Index: extensions/browser/guest_view/guest_view_base.cc |
diff --git a/extensions/browser/guest_view/guest_view_base.cc b/extensions/browser/guest_view/guest_view_base.cc |
index eefe4bb0758b900fe5187bc7e3100c6a92049011..1652bc884a80531e6bb38333ca1f79aeb1c44eca 100644 |
--- a/extensions/browser/guest_view/guest_view_base.cc |
+++ b/extensions/browser/guest_view/guest_view_base.cc |
@@ -233,6 +233,12 @@ void GuestViewBase::InitWithWebContents( |
content::WebContents* guest_web_contents) { |
DCHECK(guest_web_contents); |
+ // Create a ZoomController to allow the guest's contents to be zoomed. |
+ // Do this before adding the GuestView as a WebContents Observer so that |
+ // the GuestView and its derived classes can re-configure the ZoomController |
+ // after the latter has handled WebContentsObserver events. |
Fady Samuel
2015/03/25 21:07:16
I don't know what this means. What problem is this
wjmaclean
2015/03/25 21:14:33
When multiple observers exist for a given WebConte
|
+ ui_zoom::ZoomController::CreateForWebContents(guest_web_contents); |
+ |
// At this point, we have just created the guest WebContents, we need to add |
// an observer to the owner WebContents. This observer will be responsible |
// for destroying the guest WebContents if the owner goes away. |
@@ -246,9 +252,6 @@ void GuestViewBase::InitWithWebContents( |
GuestViewManager::FromBrowserContext(browser_context_)-> |
AddGuest(guest_instance_id_, guest_web_contents); |
- // Create a ZoomController to allow the guest's contents to be zoomed. |
- ui_zoom::ZoomController::CreateForWebContents(guest_web_contents); |
- |
// Populate the view instance ID if we have it on creation. |
create_params.GetInteger(guestview::kParameterInstanceId, |
&view_instance_id_); |
@@ -576,6 +579,13 @@ void GuestViewBase::WebContentsDestroyed() { |
delete this; |
} |
+void GuestViewBase::DidNavigateMainFrame( |
+ const content::LoadCommittedDetails& details, |
+ const content::FrameNavigateParams& params) { |
+ if (attached()) |
+ SetGuestZoomLevelToMatchEmbedder(); |
+} |
+ |
void GuestViewBase::ActivateContents(WebContents* web_contents) { |
if (!attached() || !embedder_web_contents()->GetDelegate()) |
return; |
@@ -815,6 +825,16 @@ void GuestViewBase::SetUpSizing(const base::DictionaryValue& params) { |
SetSize(set_size_params); |
} |
+void GuestViewBase::SetGuestZoomLevelToMatchEmbedder() { |
+ auto embedder_zoom_controller = |
+ ui_zoom::ZoomController::FromWebContents(owner_web_contents()); |
+ if (!embedder_zoom_controller) |
+ return; |
+ |
+ ui_zoom::ZoomController::FromWebContents(web_contents()) |
+ ->SetZoomLevel(embedder_zoom_controller->GetZoomLevel()); |
+} |
+ |
void GuestViewBase::StartTrackingEmbedderZoomLevel() { |
if (!ZoomPropagatesFromEmbedderToGuest()) |
return; |
@@ -826,9 +846,9 @@ void GuestViewBase::StartTrackingEmbedderZoomLevel() { |
return; |
// Listen to the embedder's zoom changes. |
embedder_zoom_controller->AddObserver(this); |
+ |
// Set the guest's initial zoom level to be equal to the embedder's. |
- ui_zoom::ZoomController::FromWebContents(web_contents()) |
- ->SetZoomLevel(embedder_zoom_controller->GetZoomLevel()); |
+ SetGuestZoomLevelToMatchEmbedder(); |
} |
void GuestViewBase::StopTrackingEmbedderZoomLevel() { |