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 |