diff --git a/engine/core/page/Page.cpp b/engine/core/page/Page.cpp index 9ce87b2ad33..a89446e31fa 100644 --- a/engine/core/page/Page.cpp +++ b/engine/core/page/Page.cpp @@ -79,7 +79,6 @@ Page::Page(PageClients& pageClients, ServiceProvider& services) , m_isPainting(false) #endif , m_frameHost(FrameHost::create(*this, services)) - , m_inspectorHost(0) { ASSERT(m_editorClient); diff --git a/engine/core/page/Page.h b/engine/core/page/Page.h index 8352e52c172..03b074e41a5 100644 --- a/engine/core/page/Page.h +++ b/engine/core/page/Page.h @@ -36,11 +36,6 @@ #include "sky/engine/wtf/Noncopyable.h" #include "sky/engine/wtf/text/WTFString.h" -// FIXME: Page should not need to know anything about InspectorHost. -namespace inspector { -class InspectorHost; -} - namespace blink { class AutoscrollController; @@ -90,11 +85,6 @@ public: FrameHost& frameHost() const { return *m_frameHost; } - // FIXME(sky): This is only needed by PageDebuggerAgent to be able to look - // up the InspectorHost from the frame associated with a v8 context. - inspector::InspectorHost* inspectorHost() const { return m_inspectorHost; } - void setInspectorHost(inspector::InspectorHost* host) { m_inspectorHost = host; } - void setNeedsRecalcStyleInAllFrames(); EditorClient& editorClient() const { return *m_editorClient; } @@ -216,7 +206,6 @@ private: // A pointer to all the interfaces provided to in-process Frames for this Page. // FIXME: Most of the members of Page should move onto FrameHost. OwnPtr m_frameHost; - inspector::InspectorHost* m_inspectorHost; }; } // namespace blink diff --git a/engine/v8_inspector/PageScriptDebugServer.cpp b/engine/v8_inspector/PageScriptDebugServer.cpp index 2b549d812a7..f52dfc74925 100644 --- a/engine/v8_inspector/PageScriptDebugServer.cpp +++ b/engine/v8_inspector/PageScriptDebugServer.cpp @@ -161,6 +161,11 @@ void PageScriptDebugServer::setClientMessageLoop(PassOwnPtr c m_clientMessageLoop = clientMessageLoop; } +void PageScriptDebugServer::setInspectorHostResolver(PassOwnPtr resolver) +{ + m_inspectorHostResolver = resolver; +} + void PageScriptDebugServer::compileScript(ScriptState* scriptState, const String& expression, const String& sourceURL, String* scriptId, String* exceptionDetailsText, int* lineNumber, int* columnNumber, RefPtr* stackTrace) { ExecutionContext* executionContext = scriptState->executionContext(); @@ -193,18 +198,16 @@ void PageScriptDebugServer::runScript(ScriptState* scriptState, const String& sc ScriptDebugListener* PageScriptDebugServer::getDebugListenerForContext(v8::Handle context) { - v8::HandleScope scope(m_isolate); - LocalFrame* frame = retrieveFrameWithGlobalObjectCheck(context); - if (!frame) + inspector::InspectorHost* inspectorHost = m_inspectorHostResolver->inspectorHostFor(context); + if (!inspectorHost) return 0; - return m_listenersMap.get(frame->page()->inspectorHost()); + return m_listenersMap.get(inspectorHost); } void PageScriptDebugServer::runMessageLoopOnPause(v8::Handle context) { - v8::HandleScope scope(m_isolate); - LocalFrame* frame = retrieveFrameWithGlobalObjectCheck(context); - m_pausedHost = frame->page()->inspectorHost(); + m_pausedHost = m_inspectorHostResolver->inspectorHostFor(context); + ASSERT(m_pausedHost); // Wait for continue or step command. m_clientMessageLoop->run(m_pausedHost); diff --git a/engine/v8_inspector/PageScriptDebugServer.h b/engine/v8_inspector/PageScriptDebugServer.h index 351145387c4..03d6d1e7e0d 100644 --- a/engine/v8_inspector/PageScriptDebugServer.h +++ b/engine/v8_inspector/PageScriptDebugServer.h @@ -68,6 +68,13 @@ public: }; void setClientMessageLoop(PassOwnPtr); + class InspectorHostResolver { + public: + virtual ~InspectorHostResolver() { } + virtual inspector::InspectorHost* inspectorHostFor(v8::Handle) = 0; + }; + void setInspectorHostResolver(PassOwnPtr); + virtual void compileScript(ScriptState*, const String& expression, const String& sourceURL, String* scriptId, String* exceptionDetailsText, int* lineNumber, int* columnNumber, RefPtr* stackTrace) override; virtual void clearCompiledScripts() override; virtual void runScript(ScriptState*, const String& scriptId, ScriptValue* result, bool* wasThrown, String* exceptionDetailsText, int* lineNumber, int* columnNumber, RefPtr* stackTrace) override; @@ -91,6 +98,7 @@ private: typedef HashMap ListenersMap; ListenersMap m_listenersMap; OwnPtr m_clientMessageLoop; + OwnPtr m_inspectorHostResolver; inspector::InspectorHost* m_pausedHost; HashMap m_compiledScriptURLs; diff --git a/engine/v8_inspector/inspector_backend_mojo.cc b/engine/v8_inspector/inspector_backend_mojo.cc index 9ab141afa3c..46ee3c12eb5 100644 --- a/engine/v8_inspector/inspector_backend_mojo.cc +++ b/engine/v8_inspector/inspector_backend_mojo.cc @@ -72,6 +72,19 @@ class MessageLoopAdaptor : public PageScriptDebugServer::ClientMessageLoop { scoped_ptr run_loop_; }; +class InspectorHostResolverImpl : public PageScriptDebugServer::InspectorHostResolver { + public: + explicit InspectorHostResolverImpl(inspector::InspectorHost* host) : host_(host) { } + ~InspectorHostResolverImpl() override { } + inspector::InspectorHost* inspectorHostFor(v8::Handle context) override { + if (context == host_->GetContext()) + return host_; + return nullptr; + } + private: + inspector::InspectorHost* host_; +}; + InspectorBackendMojoImpl::InspectorBackendMojoImpl( inspector::InspectorHost* host) : host_(host) { @@ -96,6 +109,9 @@ void InspectorBackendMojoImpl::Connect() { PageScriptDebugServer::setMainThreadIsolate(host_->GetIsolate()); OwnPtr message_loop = adoptPtr(new MessageLoopAdaptor); PageScriptDebugServer::shared().setClientMessageLoop(message_loop.release()); + OwnPtr host_resolver = + adoptPtr(new InspectorHostResolverImpl(host_)); + PageScriptDebugServer::shared().setInspectorHostResolver(host_resolver.release()); // AgentRegistry used to do this, but we don't need it for one agent. script_manager_ = InjectedScriptManager::createForPage();