18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Copyright (C) 1997 Martin Jones (mjones@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              (C) 1997 Torben Weis (weis@kde.org)
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              (C) 1998 Waldo Bastian (bastian@kde.org)
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              (C) 2001 Dirk Mueller (mueller@kde.org)
6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is free software; you can redistribute it and/or
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    modify it under the terms of the GNU Library General Public
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    License as published by the Free Software Foundation; either
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    version 2 of the License, or (at your option) any later version.
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    This library is distributed in the hope that it will be useful,
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    but WITHOUT ANY WARRANTY; without even the implied warranty of
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Library General Public License for more details.
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    You should have received a copy of the GNU Library General Public License
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    along with this library; see the file COPYING.LIB.  If not, write to
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Boston, MA 02110-1301, USA.
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project*/
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef HTMLTokenizer_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define HTMLTokenizer_h
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceHandle.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NamedMappedAttrMap.h"
30d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "MappedAttributeEntry.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SegmentedString.h"
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Timer.h"
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Tokenizer.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Deque.h>
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/OwnPtr.h>
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CachedScript;
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DocumentFragment;
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Document;
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLDocument;
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass HTMLScriptElement;
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLViewSourceDocument;
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass FrameView;
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLParser;
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Node;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass PreloadScanner;
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectclass ScriptSourceCode;
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/**
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * @internal
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * represents one HTML tag. Consists of a numerical id, and the list
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * of attributes. Can also represent text. In this case the id = 0 and
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * text contains the text.
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstruct Token {
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Token()
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        : beginTag(true)
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        , selfClosingTag(false)
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        , brokenXMLStyle(false)
63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        , m_sourceInfo(0)
64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    { }
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ~Token() { }
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void addAttribute(AtomicString& attrName, const AtomicString& v, bool viewSourceMode);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isOpenTag(const QualifiedName& fullName) const { return beginTag && fullName.localName() == tagName; }
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool isCloseTag(const QualifiedName& fullName) const { return !beginTag && fullName.localName() == tagName; }
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void reset()
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        attrs = 0;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        text = 0;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        tagName = nullAtom;
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        beginTag = true;
78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        selfClosingTag = false;
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        brokenXMLStyle = false;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (m_sourceInfo)
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            m_sourceInfo->clear();
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void addViewSourceChar(UChar c) { if (!m_sourceInfo.get()) m_sourceInfo.set(new Vector<UChar>); m_sourceInfo->append(c); }
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<NamedMappedAttrMap> attrs;
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<StringImpl> text;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    AtomicString tagName;
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool beginTag;
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool selfClosingTag;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool brokenXMLStyle;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OwnPtr<Vector<UChar> > m_sourceInfo;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum DoctypeState {
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeBegin,
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeBeforeName,
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeName,
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeAfterName,
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeBeforePublicID,
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypePublicID,
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeAfterPublicID,
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeBeforeSystemID,
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeSystemID,
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeAfterSystemID,
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeBogus
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DoctypeToken {
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeToken() {}
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void reset()
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_name.clear();
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_publicID.clear();
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_systemID.clear();
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_state = DoctypeBegin;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_source.clear();
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeState state() { return m_state; }
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setState(DoctypeState s) { m_state = s; }
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<UChar> m_name;
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<UChar> m_publicID;
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<UChar> m_systemID;
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeState m_state;
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<UChar> m_source;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project//-----------------------------------------------------------------------------
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass HTMLTokenizer : public Tokenizer, public CachedResourceClient {
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLTokenizer(HTMLDocument*, bool reportErrors);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    HTMLTokenizer(HTMLViewSourceDocument*);
139d0825bca7fe65beaee391d30da42e937db621564Steve Block    HTMLTokenizer(DocumentFragment*, FragmentScriptingPermission = FragmentScriptingAllowed);
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ~HTMLTokenizer();
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void write(const SegmentedString&, bool appendData);
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void finish();
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void setForceSynchronous(bool force);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isWaitingForScripts() const;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void stopParsing();
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool processingData() const;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int executingScript() const { return m_executingScript; }
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int lineNumber() const { return m_lineNumber; }
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual int columnNumber() const { return 1; }
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool processingContentWrittenByScript() const { return m_src.excludeLineNumbers(); }
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual void executeScriptsWaitingForStylesheets();
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isHTMLTokenizer() const { return true; }
158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    HTMLParser* htmlParser() const { return m_parser.get(); }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class State;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Where we are in parsing a tag
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void begin();
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void end();
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void reset();
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    PassRefPtr<Node> processToken();
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void processDoctypeToken();
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State processListing(SegmentedString, State);
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseComment(SegmentedString&, State);
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseDoctype(SegmentedString&, State);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseServer(SegmentedString&, State);
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseText(SegmentedString&, State);
1770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    State parseNonHTMLText(SegmentedString&, State);
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseTag(SegmentedString&, State);
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    State parseEntity(SegmentedString&, UChar*& dest, State, unsigned& cBufferPos, bool start, bool parsingTag);
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State parseProcessingInstruction(SegmentedString&, State);
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State scriptHandler(State);
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    State scriptExecution(const ScriptSourceCode&, State);
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setSrc(const SegmentedString&);
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // check if we have enough space in the buffer.
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // if not enlarge it
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline void checkBuffer(int len = 10)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
189635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if ((m_dest - m_buffer) > m_bufferSize - len)
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            enlargeBuffer(len);
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    inline void checkScriptBuffer(int len = 10)
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
195635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        if (m_scriptCodeSize + len >= m_scriptCodeCapacity)
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            enlargeScriptBuffer(len);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void enlargeBuffer(int len);
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void enlargeScriptBuffer(int len);
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool continueProcessing(int& processedCount, double startTime, State&);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void timerFired(Timer<HTMLTokenizer>*);
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void allDataProcessed();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // from CachedResourceClient
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void notifyFinished(CachedResource*);
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
209d0825bca7fe65beaee391d30da42e937db621564Steve Block    void executeExternalScriptsIfReady();
210d0825bca7fe65beaee391d30da42e937db621564Steve Block    void executeExternalScriptsTimerFired(Timer<HTMLTokenizer>*);
211d0825bca7fe65beaee391d30da42e937db621564Steve Block    bool continueExecutingExternalScripts(double startTime);
212d0825bca7fe65beaee391d30da42e937db621564Steve Block
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Internal buffers
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ///////////////////
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    UChar* m_buffer;
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_bufferSize;
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    UChar* m_dest;
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Token m_currentToken;
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // This buffer holds the raw characters we've seen between the beginning of
2220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    // the attribute name and the first character of the attribute value.
2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Vector<UChar, 32> m_rawAttributeBeforeValue;
2240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Tokenizer flags
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    //////////////////
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // are we in quotes within a html tag
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum { NoQuote, SingleQuote, DoubleQuote } tquote;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Are we in a &... character entity description?
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum EntityState {
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NoEntity = 0,
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchEntity = 1,
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NumericSearch = 2,
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Hexadecimal = 3,
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Decimal = 4,
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EntityName = 5,
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchSemicolon = 6
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned EntityUnicodeValue;
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum TagState {
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NoTag = 0,
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TagName = 1,
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchAttribute = 2,
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        AttributeName = 3,
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchEqual = 4,
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchValue = 5,
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        QuotedValue = 6,
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Value = 7,
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        SearchEnd = 8
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    class State {
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    public:
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        State() : m_bits(0) { }
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        TagState tagState() const { return static_cast<TagState>(m_bits & TagMask); }
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setTagState(TagState t) { m_bits = (m_bits & ~TagMask) | t; }
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        EntityState entityState() const { return static_cast<EntityState>((m_bits & EntityMask) >> EntityShift); }
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setEntityState(EntityState e) { m_bits = (m_bits & ~EntityMask) | (e << EntityShift); }
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inScript() const { return testBit(InScript); }
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInScript(bool v) { setBit(InScript, v); }
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inStyle() const { return testBit(InStyle); }
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInStyle(bool v) { setBit(InStyle, v); }
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inXmp() const { return testBit(InXmp); }
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInXmp(bool v) { setBit(InXmp, v); }
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inTitle() const { return testBit(InTitle); }
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInTitle(bool v) { setBit(InTitle, v); }
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inIFrame() const { return testBit(InIFrame); }
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInIFrame(bool v) { setBit(InIFrame, v); }
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inPlainText() const { return testBit(InPlainText); }
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInPlainText(bool v) { setBit(InPlainText, v); }
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inProcessingInstruction() const { return testBit(InProcessingInstruction); }
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInProcessingInstruction(bool v) { return setBit(InProcessingInstruction, v); }
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inComment() const { return testBit(InComment); }
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInComment(bool v) { setBit(InComment, v); }
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inDoctype() const { return testBit(InDoctype); }
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInDoctype(bool v) { setBit(InDoctype, v); }
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inTextArea() const { return testBit(InTextArea); }
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInTextArea(bool v) { setBit(InTextArea, v); }
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool escaped() const { return testBit(Escaped); }
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setEscaped(bool v) { setBit(Escaped, v); }
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool inServer() const { return testBit(InServer); }
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setInServer(bool v) { setBit(InServer, v); }
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool skipLF() const { return testBit(SkipLF); }
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setSkipLF(bool v) { setBit(SkipLF, v); }
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool startTag() const { return testBit(StartTag); }
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setStartTag(bool v) { setBit(StartTag, v); }
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool discardLF() const { return testBit(DiscardLF); }
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setDiscardLF(bool v) { setBit(DiscardLF, v); }
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool allowYield() const { return testBit(AllowYield); }
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setAllowYield(bool v) { setBit(AllowYield, v); }
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool loadingExtScript() const { return testBit(LoadingExtScript); }
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setLoadingExtScript(bool v) { setBit(LoadingExtScript, v); }
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool forceSynchronous() const { return testBit(ForceSynchronous); }
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setForceSynchronous(bool v) { setBit(ForceSynchronous, v); }
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool inAnyNonHTMLText() const { return m_bits & (InScript | InStyle | InXmp | InTextArea | InTitle | InIFrame); }
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasTagState() const { return m_bits & TagMask; }
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool hasEntityState() const { return m_bits & EntityMask; }
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool needsSpecialWriteHandling() const { return m_bits & (InScript | InStyle | InXmp | InTextArea | InTitle | InIFrame | TagMask | EntityMask | InPlainText | InComment | InDoctype | InServer | InProcessingInstruction | StartTag); }
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    private:
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        static const int EntityShift = 4;
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        enum StateBits {
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            TagMask = (1 << 4) - 1,
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            EntityMask = (1 << 7) - (1 << 4),
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InScript = 1 << 7,
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InStyle = 1 << 8,
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // Bit 9 unused
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InXmp = 1 << 10,
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InTitle = 1 << 11,
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InPlainText = 1 << 12,
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InProcessingInstruction = 1 << 13,
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InComment = 1 << 14,
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InTextArea = 1 << 15,
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            Escaped = 1 << 16,
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InServer = 1 << 17,
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            SkipLF = 1 << 18,
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            StartTag = 1 << 19,
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DiscardLF = 1 << 20, // FIXME: should clarify difference between skip and discard
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            AllowYield = 1 << 21,
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            LoadingExtScript = 1 << 22,
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            ForceSynchronous = 1 << 23,
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InIFrame = 1 << 24,
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            InDoctype = 1 << 25
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        };
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        void setBit(StateBits bit, bool value)
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        {
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (value)
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_bits |= bit;
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            else
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                m_bits &= ~bit;
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        bool testBit(StateBits bit) const { return m_bits & bit; }
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned m_bits;
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    State m_state;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DoctypeToken m_doctypeToken;
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_doctypeSearchCount;
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_doctypeSecondarySearchCount;
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_brokenServer;
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Name of an attribute that we just scanned.
353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    AtomicString m_attrName;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Used to store the code of a scripting sequence
356635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    UChar* m_scriptCode;
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Size of the script sequenze stored in @ref #scriptCode
358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_scriptCodeSize;
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Maximal size that can be stored in @ref #scriptCode
360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_scriptCodeCapacity;
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // resync point of script code size
362635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_scriptCodeResync;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Stores characters if we are scanning for a string like "</script>"
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    UChar searchBuffer[10];
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Counts where we are in the string we are scanning for
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int searchCount;
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the stopper string
370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    const char* m_searchStopper;
371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_searchStopperLength;
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // if no more data is coming, just parse what we have (including ext scripts that
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // may be still downloading) and finish
375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_noMoreData;
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // URL to get source code of script from
377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String m_scriptTagSrcAttrValue;
378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    String m_scriptTagCharsetAttrValue;
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the HTML code we will parse after the external script we are waiting for has loaded
380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SegmentedString m_pendingSrc;
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the HTML code we will parse after this particular script has
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // loaded, but before all pending HTML
384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SegmentedString* m_currentPrependingSrc;
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // true if we are executing a script while parsing a document. This causes the parsing of
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // the output of the script to be postponed until after the script has finished executing
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_executingScript;
389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    Deque<CachedResourceHandle<CachedScript> > m_pendingScripts;
390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<HTMLScriptElement> m_scriptNode;
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_requestingScript;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_hasScriptsWaitingForStylesheets;
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // if we found one broken comment, there are most likely others as well
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // store a flag to get rid of the O(n^2) behaviour in such a case.
397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_brokenComments;
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // current line number
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_lineNumber;
400635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_currentScriptTagStartLineNumber;
401635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    int m_currentTagStartLineNumber;
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double m_tokenizerTimeDelay;
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int m_tokenizerChunkSize;
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // The timer for continued processing.
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Timer<HTMLTokenizer> m_timer;
4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
409d0825bca7fe65beaee391d30da42e937db621564Steve Block    // The timer for continued executing external scripts.
410d0825bca7fe65beaee391d30da42e937db621564Steve Block    Timer<HTMLTokenizer> m_externalScriptsTimer;
411d0825bca7fe65beaee391d30da42e937db621564Steve Block
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// This buffer can hold arbitrarily long user-defined attribute names, such as in EMBED tags.
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// So any fixed number might be too small, but rather than rewriting all usage of this buffer
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// we'll just make it large enough to handle all imaginable cases.
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CBUFLEN 1024
416635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    UChar m_cBuffer[CBUFLEN + 2];
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned int m_cBufferPos;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
419635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    SegmentedString m_src;
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Document* m_doc;
421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    OwnPtr<HTMLParser> m_parser;
422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    bool m_inWrite;
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_fragment;
424d0825bca7fe65beaee391d30da42e937db621564Steve Block    FragmentScriptingPermission m_scriptingPermission;
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    OwnPtr<PreloadScanner> m_preloadScanner;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
429d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid parseHTMLDocumentFragment(const String&, DocumentFragment*, FragmentScriptingPermission = FragmentScriptingAllowed);
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectUChar decodeNamedEntity(const char*);
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // HTMLTokenizer_h
436