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

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

Issue 2512233002: [Extensions Bindings] Add ExtensionBindingsSystem interface; hook it up (Closed)
Patch Set: . 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
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 // 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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698