WebCore/html/LegacyPreloadScanner.h
changeset 0 4f2f89ce4247
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebCore/html/LegacyPreloadScanner.h	Fri Sep 17 09:02:29 2010 +0300
@@ -0,0 +1,144 @@
+/*
+ * 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 LegacyPreloadScanner_h
+#define LegacyPreloadScanner_h
+
+#include "AtomicString.h"
+#include "SegmentedString.h"
+#include <wtf/Noncopyable.h>
+#include <wtf/Vector.h>
+
+namespace WebCore {
+    
+    class CachedResource;
+    class CachedResourceClient;
+    class Document;
+    
+    class LegacyPreloadScanner : public Noncopyable {
+    public:
+        LegacyPreloadScanner(Document*);
+        ~LegacyPreloadScanner();
+        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