| 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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 weak_ptr_factory_.GetWeakPtr(), | 227 weak_ptr_factory_.GetWeakPtr(), |
| 228 base::Passed(¶ms), | 228 base::Passed(¶ms), |
| 229 callback)); | 229 callback)); |
| 230 } | 230 } |
| 231 | 231 |
| 232 void GuestViewBase::InitWithWebContents( | 232 void GuestViewBase::InitWithWebContents( |
| 233 const base::DictionaryValue& create_params, | 233 const base::DictionaryValue& create_params, |
| 234 content::WebContents* guest_web_contents) { | 234 content::WebContents* guest_web_contents) { |
| 235 DCHECK(guest_web_contents); | 235 DCHECK(guest_web_contents); |
| 236 | 236 |
| 237 // Create a ZoomController to allow the guest's contents to be zoomed. |
| 238 // Do this before adding the GuestView as a WebContents Observer so that |
| 239 // the GuestView and its derived classes can re-configure the ZoomController |
| 240 // after the latter has handled WebContentsObserver events (observers are |
| 241 // notified of events in the same order they are added as observers). For |
| 242 // example, GuestViewBase may wish to put its guest into isolated zoom mode |
| 243 // in DidNavigateMainFrame, but since ZoomController always resets to default |
| 244 // zoom mode on this event, GuestViewBase would need to do so after |
| 245 // ZoomController::DidNavigateMainFrame has completed. |
| 246 ui_zoom::ZoomController::CreateForWebContents(guest_web_contents); |
| 247 |
| 237 // At this point, we have just created the guest WebContents, we need to add | 248 // At this point, we have just created the guest WebContents, we need to add |
| 238 // an observer to the owner WebContents. This observer will be responsible | 249 // an observer to the owner WebContents. This observer will be responsible |
| 239 // for destroying the guest WebContents if the owner goes away. | 250 // for destroying the guest WebContents if the owner goes away. |
| 240 owner_contents_observer_.reset( | 251 owner_contents_observer_.reset( |
| 241 new OwnerContentsObserver(this, owner_web_contents_)); | 252 new OwnerContentsObserver(this, owner_web_contents_)); |
| 242 | 253 |
| 243 WebContentsObserver::Observe(guest_web_contents); | 254 WebContentsObserver::Observe(guest_web_contents); |
| 244 guest_web_contents->SetDelegate(this); | 255 guest_web_contents->SetDelegate(this); |
| 245 webcontents_guestview_map.Get().insert( | 256 webcontents_guestview_map.Get().insert( |
| 246 std::make_pair(guest_web_contents, this)); | 257 std::make_pair(guest_web_contents, this)); |
| 247 GuestViewManager::FromBrowserContext(browser_context_)-> | 258 GuestViewManager::FromBrowserContext(browser_context_)-> |
| 248 AddGuest(guest_instance_id_, guest_web_contents); | 259 AddGuest(guest_instance_id_, guest_web_contents); |
| 249 | 260 |
| 250 // Create a ZoomController to allow the guest's contents to be zoomed. | |
| 251 ui_zoom::ZoomController::CreateForWebContents(guest_web_contents); | |
| 252 | |
| 253 // Populate the view instance ID if we have it on creation. | 261 // Populate the view instance ID if we have it on creation. |
| 254 create_params.GetInteger(guestview::kParameterInstanceId, | 262 create_params.GetInteger(guestview::kParameterInstanceId, |
| 255 &view_instance_id_); | 263 &view_instance_id_); |
| 256 | 264 |
| 257 if (CanRunInDetachedState()) | 265 if (CanRunInDetachedState()) |
| 258 SetUpSizing(create_params); | 266 SetUpSizing(create_params); |
| 259 | 267 |
| 260 // Give the derived class an opportunity to perform additional initialization. | 268 // Give the derived class an opportunity to perform additional initialization. |
| 261 DidInitialize(create_params); | 269 DidInitialize(create_params); |
| 262 } | 270 } |
| (...skipping 307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 // being destroyed. web_contents() is still valid at this point. | 578 // being destroyed. web_contents() is still valid at this point. |
| 571 // TODO(fsamuel): This allows for reentrant code into WebContents during | 579 // TODO(fsamuel): This allows for reentrant code into WebContents during |
| 572 // destruction. This could potentially lead to bugs. Perhaps we should get rid | 580 // destruction. This could potentially lead to bugs. Perhaps we should get rid |
| 573 // of this? | 581 // of this? |
| 574 GuestDestroyed(); | 582 GuestDestroyed(); |
| 575 | 583 |
| 576 // Self-destruct. | 584 // Self-destruct. |
| 577 delete this; | 585 delete this; |
| 578 } | 586 } |
| 579 | 587 |
| 588 void GuestViewBase::DidNavigateMainFrame( |
| 589 const content::LoadCommittedDetails& details, |
| 590 const content::FrameNavigateParams& params) { |
| 591 if (attached()) |
| 592 SetGuestZoomLevelToMatchEmbedder(); |
| 593 } |
| 594 |
| 580 void GuestViewBase::ActivateContents(WebContents* web_contents) { | 595 void GuestViewBase::ActivateContents(WebContents* web_contents) { |
| 581 if (!attached() || !embedder_web_contents()->GetDelegate()) | 596 if (!attached() || !embedder_web_contents()->GetDelegate()) |
| 582 return; | 597 return; |
| 583 | 598 |
| 584 embedder_web_contents()->GetDelegate()->ActivateContents( | 599 embedder_web_contents()->GetDelegate()->ActivateContents( |
| 585 embedder_web_contents()); | 600 embedder_web_contents()); |
| 586 } | 601 } |
| 587 | 602 |
| 588 void GuestViewBase::DeactivateContents(WebContents* web_contents) { | 603 void GuestViewBase::DeactivateContents(WebContents* web_contents) { |
| 589 if (!attached() || !embedder_web_contents()->GetDelegate()) | 604 if (!attached() || !embedder_web_contents()->GetDelegate()) |
| (...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 819 set_size_params.enable_auto_size.reset(new bool(auto_size_enabled)); | 834 set_size_params.enable_auto_size.reset(new bool(auto_size_enabled)); |
| 820 set_size_params.min_size.reset(new gfx::Size(min_width, min_height)); | 835 set_size_params.min_size.reset(new gfx::Size(min_width, min_height)); |
| 821 set_size_params.max_size.reset(new gfx::Size(max_width, max_height)); | 836 set_size_params.max_size.reset(new gfx::Size(max_width, max_height)); |
| 822 set_size_params.normal_size.reset(new gfx::Size(normal_width, normal_height)); | 837 set_size_params.normal_size.reset(new gfx::Size(normal_width, normal_height)); |
| 823 | 838 |
| 824 // Call SetSize to apply all the appropriate validation and clipping of | 839 // Call SetSize to apply all the appropriate validation and clipping of |
| 825 // values. | 840 // values. |
| 826 SetSize(set_size_params); | 841 SetSize(set_size_params); |
| 827 } | 842 } |
| 828 | 843 |
| 844 void GuestViewBase::SetGuestZoomLevelToMatchEmbedder() { |
| 845 auto embedder_zoom_controller = |
| 846 ui_zoom::ZoomController::FromWebContents(owner_web_contents()); |
| 847 if (!embedder_zoom_controller) |
| 848 return; |
| 849 |
| 850 ui_zoom::ZoomController::FromWebContents(web_contents()) |
| 851 ->SetZoomLevel(embedder_zoom_controller->GetZoomLevel()); |
| 852 } |
| 853 |
| 829 void GuestViewBase::StartTrackingEmbedderZoomLevel() { | 854 void GuestViewBase::StartTrackingEmbedderZoomLevel() { |
| 830 if (!ZoomPropagatesFromEmbedderToGuest()) | 855 if (!ZoomPropagatesFromEmbedderToGuest()) |
| 831 return; | 856 return; |
| 832 | 857 |
| 833 auto embedder_zoom_controller = | 858 auto embedder_zoom_controller = |
| 834 ui_zoom::ZoomController::FromWebContents(owner_web_contents()); | 859 ui_zoom::ZoomController::FromWebContents(owner_web_contents()); |
| 835 // Chrome Apps do not have a ZoomController. | 860 // Chrome Apps do not have a ZoomController. |
| 836 if (!embedder_zoom_controller) | 861 if (!embedder_zoom_controller) |
| 837 return; | 862 return; |
| 838 // Listen to the embedder's zoom changes. | 863 // Listen to the embedder's zoom changes. |
| 839 embedder_zoom_controller->AddObserver(this); | 864 embedder_zoom_controller->AddObserver(this); |
| 865 |
| 840 // Set the guest's initial zoom level to be equal to the embedder's. | 866 // Set the guest's initial zoom level to be equal to the embedder's. |
| 841 ui_zoom::ZoomController::FromWebContents(web_contents()) | 867 SetGuestZoomLevelToMatchEmbedder(); |
| 842 ->SetZoomLevel(embedder_zoom_controller->GetZoomLevel()); | |
| 843 } | 868 } |
| 844 | 869 |
| 845 void GuestViewBase::StopTrackingEmbedderZoomLevel() { | 870 void GuestViewBase::StopTrackingEmbedderZoomLevel() { |
| 846 if (!attached() || !ZoomPropagatesFromEmbedderToGuest()) | 871 if (!attached() || !ZoomPropagatesFromEmbedderToGuest()) |
| 847 return; | 872 return; |
| 848 | 873 |
| 849 auto embedder_zoom_controller = | 874 auto embedder_zoom_controller = |
| 850 ui_zoom::ZoomController::FromWebContents(owner_web_contents()); | 875 ui_zoom::ZoomController::FromWebContents(owner_web_contents()); |
| 851 // Chrome Apps do not have a ZoomController. | 876 // Chrome Apps do not have a ZoomController. |
| 852 if (!embedder_zoom_controller) | 877 if (!embedder_zoom_controller) |
| 853 return; | 878 return; |
| 854 embedder_zoom_controller->RemoveObserver(this); | 879 embedder_zoom_controller->RemoveObserver(this); |
| 855 } | 880 } |
| 856 | 881 |
| 857 // static | 882 // static |
| 858 void GuestViewBase::RegisterGuestViewTypes() { | 883 void GuestViewBase::RegisterGuestViewTypes() { |
| 859 AppViewGuest::Register(); | 884 AppViewGuest::Register(); |
| 860 ExtensionOptionsGuest::Register(); | 885 ExtensionOptionsGuest::Register(); |
| 861 ExtensionViewGuest::Register(); | 886 ExtensionViewGuest::Register(); |
| 862 MimeHandlerViewGuest::Register(); | 887 MimeHandlerViewGuest::Register(); |
| 863 SurfaceWorkerGuest::Register(); | 888 SurfaceWorkerGuest::Register(); |
| 864 WebViewGuest::Register(); | 889 WebViewGuest::Register(); |
| 865 } | 890 } |
| 866 | 891 |
| 867 } // namespace extensions | 892 } // namespace extensions |
| OLD | NEW |