Index: third_party/WebKit/Source/core/inspector/DevToolsHost.cpp |
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp |
index 94db56dfffb745a160789c81429a4421df67db2f..5a295331061dfaba3b550b7bef4e4bda7772229a 100644 |
--- a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp |
+++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp |
@@ -29,8 +29,8 @@ |
#include "core/inspector/DevToolsHost.h" |
+#include "bindings/core/v8/ScriptFunctionCall.h" |
#include "bindings/core/v8/ScriptState.h" |
-#include "bindings/core/v8/V8ScriptRunner.h" |
#include "core/clipboard/Pasteboard.h" |
#include "core/dom/ExecutionContext.h" |
#include "core/events/Event.h" |
@@ -49,6 +49,7 @@ |
#include "platform/ContextMenu.h" |
#include "platform/ContextMenuItem.h" |
#include "platform/HostWindow.h" |
+#include "platform/ScriptForbiddenScope.h" |
#include "platform/SharedBuffer.h" |
#include "platform/UserGestureIndicator.h" |
#include "platform/network/ResourceError.h" |
@@ -59,9 +60,9 @@ |
class FrontendMenuProvider final : public ContextMenuProvider { |
public: |
- static PassRefPtrWillBeRawPtr<FrontendMenuProvider> create(DevToolsHost* devtoolsHost, const Vector<ContextMenuItem>& items) |
- { |
- return adoptRefWillBeNoop(new FrontendMenuProvider(devtoolsHost, items)); |
+ static PassRefPtrWillBeRawPtr<FrontendMenuProvider> create(DevToolsHost* devtoolsHost, ScriptValue devtoolsApiObject, const Vector<ContextMenuItem>& items) |
+ { |
+ return adoptRefWillBeNoop(new FrontendMenuProvider(devtoolsHost, devtoolsApiObject, items)); |
} |
~FrontendMenuProvider() override |
@@ -78,13 +79,17 @@ |
void disconnect() |
{ |
+ m_devtoolsApiObject = ScriptValue(); |
m_devtoolsHost = nullptr; |
} |
void contextMenuCleared() override |
{ |
if (m_devtoolsHost) { |
- m_devtoolsHost->evaluateScript("DevToolsAPI.contextMenuCleared()"); |
+ if (!ScriptForbiddenScope::isScriptForbidden()) { |
+ ScriptFunctionCall function(m_devtoolsApiObject, "contextMenuCleared"); |
+ function.call(); |
+ } |
m_devtoolsHost->clearMenuProvider(); |
m_devtoolsHost = nullptr; |
} |
@@ -101,18 +106,28 @@ |
{ |
if (!m_devtoolsHost) |
return; |
+ |
+ UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); |
int itemNumber = item->action() - ContextMenuItemBaseCustomTag; |
- m_devtoolsHost->evaluateScript("DevToolsAPI.contextMenuItemSelected(" + String::number(itemNumber) + ")"); |
+ |
+ if (!ScriptForbiddenScope::isScriptForbidden()) { |
+ ScriptFunctionCall function(m_devtoolsApiObject, "contextMenuItemSelected"); |
+ function.appendArgument(itemNumber); |
+ function.call(); |
+ } |
} |
private: |
- FrontendMenuProvider(DevToolsHost* devtoolsHost, const Vector<ContextMenuItem>& items) |
+ FrontendMenuProvider(DevToolsHost* devtoolsHost, ScriptValue devtoolsApiObject, const Vector<ContextMenuItem>& items) |
: m_devtoolsHost(devtoolsHost) |
+ , m_devtoolsApiObject(devtoolsApiObject) |
, m_items(items) |
{ |
} |
RawPtrWillBeMember<DevToolsHost> m_devtoolsHost; |
+ ScriptValue m_devtoolsApiObject; |
+ |
Vector<ContextMenuItem> m_items; |
}; |
@@ -132,19 +147,6 @@ |
{ |
visitor->trace(m_frontendFrame); |
visitor->trace(m_menuProvider); |
-} |
- |
-void DevToolsHost::evaluateScript(const String& expression) |
-{ |
- if (!m_frontendFrame) |
- return; |
- ScriptState* scriptState = ScriptState::forMainWorld(m_frontendFrame); |
- if (!scriptState) |
- return; |
- ScriptState::Scope scope(scriptState); |
- UserGestureIndicator gestureIndicator(DefinitelyProcessingNewUserGesture); |
- v8::Local<v8::String> source = v8AtomicString(scriptState->isolate(), expression.utf8().data()); |
- V8ScriptRunner::compileAndRunInternalScript(source, scriptState->isolate(), String(), TextPosition()); |
} |
void DevToolsHost::disconnectClient() |
@@ -216,7 +218,13 @@ |
void DevToolsHost::showContextMenu(LocalFrame* targetFrame, float x, float y, const Vector<ContextMenuItem>& items) |
{ |
ASSERT(m_frontendFrame); |
- RefPtrWillBeRawPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, items); |
+ ScriptState* frontendScriptState = ScriptState::forMainWorld(m_frontendFrame); |
+ if (!frontendScriptState) |
+ return; |
+ ScriptValue devtoolsApiObject = frontendScriptState->getFromGlobalObject("DevToolsAPI"); |
+ ASSERT(devtoolsApiObject.isObject()); |
+ |
+ RefPtrWillBeRawPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, devtoolsApiObject, items); |
m_menuProvider = menuProvider.get(); |
float zoom = targetFrame->pageZoomFactor(); |
if (m_client) |