1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/parser/html/nsHtml5StringParser.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,124 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +#include "nsHtml5StringParser.h" 1.9 +#include "nsHtml5TreeOpExecutor.h" 1.10 +#include "nsHtml5TreeBuilder.h" 1.11 +#include "nsHtml5Tokenizer.h" 1.12 +#include "nsIContent.h" 1.13 +#include "nsIDocument.h" 1.14 +#include "nsIDOMDocumentFragment.h" 1.15 +#include "nsHtml5DependentUTF16Buffer.h" 1.16 + 1.17 +NS_IMPL_ISUPPORTS0(nsHtml5StringParser) 1.18 + 1.19 +nsHtml5StringParser::nsHtml5StringParser() 1.20 + : mBuilder(new nsHtml5OplessBuilder()) 1.21 + , mTreeBuilder(new nsHtml5TreeBuilder(mBuilder)) 1.22 + , mTokenizer(new nsHtml5Tokenizer(mTreeBuilder, false)) 1.23 +{ 1.24 + MOZ_COUNT_CTOR(nsHtml5StringParser); 1.25 + mTokenizer->setInterner(&mAtomTable); 1.26 +} 1.27 + 1.28 +nsHtml5StringParser::~nsHtml5StringParser() 1.29 +{ 1.30 + MOZ_COUNT_DTOR(nsHtml5StringParser); 1.31 +} 1.32 + 1.33 +nsresult 1.34 +nsHtml5StringParser::ParseFragment(const nsAString& aSourceBuffer, 1.35 + nsIContent* aTargetNode, 1.36 + nsIAtom* aContextLocalName, 1.37 + int32_t aContextNamespace, 1.38 + bool aQuirks, 1.39 + bool aPreventScriptExecution) 1.40 +{ 1.41 + NS_ENSURE_TRUE(aSourceBuffer.Length() <= INT32_MAX, 1.42 + NS_ERROR_OUT_OF_MEMORY); 1.43 + 1.44 + nsIDocument* doc = aTargetNode->OwnerDoc(); 1.45 + nsIURI* uri = doc->GetDocumentURI(); 1.46 + NS_ENSURE_TRUE(uri, NS_ERROR_NOT_AVAILABLE); 1.47 + 1.48 + mTreeBuilder->setFragmentContext(aContextLocalName, 1.49 + aContextNamespace, 1.50 + aTargetNode, 1.51 + aQuirks); 1.52 + 1.53 +#ifdef DEBUG 1.54 + if (!aPreventScriptExecution) { 1.55 + NS_ASSERTION(!aTargetNode->IsInDoc(), 1.56 + "If script execution isn't prevented, " 1.57 + "the target node must not be in doc."); 1.58 + nsCOMPtr<nsIDOMDocumentFragment> domFrag = do_QueryInterface(aTargetNode); 1.59 + NS_ASSERTION(domFrag, 1.60 + "If script execution isn't prevented, must parse to DOM fragment."); 1.61 + } 1.62 +#endif 1.63 + 1.64 + mTreeBuilder->SetPreventScriptExecution(aPreventScriptExecution); 1.65 + 1.66 + return Tokenize(aSourceBuffer, doc, true); 1.67 +} 1.68 + 1.69 +nsresult 1.70 +nsHtml5StringParser::ParseDocument(const nsAString& aSourceBuffer, 1.71 + nsIDocument* aTargetDoc, 1.72 + bool aScriptingEnabledForNoscriptParsing) 1.73 +{ 1.74 + MOZ_ASSERT(!aTargetDoc->GetFirstChild()); 1.75 + 1.76 + NS_ENSURE_TRUE(aSourceBuffer.Length() <= INT32_MAX, 1.77 + NS_ERROR_OUT_OF_MEMORY); 1.78 + 1.79 + mTreeBuilder->setFragmentContext(nullptr, 1.80 + kNameSpaceID_None, 1.81 + nullptr, 1.82 + false); 1.83 + 1.84 + mTreeBuilder->SetPreventScriptExecution(true); 1.85 + 1.86 + return Tokenize(aSourceBuffer, aTargetDoc, aScriptingEnabledForNoscriptParsing); 1.87 +} 1.88 + 1.89 +nsresult 1.90 +nsHtml5StringParser::Tokenize(const nsAString& aSourceBuffer, 1.91 + nsIDocument* aDocument, 1.92 + bool aScriptingEnabledForNoscriptParsing) { 1.93 + 1.94 + nsIURI* uri = aDocument->GetDocumentURI(); 1.95 + 1.96 + mBuilder->Init(aDocument, uri, nullptr, nullptr); 1.97 + 1.98 + mBuilder->SetParser(this); 1.99 + mBuilder->SetNodeInfoManager(aDocument->NodeInfoManager()); 1.100 + 1.101 + // Mark the parser as *not* broken by passing NS_OK 1.102 + nsresult rv = mBuilder->MarkAsBroken(NS_OK); 1.103 + 1.104 + mTreeBuilder->setScriptingEnabled(aScriptingEnabledForNoscriptParsing); 1.105 + mTreeBuilder->setIsSrcdocDocument(aDocument->IsSrcdocDocument()); 1.106 + mBuilder->Start(); 1.107 + mTokenizer->start(); 1.108 + if (!aSourceBuffer.IsEmpty()) { 1.109 + bool lastWasCR = false; 1.110 + nsHtml5DependentUTF16Buffer buffer(aSourceBuffer); 1.111 + while (buffer.hasMore()) { 1.112 + buffer.adjust(lastWasCR); 1.113 + lastWasCR = false; 1.114 + if (buffer.hasMore()) { 1.115 + lastWasCR = mTokenizer->tokenizeBuffer(&buffer); 1.116 + if (NS_FAILED(rv = mBuilder->IsBroken())) { 1.117 + break; 1.118 + } 1.119 + } 1.120 + } 1.121 + } 1.122 + mTokenizer->eof(); 1.123 + mTokenizer->end(); 1.124 + mBuilder->Finish(); 1.125 + mAtomTable.Clear(); 1.126 + return rv; 1.127 +}