Index: Source/web/WebSharedWorkerImpl.cpp |
diff --git a/Source/web/WebSharedWorkerImpl.cpp b/Source/web/WebSharedWorkerImpl.cpp |
index f570bad9ed14a0843345b2f5992da681f491e1c3..7b8ea29ef22452d745ddc55ebb840da2fdc58ef8 100644 |
--- a/Source/web/WebSharedWorkerImpl.cpp |
+++ b/Source/web/WebSharedWorkerImpl.cpp |
@@ -61,6 +61,7 @@ |
#include "public/platform/WebString.h" |
#include "public/platform/WebURL.h" |
#include "public/platform/WebURLRequest.h" |
+#include "public/web/WebDevToolsAgent.h" |
#include "public/web/WebFrame.h" |
#include "public/web/WebSettings.h" |
#include "public/web/WebView.h" |
@@ -159,7 +160,7 @@ WebSharedWorkerImpl::WebSharedWorkerImpl(WebSharedWorkerClient* client) |
, m_client(WeakReference<WebSharedWorkerClient>::create(client)) |
, m_clientWeakPtr(WeakPtr<WebSharedWorkerClient>(m_client)) |
, m_pauseWorkerContextOnStart(false) |
- , m_attachDevToolsOnStart(false) |
+ , m_isPausedOnStart(false) |
{ |
initializeWebKitStaticValues(); |
} |
@@ -207,6 +208,7 @@ void WebSharedWorkerImpl::initializeLoader(const WebURL& url) |
// is created (similar to RenderThread::OnCreateNewView). |
m_mainFrame = WebLocalFrame::create(this); |
m_webView->setMainFrame(m_mainFrame); |
+ m_webView->setDevToolsAgentClient(this); |
WebLocalFrameImpl* webFrame = toWebLocalFrameImpl(m_webView->mainFrame()); |
@@ -227,6 +229,35 @@ WebApplicationCacheHost* WebSharedWorkerImpl::createApplicationCacheHost(WebLoca |
void WebSharedWorkerImpl::didFinishDocumentLoad(WebLocalFrame* frame) |
{ |
+ // If we were asked to pause worker context on start and wait for debugger then it is the good time to do that. |
+ client()->workerReadyForInspection(); |
+ if (m_pauseWorkerContextOnStart) { |
+ m_isPausedOnStart = true; |
+ return; |
+ } |
+ startScriptLoader(frame); |
+} |
+ |
+void WebSharedWorkerImpl::sendMessageToInspectorFrontend(const WebString& message) |
+{ |
+ client()->dispatchDevToolsMessage(message); |
+} |
+ |
+void WebSharedWorkerImpl::resumeStartup() |
+{ |
+ bool isPausedOnStart = m_isPausedOnStart; |
+ m_isPausedOnStart = false; |
+ if (isPausedOnStart) |
+ startScriptLoader(toWebLocalFrameImpl(m_mainFrame)); |
+} |
+ |
+void WebSharedWorkerImpl::saveAgentRuntimeState(const WebString& inspectorState) |
+{ |
+ client()->saveDevToolsAgentState(inspectorState); |
+} |
+ |
+void WebSharedWorkerImpl::startScriptLoader(WebLocalFrame* frame) |
+{ |
ASSERT(!m_loadingDocument); |
ASSERT(!m_mainScriptLoader); |
m_mainScriptLoader = Loader::create(); |
@@ -252,11 +283,6 @@ void WebSharedWorkerImpl::reportConsoleMessage(PassRefPtrWillBeRawPtr<ConsoleMes |
void WebSharedWorkerImpl::postMessageToPageInspector(const String& message) |
{ |
- // Note that we need to keep the closure creation on a separate line so |
- // that the temporary created by isolatedCopy() will always be destroyed |
- // before the copy in the closure is used on the main thread. |
- const Closure& boundFunction = bind(&WebSharedWorkerClient::dispatchDevToolsMessage, m_clientWeakPtr, message.isolatedCopy()); |
- callOnMainThread(boundFunction); |
toWebLocalFrameImpl(m_mainFrame)->frame()->document()->postInspectorTask(createCrossThreadTask(&WebSharedWorkerImpl::postMessageToPageInspectorOnMainThread, this, message)); |
} |
@@ -271,11 +297,6 @@ void WebSharedWorkerImpl::postMessageToPageInspectorOnMainThread(const String& m |
void WebSharedWorkerImpl::updateInspectorStateCookie(const String& cookie) |
{ |
- // Note that we need to keep the closure creation on a separate line so |
- // that the temporary created by isolatedCopy() will always be destroyed |
- // before the copy in the closure is used on the main thread. |
- const Closure& boundFunction = bind(&WebSharedWorkerClient::saveDevToolsAgentState, m_clientWeakPtr, cookie.isolatedCopy()); |
- callOnMainThread(boundFunction); |
} |
void WebSharedWorkerImpl::workerGlobalScopeClosed() |
@@ -353,11 +374,6 @@ void WebSharedWorkerImpl::didReceiveScriptLoaderResponse() |
client()->selectAppCacheID(m_mainScriptLoader->appCacheID()); |
} |
-static void connectToWorkerContextInspectorTask(ExecutionContext* context, bool) |
-{ |
- toWorkerGlobalScope(context)->workerInspectorController()->connectFrontend(); |
-} |
- |
void WebSharedWorkerImpl::onScriptLoaderFinished() |
{ |
ASSERT(m_loadingDocument); |
@@ -374,7 +390,12 @@ void WebSharedWorkerImpl::onScriptLoaderFinished() |
delete this; |
return; |
} |
- WorkerThreadStartMode startMode = m_pauseWorkerContextOnStart ? PauseWorkerGlobalScopeOnStart : DontPauseWorkerGlobalScopeOnStart; |
+ |
+ Document* document = toWebLocalFrameImpl(m_mainFrame)->frame()->document(); |
+ WorkerThreadStartMode startMode = DontPauseWorkerGlobalScopeOnStart; |
+ if (InspectorInstrumentation::shouldPauseDedicatedWorkerOnStart(document)) |
horo
2014/09/04 05:44:02
nit: It is better to rename "shouldPauseDedicatedW
|
+ startMode = PauseWorkerGlobalScopeOnStart; |
+ |
OwnPtrWillBeRawPtr<WorkerClients> workerClients = WorkerClients::create(); |
provideLocalFileSystemToWorker(workerClients.get(), LocalFileSystemClient::create()); |
provideDatabaseClientToWorker(workerClients.get(), DatabaseClientImpl::create()); |
@@ -385,15 +406,10 @@ void WebSharedWorkerImpl::onScriptLoaderFinished() |
InspectorInstrumentation::scriptImported(m_loadingDocument.get(), m_mainScriptLoader->identifier(), m_mainScriptLoader->script()); |
m_mainScriptLoader.clear(); |
- if (m_attachDevToolsOnStart) |
- workerThread()->postDebuggerTask(createCrossThreadTask(connectToWorkerContextInspectorTask, true)); |
- |
workerThread()->start(); |
m_workerInspectorProxy->workerThreadCreated(m_loadingDocument.get(), workerThread(), m_url); |
- if (client()) { |
+ if (client()) |
client()->workerScriptLoaded(); |
- client()->workerReadyForInspection(); |
- } |
} |
void WebSharedWorkerImpl::terminateWorkerContext() |
@@ -411,70 +427,38 @@ void WebSharedWorkerImpl::pauseWorkerContextOnStart() |
m_pauseWorkerContextOnStart = true; |
} |
-static void resumeWorkerContextTask(ExecutionContext* context, bool) |
-{ |
- toWorkerGlobalScope(context)->workerInspectorController()->resume(); |
-} |
- |
void WebSharedWorkerImpl::resumeWorkerContext() |
{ |
- m_pauseWorkerContextOnStart = false; |
- if (workerThread()) |
- workerThread()->postDebuggerTask(createCrossThreadTask(resumeWorkerContextTask, true)); |
-} |
- |
-void WebSharedWorkerImpl::attachDevTools() |
-{ |
- if (workerThread()) |
- workerThread()->postDebuggerTask(createCrossThreadTask(connectToWorkerContextInspectorTask, true)); |
- else |
- m_attachDevToolsOnStart = true; |
} |
void WebSharedWorkerImpl::attachDevTools(const WebString& hostId) |
{ |
- attachDevTools(); |
-} |
- |
-static void reconnectToWorkerContextInspectorTask(ExecutionContext* context, const String& savedState) |
-{ |
- WorkerInspectorController* ic = toWorkerGlobalScope(context)->workerInspectorController(); |
- ic->restoreInspectorStateFromCookie(savedState); |
- ic->resume(); |
-} |
- |
-void WebSharedWorkerImpl::reattachDevTools(const WebString& savedState) |
-{ |
- workerThread()->postDebuggerTask(createCrossThreadTask(reconnectToWorkerContextInspectorTask, String(savedState))); |
+ WebDevToolsAgent* devtoolsAgent = m_webView->devToolsAgent(); |
+ if (devtoolsAgent) |
+ devtoolsAgent->attach(hostId); |
} |
void WebSharedWorkerImpl::reattachDevTools(const WebString& hostId, const WebString& savedState) |
{ |
- reattachDevTools(savedState); |
-} |
- |
-static void disconnectFromWorkerContextInspectorTask(ExecutionContext* context, bool) |
-{ |
- toWorkerGlobalScope(context)->workerInspectorController()->disconnectFrontend(); |
+ WebDevToolsAgent* devtoolsAgent = m_webView->devToolsAgent(); |
+ if (devtoolsAgent) |
+ devtoolsAgent->reattach(hostId, savedState); |
} |
void WebSharedWorkerImpl::detachDevTools() |
{ |
- m_attachDevToolsOnStart = false; |
- workerThread()->postDebuggerTask(createCrossThreadTask(disconnectFromWorkerContextInspectorTask, true)); |
-} |
- |
-static void dispatchOnInspectorBackendTask(ExecutionContext* context, const String& message) |
-{ |
- toWorkerGlobalScope(context)->workerInspectorController()->dispatchMessageFromFrontend(message); |
+ WebDevToolsAgent* devtoolsAgent = m_webView->devToolsAgent(); |
+ if (devtoolsAgent) |
+ devtoolsAgent->detach(); |
} |
void WebSharedWorkerImpl::dispatchDevToolsMessage(const WebString& message) |
{ |
if (m_askedToTerminate) |
return; |
- workerThread()->postDebuggerTask(createCrossThreadTask(dispatchOnInspectorBackendTask, String(message))); |
- workerThread()->interruptAndDispatchInspectorCommands(); |
+ WebDevToolsAgent* devtoolsAgent = m_webView->devToolsAgent(); |
+ if (devtoolsAgent) |
+ devtoolsAgent->dispatchOnInspectorBackend(message); |
} |
WebSharedWorker* WebSharedWorker::create(WebSharedWorkerClient* client) |