Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1071)

Side by Side Diff: extensions/renderer/worker_thread_dispatcher.cc

Issue 2512233002: [Extensions Bindings] Add ExtensionBindingsSystem interface; hook it up (Closed)
Patch Set: lazyboys Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « extensions/renderer/worker_thread_dispatcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« no previous file with comments | « extensions/renderer/worker_thread_dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698