Index: Source/platform/PluginScriptForbiddenScope.h |
diff --git a/Source/platform/PluginScriptForbiddenScope.h b/Source/platform/PluginScriptForbiddenScope.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..327b4feb9f61beb097ca9e4af88b655ba6117798 |
--- /dev/null |
+++ b/Source/platform/PluginScriptForbiddenScope.h |
@@ -0,0 +1,49 @@ |
+// Copyright 2015 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 PluginScriptForbiddenScope_h |
+#define PluginScriptForbiddenScope_h |
+ |
+#include "platform/PlatformExport.h" |
+ |
+namespace blink { |
+ |
+// Similar to ScriptForbiddenScope, but more selective. This is intended to help |
+// reduce the number of places where Flash can run a nested message loop as its |
+// plugin element is being destroyed. One of the reasons that Flash runs this |
+// nested message loop is to allow Flash content to synchronously script the |
+// page when the plugin element is destroyed. |
+// |
+// This is problematic for many reasons: the DOM may not be in a consistent |
+// state, since Blink is in the middle of detaching nodes, nested message loops |
+// can cause normally impossible conditions to occur (https://crbug.com/367210), |
+// etc. |
+// |
+// When this object is instantiated on the stack, it allows execution of event |
+// handlers, etc but blocks attempts by plugins to call back into Blink to |
+// execute script. |
+// |
+// Background: |
+// For historical reasons, Flash has allowed synchronous scripting during |
+// teardown of the plugin. This is generally problematic, but sites apparently |
+// rely on this behavior. Over time, Blink has added restrictions on this |
+// synchronous scripting: for example, past a certain point in Frame detach, |
+// script execution by Flash is ignored: https://crbug.com/371084. |
+// |
+// Unfortunately, there are still ways for plugins to synchronously script |
+// during Document detach: if an unload handler removes a Flash plugin element, |
+// that will run the nested message loop, etc. This scoper is intended to block |
+// those usages, with the eventual goal that Frame detach will never have to run |
+// a nested message loop. |
+class PLATFORM_EXPORT PluginScriptForbiddenScope { |
+public: |
+ PluginScriptForbiddenScope(); |
+ ~PluginScriptForbiddenScope(); |
+ |
+ static bool isForbidden(); |
+}; |
+ |
+} // namespace blink |
+ |
+#endif // PluginScriptForbiddenScope_h |