Commit 8139c8f9 authored by Alexey Kozyatinskiy's avatar Alexey Kozyatinskiy Committed by Commit Bot

DevTools: make shared worker connect pausable..

..otherwise we ignore connection event when we paused at shared worker
initialization.
This bug was introduced by workers refactoring [1].

[1] https://chromium-review.googlesource.com/c/chromium/src/+/1205802

R=dgozman@chromium.org

Bug: chromium:775132
Change-Id: I1d7c68d0c6339eaae4bd74c7a1953273f5ce8f2b
Reviewed-on: https://chromium-review.googlesource.com/1237249
Commit-Queue: Aleksey Kozyatinskiy <kozyatinskiy@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Reviewed-by: default avatarTsuyoshi Horo <horo@chromium.org>
Cr-Commit-Position: refs/heads/master@{#593037}
parent 9708f72a
debugger;
var globalVar = 2011; var globalVar = 2011;
onconnect = function(e) { onconnect = function(e) {
var port = e.ports[0]; var port = e.ports[0];
console.log('connected');
port.postMessage("pong"); port.postMessage("pong");
} }
...@@ -197,10 +197,9 @@ void WebSharedWorkerImpl::ConnectTaskOnWorkerThread( ...@@ -197,10 +197,9 @@ void WebSharedWorkerImpl::ConnectTaskOnWorkerThread(
DCHECK(worker_thread_->IsCurrentThread()); DCHECK(worker_thread_->IsCurrentThread());
WorkerGlobalScope* worker_global_scope = WorkerGlobalScope* worker_global_scope =
ToWorkerGlobalScope(worker_thread_->GlobalScope()); ToWorkerGlobalScope(worker_thread_->GlobalScope());
MessagePort* port = MessagePort::Create(*worker_global_scope);
port->Entangle(std::move(channel));
SECURITY_DCHECK(worker_global_scope->IsSharedWorkerGlobalScope()); SECURITY_DCHECK(worker_global_scope->IsSharedWorkerGlobalScope());
worker_global_scope->DispatchEvent(*CreateConnectEvent(port)); static_cast<SharedWorkerGlobalScope*>(worker_global_scope)
->ConnectPausable(std::move(channel));
} }
void WebSharedWorkerImpl::StartWorkerContext( void WebSharedWorkerImpl::StartWorkerContext(
......
...@@ -41,13 +41,6 @@ ...@@ -41,13 +41,6 @@
namespace blink { namespace blink {
MessageEvent* CreateConnectEvent(MessagePort* port) {
MessageEvent* event = MessageEvent::Create(new MessagePortArray(1, port),
String(), String(), port);
event->initEvent(EventTypeNames::connect, false, false);
return event;
}
SharedWorkerGlobalScope::SharedWorkerGlobalScope( SharedWorkerGlobalScope::SharedWorkerGlobalScope(
const String& name, const String& name,
std::unique_ptr<GlobalScopeCreationParams> creation_params, std::unique_ptr<GlobalScopeCreationParams> creation_params,
...@@ -79,6 +72,21 @@ void SharedWorkerGlobalScope::ImportModuleScript( ...@@ -79,6 +72,21 @@ void SharedWorkerGlobalScope::ImportModuleScript(
NOTREACHED(); NOTREACHED();
} }
void SharedWorkerGlobalScope::ConnectPausable(MessagePortChannel channel) {
if (IsContextPaused()) {
AddPausedCall(WTF::Bind(&SharedWorkerGlobalScope::ConnectPausable,
WrapWeakPersistent(this), std::move(channel)));
return;
}
MessagePort* port = MessagePort::Create(*this);
port->Entangle(std::move(channel));
MessageEvent* event = MessageEvent::Create(new MessagePortArray(1, port),
String(), String(), port);
event->initEvent(EventTypeNames::connect, false, false);
DispatchEvent(*event);
}
void SharedWorkerGlobalScope::ExceptionThrown(ErrorEvent* event) { void SharedWorkerGlobalScope::ExceptionThrown(ErrorEvent* event) {
WorkerGlobalScope::ExceptionThrown(event); WorkerGlobalScope::ExceptionThrown(event);
if (WorkerThreadDebugger* debugger = if (WorkerThreadDebugger* debugger =
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
#define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_SHARED_WORKER_GLOBAL_SCOPE_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_SHARED_WORKER_GLOBAL_SCOPE_H_
#include <memory> #include <memory>
#include "third_party/blink/public/common/messaging/message_port_channel.h"
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/workers/global_scope_creation_params.h" #include "third_party/blink/renderer/core/workers/global_scope_creation_params.h"
#include "third_party/blink/renderer/core/workers/worker_global_scope.h" #include "third_party/blink/renderer/core/workers/worker_global_scope.h"
...@@ -39,7 +40,6 @@ ...@@ -39,7 +40,6 @@
namespace blink { namespace blink {
class MessageEvent;
class SharedWorkerThread; class SharedWorkerThread;
class SharedWorkerGlobalScope final : public WorkerGlobalScope { class SharedWorkerGlobalScope final : public WorkerGlobalScope {
...@@ -67,6 +67,8 @@ class SharedWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -67,6 +67,8 @@ class SharedWorkerGlobalScope final : public WorkerGlobalScope {
DEFINE_ATTRIBUTE_EVENT_LISTENER(connect); DEFINE_ATTRIBUTE_EVENT_LISTENER(connect);
String name() const { return name_; } String name() const { return name_; }
void ConnectPausable(MessagePortChannel channel);
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
...@@ -74,9 +76,6 @@ class SharedWorkerGlobalScope final : public WorkerGlobalScope { ...@@ -74,9 +76,6 @@ class SharedWorkerGlobalScope final : public WorkerGlobalScope {
const String name_; const String name_;
}; };
CORE_EXPORT MessageEvent* CreateConnectEvent(MessagePort*);
} // namespace blink } // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_SHARED_WORKER_GLOBAL_SCOPE_H_ #endif // THIRD_PARTY_BLINK_RENDERER_CORE_WORKERS_SHARED_WORKER_GLOBAL_SCOPE_H_
...@@ -327,7 +327,7 @@ void WorkerGlobalScope::EvaluateClassicScriptPausable( ...@@ -327,7 +327,7 @@ void WorkerGlobalScope::EvaluateClassicScriptPausable(
std::unique_ptr<Vector<char>> cached_meta_data, std::unique_ptr<Vector<char>> cached_meta_data,
const v8_inspector::V8StackTraceId& stack_id) { const v8_inspector::V8StackTraceId& stack_id) {
if (IsContextPaused()) { if (IsContextPaused()) {
paused_calls_.push_back(WTF::Bind( AddPausedCall(WTF::Bind(
&WorkerGlobalScope::EvaluateClassicScriptPausable, &WorkerGlobalScope::EvaluateClassicScriptPausable,
WrapWeakPersistent(this), script_url, access_control_status, WrapWeakPersistent(this), script_url, access_control_status,
source_code, WTF::Passed(std::move(cached_meta_data)), stack_id)); source_code, WTF::Passed(std::move(cached_meta_data)), stack_id));
...@@ -347,10 +347,9 @@ void WorkerGlobalScope::ImportModuleScriptPausable( ...@@ -347,10 +347,9 @@ void WorkerGlobalScope::ImportModuleScriptPausable(
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
network::mojom::FetchCredentialsMode mode) { network::mojom::FetchCredentialsMode mode) {
if (IsContextPaused()) { if (IsContextPaused()) {
paused_calls_.push_back( AddPausedCall(WTF::Bind(&WorkerGlobalScope::ImportModuleScriptPausable,
WTF::Bind(&WorkerGlobalScope::ImportModuleScriptPausable, WrapWeakPersistent(this), module_url_record,
WrapWeakPersistent(this), module_url_record, WrapPersistent(outside_settings_object), mode));
WrapPersistent(outside_settings_object), mode));
return; return;
} }
ImportModuleScript(module_url_record, outside_settings_object, mode); ImportModuleScript(module_url_record, outside_settings_object, mode);
...@@ -359,9 +358,8 @@ void WorkerGlobalScope::ImportModuleScriptPausable( ...@@ -359,9 +358,8 @@ void WorkerGlobalScope::ImportModuleScriptPausable(
void WorkerGlobalScope::ReceiveMessagePausable( void WorkerGlobalScope::ReceiveMessagePausable(
BlinkTransferableMessage message) { BlinkTransferableMessage message) {
if (IsContextPaused()) { if (IsContextPaused()) {
paused_calls_.push_back( AddPausedCall(WTF::Bind(&WorkerGlobalScope::ReceiveMessagePausable,
WTF::Bind(&WorkerGlobalScope::ReceiveMessagePausable, WrapWeakPersistent(this), std::move(message)));
WrapWeakPersistent(this), std::move(message)));
return; return;
} }
...@@ -402,6 +400,10 @@ void WorkerGlobalScope::EvaluateClassicScript( ...@@ -402,6 +400,10 @@ void WorkerGlobalScope::EvaluateClassicScript(
ReportingProxy().DidEvaluateClassicScript(success); ReportingProxy().DidEvaluateClassicScript(success);
} }
void WorkerGlobalScope::AddPausedCall(base::OnceClosure closure) {
paused_calls_.push_back(std::move(closure));
}
WorkerGlobalScope::WorkerGlobalScope( WorkerGlobalScope::WorkerGlobalScope(
std::unique_ptr<GlobalScopeCreationParams> creation_params, std::unique_ptr<GlobalScopeCreationParams> creation_params,
WorkerThread* thread, WorkerThread* thread,
......
...@@ -188,6 +188,8 @@ class CORE_EXPORT WorkerGlobalScope ...@@ -188,6 +188,8 @@ class CORE_EXPORT WorkerGlobalScope
FetchClientSettingsObjectSnapshot* outside_settings_object, FetchClientSettingsObjectSnapshot* outside_settings_object,
network::mojom::FetchCredentialsMode) = 0; network::mojom::FetchCredentialsMode) = 0;
void AddPausedCall(base::OnceClosure closure);
private: private:
void SetWorkerSettings(std::unique_ptr<WorkerSettings>); void SetWorkerSettings(std::unique_ptr<WorkerSettings>);
......
...@@ -576,10 +576,18 @@ ...@@ -576,10 +576,18 @@
function callback() { function callback() {
const debuggerModel = SDK.targetManager.models(SDK.DebuggerModel)[0]; const debuggerModel = SDK.targetManager.models(SDK.DebuggerModel)[0];
if (debuggerModel.isPaused()) { if (debuggerModel.isPaused()) {
this.releaseControl(); SDK.consoleModel.addEventListener(SDK.ConsoleModel.Events.MessageAdded, onConsoleMessage, this);
debuggerModel.resume();
return; return;
} }
this._waitForScriptPause(this.releaseControl.bind(this)); this._waitForScriptPause(callback.bind(this));
}
function onConsoleMessage(event) {
const message = event.data.messageText;
if (message !== 'connected')
this.fail('Unexpected message: ' + message);
this.releaseControl();
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment