OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/guest_view/extensions_guest_view_container.h" | 5 #include "extensions/renderer/guest_view/extensions_guest_view_container.h" |
6 | 6 |
7 #include "content/public/renderer/render_frame.h" | 7 #include "content/public/renderer/render_frame.h" |
8 #include "content/public/renderer/render_view.h" | 8 #include "content/public/renderer/render_view.h" |
9 #include "extensions/common/guest_view/guest_view_constants.h" | 9 #include "extensions/common/guest_view/guest_view_constants.h" |
10 #include "extensions/common/guest_view/guest_view_messages.h" | 10 #include "extensions/common/guest_view/guest_view_messages.h" |
11 #include "third_party/WebKit/public/web/WebLocalFrame.h" | 11 #include "third_party/WebKit/public/web/WebLocalFrame.h" |
12 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" | 12 #include "third_party/WebKit/public/web/WebScopedMicrotaskSuppression.h" |
13 #include "third_party/WebKit/public/web/WebView.h" | 13 #include "third_party/WebKit/public/web/WebView.h" |
14 | 14 |
15 namespace { | 15 namespace { |
16 typedef std::map<int, extensions::ExtensionsGuestViewContainer*> | 16 typedef std::map<int, extensions::ExtensionsGuestViewContainer*> |
17 ExtensionsGuestViewContainerMap; | 17 ExtensionsGuestViewContainerMap; |
18 static base::LazyInstance<ExtensionsGuestViewContainerMap> | 18 static base::LazyInstance<ExtensionsGuestViewContainerMap> |
19 g_guest_view_container_map = LAZY_INSTANCE_INITIALIZER; | 19 g_guest_view_container_map = LAZY_INSTANCE_INITIALIZER; |
20 } // namespace | 20 } // namespace |
21 | 21 |
22 namespace extensions { | 22 namespace extensions { |
23 | 23 |
24 ExtensionsGuestViewContainer::Request::Request( | 24 ExtensionsGuestViewContainer::Request::Request( |
25 GuestViewContainer* container, | 25 GuestViewContainer* container, |
26 v8::Handle<v8::Function> callback, | 26 v8::Handle<v8::Function> callback, |
27 v8::Isolate* isolate) | 27 v8::Isolate* isolate) |
28 : container_(container), | 28 : container_(container), callback_(isolate, callback), isolate_(isolate) { |
29 callback_(callback), | |
30 isolate_(isolate) { | |
31 } | 29 } |
32 | 30 |
33 ExtensionsGuestViewContainer::Request::~Request() { | 31 ExtensionsGuestViewContainer::Request::~Request() { |
34 } | 32 } |
35 | 33 |
36 bool ExtensionsGuestViewContainer::Request::HasCallback() const { | 34 bool ExtensionsGuestViewContainer::Request::HasCallback() const { |
37 return !callback_.IsEmpty(); | 35 return !callback_.IsEmpty(); |
38 } | 36 } |
39 | 37 |
40 v8::Handle<v8::Function> | 38 v8::Handle<v8::Function> |
41 ExtensionsGuestViewContainer::Request::GetCallback() const { | 39 ExtensionsGuestViewContainer::Request::GetCallback() const { |
42 return callback_.NewHandle(isolate_); | 40 return v8::Local<v8::Function>::New(isolate_, callback_); |
43 } | 41 } |
44 | 42 |
45 ExtensionsGuestViewContainer::AttachRequest::AttachRequest( | 43 ExtensionsGuestViewContainer::AttachRequest::AttachRequest( |
46 GuestViewContainer* container, | 44 GuestViewContainer* container, |
47 int guest_instance_id, | 45 int guest_instance_id, |
48 scoped_ptr<base::DictionaryValue> params, | 46 scoped_ptr<base::DictionaryValue> params, |
49 v8::Handle<v8::Function> callback, | 47 v8::Handle<v8::Function> callback, |
50 v8::Isolate* isolate) | 48 v8::Isolate* isolate) |
51 : Request(container, callback, isolate), | 49 : Request(container, callback, isolate), |
52 guest_instance_id_(guest_instance_id), | 50 guest_instance_id_(guest_instance_id), |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() { | 152 ExtensionsGuestViewContainer::~ExtensionsGuestViewContainer() { |
155 if (element_instance_id() != guestview::kInstanceIDNone) { | 153 if (element_instance_id() != guestview::kInstanceIDNone) { |
156 g_guest_view_container_map.Get().erase(element_instance_id()); | 154 g_guest_view_container_map.Get().erase(element_instance_id()); |
157 } | 155 } |
158 | 156 |
159 // Call the destruction callback, if one is registered. | 157 // Call the destruction callback, if one is registered. |
160 if (destruction_callback_.IsEmpty()) | 158 if (destruction_callback_.IsEmpty()) |
161 return; | 159 return; |
162 v8::HandleScope handle_scope(destruction_isolate_); | 160 v8::HandleScope handle_scope(destruction_isolate_); |
163 v8::Handle<v8::Function> callback = | 161 v8::Handle<v8::Function> callback = |
164 destruction_callback_.NewHandle(destruction_isolate_); | 162 v8::Local<v8::Function>::New(destruction_isolate_, destruction_callback_); |
165 v8::Handle<v8::Context> context = callback->CreationContext(); | 163 v8::Handle<v8::Context> context = callback->CreationContext(); |
166 if (context.IsEmpty()) | 164 if (context.IsEmpty()) |
167 return; | 165 return; |
168 | 166 |
169 v8::Context::Scope context_scope(context); | 167 v8::Context::Scope context_scope(context); |
170 blink::WebScopedMicrotaskSuppression suppression; | 168 blink::WebScopedMicrotaskSuppression suppression; |
171 | 169 |
172 callback->Call(context->Global(), 0 /* argc */, nullptr); | 170 callback->Call(context->Global(), 0 /* argc */, nullptr); |
173 } | 171 } |
174 | 172 |
175 ExtensionsGuestViewContainer* ExtensionsGuestViewContainer::FromID( | 173 ExtensionsGuestViewContainer* ExtensionsGuestViewContainer::FromID( |
176 int element_instance_id) { | 174 int element_instance_id) { |
177 ExtensionsGuestViewContainerMap* guest_view_containers = | 175 ExtensionsGuestViewContainerMap* guest_view_containers = |
178 g_guest_view_container_map.Pointer(); | 176 g_guest_view_container_map.Pointer(); |
179 auto it = guest_view_containers->find(element_instance_id); | 177 auto it = guest_view_containers->find(element_instance_id); |
180 return it == guest_view_containers->end() ? nullptr : it->second; | 178 return it == guest_view_containers->end() ? nullptr : it->second; |
181 } | 179 } |
182 | 180 |
183 void ExtensionsGuestViewContainer::IssueRequest(linked_ptr<Request> request) { | 181 void ExtensionsGuestViewContainer::IssueRequest(linked_ptr<Request> request) { |
184 EnqueueRequest(request); | 182 EnqueueRequest(request); |
185 PerformPendingRequest(); | 183 PerformPendingRequest(); |
186 } | 184 } |
187 | 185 |
188 void ExtensionsGuestViewContainer::RegisterDestructionCallback( | 186 void ExtensionsGuestViewContainer::RegisterDestructionCallback( |
189 v8::Handle<v8::Function> callback, | 187 v8::Handle<v8::Function> callback, |
190 v8::Isolate* isolate) { | 188 v8::Isolate* isolate) { |
191 destruction_callback_.reset(callback); | 189 destruction_callback_.Reset(isolate, callback); |
192 destruction_isolate_ = isolate; | 190 destruction_isolate_ = isolate; |
193 } | 191 } |
194 | 192 |
195 void ExtensionsGuestViewContainer::RegisterElementResizeCallback( | 193 void ExtensionsGuestViewContainer::RegisterElementResizeCallback( |
196 v8::Handle<v8::Function> callback, | 194 v8::Handle<v8::Function> callback, |
197 v8::Isolate* isolate) { | 195 v8::Isolate* isolate) { |
198 element_resize_callback_.reset(callback); | 196 element_resize_callback_.Reset(isolate, callback); |
199 element_resize_isolate_ = isolate; | 197 element_resize_isolate_ = isolate; |
200 } | 198 } |
201 | 199 |
202 void ExtensionsGuestViewContainer::DidResizeElement(const gfx::Size& old_size, | 200 void ExtensionsGuestViewContainer::DidResizeElement(const gfx::Size& old_size, |
203 const gfx::Size& new_size) { | 201 const gfx::Size& new_size) { |
204 // Call the element resize callback, if one is registered. | 202 // Call the element resize callback, if one is registered. |
205 if (element_resize_callback_.IsEmpty()) | 203 if (element_resize_callback_.IsEmpty()) |
206 return; | 204 return; |
207 | 205 |
208 base::MessageLoop::current()->PostTask( | 206 base::MessageLoop::current()->PostTask( |
(...skipping 29 matching lines...) Expand all Loading... |
238 // Handle the callback for the current request with a pending response. | 236 // Handle the callback for the current request with a pending response. |
239 HandlePendingResponseCallback(message); | 237 HandlePendingResponseCallback(message); |
240 // Perform the subsequent attach request if one exists. | 238 // Perform the subsequent attach request if one exists. |
241 PerformPendingRequest(); | 239 PerformPendingRequest(); |
242 } | 240 } |
243 | 241 |
244 void ExtensionsGuestViewContainer::CallElementResizeCallback( | 242 void ExtensionsGuestViewContainer::CallElementResizeCallback( |
245 const gfx::Size& old_size, | 243 const gfx::Size& old_size, |
246 const gfx::Size& new_size) { | 244 const gfx::Size& new_size) { |
247 v8::HandleScope handle_scope(element_resize_isolate_); | 245 v8::HandleScope handle_scope(element_resize_isolate_); |
248 v8::Handle<v8::Function> callback = | 246 v8::Handle<v8::Function> callback = v8::Local<v8::Function>::New( |
249 element_resize_callback_.NewHandle(element_resize_isolate_); | 247 element_resize_isolate_, element_resize_callback_); |
250 v8::Handle<v8::Context> context = callback->CreationContext(); | 248 v8::Handle<v8::Context> context = callback->CreationContext(); |
251 if (context.IsEmpty()) | 249 if (context.IsEmpty()) |
252 return; | 250 return; |
253 | 251 |
254 const int argc = 4; | 252 const int argc = 4; |
255 v8::Handle<v8::Value> argv[argc] = { | 253 v8::Handle<v8::Value> argv[argc] = { |
256 v8::Integer::New(element_resize_isolate_, old_size.width()), | 254 v8::Integer::New(element_resize_isolate_, old_size.width()), |
257 v8::Integer::New(element_resize_isolate_, old_size.height()), | 255 v8::Integer::New(element_resize_isolate_, old_size.height()), |
258 v8::Integer::New(element_resize_isolate_, new_size.width()), | 256 v8::Integer::New(element_resize_isolate_, new_size.width()), |
259 v8::Integer::New(element_resize_isolate_, new_size.height())}; | 257 v8::Integer::New(element_resize_isolate_, new_size.height())}; |
(...skipping 19 matching lines...) Expand all Loading... |
279 } | 277 } |
280 | 278 |
281 void ExtensionsGuestViewContainer::HandlePendingResponseCallback( | 279 void ExtensionsGuestViewContainer::HandlePendingResponseCallback( |
282 const IPC::Message& message) { | 280 const IPC::Message& message) { |
283 CHECK(pending_response_.get()); | 281 CHECK(pending_response_.get()); |
284 linked_ptr<Request> pending_response(pending_response_.release()); | 282 linked_ptr<Request> pending_response(pending_response_.release()); |
285 pending_response->HandleResponse(message); | 283 pending_response->HandleResponse(message); |
286 } | 284 } |
287 | 285 |
288 } // namespace extensions | 286 } // namespace extensions |
OLD | NEW |