Diff
Modified: trunk/LayoutTests/ChangeLog (139019 => 139020)
--- trunk/LayoutTests/ChangeLog 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/LayoutTests/ChangeLog 2013-01-08 01:21:43 UTC (rev 139020)
@@ -1,3 +1,18 @@
+2013-01-07 Adam Barth <aba...@webkit.org>
+
+ HTMLTreeBuilder should not depend on Frame
+ https://bugs.webkit.org/show_bug.cgi?id=106256
+
+ Reviewed by Eric Seidel.
+
+ I needed to update this test slightly because now we lock in the
+ "script enabled" bit for the parser when the parser starts. That means
+ we'll parse the document in a consistent way even if the "script
+ enabled" bit gets flipped later.
+
+ * fast/parser/noscript-with-_javascript_-disabled-expected.txt:
+ * fast/parser/noscript-with-_javascript_-disabled.html:
+
2013-01-07 Tony Chang <t...@chromium.org>
Remove more internals.settings that are autogenerated
Modified: trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled-expected.txt (139019 => 139020)
--- trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled-expected.txt 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled-expected.txt 2013-01-08 01:21:43 UTC (rev 139020)
@@ -1,2 +1,6 @@
-This test case verifies that contents inside <noscript> are rendered when _javascript_ is disabled.
-Succeeded!
+The text inside the 'noscript' tag inside the iframe should render:
+
+--------
+Frame: '<!--framePath //<!--frame0-->-->'
+--------
+PASS: This test case verifies that contents inside are rendered when _javascript_ is disabled.
Modified: trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled.html (139019 => 139020)
--- trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled.html 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/LayoutTests/fast/parser/noscript-with-_javascript_-disabled.html 2013-01-08 01:21:43 UTC (rev 139020)
@@ -1,17 +1,24 @@
<html>
<script>
-if (window.testRunner)
+if (window.testRunner) {
testRunner.dumpAsText();
+ testRunner.dumpChildFramesAsText();
testRunner.overridePreference("WebKitJavaScriptEnabled", false);
+}
</script>
<noscript>
<body>
- This test case verifies that contents inside <noscript> are rendered when _javascript_ is disabled.
-
- <p>Succeeded!</p>
+ FAIL: This content should not render because whether scripting is enabled
+ (for the purposes of the 'noscript' tag) is locked in when the parser starts.
</noscript>
+The text inside the 'noscript' tag inside the iframe should render:
+
+<iframe
+ src="" This test case verifies that contents inside <noscript> are rendered when _javascript_ is disabled.</body></noscript>">
+</iframe>
+
</body>
</html>
Modified: trunk/Source/WebCore/ChangeLog (139019 => 139020)
--- trunk/Source/WebCore/ChangeLog 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/ChangeLog 2013-01-08 01:21:43 UTC (rev 139020)
@@ -1,3 +1,48 @@
+2013-01-07 Adam Barth <aba...@webkit.org>
+
+ HTMLTreeBuilder should not depend on Frame
+ https://bugs.webkit.org/show_bug.cgi?id=106256
+
+ Reviewed by Eric Seidel.
+
+ Rather than have the tree builder ask the Frame whether scripting and
+ plugins are enabled, we now push that information to the tree builder
+ via HTMLParserOptions, letting us remove the Frame dependency from the
+ tree builder.
+
+ As a consequence of this change, the "script enabled" bit in the parser
+ is now locked in when the parser starts. This bit doesn't actually
+ control when script execute, only how the <noscript> element is parsed.
+
+ * html/parser/HTMLDocumentParser.cpp:
+ (WebCore::tokenizerStateForContextElement):
+ (WebCore::HTMLDocumentParser::HTMLDocumentParser):
+ * html/parser/HTMLMetaCharsetParser.cpp:
+ (WebCore::HTMLMetaCharsetParser::HTMLMetaCharsetParser):
+ (WebCore::HTMLMetaCharsetParser::checkForMetaCharset):
+ * html/parser/HTMLParserOptions.cpp:
+ (WebCore::HTMLParserOptions::HTMLParserOptions):
+ * html/parser/HTMLParserOptions.h:
+ (HTMLParserOptions):
+ (WebCore::HTMLParserOptions::HTMLParserOptions):
+ * html/parser/HTMLPreloadScanner.cpp:
+ (WebCore::HTMLPreloadScanner::HTMLPreloadScanner):
+ (WebCore::HTMLPreloadScanner::processToken):
+ * html/parser/HTMLTokenizer.cpp:
+ (WebCore::HTMLTokenizer::HTMLTokenizer):
+ (WebCore::HTMLTokenizer::nextToken):
+ (WebCore::HTMLTokenizer::updateStateFor):
+ * html/parser/HTMLTokenizer.h:
+ (WebCore::HTMLTokenizer::create):
+ (HTMLTokenizer):
+ * html/parser/HTMLTreeBuilder.cpp:
+ (WebCore::HTMLTreeBuilder::processStartTagForInBody):
+ (WebCore::HTMLTreeBuilder::processStartTagForInHead):
+ * html/parser/HTMLTreeBuilder.h:
+ * html/parser/HTMLViewSourceParser.cpp:
+ (WebCore::HTMLViewSourceParser::HTMLViewSourceParser):
+ (WebCore::HTMLViewSourceParser::updateTokenizerState):
+
2013-01-07 Tony Chang <t...@chromium.org>
Remove more internals.settings that are autogenerated
Modified: trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLDocumentParser.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -47,7 +47,7 @@
// This is a direct transcription of step 4 from:
// http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#fragment-case
-static HTMLTokenizerState::State tokenizerStateForContextElement(Element* contextElement, bool reportErrors)
+static HTMLTokenizerState::State tokenizerStateForContextElement(Element* contextElement, bool reportErrors, const HTMLParserOptions& options)
{
if (!contextElement)
return HTMLTokenizerState::DataState;
@@ -59,8 +59,8 @@
if (contextTag.matches(styleTag)
|| contextTag.matches(xmpTag)
|| contextTag.matches(iframeTag)
- || (contextTag.matches(noembedTag) && HTMLTreeBuilder::pluginsEnabled(contextElement->document()->frame()))
- || (contextTag.matches(noscriptTag) && HTMLTreeBuilder::scriptEnabled(contextElement->document()->frame()))
+ || (contextTag.matches(noembedTag) && options.pluginsEnabled)
+ || (contextTag.matches(noscriptTag) && options.scriptEnabled)
|| contextTag.matches(noframesTag))
return reportErrors ? HTMLTokenizerState::RAWTEXTState : HTMLTokenizerState::PLAINTEXTState;
if (contextTag.matches(scriptTag))
@@ -73,7 +73,7 @@
HTMLDocumentParser::HTMLDocumentParser(HTMLDocument* document, bool reportErrors)
: ScriptableDocumentParser(document)
, m_options(document)
- , m_tokenizer(HTMLTokenizer::create(m_options.usePreHTML5ParserQuirks))
+ , m_tokenizer(HTMLTokenizer::create(m_options))
, m_scriptRunner(HTMLScriptRunner::create(document, this))
, m_treeBuilder(HTMLTreeBuilder::create(this, document, reportErrors, m_options))
, m_parserScheduler(HTMLParserScheduler::create(this))
@@ -88,14 +88,14 @@
HTMLDocumentParser::HTMLDocumentParser(DocumentFragment* fragment, Element* contextElement, FragmentScriptingPermission scriptingPermission)
: ScriptableDocumentParser(fragment->document())
, m_options(fragment->document())
- , m_tokenizer(HTMLTokenizer::create(m_options.usePreHTML5ParserQuirks))
+ , m_tokenizer(HTMLTokenizer::create(m_options))
, m_treeBuilder(HTMLTreeBuilder::create(this, fragment, contextElement, scriptingPermission, m_options))
, m_xssAuditor(this)
, m_endWasDelayed(false)
, m_pumpSessionNestingLevel(0)
{
bool reportErrors = false; // For now document fragment parsing never reports errors.
- m_tokenizer->setState(tokenizerStateForContextElement(contextElement, reportErrors));
+ m_tokenizer->setState(tokenizerStateForContextElement(contextElement, reportErrors, m_options));
}
HTMLDocumentParser::~HTMLDocumentParser()
Modified: trunk/Source/WebCore/html/parser/HTMLMetaCharsetParser.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLMetaCharsetParser.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLMetaCharsetParser.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -28,6 +28,7 @@
#include "HTMLNames.h"
#include "HTMLParserIdioms.h"
+#include "HTMLParserOptions.h"
#include "HTMLTokenizer.h"
#include "TextCodec.h"
#include "TextEncodingRegistry.h"
@@ -40,7 +41,7 @@
using namespace HTMLNames;
HTMLMetaCharsetParser::HTMLMetaCharsetParser()
- : m_tokenizer(HTMLTokenizer::create(false)) // No pre-HTML5 parser quirks.
+ : m_tokenizer(HTMLTokenizer::create(HTMLParserOptions(0)))
, m_assumedCodec(newTextCodec(Latin1Encoding()))
, m_inHeadSection(true)
, m_doneChecking(false)
@@ -179,7 +180,7 @@
if (end || m_token.type() == HTMLTokenTypes::StartTag) {
AtomicString tagName(m_token.name().data(), m_token.name().size());
if (!end) {
- m_tokenizer->updateStateFor(tagName, 0);
+ m_tokenizer->updateStateFor(tagName);
if (tagName == metaTag && processMeta()) {
m_doneChecking = true;
return true;
Modified: trunk/Source/WebCore/html/parser/HTMLParserOptions.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLParserOptions.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLParserOptions.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -27,14 +27,18 @@
#include "HTMLParserOptions.h"
#include "Document.h"
+#include "Frame.h"
#include "Settings.h"
namespace WebCore {
HTMLParserOptions::HTMLParserOptions(Document* document)
{
- ASSERT(document);
- Settings* settings = document->settings();
+ Frame* frame = document ? document->frame() : 0;
+ scriptEnabled = frame && frame->script()->canExecuteScripts(NotAboutToExecuteScript);
+ pluginsEnabled = frame && frame->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin);
+
+ Settings* settings = document ? document->settings() : 0;
usePreHTML5ParserQuirks = settings && settings->usePreHTML5ParserQuirks();
maximumDOMTreeDepth = settings ? settings->maximumHTMLParserDOMTreeDepth() : Settings::defaultMaximumHTMLParserDOMTreeDepth;
}
Modified: trunk/Source/WebCore/html/parser/HTMLParserOptions.h (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLParserOptions.h 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLParserOptions.h 2013-01-08 01:21:43 UTC (rev 139020)
@@ -32,15 +32,11 @@
class HTMLParserOptions {
public:
+ bool scriptEnabled;
+ bool pluginsEnabled;
bool usePreHTML5ParserQuirks;
unsigned maximumDOMTreeDepth;
- HTMLParserOptions()
- : usePreHTML5ParserQuirks(false)
- , maximumDOMTreeDepth(0)
- {
- }
-
explicit HTMLParserOptions(Document*);
};
Modified: trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLPreloadScanner.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -165,7 +165,7 @@
HTMLPreloadScanner::HTMLPreloadScanner(Document* document, const HTMLParserOptions& options)
: m_document(document)
, m_cssScanner(document)
- , m_tokenizer(HTMLTokenizer::create(options.usePreHTML5ParserQuirks))
+ , m_tokenizer(HTMLTokenizer::create(options))
, m_inStyle(false)
{
}
@@ -203,7 +203,7 @@
return;
PreloadTask task(m_token);
- m_tokenizer->updateStateFor(task.tagName(), m_document->frame());
+ m_tokenizer->updateStateFor(task.tagName());
if (task.tagName() == styleTag)
m_inStyle = true;
Modified: trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLTokenizer.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -107,8 +107,8 @@
#define HTML_ADVANCE_TO(stateName) ADVANCE_TO(HTMLTokenizerState, stateName)
#define HTML_SWITCH_TO(stateName) SWITCH_TO(HTMLTokenizerState, stateName)
-HTMLTokenizer::HTMLTokenizer(bool usePreHTML5ParserQuirks)
- : m_usePreHTML5ParserQuirks(usePreHTML5ParserQuirks)
+HTMLTokenizer::HTMLTokenizer(const HTMLParserOptions& options)
+ : m_options(options)
{
reset();
}
@@ -343,7 +343,7 @@
HTML_ADVANCE_TO(SelfClosingStartTagState);
else if (cc == '>')
return emitAndResumeIn(source, HTMLTokenizerState::DataState);
- else if (m_usePreHTML5ParserQuirks && cc == '<')
+ else if (m_options.usePreHTML5ParserQuirks && cc == '<')
return emitAndReconsumeIn(source, HTMLTokenizerState::DataState);
else if (isASCIIUpper(cc)) {
m_token->appendToName(toLowerCase(cc));
@@ -814,7 +814,7 @@
HTML_ADVANCE_TO(SelfClosingStartTagState);
else if (cc == '>')
return emitAndResumeIn(source, HTMLTokenizerState::DataState);
- else if (m_usePreHTML5ParserQuirks && cc == '<')
+ else if (m_options.usePreHTML5ParserQuirks && cc == '<')
return emitAndReconsumeIn(source, HTMLTokenizerState::DataState);
else if (isASCIIUpper(cc)) {
m_token->addNewAttribute();
@@ -848,7 +848,7 @@
} else if (cc == '>') {
m_token->endAttributeName(source.numberOfCharactersConsumed());
return emitAndResumeIn(source, HTMLTokenizerState::DataState);
- } else if (m_usePreHTML5ParserQuirks && cc == '<') {
+ } else if (m_options.usePreHTML5ParserQuirks && cc == '<') {
m_token->endAttributeName(source.numberOfCharactersConsumed());
return emitAndReconsumeIn(source, HTMLTokenizerState::DataState);
} else if (isASCIIUpper(cc)) {
@@ -876,7 +876,7 @@
HTML_ADVANCE_TO(BeforeAttributeValueState);
else if (cc == '>')
return emitAndResumeIn(source, HTMLTokenizerState::DataState);
- else if (m_usePreHTML5ParserQuirks && cc == '<')
+ else if (m_options.usePreHTML5ParserQuirks && cc == '<')
return emitAndReconsumeIn(source, HTMLTokenizerState::DataState);
else if (isASCIIUpper(cc)) {
m_token->addNewAttribute();
@@ -1019,7 +1019,7 @@
HTML_ADVANCE_TO(SelfClosingStartTagState);
else if (cc == '>')
return emitAndResumeIn(source, HTMLTokenizerState::DataState);
- else if (m_usePreHTML5ParserQuirks && cc == '<')
+ else if (m_options.usePreHTML5ParserQuirks && cc == '<')
return emitAndReconsumeIn(source, HTMLTokenizerState::DataState);
else if (cc == InputStreamPreprocessor::endOfFileMarker) {
parseError();
@@ -1589,7 +1589,7 @@
return characters.toString();
}
-void HTMLTokenizer::updateStateFor(const AtomicString& tagName, Frame* frame)
+void HTMLTokenizer::updateStateFor(const AtomicString& tagName)
{
if (tagName == textareaTag || tagName == titleTag)
setState(HTMLTokenizerState::RCDATAState);
@@ -1600,9 +1600,9 @@
else if (tagName == styleTag
|| tagName == iframeTag
|| tagName == xmpTag
- || (tagName == noembedTag && HTMLTreeBuilder::pluginsEnabled(frame))
+ || (tagName == noembedTag && m_options.pluginsEnabled)
|| tagName == noframesTag
- || (tagName == noscriptTag && HTMLTreeBuilder::scriptEnabled(frame)))
+ || (tagName == noscriptTag && m_options.scriptEnabled))
setState(HTMLTokenizerState::RAWTEXTState);
}
Modified: trunk/Source/WebCore/html/parser/HTMLTokenizer.h (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLTokenizer.h 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLTokenizer.h 2013-01-08 01:21:43 UTC (rev 139020)
@@ -27,14 +27,13 @@
#ifndef HTMLTokenizer_h
#define HTMLTokenizer_h
+#include "HTMLParserOptions.h"
#include "HTMLToken.h"
#include "MarkupTokenizerBase.h"
#include "SegmentedString.h"
namespace WebCore {
-class Frame;
-
class HTMLTokenizerState {
public:
enum State {
@@ -120,7 +119,7 @@
WTF_MAKE_NONCOPYABLE(HTMLTokenizer);
WTF_MAKE_FAST_ALLOCATED;
public:
- static PassOwnPtr<HTMLTokenizer> create(bool usePreHTML5ParserQuirks) { return adoptPtr(new HTMLTokenizer(usePreHTML5ParserQuirks)); }
+ static PassOwnPtr<HTMLTokenizer> create(const HTMLParserOptions& options) { return adoptPtr(new HTMLTokenizer(options)); }
~HTMLTokenizer();
void reset();
@@ -157,7 +156,7 @@
// * CDATA sections in foreign content will be tokenized as bogus comments
// instead of as character tokens.
//
- void updateStateFor(const AtomicString& tagName, Frame*);
+ void updateStateFor(const AtomicString& tagName);
bool forceNullCharacterReplacement() const { return m_forceNullCharacterReplacement; }
void setForceNullCharacterReplacement(bool value) { m_forceNullCharacterReplacement = value; }
@@ -166,7 +165,7 @@
void setShouldAllowCDATA(bool value) { m_shouldAllowCDATA = value; }
private:
- explicit HTMLTokenizer(bool usePreHTML5ParserQuirks);
+ explicit HTMLTokenizer(const HTMLParserOptions&);
inline bool processEntity(SegmentedString&);
@@ -216,7 +215,7 @@
// token here so we remember it next time we re-enter the tokenizer.
Vector<LChar, 32> m_bufferedEndTagName;
- bool m_usePreHTML5ParserQuirks;
+ HTMLParserOptions m_options;
};
}
Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -31,7 +31,6 @@
#include "DOMWindow.h"
#include "DocumentFragment.h"
#include "DocumentType.h"
-#include "Frame.h"
#include "HTMLDocument.h"
#include "HTMLDocumentParser.h"
#include "HTMLElementFactory.h"
@@ -894,11 +893,11 @@
processGenericRawTextStartTag(token);
return;
}
- if (token->name() == noembedTag && pluginsEnabled(m_document->frame())) {
+ if (token->name() == noembedTag && m_options.pluginsEnabled) {
processGenericRawTextStartTag(token);
return;
}
- if (token->name() == noscriptTag && scriptEnabled(m_document->frame())) {
+ if (token->name() == noscriptTag && m_options.scriptEnabled) {
processGenericRawTextStartTag(token);
return;
}
@@ -2690,7 +2689,7 @@
return true;
}
if (token->name() == noscriptTag) {
- if (scriptEnabled(m_document->frame())) {
+ if (m_options.scriptEnabled) {
processGenericRawTextStartTag(token);
return true;
}
@@ -2913,18 +2912,4 @@
{
}
-bool HTMLTreeBuilder::scriptEnabled(Frame* frame)
-{
- if (!frame)
- return false;
- return frame->script()->canExecuteScripts(NotAboutToExecuteScript);
}
-
-bool HTMLTreeBuilder::pluginsEnabled(Frame* frame)
-{
- if (!frame)
- return false;
- return frame->loader()->subframeLoader()->allowPlugins(NotAboutToInstantiatePlugin);
-}
-
-}
Modified: trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLTreeBuilder.h 2013-01-08 01:21:43 UTC (rev 139020)
@@ -91,9 +91,6 @@
void setShouldSkipLeadingNewline(bool shouldSkip) { m_shouldSkipLeadingNewline = shouldSkip; }
- static bool scriptEnabled(Frame*);
- static bool pluginsEnabled(Frame*);
-
private:
class ExternalCharacterTokenBuffer;
// Represents HTML5 "insertion mode"
Modified: trunk/Source/WebCore/html/parser/HTMLViewSourceParser.cpp (139019 => 139020)
--- trunk/Source/WebCore/html/parser/HTMLViewSourceParser.cpp 2013-01-08 01:19:30 UTC (rev 139019)
+++ trunk/Source/WebCore/html/parser/HTMLViewSourceParser.cpp 2013-01-08 01:21:43 UTC (rev 139020)
@@ -35,7 +35,7 @@
HTMLViewSourceParser::HTMLViewSourceParser(HTMLViewSourceDocument* document)
: DecodedDataDocumentParser(document)
- , m_tokenizer(HTMLTokenizer::create(HTMLParserOptions(document).usePreHTML5ParserQuirks))
+ , m_tokenizer(HTMLTokenizer::create(HTMLParserOptions(document)))
{
}
@@ -80,7 +80,7 @@
return;
AtomicString tagName(m_token.name().data(), m_token.name().size());
- m_tokenizer->updateStateFor(tagName, document()->frame());
+ m_tokenizer->updateStateFor(tagName);
}
void HTMLViewSourceParser::finish()