Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(105)

Unified Diff: third_party/WebKit/Source/core/html/parser/HTMLParserReentryPermit.h

Issue 2200613002: The HTML parser synchronously creates custom elements (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Eliminate redundant TODOs. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/html/parser/HTMLParserReentryPermit.h
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLParserReentryPermit.h b/third_party/WebKit/Source/core/html/parser/HTMLParserReentryPermit.h
new file mode 100644
index 0000000000000000000000000000000000000000..4538b4c990d0a26d6c98fd0e2732e3174c0b6734
--- /dev/null
+++ b/third_party/WebKit/Source/core/html/parser/HTMLParserReentryPermit.h
@@ -0,0 +1,95 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef HTMLParserReentryPermit_h
+#define HTMLParserReentryPermit_h
+
+#include "base/macros.h"
+#include "wtf/PassRefPtr.h"
+#include "wtf/RefCounted.h"
+
+namespace blink {
+
+// The HTML spec for parsing controls reentering the parser from
+// script with the "parser pause flag" and "script nesting level."
+//
+// The parser pause flag puts a brake on whether the tokenizer will
+// produce more tokens. When the parser is paused, nested invocations
+// of the tokenizer unwind.
+//
+// The script nesting level is incremented and decremented any time
+// the parser causes script to run. The script nesting level:
+//
+// - May prevent document.open from blowing away the document.
+//
+// - Governs whether a script element becomes the "pending
+// parsing-blocking script." The pending parsing-blocking script in
+// turn affects whether document.write reenters the parser.
+//
+// Clearing the parser pause flag is simple: Whenever the script
+// nesting level hits zero, the parser pause flag is cleared. However
+// setting the parser pause flag is subtle.
+//
+// Processing a typical script end tag, or running a chain of pending
+// parser-blocking scripts after that, does not set the parser pause
+// flag. However recursively parsing end script tags, or running
+// custom element constructors, does set the parser pause flag.
+class HTMLParserReentryPermit final : public RefCounted<HTMLParserReentryPermit> {
+public:
+ static PassRefPtr<HTMLParserReentryPermit> create();
+ ~HTMLParserReentryPermit() = default;
+
+ unsigned scriptNestingLevel() const { return m_scriptNestingLevel; }
+ bool parserPauseFlag() const { return m_parserPauseFlag; }
+ void pause()
+ {
+ CHECK(m_scriptNestingLevel);
+ m_parserPauseFlag = true;
+ }
+
+ class ScriptNestingLevelIncrementer final {
+ STACK_ALLOCATED();
+ public:
+ explicit ScriptNestingLevelIncrementer(HTMLParserReentryPermit* permit)
+ : m_permit(permit)
+ {
+ m_permit->m_scriptNestingLevel++;
+ }
+
+ ScriptNestingLevelIncrementer(ScriptNestingLevelIncrementer&&)
+ = default;
+
+ ~ScriptNestingLevelIncrementer()
+ {
+ m_permit->m_scriptNestingLevel--;
+ if (!m_permit->m_scriptNestingLevel)
+ m_permit->m_parserPauseFlag = false;
+ }
+
+ private:
+ HTMLParserReentryPermit* m_permit;
+
+ DISALLOW_COPY_AND_ASSIGN(ScriptNestingLevelIncrementer);
+ };
+
+ ScriptNestingLevelIncrementer incrementScriptNestingLevel()
+ {
+ return ScriptNestingLevelIncrementer(this);
+ }
+
+private:
+ HTMLParserReentryPermit();
+
+ // https://html.spec.whatwg.org/#script-nesting-level
+ unsigned m_scriptNestingLevel;
+
+ // https://html.spec.whatwg.org/#parser-pause-flag
+ bool m_parserPauseFlag;
+
+ DISALLOW_COPY_AND_ASSIGN(HTMLParserReentryPermit);
+};
+
+} // namespace blink
+
+#endif // HTMLParserReentryPermit_h

Powered by Google App Engine
This is Rietveld 408576698