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