/*
 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 */

#ifndef PreloadScanner_h
#define PreloadScanner_h

#include "AtomicString.h"
#include "SegmentedString.h"
#include <wtf/Noncopyable.h>
#include <wtf/Vector.h>

namespace WebCore {
    
    class CachedResource;
    class CachedResourceClient;
    class Document;
    
    class PreloadScanner : Noncopyable {
    public:
        PreloadScanner(Document*);
        ~PreloadScanner();
        void begin();
        void write(const SegmentedString&);
        void end();
        bool inProgress() const { return m_inProgress; }
        
        bool scanningBody() const;
        
        static unsigned consumeEntity(SegmentedString&, bool& notEnoughCharacters);
        
    private:
        void tokenize(const SegmentedString&);
        void reset();
        
        void emitTag();
        void emitCharacter(UChar);
        
        void tokenizeCSS(UChar);
        void emitCSSRule();
        
        void processAttribute();

        
        void clearLastCharacters();
        void rememberCharacter(UChar);
        bool lastCharactersMatch(const char*, unsigned count) const;
        
        bool m_inProgress;
        SegmentedString m_source;
        
        enum State {
            Data,
            EntityData,
            TagOpen,
            CloseTagOpen,
            TagName,
            BeforeAttributeName,
            AttributeName,
            AfterAttributeName,
            BeforeAttributeValue,
            AttributeValueDoubleQuoted,
            AttributeValueSingleQuoted,
            AttributeValueUnquoted,
            EntityInAttributeValue,
            BogusComment,
            MarkupDeclarationOpen,
            CommentStart,
            CommentStartDash,
            Comment,
            CommentEndDash,
            CommentEnd
        };
        State m_state;
        bool m_escape;
        enum ContentModel {
            PCDATA,
            RCDATA,
            CDATA,
            PLAINTEXT
        };
        ContentModel m_contentModel;
        unsigned m_commentPos;
        State m_stateBeforeEntityInAttributeValue;
        
        static const unsigned lastCharactersBufferSize = 8;
        UChar m_lastCharacters[lastCharactersBufferSize];
        unsigned m_lastCharacterIndex;
        
        bool m_closeTag;
        Vector<UChar, 32> m_tagName;
        Vector<UChar, 32> m_attributeName;
        Vector<UChar> m_attributeValue;
        AtomicString m_lastStartTag;
        
        String m_urlToLoad;
        String m_charset;
        bool m_linkIsStyleSheet;
        
        enum CSSState {
            CSSInitial,
            CSSMaybeComment,
            CSSComment,
            CSSMaybeCommentEnd,
            CSSRuleStart,
            CSSRule,
            CSSAfterRule,
            CSSRuleValue,
            CSSAfterRuleValue
        };
        CSSState m_cssState;
        Vector<UChar, 16> m_cssRule;
        Vector<UChar> m_cssRuleValue;
        
        double m_timeUsed;
        
        bool m_bodySeen;
        Document* m_document;
    };

}

#endif
