Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/renderer/worker_thread_dispatcher.h" | 5 #include "extensions/renderer/worker_thread_dispatcher.h" |
| 6 | 6 |
| 7 #include "base/threading/thread_local.h" | 7 #include "base/threading/thread_local.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "content/public/child/worker_thread.h" | 9 #include "content/public/child/worker_thread.h" |
| 10 #include "content/public/renderer/render_thread.h" | 10 #include "content/public/renderer/render_thread.h" |
| 11 #include "extensions/common/extension_messages.h" | 11 #include "extensions/common/extension_messages.h" |
| 12 #include "extensions/renderer/extension_bindings_system.h" | |
| 13 #include "extensions/renderer/js_extension_bindings_system.h" | |
| 12 #include "extensions/renderer/service_worker_data.h" | 14 #include "extensions/renderer/service_worker_data.h" |
| 13 | 15 |
| 14 namespace extensions { | 16 namespace extensions { |
| 15 | 17 |
| 16 namespace { | 18 namespace { |
| 17 | 19 |
| 18 base::LazyInstance<WorkerThreadDispatcher> g_instance = | 20 base::LazyInstance<WorkerThreadDispatcher> g_instance = |
| 19 LAZY_INSTANCE_INITIALIZER; | 21 LAZY_INSTANCE_INITIALIZER; |
| 20 base::LazyInstance<base::ThreadLocalPointer<extensions::ServiceWorkerData>> | 22 base::LazyInstance<base::ThreadLocalPointer<extensions::ServiceWorkerData>> |
| 21 g_data_tls = LAZY_INSTANCE_INITIALIZER; | 23 g_data_tls = LAZY_INSTANCE_INITIALIZER; |
| 22 | 24 |
| 23 void OnResponseOnWorkerThread(int request_id, | 25 void OnResponseOnWorkerThread(int request_id, |
| 24 bool succeeded, | 26 bool succeeded, |
| 25 const std::unique_ptr<base::ListValue>& response, | 27 const std::unique_ptr<base::ListValue>& response, |
| 26 const std::string& error) { | 28 const std::string& error) { |
| 29 // TODO(devlin): Using the RequestSender directly here won't work with | |
| 30 // native bindings. We should instead be going through the bindings system. | |
|
lazyboy
2016/11/19 03:23:01
nit: expand this a bit to make it clearer: as far
Devlin
2016/11/21 19:29:41
Done.
| |
| 27 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 31 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 28 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( | 32 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( |
| 29 request_id, data->service_worker_version_id(), succeeded, *response, | 33 request_id, data->service_worker_version_id(), succeeded, *response, |
| 30 error); | 34 error); |
| 31 } | 35 } |
| 32 | 36 |
| 37 ServiceWorkerData* GetServiceWorkerData() { | |
| 38 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | |
| 39 DCHECK(data); | |
| 40 return data; | |
| 41 } | |
| 42 | |
| 33 } // namespace | 43 } // namespace |
| 34 | 44 |
| 35 WorkerThreadDispatcher::WorkerThreadDispatcher() {} | 45 WorkerThreadDispatcher::WorkerThreadDispatcher() {} |
| 36 WorkerThreadDispatcher::~WorkerThreadDispatcher() {} | 46 WorkerThreadDispatcher::~WorkerThreadDispatcher() {} |
| 37 | 47 |
| 38 WorkerThreadDispatcher* WorkerThreadDispatcher::Get() { | 48 WorkerThreadDispatcher* WorkerThreadDispatcher::Get() { |
| 39 return g_instance.Pointer(); | 49 return g_instance.Pointer(); |
| 40 } | 50 } |
| 41 | 51 |
| 42 void WorkerThreadDispatcher::Init(content::RenderThread* render_thread) { | 52 void WorkerThreadDispatcher::Init(content::RenderThread* render_thread) { |
| 43 DCHECK(render_thread); | 53 DCHECK(render_thread); |
| 44 DCHECK_EQ(content::RenderThread::Get(), render_thread); | 54 DCHECK_EQ(content::RenderThread::Get(), render_thread); |
| 45 DCHECK(!message_filter_); | 55 DCHECK(!message_filter_); |
| 46 message_filter_ = render_thread->GetSyncMessageFilter(); | 56 message_filter_ = render_thread->GetSyncMessageFilter(); |
| 47 render_thread->AddObserver(this); | 57 render_thread->AddObserver(this); |
| 48 } | 58 } |
| 49 | 59 |
| 50 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { | 60 // static |
| 51 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 61 ExtensionBindingsSystem* WorkerThreadDispatcher::GetBindingsSystem() { |
| 52 DCHECK(data); | 62 return GetServiceWorkerData()->bindings_system(); |
| 53 return data->v8_schema_registry(); | |
| 54 } | 63 } |
| 55 | 64 |
| 56 // static | 65 // static |
| 57 ServiceWorkerRequestSender* WorkerThreadDispatcher::GetRequestSender() { | 66 ServiceWorkerRequestSender* WorkerThreadDispatcher::GetRequestSender() { |
| 58 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 67 return static_cast<ServiceWorkerRequestSender*>( |
| 59 DCHECK(data); | 68 GetBindingsSystem()->GetRequestSender()); |
| 60 return data->request_sender(); | 69 } |
| 70 | |
| 71 // static | |
| 72 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { | |
| 73 return GetServiceWorkerData()->v8_schema_registry(); | |
| 61 } | 74 } |
| 62 | 75 |
| 63 bool WorkerThreadDispatcher::OnControlMessageReceived( | 76 bool WorkerThreadDispatcher::OnControlMessageReceived( |
| 64 const IPC::Message& message) { | 77 const IPC::Message& message) { |
| 65 bool handled = true; | 78 bool handled = true; |
| 66 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) | 79 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) |
| 67 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) | 80 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) |
| 68 IPC_MESSAGE_UNHANDLED(handled = false) | 81 IPC_MESSAGE_UNHANDLED(handled = false) |
| 69 IPC_END_MESSAGE_MAP() | 82 IPC_END_MESSAGE_MAP() |
| 70 return handled; | 83 return handled; |
| 71 } | 84 } |
| 72 | 85 |
| 73 bool WorkerThreadDispatcher::Send(IPC::Message* message) { | 86 bool WorkerThreadDispatcher::Send(IPC::Message* message) { |
| 74 return message_filter_->Send(message); | 87 return message_filter_->Send(message); |
| 75 } | 88 } |
| 76 | 89 |
| 77 void WorkerThreadDispatcher::OnResponseWorker(int worker_thread_id, | 90 void WorkerThreadDispatcher::OnResponseWorker(int worker_thread_id, |
| 78 int request_id, | 91 int request_id, |
| 79 bool succeeded, | 92 bool succeeded, |
| 80 const base::ListValue& response, | 93 const base::ListValue& response, |
| 81 const std::string& error) { | 94 const std::string& error) { |
| 82 content::WorkerThread::PostTask( | 95 content::WorkerThread::PostTask( |
| 83 worker_thread_id, | 96 worker_thread_id, |
| 84 base::Bind(&OnResponseOnWorkerThread, request_id, succeeded, | 97 base::Bind(&OnResponseOnWorkerThread, request_id, succeeded, |
| 85 // TODO(lazyboy): Can we avoid CreateDeepCopy()? | 98 // TODO(lazyboy): Can we avoid CreateDeepCopy()? |
| 86 base::Passed(response.CreateDeepCopy()), error)); | 99 base::Passed(response.CreateDeepCopy()), error)); |
| 87 } | 100 } |
| 88 | 101 |
| 89 void WorkerThreadDispatcher::AddWorkerData(int64_t service_worker_version_id) { | 102 void WorkerThreadDispatcher::AddWorkerData( |
| 103 int64_t service_worker_version_id, | |
| 104 ResourceBundleSourceMap* source_map) { | |
| 90 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 105 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 91 if (!data) { | 106 if (!data) { |
| 92 ServiceWorkerData* new_data = | 107 std::unique_ptr<ExtensionBindingsSystem> bindings_system = |
| 93 new ServiceWorkerData(this, service_worker_version_id); | 108 base::MakeUnique<JsExtensionBindingsSystem>( |
| 109 source_map, base::MakeUnique<ServiceWorkerRequestSender>( | |
| 110 this, service_worker_version_id)); | |
| 111 ServiceWorkerData* new_data = new ServiceWorkerData( | |
| 112 service_worker_version_id, std::move(bindings_system)); | |
| 94 g_data_tls.Pointer()->Set(new_data); | 113 g_data_tls.Pointer()->Set(new_data); |
| 95 } | 114 } |
| 96 } | 115 } |
| 97 | 116 |
| 98 void WorkerThreadDispatcher::RemoveWorkerData( | 117 void WorkerThreadDispatcher::RemoveWorkerData( |
| 99 int64_t service_worker_version_id) { | 118 int64_t service_worker_version_id) { |
| 100 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 119 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 101 if (data) { | 120 if (data) { |
| 102 DCHECK_EQ(service_worker_version_id, data->service_worker_version_id()); | 121 DCHECK_EQ(service_worker_version_id, data->service_worker_version_id()); |
| 103 delete data; | 122 delete data; |
| 104 g_data_tls.Pointer()->Set(nullptr); | 123 g_data_tls.Pointer()->Set(nullptr); |
| 105 } | 124 } |
| 106 } | 125 } |
| 107 | 126 |
| 108 } // namespace extensions | 127 } // namespace extensions |
| OLD | NEW |