| 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 |