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/browser/guest_view/guest_view_base.h" | 5 #include "extensions/browser/guest_view/guest_view_base.h" |
6 | 6 |
7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "components/ui/zoom/page_zoom.h" | 9 #include "components/ui/zoom/page_zoom.h" |
10 #include "components/ui/zoom/zoom_controller.h" | 10 #include "components/ui/zoom/zoom_controller.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 create_params.GetInteger(guestview::kParameterInstanceId, | 218 create_params.GetInteger(guestview::kParameterInstanceId, |
219 &view_instance_id_); | 219 &view_instance_id_); |
220 | 220 |
221 if (CanRunInDetachedState()) | 221 if (CanRunInDetachedState()) |
222 SetUpAutoSize(create_params); | 222 SetUpAutoSize(create_params); |
223 | 223 |
224 // Give the derived class an opportunity to perform additional initialization. | 224 // Give the derived class an opportunity to perform additional initialization. |
225 DidInitialize(create_params); | 225 DidInitialize(create_params); |
226 } | 226 } |
227 | 227 |
| 228 void GuestViewBase::DispatchOnResizeEvent(const gfx::Size& old_size, |
| 229 const gfx::Size& new_size) { |
| 230 if (new_size == old_size) |
| 231 return; |
| 232 |
| 233 // Dispatch the onResize event. |
| 234 scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue()); |
| 235 args->SetInteger(guestview::kOldWidth, old_size.width()); |
| 236 args->SetInteger(guestview::kOldHeight, old_size.height()); |
| 237 args->SetInteger(guestview::kNewWidth, new_size.width()); |
| 238 args->SetInteger(guestview::kNewHeight, new_size.height()); |
| 239 DispatchEventToGuestProxy(new Event(guestview::kEventResize, args.Pass())); |
| 240 } |
| 241 |
228 void GuestViewBase::SetAutoSize(bool enabled, | 242 void GuestViewBase::SetAutoSize(bool enabled, |
229 const gfx::Size& min_size, | 243 const gfx::Size& min_size, |
230 const gfx::Size& max_size) { | 244 const gfx::Size& max_size) { |
231 min_auto_size_ = min_size; | 245 min_auto_size_ = min_size; |
232 min_auto_size_.SetToMin(max_size); | 246 min_auto_size_.SetToMin(max_size); |
233 max_auto_size_ = max_size; | 247 max_auto_size_ = max_size; |
234 max_auto_size_.SetToMax(min_size); | 248 max_auto_size_.SetToMax(min_size); |
235 | 249 |
236 enabled &= !min_auto_size_.IsEmpty() && !max_auto_size_.IsEmpty() && | 250 enabled &= !min_auto_size_.IsEmpty() && !max_auto_size_.IsEmpty() && |
237 IsAutoSizeSupported(); | 251 IsAutoSizeSupported(); |
238 if (!enabled && !auto_size_enabled_) | 252 if (!enabled && !auto_size_enabled_) |
239 return; | 253 return; |
240 | 254 |
241 auto_size_enabled_ = enabled; | 255 auto_size_enabled_ = enabled; |
242 | 256 |
243 if (!attached() && !CanRunInDetachedState()) | 257 if (!attached() && !CanRunInDetachedState()) |
244 return; | 258 return; |
245 | 259 |
246 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); | 260 content::RenderViewHost* rvh = web_contents()->GetRenderViewHost(); |
247 if (auto_size_enabled_) { | 261 if (auto_size_enabled_) { |
248 rvh->EnableAutoResize(min_auto_size_, max_auto_size_); | 262 rvh->EnableAutoResize(min_auto_size_, max_auto_size_); |
249 } else { | 263 } else { |
250 rvh->DisableAutoResize(element_size_); | 264 rvh->DisableAutoResize(element_size_); |
| 265 DispatchOnResizeEvent(guest_size_, element_size_); |
| 266 GuestSizeChangedDueToAutoSize(guest_size_, element_size_); |
251 guest_size_ = element_size_; | 267 guest_size_ = element_size_; |
252 GuestSizeChangedDueToAutoSize(guest_size_, element_size_); | |
253 } | 268 } |
254 } | 269 } |
255 | 270 |
256 // static | 271 // static |
257 void GuestViewBase::RegisterGuestViewType( | 272 void GuestViewBase::RegisterGuestViewType( |
258 const std::string& view_type, | 273 const std::string& view_type, |
259 const GuestCreationCallback& callback) { | 274 const GuestCreationCallback& callback) { |
260 auto it = guest_view_registry.Get().find(view_type); | 275 auto it = guest_view_registry.Get().find(view_type); |
261 DCHECK(it == guest_view_registry.Get().end()); | 276 DCHECK(it == guest_view_registry.Get().end()); |
262 guest_view_registry.Get()[view_type] = callback; | 277 guest_view_registry.Get()[view_type] = callback; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 StopTrackingEmbedderZoomLevel(); | 368 StopTrackingEmbedderZoomLevel(); |
354 owner_web_contents()->Send(new ExtensionMsg_GuestDetached( | 369 owner_web_contents()->Send(new ExtensionMsg_GuestDetached( |
355 element_instance_id_)); | 370 element_instance_id_)); |
356 element_instance_id_ = guestview::kInstanceIDNone; | 371 element_instance_id_ = guestview::kInstanceIDNone; |
357 } | 372 } |
358 | 373 |
359 void GuestViewBase::ElementSizeChanged(const gfx::Size& size) { | 374 void GuestViewBase::ElementSizeChanged(const gfx::Size& size) { |
360 element_size_ = size; | 375 element_size_ = size; |
361 | 376 |
362 // Only resize if needed. | 377 // Only resize if needed. |
363 if (!size.IsEmpty()) | 378 if (!size.IsEmpty()) { |
364 guest_sizer_->SizeContents(size); | 379 guest_sizer_->SizeContents(size); |
| 380 guest_size_ = size; |
| 381 } |
365 } | 382 } |
366 | 383 |
367 WebContents* GuestViewBase::GetOwnerWebContents() const { | 384 WebContents* GuestViewBase::GetOwnerWebContents() const { |
368 return owner_web_contents_; | 385 return owner_web_contents_; |
369 } | 386 } |
370 | 387 |
371 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, | 388 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, |
372 const gfx::Size& new_size) { | 389 const gfx::Size& new_size) { |
| 390 DispatchOnResizeEvent(old_size, new_size); |
373 if (!auto_size_enabled_) | 391 if (!auto_size_enabled_) |
374 return; | 392 return; |
375 guest_size_ = new_size; | 393 guest_size_ = new_size; |
376 GuestSizeChangedDueToAutoSize(old_size, new_size); | 394 GuestSizeChangedDueToAutoSize(old_size, new_size); |
377 } | 395 } |
378 | 396 |
379 const GURL& GuestViewBase::GetOwnerSiteURL() const { | 397 const GURL& GuestViewBase::GetOwnerSiteURL() const { |
380 return owner_web_contents()->GetLastCommittedURL(); | 398 return owner_web_contents()->GetLastCommittedURL(); |
381 } | 399 } |
382 | 400 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
566 ui_zoom::ZoomController::FromWebContents(web_contents()); | 584 ui_zoom::ZoomController::FromWebContents(web_contents()); |
567 if (content::ZoomValuesEqual(data.new_zoom_level, | 585 if (content::ZoomValuesEqual(data.new_zoom_level, |
568 guest_zoom_controller->GetZoomLevel())) { | 586 guest_zoom_controller->GetZoomLevel())) { |
569 return; | 587 return; |
570 } | 588 } |
571 // When the embedder's zoom level doesn't match the guest's, then update the | 589 // When the embedder's zoom level doesn't match the guest's, then update the |
572 // guest's zoom level to match. | 590 // guest's zoom level to match. |
573 guest_zoom_controller->SetZoomLevel(data.new_zoom_level); | 591 guest_zoom_controller->SetZoomLevel(data.new_zoom_level); |
574 } | 592 } |
575 | 593 |
576 void GuestViewBase::DispatchEventToEmbedder(Event* event) { | 594 void GuestViewBase::DispatchEventToGuestProxy(Event* event) { |
577 scoped_ptr<Event> event_ptr(event); | 595 DispatchEvent(event, guest_instance_id_); |
| 596 } |
578 | 597 |
| 598 void GuestViewBase::DispatchEventToView(Event* event) { |
579 if (!attached() && | 599 if (!attached() && |
580 (!CanRunInDetachedState() || !can_owner_receive_events())) { | 600 (!CanRunInDetachedState() || !can_owner_receive_events())) { |
581 pending_events_.push_back(linked_ptr<Event>(event_ptr.release())); | 601 pending_events_.push_back(linked_ptr<Event>(event)); |
582 return; | 602 return; |
583 } | 603 } |
584 | 604 |
| 605 DispatchEvent(event, view_instance_id_); |
| 606 } |
| 607 |
| 608 void GuestViewBase::DispatchEvent(Event* event, int instance_id) { |
| 609 scoped_ptr<Event> event_ptr(event); |
| 610 |
585 EventFilteringInfo info; | 611 EventFilteringInfo info; |
586 info.SetInstanceID(view_instance_id_); | 612 info.SetInstanceID(instance_id); |
587 scoped_ptr<base::ListValue> args(new base::ListValue()); | 613 scoped_ptr<base::ListValue> args(new base::ListValue()); |
588 args->Append(event->GetArguments().release()); | 614 args->Append(event->GetArguments().release()); |
589 | 615 |
590 EventRouter::DispatchEvent( | 616 EventRouter::DispatchEvent( |
591 owner_web_contents_, | 617 owner_web_contents_, |
592 browser_context_, | 618 browser_context_, |
593 owner_extension_id_, | 619 owner_extension_id_, |
594 event->name(), | 620 event->name(), |
595 args.Pass(), | 621 args.Pass(), |
596 EventRouter::USER_GESTURE_UNKNOWN, | 622 EventRouter::USER_GESTURE_UNKNOWN, |
597 info); | 623 info); |
598 } | 624 } |
599 | 625 |
600 void GuestViewBase::SendQueuedEvents() { | 626 void GuestViewBase::SendQueuedEvents() { |
601 if (!attached()) | 627 if (!attached()) |
602 return; | 628 return; |
603 while (!pending_events_.empty()) { | 629 while (!pending_events_.empty()) { |
604 linked_ptr<Event> event_ptr = pending_events_.front(); | 630 linked_ptr<Event> event_ptr = pending_events_.front(); |
605 pending_events_.pop_front(); | 631 pending_events_.pop_front(); |
606 DispatchEventToEmbedder(event_ptr.release()); | 632 DispatchEvent(event_ptr.release(), view_instance_id_); |
607 } | 633 } |
608 } | 634 } |
609 | 635 |
610 void GuestViewBase::CompleteInit( | 636 void GuestViewBase::CompleteInit( |
611 scoped_ptr<base::DictionaryValue> create_params, | 637 scoped_ptr<base::DictionaryValue> create_params, |
612 const WebContentsCreatedCallback& callback, | 638 const WebContentsCreatedCallback& callback, |
613 content::WebContents* guest_web_contents) { | 639 content::WebContents* guest_web_contents) { |
614 if (!guest_web_contents) { | 640 if (!guest_web_contents) { |
615 // The derived class did not create a WebContents so this class serves no | 641 // The derived class did not create a WebContents so this class serves no |
616 // purpose. Let's self-destruct. | 642 // purpose. Let's self-destruct. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
675 // static | 701 // static |
676 void GuestViewBase::RegisterGuestViewTypes() { | 702 void GuestViewBase::RegisterGuestViewTypes() { |
677 AppViewGuest::Register(); | 703 AppViewGuest::Register(); |
678 ExtensionOptionsGuest::Register(); | 704 ExtensionOptionsGuest::Register(); |
679 MimeHandlerViewGuest::Register(); | 705 MimeHandlerViewGuest::Register(); |
680 SurfaceWorkerGuest::Register(); | 706 SurfaceWorkerGuest::Register(); |
681 WebViewGuest::Register(); | 707 WebViewGuest::Register(); |
682 } | 708 } |
683 | 709 |
684 } // namespace extensions | 710 } // namespace extensions |
OLD | NEW |