18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2000 Peter Kelly (pmk@post.com)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006 Apple Computer, Inc.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Samuel Weinig (sam@webkit.org)
506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen * Copyright (C) 2010 Google, Inc.
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#ifndef DocumentParser_h
25545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#define DocumentParser_h
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
27e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block#include <wtf/RefCounted.h>
2806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass Document;
32ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass DocumentWriter;
3306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenclass SegmentedString;
34ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockclass ScriptableDocumentParser;
3506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
36e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockclass DocumentParser : public RefCounted<DocumentParser> {
3706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenpublic:
38e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual ~DocumentParser();
3906ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
40ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual ScriptableDocumentParser* asScriptableDocumentParser() { return 0; }
41ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
420617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // http://www.whatwg.org/specs/web-apps/current-work/#insertion-point
430617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    virtual bool hasInsertionPoint() { return true; }
440617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
45ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // insert is used by document.write
46ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual void insert(const SegmentedString&) = 0;
47ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
48ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // appendBytes is used by DocumentWriter (the loader)
49ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual void appendBytes(DocumentWriter*, const char* bytes, int length, bool flush) = 0;
50ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
51ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // FIXME: append() should be private, but DocumentWriter::replaceDocument
52ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    // uses it for now.
53ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    virtual void append(const SegmentedString&) = 0;
54ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
5506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual void finish() = 0;
5606ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual bool finishWasCalled() = 0;
5706ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
5806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // FIXME: processingData() is only used by DocumentLoader::isLoadingInAPISense
59f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // and is very unclear as to what it actually means.  The LegacyHTMLDocumentParser
605abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // used to implement it.
6106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    virtual bool processingData() const { return false; }
6206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
63e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // document() will return 0 after detach() is called.
64e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    Document* document() const { ASSERT(m_document); return m_document; }
655abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool isParsing() const { return m_state == ParsingState; }
675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool isStopping() const { return m_state == StoppingState; }
685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool isStopped() const { return m_state >= StoppedState; }
695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    bool isDetached() const { return m_state == DetachedState; }
705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // FIXME: Is this necessary? Does XMLDocumentParserLibxml2 really need to set this?
725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void startParsing();
735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // prepareToStop() is used when the EOF token is encountered and parsing is to be
755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // stopped normally.
765abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void prepareToStopParsing();
775abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
785abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // stopParsing() is used when a load is canceled/stopped.
795abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // stopParsing() is currently different from detach(), but shouldn't be.
805abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // It should NOT be ok to call any methods on DocumentParser after either
815abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // detach() or stopParsing() but right now only detach() will ASSERT.
825abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    virtual void stopParsing();
83e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
84e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // Document is expected to detach the parser before releasing its ref.
85e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // After detach, m_document is cleared.  The parser will unwind its
86e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // callstacks, but not produce any more nodes.
87e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // It is impossible for the parser to touch the rest of WebCore after
88e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // detach is called.
89e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    virtual void detach();
90e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block
91a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    void setDocumentWasLoadedAsPartOfNavigation() { m_documentWasLoadedAsPartOfNavigation = true; }
92a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool documentWasLoadedAsPartOfNavigation() const { return m_documentWasLoadedAsPartOfNavigation; }
93a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch
94cad810f21b803229eb11403f9209855525a25d57Steve Block    // FIXME: The names are not very accurate :(
95cad810f21b803229eb11403f9209855525a25d57Steve Block    virtual void suspendScheduledTasks();
96cad810f21b803229eb11403f9209855525a25d57Steve Block    virtual void resumeScheduledTasks();
97cad810f21b803229eb11403f9209855525a25d57Steve Block
9806ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsenprotected:
99ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    DocumentParser(Document*);
10006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
101e8b154fd68f9b33be40a3590e58347f353835f5cSteve Blockprivate:
1025abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    enum ParserState {
1035abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        ParsingState,
1045abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        StoppingState,
1055abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        StoppedState,
1065abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        DetachedState
1075abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    };
1085abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    ParserState m_state;
109a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch    bool m_documentWasLoadedAsPartOfNavigation;
1105abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
11106ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    // Every DocumentParser needs a pointer back to the document.
112e8b154fd68f9b33be40a3590e58347f353835f5cSteve Block    // m_document will be 0 after the parser is stopped.
11306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    Document* m_document;
11406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen};
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif // DocumentParser_h
119