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 b585170006431b97e906050de3d1d2c45198159c..f5cd21a6cdbfe0cc34b474c82eba283337d37db3 100644 |
--- a/extensions/browser/guest_view/guest_view_base.cc |
+++ b/extensions/browser/guest_view/guest_view_base.cc |
@@ -6,11 +6,13 @@ |
#include "base/lazy_instance.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "components/ui/zoom/zoom_controller.h" |
#include "content/public/browser/navigation_details.h" |
#include "content/public/browser/render_frame_host.h" |
#include "content/public/browser/render_process_host.h" |
#include "content/public/browser/render_view_host.h" |
#include "content/public/browser/web_contents.h" |
+#include "content/public/common/page_zoom.h" |
#include "content/public/common/url_constants.h" |
#include "extensions/browser/api/extensions_api_client.h" |
#include "extensions/browser/event_router.h" |
@@ -102,7 +104,6 @@ class GuestViewBase::OwnerLifetimeObserver : public WebContentsObserver { |
destroyed_ = true; |
guest_->EmbedderWillBeDestroyed(); |
- guest_->owner_web_contents_ = NULL; |
guest_->Destroy(); |
} |
@@ -146,6 +147,7 @@ GuestViewBase::GuestViewBase(content::BrowserContext* browser_context, |
is_being_destroyed_(false), |
auto_size_enabled_(false), |
is_full_page_plugin_(false), |
+ observing_owners_zoom_controller_(false), |
weak_ptr_factory_(this) { |
} |
@@ -209,6 +211,9 @@ 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); |
+ |
// Give the derived class an opportunity to perform additional initialization. |
DidInitialize(); |
} |
@@ -309,6 +314,9 @@ bool GuestViewBase::IsDragAndDropEnabled() const { |
void GuestViewBase::DidAttach(int guest_proxy_routing_id) { |
opener_lifetime_observer_.reset(); |
+ // Any zoom events from the embedder should be relayed to the guest. |
+ StartObservingOwnersZoomController(); |
+ |
// Give the derived class an opportunity to perform some actions. |
DidAttachToEmbedder(); |
@@ -357,6 +365,12 @@ void GuestViewBase::Destroy() { |
is_being_destroyed_ = true; |
+ // It is important to clear owner_web_contents_ after the call to |
+ // StopObservingOwnersZoomControllerIfNecessary(), but before the rest of |
+ // the statements in this function. |
+ StopObservingOwnersZoomControllerIfNecessary(); |
+ owner_web_contents_ = NULL; |
+ |
DCHECK(web_contents()); |
// Give the derived class an opportunity to perform some cleanup. |
@@ -485,6 +499,17 @@ bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source, |
GuestViewBase::~GuestViewBase() { |
} |
+void GuestViewBase::OnZoomChanged( |
+ const ui_zoom::ZoomController::ZoomChangedEventData& data) { |
+ if (content::ZoomValuesEqual(data.old_zoom_level, data.new_zoom_level)) |
+ return; |
+ |
+ // When the embedder's zoom level is changed, then we also update the |
+ // guest's zoom level to match. |
+ ui_zoom::ZoomController::FromWebContents(web_contents()) |
+ ->SetZoomLevel(data.new_zoom_level); |
+} |
+ |
void GuestViewBase::DispatchEventToEmbedder(Event* event) { |
scoped_ptr<Event> event_ptr(event); |
@@ -532,6 +557,33 @@ void GuestViewBase::CompleteInit(const std::string& owner_extension_id, |
callback.Run(guest_web_contents); |
} |
+void GuestViewBase::StartObservingOwnersZoomController() { |
+ ui_zoom::ZoomController* zoom_controller = |
+ ui_zoom::ZoomController::FromWebContents(embedder_web_contents()); |
+ if (!zoom_controller) |
+ return; |
+ |
+ // Listen to the embedder's zoom changes. |
+ zoom_controller->AddObserver(this); |
+ observing_owners_zoom_controller_ = true; |
+ // Set the guest's initial zoom level to be equal to the embedder's. |
+ ui_zoom::ZoomController::FromWebContents(web_contents()) |
+ ->SetZoomLevel(zoom_controller->GetZoomLevel()); |
+} |
+ |
+void GuestViewBase::StopObservingOwnersZoomControllerIfNecessary() { |
+ // We use owner_web_contents_ below and not embedder_web_contents() since |
+ // we may have been detached by this point. |
+ DCHECK(!observing_owners_zoom_controller_ || owner_web_contents_); |
+ if (!owner_web_contents_ || !observing_owners_zoom_controller_) |
+ return; |
+ |
+ ui_zoom::ZoomController* zoom_controller = |
+ ui_zoom::ZoomController::FromWebContents(owner_web_contents_); |
+ zoom_controller->RemoveObserver(this); |
+ observing_owners_zoom_controller_ = false; |
+} |
+ |
// static |
void GuestViewBase::RegisterGuestViewTypes() { |
AppViewGuest::Register(); |