Commit ec6bd52a authored by wjmaclean's avatar wjmaclean Committed by Commit bot

Move ZoomController out of ChromeWebViewGuestDelegate.

This CL moves the ZoomController code for WebView out of
ChromeWebViewGuestDelegate and into GuestViewBase and WebViewGuest. This
will allow non-chrome builds to access the WebView zoom api.

BUG=none

Review URL: https://codereview.chromium.org/787813004

Cr-Commit-Position: refs/heads/master@{#308094}
parent 85f7f361
...@@ -12,8 +12,6 @@ ...@@ -12,8 +12,6 @@
#include "chrome/common/chrome_version_info.h" #include "chrome/common/chrome_version_info.h"
#include "components/pdf/browser/pdf_web_contents_helper.h" #include "components/pdf/browser/pdf_web_contents_helper.h"
#include "components/renderer_context_menu/context_menu_delegate.h" #include "components/renderer_context_menu/context_menu_delegate.h"
#include "components/ui/zoom/zoom_controller.h"
#include "content/public/common/page_zoom.h"
#include "extensions/browser/api/web_request/web_request_api.h" #include "extensions/browser/api/web_request/web_request_api.h"
#include "extensions/browser/guest_view/web_view/web_view_constants.h" #include "extensions/browser/guest_view/web_view/web_view_constants.h"
...@@ -28,13 +26,10 @@ ...@@ -28,13 +26,10 @@
namespace extensions { namespace extensions {
using ui_zoom::ZoomController;
ChromeWebViewGuestDelegate::ChromeWebViewGuestDelegate( ChromeWebViewGuestDelegate::ChromeWebViewGuestDelegate(
WebViewGuest* web_view_guest) WebViewGuest* web_view_guest)
: pending_context_menu_request_id_(0), : pending_context_menu_request_id_(0),
chromevox_injected_(false), chromevox_injected_(false),
current_zoom_factor_(1.0),
web_view_guest_(web_view_guest), web_view_guest_(web_view_guest),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
} }
...@@ -42,10 +37,6 @@ ChromeWebViewGuestDelegate::ChromeWebViewGuestDelegate( ...@@ -42,10 +37,6 @@ ChromeWebViewGuestDelegate::ChromeWebViewGuestDelegate(
ChromeWebViewGuestDelegate::~ChromeWebViewGuestDelegate() { ChromeWebViewGuestDelegate::~ChromeWebViewGuestDelegate() {
} }
double ChromeWebViewGuestDelegate::GetZoom() {
return current_zoom_factor_;
}
bool ChromeWebViewGuestDelegate::HandleContextMenu( bool ChromeWebViewGuestDelegate::HandleContextMenu(
const content::ContextMenuParams& params) { const content::ContextMenuParams& params) {
ContextMenuDelegate* menu_delegate = ContextMenuDelegate* menu_delegate =
...@@ -70,14 +61,6 @@ bool ChromeWebViewGuestDelegate::HandleContextMenu( ...@@ -70,14 +61,6 @@ bool ChromeWebViewGuestDelegate::HandleContextMenu(
// extension module in the future. // extension module in the future.
void ChromeWebViewGuestDelegate::OnAttachWebViewHelpers( void ChromeWebViewGuestDelegate::OnAttachWebViewHelpers(
content::WebContents* contents) { content::WebContents* contents) {
// Create a zoom controller for the guest contents give it access to
// GetZoomLevel() and and SetZoomLevel() in WebViewGuest.
// TODO(wjmaclean) This currently uses the same HostZoomMap as the browser
// context, but we eventually want to isolate the guest contents from zoom
// changes outside the guest (e.g. in the main browser), so we should
// create a separate HostZoomMap for the guest.
ZoomController::CreateForWebContents(contents);
FaviconTabHelper::CreateForWebContents(contents); FaviconTabHelper::CreateForWebContents(contents);
ChromeExtensionWebContentsObserver::CreateForWebContents(contents); ChromeExtensionWebContentsObserver::CreateForWebContents(contents);
#if defined(ENABLE_PRINTING) #if defined(ENABLE_PRINTING)
...@@ -94,28 +77,8 @@ void ChromeWebViewGuestDelegate::OnAttachWebViewHelpers( ...@@ -94,28 +77,8 @@ void ChromeWebViewGuestDelegate::OnAttachWebViewHelpers(
new ChromePDFWebContentsHelperClient())); new ChromePDFWebContentsHelperClient()));
} }
void ChromeWebViewGuestDelegate::OnDidAttachToEmbedder() {
// TODO(fsamuel): This code should be implemented in GuestViewBase once the
// ZoomController moves to the extensions module.
ZoomController* zoom_controller = ZoomController::FromWebContents(
web_view_guest()->embedder_web_contents());
if (!zoom_controller)
return;
// Listen to the embedder's zoom changes.
zoom_controller->AddObserver(this);
// Set the guest's initial zoom level to be equal to the embedder's.
ZoomController::FromWebContents(guest_web_contents())->
SetZoomLevel(zoom_controller->GetZoomLevel());
}
void ChromeWebViewGuestDelegate::OnDidCommitProvisionalLoadForFrame( void ChromeWebViewGuestDelegate::OnDidCommitProvisionalLoadForFrame(
bool is_main_frame) { bool is_main_frame) {
// Update the current zoom factor for the new page.
ZoomController* zoom_controller =
ZoomController::FromWebContents(guest_web_contents());
DCHECK(zoom_controller);
current_zoom_factor_ =
content::ZoomLevelToZoomFactor(zoom_controller->GetZoomLevel());
if (is_main_frame) if (is_main_frame)
chromevox_injected_ = false; chromevox_injected_ = false;
} }
...@@ -137,18 +100,6 @@ void ChromeWebViewGuestDelegate::OnDocumentLoadedInFrame( ...@@ -137,18 +100,6 @@ void ChromeWebViewGuestDelegate::OnDocumentLoadedInFrame(
InjectChromeVoxIfNeeded(render_frame_host->GetRenderViewHost()); InjectChromeVoxIfNeeded(render_frame_host->GetRenderViewHost());
} }
void ChromeWebViewGuestDelegate::OnEmbedderWillBeDestroyed() {
content::WebContents* embedder_web_contents =
web_view_guest()->embedder_web_contents();
if (!embedder_web_contents)
return;
ZoomController* zoom_controller =
ZoomController::FromWebContents(embedder_web_contents);
if (zoom_controller)
zoom_controller->RemoveObserver(this);
}
void ChromeWebViewGuestDelegate::OnGuestDestroyed() { void ChromeWebViewGuestDelegate::OnGuestDestroyed() {
// Clean up custom context menu items for this guest. // Clean up custom context menu items for this guest.
MenuManager* menu_manager = MenuManager::Get( MenuManager* menu_manager = MenuManager::Get(
...@@ -174,21 +125,6 @@ scoped_ptr<base::ListValue> ChromeWebViewGuestDelegate::MenuModelToValue( ...@@ -174,21 +125,6 @@ scoped_ptr<base::ListValue> ChromeWebViewGuestDelegate::MenuModelToValue(
return items.Pass(); return items.Pass();
} }
void ChromeWebViewGuestDelegate::OnSetZoom(double zoom_factor) {
ZoomController* zoom_controller =
ZoomController::FromWebContents(guest_web_contents());
DCHECK(zoom_controller);
double zoom_level = content::ZoomFactorToZoomLevel(zoom_factor);
zoom_controller->SetZoomLevel(zoom_level);
scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
args->SetDouble(webview::kOldZoomFactor, current_zoom_factor_);
args->SetDouble(webview::kNewZoomFactor, zoom_factor);
web_view_guest()->DispatchEventToEmbedder(
new GuestViewBase::Event(webview::kEventZoomChange, args.Pass()));
current_zoom_factor_ = zoom_factor;
}
void ChromeWebViewGuestDelegate::OnShowContextMenu( void ChromeWebViewGuestDelegate::OnShowContextMenu(
int request_id, int request_id,
const MenuItemVector* items) { const MenuItemVector* items) {
...@@ -236,10 +172,4 @@ void ChromeWebViewGuestDelegate::OnAccessibilityStatusChanged( ...@@ -236,10 +172,4 @@ void ChromeWebViewGuestDelegate::OnAccessibilityStatusChanged(
} }
#endif #endif
void ChromeWebViewGuestDelegate::OnZoomChanged(
const ZoomController::ZoomChangedEventData& data) {
ZoomController::FromWebContents(guest_web_contents())->
SetZoomLevel(data.new_zoom_level);
}
} // namespace extensions } // namespace extensions
...@@ -6,7 +6,6 @@ ...@@ -6,7 +6,6 @@
#define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_ #define CHROME_BROWSER_GUEST_VIEW_WEB_VIEW_CHROME_WEB_VIEW_GUEST_DELEGATE_H_
#include "chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h" #include "chrome/browser/extensions/api/web_view/chrome_web_view_internal_api.h"
#include "components/ui/zoom/zoom_observer.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h" #include "extensions/browser/guest_view/web_view/web_view_guest_delegate.h"
...@@ -22,30 +21,21 @@ class SimpleMenuModel; ...@@ -22,30 +21,21 @@ class SimpleMenuModel;
namespace extensions { namespace extensions {
class ChromeWebViewGuestDelegate : public WebViewGuestDelegate, class ChromeWebViewGuestDelegate : public WebViewGuestDelegate {
public ui_zoom::ZoomObserver {
public : public :
explicit ChromeWebViewGuestDelegate(WebViewGuest* web_view_guest); explicit ChromeWebViewGuestDelegate(WebViewGuest* web_view_guest);
~ChromeWebViewGuestDelegate() override; ~ChromeWebViewGuestDelegate() override;
// WebViewGuestDelegate implementation. // WebViewGuestDelegate implementation.
double GetZoom() override;
bool HandleContextMenu(const content::ContextMenuParams& params) override; bool HandleContextMenu(const content::ContextMenuParams& params) override;
void OnAttachWebViewHelpers(content::WebContents* contents) override; void OnAttachWebViewHelpers(content::WebContents* contents) override;
void OnDidAttachToEmbedder() override;
void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) override; void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) override;
void OnDidInitialize() override; void OnDidInitialize() override;
void OnDocumentLoadedInFrame( void OnDocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) override; content::RenderFrameHost* render_frame_host) override;
void OnEmbedderWillBeDestroyed() override;
void OnGuestDestroyed() override; void OnGuestDestroyed() override;
void OnSetZoom(double zoom_factor) override;
void OnShowContextMenu(int request_id, const MenuItemVector* items) override; void OnShowContextMenu(int request_id, const MenuItemVector* items) override;
// ZoomObserver implementation.
void OnZoomChanged(
const ui_zoom::ZoomController::ZoomChangedEventData& data) override;
WebViewGuest* web_view_guest() const { return web_view_guest_; } WebViewGuest* web_view_guest() const { return web_view_guest_; }
private: private:
...@@ -72,9 +62,6 @@ class ChromeWebViewGuestDelegate : public WebViewGuestDelegate, ...@@ -72,9 +62,6 @@ class ChromeWebViewGuestDelegate : public WebViewGuestDelegate,
// Set to |true| if ChromeVox was already injected in main frame. // Set to |true| if ChromeVox was already injected in main frame.
bool chromevox_injected_; bool chromevox_injected_;
// Stores the current zoom factor.
double current_zoom_factor_;
// Holds the RenderViewContextMenuBase that has been built but yet to be // Holds the RenderViewContextMenuBase that has been built but yet to be
// shown. This is .reset() after ShowContextMenu(). // shown. This is .reset() after ShowContextMenu().
scoped_ptr<RenderViewContextMenuBase> pending_menu_; scoped_ptr<RenderViewContextMenuBase> pending_menu_;
......
...@@ -15,6 +15,7 @@ source_set("browser") { ...@@ -15,6 +15,7 @@ source_set("browser") {
"//components/keyed_service/core", "//components/keyed_service/core",
"//components/pref_registry", "//components/pref_registry",
"//components/sessions:sessions_content", "//components/sessions:sessions_content",
"//components/ui/zoom:ui_zoom",
"//components/web_cache/browser", "//components/web_cache/browser",
"//components/web_modal", "//components/web_modal",
"//content/public/browser", "//content/public/browser",
......
...@@ -213,7 +213,7 @@ bool WebViewInternalGetZoomFunction::RunAsyncSafe(WebViewGuest* guest) { ...@@ -213,7 +213,7 @@ bool WebViewInternalGetZoomFunction::RunAsyncSafe(WebViewGuest* guest) {
webview::GetZoom::Params::Create(*args_)); webview::GetZoom::Params::Create(*args_));
EXTENSION_FUNCTION_VALIDATE(params.get()); EXTENSION_FUNCTION_VALIDATE(params.get());
double zoom_factor = guest->GetZoom(); double zoom_factor = guest->zoom();
SetResult(new base::FundamentalValue(zoom_factor)); SetResult(new base::FundamentalValue(zoom_factor));
SendResponse(true); SendResponse(true);
return true; return true;
......
...@@ -6,11 +6,13 @@ ...@@ -6,11 +6,13 @@
#include "base/lazy_instance.h" #include "base/lazy_instance.h"
#include "base/strings/utf_string_conversions.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/navigation_details.h"
#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h" #include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/page_zoom.h"
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "extensions/browser/api/extensions_api_client.h" #include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
...@@ -102,7 +104,6 @@ class GuestViewBase::OwnerLifetimeObserver : public WebContentsObserver { ...@@ -102,7 +104,6 @@ class GuestViewBase::OwnerLifetimeObserver : public WebContentsObserver {
destroyed_ = true; destroyed_ = true;
guest_->EmbedderWillBeDestroyed(); guest_->EmbedderWillBeDestroyed();
guest_->owner_web_contents_ = NULL;
guest_->Destroy(); guest_->Destroy();
} }
...@@ -146,6 +147,7 @@ GuestViewBase::GuestViewBase(content::BrowserContext* browser_context, ...@@ -146,6 +147,7 @@ GuestViewBase::GuestViewBase(content::BrowserContext* browser_context,
is_being_destroyed_(false), is_being_destroyed_(false),
auto_size_enabled_(false), auto_size_enabled_(false),
is_full_page_plugin_(false), is_full_page_plugin_(false),
observing_owners_zoom_controller_(false),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
} }
...@@ -209,6 +211,9 @@ void GuestViewBase::InitWithWebContents( ...@@ -209,6 +211,9 @@ void GuestViewBase::InitWithWebContents(
GuestViewManager::FromBrowserContext(browser_context_)-> GuestViewManager::FromBrowserContext(browser_context_)->
AddGuest(guest_instance_id_, guest_web_contents); 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. // Give the derived class an opportunity to perform additional initialization.
DidInitialize(); DidInitialize();
} }
...@@ -309,6 +314,9 @@ bool GuestViewBase::IsDragAndDropEnabled() const { ...@@ -309,6 +314,9 @@ bool GuestViewBase::IsDragAndDropEnabled() const {
void GuestViewBase::DidAttach(int guest_proxy_routing_id) { void GuestViewBase::DidAttach(int guest_proxy_routing_id) {
opener_lifetime_observer_.reset(); 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. // Give the derived class an opportunity to perform some actions.
DidAttachToEmbedder(); DidAttachToEmbedder();
...@@ -357,6 +365,12 @@ void GuestViewBase::Destroy() { ...@@ -357,6 +365,12 @@ void GuestViewBase::Destroy() {
is_being_destroyed_ = true; 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()); DCHECK(web_contents());
// Give the derived class an opportunity to perform some cleanup. // Give the derived class an opportunity to perform some cleanup.
...@@ -485,6 +499,17 @@ bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source, ...@@ -485,6 +499,17 @@ bool GuestViewBase::PreHandleGestureEvent(content::WebContents* source,
GuestViewBase::~GuestViewBase() { 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) { void GuestViewBase::DispatchEventToEmbedder(Event* event) {
scoped_ptr<Event> event_ptr(event); scoped_ptr<Event> event_ptr(event);
...@@ -532,6 +557,33 @@ void GuestViewBase::CompleteInit(const std::string& owner_extension_id, ...@@ -532,6 +557,33 @@ void GuestViewBase::CompleteInit(const std::string& owner_extension_id,
callback.Run(guest_web_contents); 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 // static
void GuestViewBase::RegisterGuestViewTypes() { void GuestViewBase::RegisterGuestViewTypes() {
AppViewGuest::Register(); AppViewGuest::Register();
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/values.h" #include "base/values.h"
#include "components/ui/zoom/zoom_observer.h"
#include "content/public/browser/browser_plugin_guest_delegate.h" #include "content/public/browser/browser_plugin_guest_delegate.h"
#include "content/public/browser/render_process_host_observer.h" #include "content/public/browser/render_process_host_observer.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
...@@ -28,7 +29,8 @@ namespace extensions { ...@@ -28,7 +29,8 @@ namespace extensions {
// it is attached to a container within the owner's WebContents. // it is attached to a container within the owner's WebContents.
class GuestViewBase : public content::BrowserPluginGuestDelegate, class GuestViewBase : public content::BrowserPluginGuestDelegate,
public content::WebContentsDelegate, public content::WebContentsDelegate,
public content::WebContentsObserver { public content::WebContentsObserver,
public ui_zoom::ZoomObserver {
public: public:
class Event { class Event {
public: public:
...@@ -246,6 +248,10 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, ...@@ -246,6 +248,10 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
int browser_plugin_instance_id, int browser_plugin_instance_id,
bool is_full_page_plugin) final; bool is_full_page_plugin) final;
// ui_zoom::ZoomObserver implementation.
void OnZoomChanged(
const ui_zoom::ZoomController::ZoomChangedEventData& data) override;
// Dispatches an event |event_name| to the embedder with the |event| fields. // Dispatches an event |event_name| to the embedder with the |event| fields.
void DispatchEventToEmbedder(Event* event); void DispatchEventToEmbedder(Event* event);
...@@ -267,6 +273,9 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, ...@@ -267,6 +273,9 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
const WebContentsCreatedCallback& callback, const WebContentsCreatedCallback& callback,
content::WebContents* guest_web_contents); content::WebContents* guest_web_contents);
void StartObservingOwnersZoomController();
void StopObservingOwnersZoomControllerIfNecessary();
static void RegisterGuestViewTypes(); static void RegisterGuestViewTypes();
// WebContentsObserver implementation. // WebContentsObserver implementation.
...@@ -352,6 +361,8 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate, ...@@ -352,6 +361,8 @@ class GuestViewBase : public content::BrowserPluginGuestDelegate,
// Whether the guest view is inside a plugin document. // Whether the guest view is inside a plugin document.
bool is_full_page_plugin_; bool is_full_page_plugin_;
bool observing_owners_zoom_controller_;
// This is used to ensure pending tasks will not fire after this object is // This is used to ensure pending tasks will not fire after this object is
// destroyed. // destroyed.
base::WeakPtrFactory<GuestViewBase> weak_ptr_factory_; base::WeakPtrFactory<GuestViewBase> weak_ptr_factory_;
......
...@@ -337,9 +337,6 @@ void WebViewGuest::DidAttachToEmbedder() { ...@@ -337,9 +337,6 @@ void WebViewGuest::DidAttachToEmbedder() {
// We need to set the background opaque flag after navigation to ensure that // We need to set the background opaque flag after navigation to ensure that
// there is a RenderWidgetHostView available. // there is a RenderWidgetHostView available.
SetAllowTransparency(allow_transparency); SetAllowTransparency(allow_transparency);
if (web_view_guest_delegate_)
web_view_guest_delegate_->OnDidAttachToEmbedder();
} }
void WebViewGuest::DidInitialize() { void WebViewGuest::DidInitialize() {
...@@ -372,9 +369,6 @@ void WebViewGuest::DidStopLoading() { ...@@ -372,9 +369,6 @@ void WebViewGuest::DidStopLoading() {
} }
void WebViewGuest::EmbedderWillBeDestroyed() { void WebViewGuest::EmbedderWillBeDestroyed() {
if (web_view_guest_delegate_)
web_view_guest_delegate_->OnEmbedderWillBeDestroyed();
// Clean up rules registries for the webview. // Clean up rules registries for the webview.
RulesRegistryService::Get(browser_context()) RulesRegistryService::Get(browser_context())
->RemoveRulesRegistriesByID(rules_registry_id_); ->RemoveRulesRegistriesByID(rules_registry_id_);
...@@ -620,12 +614,6 @@ void WebViewGuest::Observe(int type, ...@@ -620,12 +614,6 @@ void WebViewGuest::Observe(int type,
} }
} }
double WebViewGuest::GetZoom() {
if (!web_view_guest_delegate_)
return 1.0;
return web_view_guest_delegate_->GetZoom();
}
void WebViewGuest::StartFinding( void WebViewGuest::StartFinding(
const base::string16& search_text, const base::string16& search_text,
const blink::WebFindOptions& options, const blink::WebFindOptions& options,
...@@ -712,6 +700,7 @@ WebViewGuest::WebViewGuest(content::BrowserContext* browser_context, ...@@ -712,6 +700,7 @@ WebViewGuest::WebViewGuest(content::BrowserContext* browser_context,
is_overriding_user_agent_(false), is_overriding_user_agent_(false),
guest_opaque_(true), guest_opaque_(true),
javascript_dialog_helper_(this), javascript_dialog_helper_(this),
current_zoom_factor_(1.0),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
web_view_guest_delegate_.reset( web_view_guest_delegate_.reset(
ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this)); ExtensionsAPIClient::Get()->CreateWebViewGuestDelegate(this));
...@@ -745,6 +734,14 @@ void WebViewGuest::DidCommitProvisionalLoadForFrame( ...@@ -745,6 +734,14 @@ void WebViewGuest::DidCommitProvisionalLoadForFrame(
new GuestViewBase::Event(webview::kEventLoadCommit, args.Pass())); new GuestViewBase::Event(webview::kEventLoadCommit, args.Pass()));
find_helper_.CancelAllFindSessions(); find_helper_.CancelAllFindSessions();
// Update the current zoom factor for the new page.
ui_zoom::ZoomController* zoom_controller =
ui_zoom::ZoomController::FromWebContents(web_contents());
DCHECK(zoom_controller);
current_zoom_factor_ =
content::ZoomLevelToZoomFactor(zoom_controller->GetZoomLevel());
if (web_view_guest_delegate_) { if (web_view_guest_delegate_) {
web_view_guest_delegate_->OnDidCommitProvisionalLoadForFrame( web_view_guest_delegate_->OnDidCommitProvisionalLoadForFrame(
!render_frame_host->GetParent()); !render_frame_host->GetParent());
...@@ -1067,8 +1064,18 @@ void WebViewGuest::SetName(const std::string& name) { ...@@ -1067,8 +1064,18 @@ void WebViewGuest::SetName(const std::string& name) {
} }
void WebViewGuest::SetZoom(double zoom_factor) { void WebViewGuest::SetZoom(double zoom_factor) {
if (web_view_guest_delegate_) ui_zoom::ZoomController* zoom_controller =
web_view_guest_delegate_->OnSetZoom(zoom_factor); ui_zoom::ZoomController::FromWebContents(web_contents());
DCHECK(zoom_controller);
double zoom_level = content::ZoomFactorToZoomLevel(zoom_factor);
zoom_controller->SetZoomLevel(zoom_level);
scoped_ptr<base::DictionaryValue> args(new base::DictionaryValue());
args->SetDouble(webview::kOldZoomFactor, current_zoom_factor_);
args->SetDouble(webview::kNewZoomFactor, zoom_factor);
DispatchEventToEmbedder(
new GuestViewBase::Event(webview::kEventZoomChange, args.Pass()));
current_zoom_factor_ = zoom_factor;
} }
void WebViewGuest::SetAllowTransparency(bool allow) { void WebViewGuest::SetAllowTransparency(bool allow) {
......
...@@ -174,7 +174,7 @@ class WebViewGuest : public GuestView<WebViewGuest>, ...@@ -174,7 +174,7 @@ class WebViewGuest : public GuestView<WebViewGuest>,
const content::NotificationDetails& details) override; const content::NotificationDetails& details) override;
// Returns the current zoom factor. // Returns the current zoom factor.
double GetZoom(); double zoom() const { return current_zoom_factor_; }
// Begin or continue a find request. // Begin or continue a find request.
void StartFinding(const base::string16& search_text, void StartFinding(const base::string16& search_text,
...@@ -368,6 +368,9 @@ class WebViewGuest : public GuestView<WebViewGuest>, ...@@ -368,6 +368,9 @@ class WebViewGuest : public GuestView<WebViewGuest>,
typedef std::map<WebViewGuest*, NewWindowInfo> PendingWindowMap; typedef std::map<WebViewGuest*, NewWindowInfo> PendingWindowMap;
PendingWindowMap pending_new_windows_; PendingWindowMap pending_new_windows_;
// Stores the current zoom factor.
double current_zoom_factor_;
// This is used to ensure pending tasks will not fire after this object is // This is used to ensure pending tasks will not fire after this object is
// destroyed. // destroyed.
base::WeakPtrFactory<WebViewGuest> weak_ptr_factory_; base::WeakPtrFactory<WebViewGuest> weak_ptr_factory_;
......
...@@ -31,19 +31,12 @@ class WebViewGuestDelegate { ...@@ -31,19 +31,12 @@ class WebViewGuestDelegate {
typedef std::vector<linked_ptr<api::web_view_internal::ContextMenuItem> > typedef std::vector<linked_ptr<api::web_view_internal::ContextMenuItem> >
MenuItemVector; MenuItemVector;
// Returns the current zoom factor.
virtual double GetZoom() = 0;
// Called when context menu operation was handled. // Called when context menu operation was handled.
virtual bool HandleContextMenu(const content::ContextMenuParams& params) = 0; virtual bool HandleContextMenu(const content::ContextMenuParams& params) = 0;
// Called to attach helpers just after additional initialization is performed. // Called to attach helpers just after additional initialization is performed.
virtual void OnAttachWebViewHelpers(content::WebContents* contents) = 0; virtual void OnAttachWebViewHelpers(content::WebContents* contents) = 0;
// Called after the guest has been attached to an embedder and suspended
// resource loads have been resumed.
virtual void OnDidAttachToEmbedder() = 0;
// Called when the guest WebContents commits a provisional load in any frame. // Called when the guest WebContents commits a provisional load in any frame.
virtual void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) = 0; virtual void OnDidCommitProvisionalLoadForFrame(bool is_main_frame) = 0;
...@@ -53,15 +46,9 @@ class WebViewGuestDelegate { ...@@ -53,15 +46,9 @@ class WebViewGuestDelegate {
virtual void OnDocumentLoadedInFrame( virtual void OnDocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) = 0; content::RenderFrameHost* render_frame_host) = 0;
// Called before the embedder is destroyed.
virtual void OnEmbedderWillBeDestroyed() = 0;
// Called immediately after the guest WebContents has been destroyed. // Called immediately after the guest WebContents has been destroyed.
virtual void OnGuestDestroyed() = 0; virtual void OnGuestDestroyed() = 0;
// Called when to set the zoom factor.
virtual void OnSetZoom(double zoom_factor) = 0;
// Shows the context menu for the guest. // Shows the context menu for the guest.
// |items| acts as a filter. This restricts the current context's default // |items| acts as a filter. This restricts the current context's default
// menu items to contain only the items from |items|. // menu items to contain only the items from |items|.
......
...@@ -294,6 +294,7 @@ ...@@ -294,6 +294,7 @@
'../components/components.gyp:pref_registry', '../components/components.gyp:pref_registry',
'../components/components.gyp:sessions_content', '../components/components.gyp:sessions_content',
'../components/components.gyp:storage_monitor', '../components/components.gyp:storage_monitor',
'../components/components.gyp:ui_zoom',
'../components/components.gyp:web_cache_browser', '../components/components.gyp:web_cache_browser',
'../components/components.gyp:web_modal', '../components/components.gyp:web_modal',
'../content/content.gyp:content_browser', '../content/content.gyp:content_browser',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment