| Index: third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
|
| diff --git a/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp b/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
|
| index eee22eeb0a63a2fe22580022ebd5e21463fd0c9e..73c1e7125e2a29a22aedfa6f291e128ec39b8e17 100644
|
| --- a/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
|
| +++ b/third_party/WebKit/Source/modules/websockets/WorkerWebSocketChannel.cpp
|
| @@ -162,10 +162,12 @@ DEFINE_TRACE(WorkerWebSocketChannel) {
|
|
|
| Peer::Peer(Bridge* bridge,
|
| PassRefPtr<WorkerLoaderProxy> loader_proxy,
|
| + RefPtr<WebTaskRunner> worker_networking_task_runner,
|
| WorkerThreadLifecycleContext* worker_thread_lifecycle_context)
|
| : WorkerThreadLifecycleObserver(worker_thread_lifecycle_context),
|
| bridge_(bridge),
|
| loader_proxy_(std::move(loader_proxy)),
|
| + worker_networking_task_runner_(std::move(worker_networking_task_runner)),
|
| main_web_socket_channel_(nullptr) {
|
| DCHECK(IsMainThread());
|
| }
|
| @@ -242,7 +244,7 @@ static void WorkerGlobalScopeDidConnect(Bridge* bridge,
|
|
|
| void Peer::DidConnect(const String& subprotocol, const String& extensions) {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE, CrossThreadBind(&WorkerGlobalScopeDidConnect, bridge_,
|
| subprotocol, extensions));
|
| }
|
| @@ -255,7 +257,7 @@ static void WorkerGlobalScopeDidReceiveTextMessage(Bridge* bridge,
|
|
|
| void Peer::DidReceiveTextMessage(const String& payload) {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE, CrossThreadBind(&WorkerGlobalScopeDidReceiveTextMessage,
|
| bridge_, payload));
|
| }
|
| @@ -269,7 +271,7 @@ static void WorkerGlobalScopeDidReceiveBinaryMessage(
|
|
|
| void Peer::DidReceiveBinaryMessage(std::unique_ptr<Vector<char>> payload) {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE,
|
| CrossThreadBind(&WorkerGlobalScopeDidReceiveBinaryMessage, bridge_,
|
| WTF::Passed(std::move(payload))));
|
| @@ -283,7 +285,7 @@ static void WorkerGlobalScopeDidConsumeBufferedAmount(Bridge* bridge,
|
|
|
| void Peer::DidConsumeBufferedAmount(uint64_t consumed) {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE,
|
| CrossThreadBind(&WorkerGlobalScopeDidConsumeBufferedAmount, bridge_,
|
| consumed));
|
| @@ -296,7 +298,7 @@ static void WorkerGlobalScopeDidStartClosingHandshake(Bridge* bridge) {
|
|
|
| void Peer::DidStartClosingHandshake() {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE,
|
| CrossThreadBind(&WorkerGlobalScopeDidStartClosingHandshake, bridge_));
|
| }
|
| @@ -320,7 +322,7 @@ void Peer::DidClose(
|
| main_web_socket_channel_->Disconnect();
|
| main_web_socket_channel_ = nullptr;
|
| }
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE,
|
| CrossThreadBind(&WorkerGlobalScopeDidClose, bridge_,
|
| closing_handshake_completion, code, reason));
|
| @@ -333,7 +335,7 @@ static void WorkerGlobalScopeDidError(Bridge* bridge) {
|
|
|
| void Peer::DidError() {
|
| DCHECK(IsMainThread());
|
| - loader_proxy_->PostTaskToWorkerGlobalScope(
|
| + worker_networking_task_runner_->PostTask(
|
| BLINK_FROM_HERE, CrossThreadBind(&WorkerGlobalScopeDidError, bridge_));
|
| }
|
|
|
| @@ -356,8 +358,9 @@ Bridge::Bridge(WebSocketChannelClient* client,
|
| WorkerGlobalScope& worker_global_scope)
|
| : client_(client),
|
| worker_global_scope_(worker_global_scope),
|
| - loader_proxy_(worker_global_scope_->GetThread()->GetWorkerLoaderProxy()) {
|
| -}
|
| + loader_proxy_(worker_global_scope_->GetThread()->GetWorkerLoaderProxy()),
|
| + parent_frame_task_runners_(
|
| + worker_global_scope_->GetThread()->GetParentFrameTaskRunners()) {}
|
|
|
| Bridge::~Bridge() {
|
| DCHECK(!peer_);
|
| @@ -366,6 +369,7 @@ Bridge::~Bridge() {
|
| void Bridge::ConnectOnMainThread(
|
| std::unique_ptr<SourceLocation> location,
|
| RefPtr<WorkerLoaderProxy> loader_proxy,
|
| + RefPtr<WebTaskRunner> worker_networking_task_runner,
|
| WorkerThreadLifecycleContext* worker_thread_lifecycle_context,
|
| const KURL& url,
|
| const String& protocol,
|
| @@ -376,7 +380,9 @@ void Bridge::ConnectOnMainThread(
|
| loader_proxy->GetThreadableLoadingContext();
|
| if (!loading_context)
|
| return;
|
| - Peer* peer = new Peer(this, loader_proxy_, worker_thread_lifecycle_context);
|
| + Peer* peer =
|
| + new Peer(this, loader_proxy_, std::move(worker_networking_task_runner),
|
| + worker_thread_lifecycle_context);
|
| if (peer->Initialize(std::move(location), loading_context)) {
|
| peer_ = peer;
|
| sync_helper->SetConnectRequestResult(peer_->Connect(url, protocol));
|
| @@ -390,14 +396,19 @@ bool Bridge::Connect(std::unique_ptr<SourceLocation> location,
|
| // Wait for completion of the task on the main thread because the mixed
|
| // content check must synchronously be conducted.
|
| WebSocketChannelSyncHelper sync_helper;
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE,
|
| - CrossThreadBind(
|
| - &Bridge::ConnectOnMainThread, WrapCrossThreadPersistent(this),
|
| - WTF::Passed(location->Clone()), loader_proxy_,
|
| - WrapCrossThreadPersistent(worker_global_scope_->GetThread()
|
| - ->GetWorkerThreadLifecycleContext()),
|
| - url, protocol, CrossThreadUnretained(&sync_helper)));
|
| + RefPtr<WebTaskRunner> worker_networking_task_runner =
|
| + TaskRunnerHelper::Get(TaskType::kNetworking, worker_global_scope_.Get());
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(
|
| + BLINK_FROM_HERE,
|
| + CrossThreadBind(&Bridge::ConnectOnMainThread,
|
| + WrapCrossThreadPersistent(this),
|
| + WTF::Passed(location->Clone()), loader_proxy_,
|
| + std::move(worker_networking_task_runner),
|
| + WrapCrossThreadPersistent(
|
| + worker_global_scope_->GetThread()
|
| + ->GetWorkerThreadLifecycleContext()),
|
| + url, protocol, CrossThreadUnretained(&sync_helper)));
|
| sync_helper.Wait();
|
| return sync_helper.ConnectRequestResult();
|
| }
|
| @@ -410,9 +421,10 @@ void Bridge::Send(const CString& message) {
|
| memcpy(data->data(), static_cast<const char*>(message.data()),
|
| message.length());
|
|
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE, CrossThreadBind(&Peer::SendTextAsCharVector, peer_,
|
| - WTF::Passed(std::move(data))));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE,
|
| + CrossThreadBind(&Peer::SendTextAsCharVector, peer_,
|
| + WTF::Passed(std::move(data))));
|
| }
|
|
|
| void Bridge::Send(const DOMArrayBuffer& binary_data,
|
| @@ -428,39 +440,42 @@ void Bridge::Send(const DOMArrayBuffer& binary_data,
|
| static_cast<const char*>(binary_data.Data()) + byte_offset,
|
| byte_length);
|
|
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE, CrossThreadBind(&Peer::SendBinaryAsCharVector, peer_,
|
| - WTF::Passed(std::move(data))));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE,
|
| + CrossThreadBind(&Peer::SendBinaryAsCharVector, peer_,
|
| + WTF::Passed(std::move(data))));
|
| }
|
|
|
| void Bridge::Send(PassRefPtr<BlobDataHandle> data) {
|
| DCHECK(peer_);
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE,
|
| - CrossThreadBind(&Peer::SendBlob, peer_, std::move(data)));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE,
|
| + CrossThreadBind(&Peer::SendBlob, peer_, std::move(data)));
|
| }
|
|
|
| void Bridge::Close(int code, const String& reason) {
|
| DCHECK(peer_);
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE, CrossThreadBind(&Peer::Close, peer_, code, reason));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE,
|
| + CrossThreadBind(&Peer::Close, peer_, code, reason));
|
| }
|
|
|
| void Bridge::Fail(const String& reason,
|
| MessageLevel level,
|
| std::unique_ptr<SourceLocation> location) {
|
| DCHECK(peer_);
|
| - loader_proxy_->PostTaskToLoader(
|
| - BLINK_FROM_HERE, CrossThreadBind(&Peer::Fail, peer_, reason, level,
|
| - WTF::Passed(location->Clone())));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE,
|
| + CrossThreadBind(&Peer::Fail, peer_, reason, level,
|
| + WTF::Passed(location->Clone())));
|
| }
|
|
|
| void Bridge::Disconnect() {
|
| if (!peer_)
|
| return;
|
|
|
| - loader_proxy_->PostTaskToLoader(BLINK_FROM_HERE,
|
| - CrossThreadBind(&Peer::Disconnect, peer_));
|
| + parent_frame_task_runners_->Get(TaskType::kNetworking)
|
| + ->PostTask(BLINK_FROM_HERE, CrossThreadBind(&Peer::Disconnect, peer_));
|
|
|
| client_ = nullptr;
|
| peer_ = nullptr;
|
|
|