Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Unified Diff: extensions/browser/guest_view/guest_view_base.cc

Issue 787813004: Move ZoomController out of ChromeWebViewGuestDelegate. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remember to clear the flag for observing the owner's ZoomController. Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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..e0cc57ded7f35c26cce6da3f9107b300574ae96f 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"
@@ -101,6 +103,7 @@ class GuestViewBase::OwnerLifetimeObserver : public WebContentsObserver {
return;
destroyed_ = true;
+ guest_->StopObservingOwnersZoomControllerIfNecessary();
Fady Samuel 2014/12/11 23:18:11 Move this to GuestViewBase::Destroy then you don't
wjmaclean 2014/12/11 23:45:24 Ok, but then we have to preserver owner_weeb_conte
Fady Samuel 2014/12/12 00:03:46 OK, that seems fine. I can't think of reason for t
guest_->EmbedderWillBeDestroyed();
guest_->owner_web_contents_ = NULL;
guest_->Destroy();
@@ -146,6 +149,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),
Fady Samuel 2014/12/11 23:18:12 Is this necessary?
wjmaclean 2014/12/11 23:45:24 Yes ... I think we need to make sure we can detect
Fady Samuel 2014/12/12 00:03:46 GuestViewBase should always have an owner_web_cont
weak_ptr_factory_(this) {
}
@@ -209,6 +213,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 +316,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();
@@ -483,6 +493,18 @@ bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source,
}
GuestViewBase::~GuestViewBase() {
+ StopObservingOwnersZoomControllerIfNecessary();
Fady Samuel 2014/12/11 23:18:12 This should be in Destroy.
wjmaclean 2014/12/11 23:45:24 OK. Then we are *guaranteed* never to call the des
Fady Samuel 2014/12/12 00:03:46 Yes, ~GuestViewBase is protected, and in derived t
Fady Samuel 2014/12/12 00:07:44 Actually the derived types' destructors are privat
+}
+
+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) {
@@ -532,6 +554,32 @@ 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) {
Fady Samuel 2014/12/11 23:18:11 Early exit preferred.
wjmaclean 2014/12/11 23:45:24 Done.
+ // Listen to the embedder's zoom changes.
+ zoom_controller->AddObserver(this);
Fady Samuel 2014/12/12 00:03:46 A GuestViewBase's owner/embedder can change during
+ 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();
« no previous file with comments | « extensions/browser/guest_view/guest_view_base.h ('k') | extensions/browser/guest_view/web_view/web_view_guest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698