| 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 // NativeExtensionBindingsSystem (since there is no associated RequestSender |
| 31 // in that case). We should instead be going |
| 32 // ExtensionBindingsSystem::HandleResponse(). |
| 27 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 33 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 28 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( | 34 WorkerThreadDispatcher::GetRequestSender()->HandleWorkerResponse( |
| 29 request_id, data->service_worker_version_id(), succeeded, *response, | 35 request_id, data->service_worker_version_id(), succeeded, *response, |
| 30 error); | 36 error); |
| 31 } | 37 } |
| 32 | 38 |
| 39 ServiceWorkerData* GetServiceWorkerData() { |
| 40 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 41 DCHECK(data); |
| 42 return data; |
| 43 } |
| 44 |
| 33 } // namespace | 45 } // namespace |
| 34 | 46 |
| 35 WorkerThreadDispatcher::WorkerThreadDispatcher() {} | 47 WorkerThreadDispatcher::WorkerThreadDispatcher() {} |
| 36 WorkerThreadDispatcher::~WorkerThreadDispatcher() {} | 48 WorkerThreadDispatcher::~WorkerThreadDispatcher() {} |
| 37 | 49 |
| 38 WorkerThreadDispatcher* WorkerThreadDispatcher::Get() { | 50 WorkerThreadDispatcher* WorkerThreadDispatcher::Get() { |
| 39 return g_instance.Pointer(); | 51 return g_instance.Pointer(); |
| 40 } | 52 } |
| 41 | 53 |
| 42 void WorkerThreadDispatcher::Init(content::RenderThread* render_thread) { | 54 void WorkerThreadDispatcher::Init(content::RenderThread* render_thread) { |
| 43 DCHECK(render_thread); | 55 DCHECK(render_thread); |
| 44 DCHECK_EQ(content::RenderThread::Get(), render_thread); | 56 DCHECK_EQ(content::RenderThread::Get(), render_thread); |
| 45 DCHECK(!message_filter_); | 57 DCHECK(!message_filter_); |
| 46 message_filter_ = render_thread->GetSyncMessageFilter(); | 58 message_filter_ = render_thread->GetSyncMessageFilter(); |
| 47 render_thread->AddObserver(this); | 59 render_thread->AddObserver(this); |
| 48 } | 60 } |
| 49 | 61 |
| 50 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { | 62 // static |
| 51 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 63 ExtensionBindingsSystem* WorkerThreadDispatcher::GetBindingsSystem() { |
| 52 DCHECK(data); | 64 return GetServiceWorkerData()->bindings_system(); |
| 53 return data->v8_schema_registry(); | |
| 54 } | 65 } |
| 55 | 66 |
| 56 // static | 67 // static |
| 57 ServiceWorkerRequestSender* WorkerThreadDispatcher::GetRequestSender() { | 68 ServiceWorkerRequestSender* WorkerThreadDispatcher::GetRequestSender() { |
| 58 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 69 return static_cast<ServiceWorkerRequestSender*>( |
| 59 DCHECK(data); | 70 GetBindingsSystem()->GetRequestSender()); |
| 60 return data->request_sender(); | 71 } |
| 72 |
| 73 // static |
| 74 V8SchemaRegistry* WorkerThreadDispatcher::GetV8SchemaRegistry() { |
| 75 return GetServiceWorkerData()->v8_schema_registry(); |
| 61 } | 76 } |
| 62 | 77 |
| 63 bool WorkerThreadDispatcher::OnControlMessageReceived( | 78 bool WorkerThreadDispatcher::OnControlMessageReceived( |
| 64 const IPC::Message& message) { | 79 const IPC::Message& message) { |
| 65 bool handled = true; | 80 bool handled = true; |
| 66 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) | 81 IPC_BEGIN_MESSAGE_MAP(WorkerThreadDispatcher, message) |
| 67 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) | 82 IPC_MESSAGE_HANDLER(ExtensionMsg_ResponseWorker, OnResponseWorker) |
| 68 IPC_MESSAGE_UNHANDLED(handled = false) | 83 IPC_MESSAGE_UNHANDLED(handled = false) |
| 69 IPC_END_MESSAGE_MAP() | 84 IPC_END_MESSAGE_MAP() |
| 70 return handled; | 85 return handled; |
| 71 } | 86 } |
| 72 | 87 |
| 73 bool WorkerThreadDispatcher::Send(IPC::Message* message) { | 88 bool WorkerThreadDispatcher::Send(IPC::Message* message) { |
| 74 return message_filter_->Send(message); | 89 return message_filter_->Send(message); |
| 75 } | 90 } |
| 76 | 91 |
| 77 void WorkerThreadDispatcher::OnResponseWorker(int worker_thread_id, | 92 void WorkerThreadDispatcher::OnResponseWorker(int worker_thread_id, |
| 78 int request_id, | 93 int request_id, |
| 79 bool succeeded, | 94 bool succeeded, |
| 80 const base::ListValue& response, | 95 const base::ListValue& response, |
| 81 const std::string& error) { | 96 const std::string& error) { |
| 82 content::WorkerThread::PostTask( | 97 content::WorkerThread::PostTask( |
| 83 worker_thread_id, | 98 worker_thread_id, |
| 84 base::Bind(&OnResponseOnWorkerThread, request_id, succeeded, | 99 base::Bind(&OnResponseOnWorkerThread, request_id, succeeded, |
| 85 // TODO(lazyboy): Can we avoid CreateDeepCopy()? | 100 // TODO(lazyboy): Can we avoid CreateDeepCopy()? |
| 86 base::Passed(response.CreateDeepCopy()), error)); | 101 base::Passed(response.CreateDeepCopy()), error)); |
| 87 } | 102 } |
| 88 | 103 |
| 89 void WorkerThreadDispatcher::AddWorkerData(int64_t service_worker_version_id) { | 104 void WorkerThreadDispatcher::AddWorkerData( |
| 105 int64_t service_worker_version_id, |
| 106 ResourceBundleSourceMap* source_map) { |
| 90 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 107 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 91 if (!data) { | 108 if (!data) { |
| 92 ServiceWorkerData* new_data = | 109 std::unique_ptr<ExtensionBindingsSystem> bindings_system = |
| 93 new ServiceWorkerData(this, service_worker_version_id); | 110 base::MakeUnique<JsExtensionBindingsSystem>( |
| 111 source_map, base::MakeUnique<ServiceWorkerRequestSender>( |
| 112 this, service_worker_version_id)); |
| 113 ServiceWorkerData* new_data = new ServiceWorkerData( |
| 114 service_worker_version_id, std::move(bindings_system)); |
| 94 g_data_tls.Pointer()->Set(new_data); | 115 g_data_tls.Pointer()->Set(new_data); |
| 95 } | 116 } |
| 96 } | 117 } |
| 97 | 118 |
| 98 void WorkerThreadDispatcher::RemoveWorkerData( | 119 void WorkerThreadDispatcher::RemoveWorkerData( |
| 99 int64_t service_worker_version_id) { | 120 int64_t service_worker_version_id) { |
| 100 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); | 121 ServiceWorkerData* data = g_data_tls.Pointer()->Get(); |
| 101 if (data) { | 122 if (data) { |
| 102 DCHECK_EQ(service_worker_version_id, data->service_worker_version_id()); | 123 DCHECK_EQ(service_worker_version_id, data->service_worker_version_id()); |
| 103 delete data; | 124 delete data; |
| 104 g_data_tls.Pointer()->Set(nullptr); | 125 g_data_tls.Pointer()->Set(nullptr); |
| 105 } | 126 } |
| 106 } | 127 } |
| 107 | 128 |
| 108 } // namespace extensions | 129 } // namespace extensions |
| OLD | NEW |