| 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/zoom_controller.h" | 9 #include "components/ui/zoom/zoom_controller.h" |
| 10 #include "content/public/browser/navigation_details.h" | 10 #include "content/public/browser/navigation_details.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 GuestViewCreationMap::iterator it = | 275 GuestViewCreationMap::iterator it = |
| 261 guest_view_registry.Get().find(view_type); | 276 guest_view_registry.Get().find(view_type); |
| 262 DCHECK(it == guest_view_registry.Get().end()); | 277 DCHECK(it == guest_view_registry.Get().end()); |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 358 StopTrackingEmbedderZoomLevel(); | 373 StopTrackingEmbedderZoomLevel(); |
| 359 owner_web_contents()->Send(new ExtensionMsg_GuestDetached( | 374 owner_web_contents()->Send(new ExtensionMsg_GuestDetached( |
| 360 element_instance_id_)); | 375 element_instance_id_)); |
| 361 element_instance_id_ = guestview::kInstanceIDNone; | 376 element_instance_id_ = guestview::kInstanceIDNone; |
| 362 } | 377 } |
| 363 | 378 |
| 364 void GuestViewBase::ElementSizeChanged(const gfx::Size& size) { | 379 void GuestViewBase::ElementSizeChanged(const gfx::Size& size) { |
| 365 element_size_ = size; | 380 element_size_ = size; |
| 366 | 381 |
| 367 // Only resize if needed. | 382 // Only resize if needed. |
| 368 if (!size.IsEmpty()) | 383 if (!size.IsEmpty()) { |
| 369 guest_sizer_->SizeContents(size); | 384 guest_sizer_->SizeContents(size); |
| 385 guest_size_ = size; |
| 386 } |
| 370 } | 387 } |
| 371 | 388 |
| 372 WebContents* GuestViewBase::GetOwnerWebContents() const { | 389 WebContents* GuestViewBase::GetOwnerWebContents() const { |
| 373 return owner_web_contents_; | 390 return owner_web_contents_; |
| 374 } | 391 } |
| 375 | 392 |
| 376 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, | 393 void GuestViewBase::GuestSizeChanged(const gfx::Size& old_size, |
| 377 const gfx::Size& new_size) { | 394 const gfx::Size& new_size) { |
| 395 DispatchOnResizeEvent(old_size, new_size); |
| 378 if (!auto_size_enabled_) | 396 if (!auto_size_enabled_) |
| 379 return; | 397 return; |
| 380 guest_size_ = new_size; | 398 guest_size_ = new_size; |
| 381 GuestSizeChangedDueToAutoSize(old_size, new_size); | 399 GuestSizeChangedDueToAutoSize(old_size, new_size); |
| 382 } | 400 } |
| 383 | 401 |
| 384 const GURL& GuestViewBase::GetOwnerSiteURL() const { | 402 const GURL& GuestViewBase::GetOwnerSiteURL() const { |
| 385 return owner_web_contents()->GetLastCommittedURL(); | 403 return owner_web_contents()->GetLastCommittedURL(); |
| 386 } | 404 } |
| 387 | 405 |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 551 void GuestViewBase::OnZoomChanged( | 569 void GuestViewBase::OnZoomChanged( |
| 552 const ui_zoom::ZoomController::ZoomChangedEventData& data) { | 570 const ui_zoom::ZoomController::ZoomChangedEventData& data) { |
| 553 if (content::ZoomValuesEqual(data.old_zoom_level, data.new_zoom_level)) | 571 if (content::ZoomValuesEqual(data.old_zoom_level, data.new_zoom_level)) |
| 554 return; | 572 return; |
| 555 // When the embedder's zoom level is changed, then we also update the | 573 // When the embedder's zoom level is changed, then we also update the |
| 556 // guest's zoom level to match. | 574 // guest's zoom level to match. |
| 557 ui_zoom::ZoomController::FromWebContents(web_contents()) | 575 ui_zoom::ZoomController::FromWebContents(web_contents()) |
| 558 ->SetZoomLevel(data.new_zoom_level); | 576 ->SetZoomLevel(data.new_zoom_level); |
| 559 } | 577 } |
| 560 | 578 |
| 561 void GuestViewBase::DispatchEventToEmbedder(Event* event) { | 579 void GuestViewBase::DispatchEventToGuestProxy(Event* event) { |
| 562 scoped_ptr<Event> event_ptr(event); | 580 DispatchEvent(event, guest_instance_id_); |
| 581 } |
| 563 | 582 |
| 583 void GuestViewBase::DispatchEventToView(Event* event) { |
| 564 if (!attached() && | 584 if (!attached() && |
| 565 (!CanRunInDetachedState() || !can_owner_receive_events())) { | 585 (!CanRunInDetachedState() || !can_owner_receive_events())) { |
| 566 pending_events_.push_back(linked_ptr<Event>(event_ptr.release())); | 586 pending_events_.push_back(linked_ptr<Event>(event)); |
| 567 return; | 587 return; |
| 568 } | 588 } |
| 569 | 589 |
| 590 DispatchEvent(event, view_instance_id_); |
| 591 } |
| 592 |
| 593 void GuestViewBase::DispatchEvent(Event* event, int instance_id) { |
| 594 scoped_ptr<Event> event_ptr(event); |
| 595 |
| 570 EventFilteringInfo info; | 596 EventFilteringInfo info; |
| 571 info.SetInstanceID(view_instance_id_); | 597 info.SetInstanceID(instance_id); |
| 572 scoped_ptr<base::ListValue> args(new base::ListValue()); | 598 scoped_ptr<base::ListValue> args(new base::ListValue()); |
| 573 args->Append(event->GetArguments().release()); | 599 args->Append(event->GetArguments().release()); |
| 574 | 600 |
| 575 EventRouter::DispatchEvent( | 601 EventRouter::DispatchEvent( |
| 576 owner_web_contents_, | 602 owner_web_contents_, |
| 577 browser_context_, | 603 browser_context_, |
| 578 owner_extension_id_, | 604 owner_extension_id_, |
| 579 event->name(), | 605 event->name(), |
| 580 args.Pass(), | 606 args.Pass(), |
| 581 EventRouter::USER_GESTURE_UNKNOWN, | 607 EventRouter::USER_GESTURE_UNKNOWN, |
| 582 info); | 608 info); |
| 583 } | 609 } |
| 584 | 610 |
| 585 void GuestViewBase::SendQueuedEvents() { | 611 void GuestViewBase::SendQueuedEvents() { |
| 586 if (!attached()) | 612 if (!attached()) |
| 587 return; | 613 return; |
| 588 while (!pending_events_.empty()) { | 614 while (!pending_events_.empty()) { |
| 589 linked_ptr<Event> event_ptr = pending_events_.front(); | 615 linked_ptr<Event> event_ptr = pending_events_.front(); |
| 590 pending_events_.pop_front(); | 616 pending_events_.pop_front(); |
| 591 DispatchEventToEmbedder(event_ptr.release()); | 617 DispatchEvent(event_ptr.release(), view_instance_id_); |
| 592 } | 618 } |
| 593 } | 619 } |
| 594 | 620 |
| 595 void GuestViewBase::CompleteInit( | 621 void GuestViewBase::CompleteInit( |
| 596 scoped_ptr<base::DictionaryValue> create_params, | 622 scoped_ptr<base::DictionaryValue> create_params, |
| 597 const WebContentsCreatedCallback& callback, | 623 const WebContentsCreatedCallback& callback, |
| 598 content::WebContents* guest_web_contents) { | 624 content::WebContents* guest_web_contents) { |
| 599 if (!guest_web_contents) { | 625 if (!guest_web_contents) { |
| 600 // The derived class did not create a WebContents so this class serves no | 626 // The derived class did not create a WebContents so this class serves no |
| 601 // purpose. Let's self-destruct. | 627 // purpose. Let's self-destruct. |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 // static | 685 // static |
| 660 void GuestViewBase::RegisterGuestViewTypes() { | 686 void GuestViewBase::RegisterGuestViewTypes() { |
| 661 AppViewGuest::Register(); | 687 AppViewGuest::Register(); |
| 662 ExtensionOptionsGuest::Register(); | 688 ExtensionOptionsGuest::Register(); |
| 663 MimeHandlerViewGuest::Register(); | 689 MimeHandlerViewGuest::Register(); |
| 664 SurfaceWorkerGuest::Register(); | 690 SurfaceWorkerGuest::Register(); |
| 665 WebViewGuest::Register(); | 691 WebViewGuest::Register(); |
| 666 } | 692 } |
| 667 | 693 |
| 668 } // namespace extensions | 694 } // namespace extensions |
| OLD | NEW |