From b27c94368d72896ec9a09fa6c37170d7f57fd9d0 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Sun, 29 Jan 2017 19:43:20 +0530 Subject: [PATCH 1/6] webContents: set zoom levels with HostZoomMap --- atom/browser/api/atom_api_web_contents.cc | 23 +++++++++++++++++++++++ atom/browser/api/atom_api_web_contents.h | 6 ++++++ lib/browser/api/web-contents.js | 7 +------ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 9d5c8f8684..74d5da416a 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -49,6 +49,7 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/view_messages.h" #include "content/public/browser/favicon_status.h" +#include "content/public/browser/host_zoom_map.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" @@ -1498,6 +1499,24 @@ void WebContents::Invalidate() { osr_rwhv->Invalidate(); } +void WebContents::SetZoomLevel(double level) { + content::HostZoomMap::SetZoomLevel(web_contents(), level); +} + +double WebContents::GetZoomLevel() { + return content::HostZoomMap::GetZoomLevel(web_contents()); +} + +void WebContents::SetZoomFactor(double factor) { + auto level = content::ZoomFactorToZoomLevel(factor); + SetZoomLevel(level); +} + +double WebContents::GetZoomFactor() { + auto level = GetZoomLevel(); + return content::ZoomLevelToZoomFactor(level); +} + v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = WebContentsPreferences::FromWebContents(web_contents()); @@ -1626,6 +1645,10 @@ void WebContents::BuildPrototype(v8::Isolate* isolate, .SetMethod("setFrameRate", &WebContents::SetFrameRate) .SetMethod("getFrameRate", &WebContents::GetFrameRate) .SetMethod("invalidate", &WebContents::Invalidate) + .SetMethod("setZoomLevel", &WebContents::SetZoomLevel) + .SetMethod("getZoomLevel", &WebContents::GetZoomLevel) + .SetMethod("setZoomFactor", &WebContents::SetZoomFactor) + .SetMethod("getZoomFactor", &WebContents::GetZoomFactor) .SetMethod("getType", &WebContents::GetType) .SetMethod("getWebPreferences", &WebContents::GetWebPreferences) .SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow) diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index 81472ccd97..f245040e9f 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -174,6 +174,12 @@ class WebContents : public mate::TrackableObject, int GetFrameRate() const; void Invalidate(); + // Methods for zoom handling. + void SetZoomLevel(double level); + double GetZoomLevel(); + void SetZoomFactor(double factor); + double GetZoomFactor(); + // Callback triggered on permission response. void OnEnterFullscreenModeForTab(content::WebContents* source, const GURL& origin, diff --git a/lib/browser/api/web-contents.js b/lib/browser/api/web-contents.js index a92ef7603b..c94bd768c0 100644 --- a/lib/browser/api/web-contents.js +++ b/lib/browser/api/web-contents.js @@ -105,15 +105,10 @@ const webFrameMethods = [ 'insertText', 'setLayoutZoomLevelLimits', 'setVisualZoomLevelLimits', - 'setZoomFactor', - 'setZoomLevel', // TODO(kevinsawicki): Remove in 2.0, deprecate before then with warnings 'setZoomLevelLimits' ] -const webFrameMethodsWithResult = [ - 'getZoomFactor', - 'getZoomLevel' -] +const webFrameMethodsWithResult = [] const asyncWebFrameMethods = function (requestId, method, callback, ...args) { return new Promise((resolve, reject) => { From 07794a58aa53da4eee29ce4821b094423803fd6b Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 30 Jan 2017 00:38:28 +0530 Subject: [PATCH 2/6] use zoom factor webpreference option when required. * When setzoomlevel is not called for the host. * When there is no zoom preference for the host. --- atom/browser/api/atom_api_web_contents.cc | 35 ++++++++++++++++++++-- atom/browser/api/atom_api_web_contents.h | 8 +++++ atom/browser/web_contents_preferences.cc | 7 ----- atom/renderer/atom_render_view_observer.cc | 12 -------- 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 74d5da416a..fe73164d8b 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -68,6 +68,7 @@ #include "content/public/common/context_menu_params.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" +#include "net/base/url_util.h" #include "net/url_request/url_request_context.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/web/WebFindOptions.h" @@ -252,7 +253,8 @@ WebContents::WebContents(v8::Isolate* isolate, type_(type), request_id_(0), background_throttling_(true), - enable_devtools_(true) { + enable_devtools_(true), + zoom_factor_(content::kMinimumZoomFactor) { if (type == REMOTE) { web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); @@ -272,9 +274,11 @@ WebContents::WebContents(v8::Isolate* isolate, type_(BROWSER_WINDOW), request_id_(0), background_throttling_(true), - enable_devtools_(true) { + enable_devtools_(true), + zoom_factor_(content::kMinimumZoomFactor) { // Read options. options.Get("backgroundThrottling", &background_throttling_); + options.Get("zoomFactor", &zoom_factor_); // FIXME(zcbenz): We should read "type" parameter for better design, but // on Windows we have encountered a compiler bug that if we read "type" @@ -734,6 +738,8 @@ void WebContents::DidFinishNavigation( auto url = navigation_handle->GetURL(); bool is_in_page = navigation_handle->IsSamePage(); if (is_main_frame && !is_in_page) { + // Set initial zoom factor if needed. + SetZoomFactorIfNeeded(url); Emit("did-navigate", url); } else if (is_in_page) { Emit("did-navigate-in-page", url, is_main_frame); @@ -1500,6 +1506,15 @@ void WebContents::Invalidate() { } void WebContents::SetZoomLevel(double level) { + auto factor = content::ZoomLevelToZoomFactor(level); + if (!content::ZoomValuesEqual(zoom_factor_, factor)) { + content::NavigationEntry* entry = + web_contents()->GetController().GetLastCommittedEntry(); + if (entry) { + std::string host = net::GetHostOrSpecFromURL(entry->GetURL()); + host_zoom_factor_[host] = factor; + } + } content::HostZoomMap::SetZoomLevel(web_contents(), level); } @@ -1517,6 +1532,22 @@ double WebContents::GetZoomFactor() { return content::ZoomLevelToZoomFactor(level); } +void WebContents::SetZoomFactorIfNeeded(const GURL& url) { + if (zoom_factor_ == content::kMinimumZoomFactor) + return; + + std::string host = net::GetHostOrSpecFromURL(url); + double zoom_factor = zoom_factor_; + auto it = host_zoom_factor_.find(host); + if (it != host_zoom_factor_.end()) + zoom_factor = it->second; + auto level = content::ZoomFactorToZoomLevel(zoom_factor); + if (content::ZoomValuesEqual(level, GetZoomLevel())) + return; + + SetZoomLevel(level); +} + v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = WebContentsPreferences::FromWebContents(web_contents()); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index f245040e9f..be93c4c131 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -349,11 +349,16 @@ class WebContents : public mate::TrackableObject, const base::ListValue& args, IPC::Message* message); + // Called after committing a navigation, to set the zoom + // factor. + void SetZoomFactorIfNeeded(const GURL& url); + v8::Global session_; v8::Global devtools_web_contents_; v8::Global debugger_; std::unique_ptr guest_delegate_; + std::map host_zoom_factor_; // The host webcontents that may contain this webcontents. WebContents* embedder_; @@ -370,6 +375,9 @@ class WebContents : public mate::TrackableObject, // Whether to enable devtools. bool enable_devtools_; + // Initial zoom factor. + double zoom_factor_; + DISALLOW_COPY_AND_ASSIGN(WebContents); }; diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index 1182e2859f..c6527dd6f6 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -130,13 +130,6 @@ void WebContentsPreferences::AppendExtraCommandLineSwitches( if (web_preferences.GetString(options::kBackgroundColor, &color)) command_line->AppendSwitchASCII(switches::kBackgroundColor, color); - // The zoom factor. - double zoom_factor = 1.0; - if (web_preferences.GetDouble(options::kZoomFactor, &zoom_factor) && - zoom_factor != 1.0) - command_line->AppendSwitchASCII(switches::kZoomFactor, - base::DoubleToString(zoom_factor)); - // --guest-instance-id, which is used to identify guest WebContents. int guest_instance_id = 0; if (web_preferences.GetInteger(options::kGuestInstanceID, &guest_instance_id)) diff --git a/atom/renderer/atom_render_view_observer.cc b/atom/renderer/atom_render_view_observer.cc index b96c6ea672..a68238ba4c 100644 --- a/atom/renderer/atom_render_view_observer.cc +++ b/atom/renderer/atom_render_view_observer.cc @@ -14,7 +14,6 @@ #include "atom/common/api/event_emitter_caller.h" #include "atom/common/native_mate_converters/value_converter.h" #include "atom/common/node_includes.h" -#include "atom/common/options_switches.h" #include "atom/renderer/atom_renderer_client.h" #include "base/command_line.h" #include "base/strings/string_number_conversions.h" @@ -117,17 +116,6 @@ void AtomRenderViewObserver::EmitIPCEvent(blink::WebFrame* frame, void AtomRenderViewObserver::DidCreateDocumentElement( blink::WebLocalFrame* frame) { document_created_ = true; - - // Read --zoom-factor from command line. - std::string zoom_factor_str = base::CommandLine::ForCurrentProcess()-> - GetSwitchValueASCII(switches::kZoomFactor); - if (zoom_factor_str.empty()) - return; - double zoom_factor; - if (!base::StringToDouble(zoom_factor_str, &zoom_factor)) - return; - double zoom_level = blink::WebView::zoomFactorToZoomLevel(zoom_factor); - frame->view()->setZoomLevel(zoom_level); } void AtomRenderViewObserver::DraggableRegionsChanged(blink::WebFrame* frame) { From 63c0e4cbb1865b493e6b049cf1316901e8042c65 Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 30 Jan 2017 16:48:40 +0530 Subject: [PATCH 3/6] Add ZoomController to manager zoom changes for webcontents --- atom/browser/api/atom_api_web_contents.cc | 59 +++----- atom/browser/api/atom_api_web_contents.h | 14 +- atom/browser/api/atom_api_web_view_manager.cc | 7 + atom/browser/web_contents_zoom_controller.cc | 139 ++++++++++++++++++ atom/browser/web_contents_zoom_controller.h | 73 +++++++++ atom/browser/web_view_guest_delegate.cc | 13 ++ atom/browser/web_view_guest_delegate.h | 12 +- filenames.gypi | 2 + lib/browser/guest-view-manager.js | 2 +- lib/renderer/web-view/web-view.js | 1 - 10 files changed, 269 insertions(+), 53 deletions(-) create mode 100644 atom/browser/web_contents_zoom_controller.cc create mode 100644 atom/browser/web_contents_zoom_controller.h diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index fe73164d8b..8e513923de 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -22,6 +22,7 @@ #include "atom/browser/ui/drag_util.h" #include "atom/browser/web_contents_permission_helper.h" #include "atom/browser/web_contents_preferences.h" +#include "atom/browser/web_contents_zoom_controller.h" #include "atom/browser/web_view_guest_delegate.h" #include "atom/common/api/api_messages.h" #include "atom/common/api/event_emitter_caller.h" @@ -49,7 +50,6 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/view_messages.h" #include "content/public/browser/favicon_status.h" -#include "content/public/browser/host_zoom_map.h" #include "content/public/browser/native_web_keyboard_event.h" #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" @@ -68,7 +68,6 @@ #include "content/public/common/context_menu_params.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" -#include "net/base/url_util.h" #include "net/url_request/url_request_context.h" #include "third_party/WebKit/public/platform/WebInputEvent.h" #include "third_party/WebKit/public/web/WebFindOptions.h" @@ -249,13 +248,12 @@ WebContents::WebContents(v8::Isolate* isolate, content::WebContents* web_contents, Type type) : content::WebContentsObserver(web_contents), + zoom_controller_(nullptr), embedder_(nullptr), type_(type), request_id_(0), background_throttling_(true), - enable_devtools_(true), - zoom_factor_(content::kMinimumZoomFactor) { - + enable_devtools_(true) { if (type == REMOTE) { web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); Init(isolate); @@ -268,17 +266,15 @@ WebContents::WebContents(v8::Isolate* isolate, } } -WebContents::WebContents(v8::Isolate* isolate, - const mate::Dictionary& options) - : embedder_(nullptr), +WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options) + : zoom_controller_(nullptr), + embedder_(nullptr), type_(BROWSER_WINDOW), request_id_(0), background_throttling_(true), - enable_devtools_(true), - zoom_factor_(content::kMinimumZoomFactor) { + enable_devtools_(true) { // Read options. options.Get("backgroundThrottling", &background_throttling_); - options.Get("zoomFactor", &zoom_factor_); // FIXME(zcbenz): We should read "type" parameter for better design, but // on Windows we have encountered a compiler bug that if we read "type" @@ -350,10 +346,16 @@ void WebContents::InitWithSessionAndOptions(v8::Isolate* isolate, // Save the preferences in C++. new WebContentsPreferences(web_contents, options); - // Intialize permission helper. + // Initialize permission helper. WebContentsPermissionHelper::CreateForWebContents(web_contents); - // Intialize security state client. + // Initialize security state client. SecurityStateTabHelper::CreateForWebContents(web_contents); + // Initialize zoom controller. + WebContentsZoomController::CreateForWebContents(web_contents); + zoom_controller_ = WebContentsZoomController::FromWebContents(web_contents); + double zoom_factor; + if (options.Get("zoomFactor", &zoom_factor)) + zoom_controller_->SetDefaultZoomFactor(zoom_factor); web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); @@ -738,8 +740,6 @@ void WebContents::DidFinishNavigation( auto url = navigation_handle->GetURL(); bool is_in_page = navigation_handle->IsSamePage(); if (is_main_frame && !is_in_page) { - // Set initial zoom factor if needed. - SetZoomFactorIfNeeded(url); Emit("did-navigate", url); } else if (is_in_page) { Emit("did-navigate-in-page", url, is_main_frame); @@ -1506,20 +1506,11 @@ void WebContents::Invalidate() { } void WebContents::SetZoomLevel(double level) { - auto factor = content::ZoomLevelToZoomFactor(level); - if (!content::ZoomValuesEqual(zoom_factor_, factor)) { - content::NavigationEntry* entry = - web_contents()->GetController().GetLastCommittedEntry(); - if (entry) { - std::string host = net::GetHostOrSpecFromURL(entry->GetURL()); - host_zoom_factor_[host] = factor; - } - } - content::HostZoomMap::SetZoomLevel(web_contents(), level); + zoom_controller_->SetZoomLevel(level); } double WebContents::GetZoomLevel() { - return content::HostZoomMap::GetZoomLevel(web_contents()); + return zoom_controller_->GetZoomLevel(); } void WebContents::SetZoomFactor(double factor) { @@ -1532,22 +1523,6 @@ double WebContents::GetZoomFactor() { return content::ZoomLevelToZoomFactor(level); } -void WebContents::SetZoomFactorIfNeeded(const GURL& url) { - if (zoom_factor_ == content::kMinimumZoomFactor) - return; - - std::string host = net::GetHostOrSpecFromURL(url); - double zoom_factor = zoom_factor_; - auto it = host_zoom_factor_.find(host); - if (it != host_zoom_factor_.end()) - zoom_factor = it->second; - auto level = content::ZoomFactorToZoomLevel(zoom_factor); - if (content::ZoomValuesEqual(level, GetZoomLevel())) - return; - - SetZoomLevel(level); -} - v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = WebContentsPreferences::FromWebContents(web_contents()); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index be93c4c131..c65560a63d 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -39,6 +39,7 @@ namespace atom { struct SetSizeParams; class AtomBrowserContext; +class WebContentsZoomController; class WebViewGuestDelegate; namespace api { @@ -206,6 +207,8 @@ class WebContents : public mate::TrackableObject, v8::Local DevToolsWebContents(v8::Isolate* isolate); v8::Local Debugger(v8::Isolate* isolate); + WebContentsZoomController* GetZoomController() { return zoom_controller_; } + protected: WebContents(v8::Isolate* isolate, content::WebContents* web_contents, @@ -349,20 +352,18 @@ class WebContents : public mate::TrackableObject, const base::ListValue& args, IPC::Message* message); - // Called after committing a navigation, to set the zoom - // factor. - void SetZoomFactorIfNeeded(const GURL& url); - v8::Global session_; v8::Global devtools_web_contents_; v8::Global debugger_; std::unique_ptr guest_delegate_; - std::map host_zoom_factor_; // The host webcontents that may contain this webcontents. WebContents* embedder_; + // The zoom controller for this webContents. + WebContentsZoomController* zoom_controller_; + // The type of current WebContents. Type type_; @@ -375,9 +376,6 @@ class WebContents : public mate::TrackableObject, // Whether to enable devtools. bool enable_devtools_; - // Initial zoom factor. - double zoom_factor_; - DISALLOW_COPY_AND_ASSIGN(WebContents); }; diff --git a/atom/browser/api/atom_api_web_view_manager.cc b/atom/browser/api/atom_api_web_view_manager.cc index 1586c3a10d..33205b80c6 100644 --- a/atom/browser/api/atom_api_web_view_manager.cc +++ b/atom/browser/api/atom_api_web_view_manager.cc @@ -3,6 +3,7 @@ // found in the LICENSE file. #include "atom/browser/web_contents_preferences.h" +#include "atom/browser/web_contents_zoom_controller.h" #include "atom/browser/web_view_manager.h" #include "atom/common/native_mate_converters/content_converter.h" #include "atom/common/native_mate_converters/value_converter.h" @@ -24,6 +25,12 @@ void AddGuest(int guest_instance_id, manager->AddGuest(guest_instance_id, element_instance_id, embedder, guest_web_contents); + double zoom_factor; + if (options.GetDouble("zoomFactor", &zoom_factor)) { + atom::WebContentsZoomController::FromWebContents(guest_web_contents) + ->SetDefaultZoomFactor(zoom_factor); + } + WebContentsPreferences::FromWebContents(guest_web_contents)->Merge(options); } diff --git a/atom/browser/web_contents_zoom_controller.cc b/atom/browser/web_contents_zoom_controller.cc new file mode 100644 index 0000000000..d0a8975eae --- /dev/null +++ b/atom/browser/web_contents_zoom_controller.cc @@ -0,0 +1,139 @@ +// Copyright (c) 2017 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#include "atom/browser/web_contents_zoom_controller.h" + +#include "content/public/browser/navigation_details.h" +#include "content/public/browser/navigation_entry.h" +#include "content/public/browser/navigation_handle.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_type.h" +#include "content/public/common/page_zoom.h" +#include "net/base/url_util.h" + +DEFINE_WEB_CONTENTS_USER_DATA_KEY(atom::WebContentsZoomController); + +namespace atom { + +WebContentsZoomController::WebContentsZoomController( + content::WebContents* web_contents) + : content::WebContentsObserver(web_contents) { + default_zoom_factor_ = content::kEpsilon; + host_zoom_map_ = content::HostZoomMap::GetForWebContents(web_contents); + zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(base::Bind( + &WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this))); +} + +WebContentsZoomController::~WebContentsZoomController() {} + +void WebContentsZoomController::AddObserver( + WebContentsZoomController::Observer* observer) { + observers_.AddObserver(observer); +} + +void WebContentsZoomController::RemoveObserver( + WebContentsZoomController::Observer* observer) { + observers_.RemoveObserver(observer); +} + +void WebContentsZoomController::SetZoomLevel(double level) { + if (!web_contents()->GetRenderViewHost()->IsRenderViewLive() || + content::ZoomValuesEqual(GetZoomLevel(), level)) + return; + auto new_zoom_factor = content::ZoomLevelToZoomFactor(level); + content::NavigationEntry* entry = + web_contents()->GetController().GetLastCommittedEntry(); + if (entry) { + std::string host = net::GetHostOrSpecFromURL(entry->GetURL()); + // When new zoom level varies from kZoomFactor, it takes preference. + if (!content::ZoomValuesEqual(GetDefaultZoomFactor(), new_zoom_factor)) + host_zoom_factor_[host] = new_zoom_factor; + content::HostZoomMap::SetZoomLevel(web_contents(), level); + // Notify observers of zoom level changes. + FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, + OnZoomLevelChanged(web_contents(), level)); + } +} + +double WebContentsZoomController::GetZoomLevel() { + return content::HostZoomMap::GetZoomLevel(web_contents()); +} + +void WebContentsZoomController::SetDefaultZoomFactor(double factor) { + default_zoom_factor_ = factor; +} + +double WebContentsZoomController::GetDefaultZoomFactor() { + return default_zoom_factor_; +} + +void WebContentsZoomController::DidFinishNavigation( + content::NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted()) + return; + + if (navigation_handle->IsErrorPage()) { + content::HostZoomMap::SendErrorPageZoomLevelRefresh(web_contents()); + return; + } + + if (!navigation_handle->IsSamePage()) + SetZoomFactorOnNavigationIfNeeded(navigation_handle->GetURL()); +} + +void WebContentsZoomController::WebContentsDestroyed() { + observers_.Clear(); + host_zoom_factor_.clear(); +} + +void WebContentsZoomController::RenderFrameHostChanged( + content::RenderFrameHost* old_host, + content::RenderFrameHost* new_host) { + // If our associated HostZoomMap changes, update our event subscription. + content::HostZoomMap* new_host_zoom_map = + content::HostZoomMap::GetForWebContents(web_contents()); + if (new_host_zoom_map == host_zoom_map_) + return; + + host_zoom_map_ = new_host_zoom_map; + zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(base::Bind( + &WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this))); +} + +void WebContentsZoomController::SetZoomFactorOnNavigationIfNeeded( + const GURL& url) { + if (content::ZoomValuesEqual(GetDefaultZoomFactor(), content::kEpsilon)) + return; + + // When kZoomFactor is available, it takes precedence over + // pref store values but if the host has zoom factor set explicitly + // then it takes precendence. + // pref store < kZoomFactor < setZoomLevel + std::string host = net::GetHostOrSpecFromURL(url); + double zoom_factor = GetDefaultZoomFactor(); + auto it = host_zoom_factor_.find(host); + if (it != host_zoom_factor_.end()) + zoom_factor = it->second; + auto level = content::ZoomFactorToZoomLevel(zoom_factor); + if (content::ZoomValuesEqual(level, GetZoomLevel())) + return; + + SetZoomLevel(level); +} + +void WebContentsZoomController::OnZoomLevelChanged( + const content::HostZoomMap::ZoomLevelChange& change) { + if (change.mode == content::HostZoomMap::ZOOM_CHANGED_FOR_HOST) { + auto it = host_zoom_factor_.find(change.host); + if (it == host_zoom_factor_.end()) + return; + host_zoom_factor_.insert( + it, std::make_pair(change.host, + content::ZoomLevelToZoomFactor(change.zoom_level))); + } +} + +} // namespace atom diff --git a/atom/browser/web_contents_zoom_controller.h b/atom/browser/web_contents_zoom_controller.h new file mode 100644 index 0000000000..d109ccd8d8 --- /dev/null +++ b/atom/browser/web_contents_zoom_controller.h @@ -0,0 +1,73 @@ +// Copyright (c) 2017 GitHub, Inc. +// Use of this source code is governed by the MIT license that can be +// found in the LICENSE file. + +#ifndef ATOM_BROWSER_WEB_CONTENTS_ZOOM_CONTROLLER_H_ +#define ATOM_BROWSER_WEB_CONTENTS_ZOOM_CONTROLLER_H_ + +#include "content/public/browser/host_zoom_map.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace atom { + +// Manages the zoom changes of WebContents. +class WebContentsZoomController + : public content::WebContentsObserver, + public content::WebContentsUserData { + public: + class Observer { + public: + virtual void OnZoomLevelChanged(content::WebContents* web_contents, + double level) {} + + protected: + virtual ~Observer() {} + }; + + explicit WebContentsZoomController(content::WebContents* web_contents); + ~WebContentsZoomController() override; + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + // Methods for managing zoom levels. + void SetZoomLevel(double level); + double GetZoomLevel(); + void SetDefaultZoomFactor(double factor); + double GetDefaultZoomFactor(); + + protected: + // content::WebContentsObserver: + void DidFinishNavigation(content::NavigationHandle* handle) override; + void WebContentsDestroyed() override; + void RenderFrameHostChanged(content::RenderFrameHost* old_host, + content::RenderFrameHost* new_host) override; + + private: + friend class content::WebContentsUserData; + + // Called after a navigation has committed to set default zoom factor. + void SetZoomFactorOnNavigationIfNeeded(const GURL& url); + + // Track zoom changes of a host in other instances of a partition. + void OnZoomLevelChanged(const content::HostZoomMap::ZoomLevelChange& change); + + // kZoomFactor. + double default_zoom_factor_; + + // Map between zoom factor and hosts in this webContent. + std::map host_zoom_factor_; + + base::ObserverList observers_; + + content::HostZoomMap* host_zoom_map_; + + std::unique_ptr zoom_subscription_; + + DISALLOW_COPY_AND_ASSIGN(WebContentsZoomController); +}; + +} // namespace atom + +#endif // ATOM_BROWSER_WEB_CONTENTS_ZOOM_CONTROLLER_H_ diff --git a/atom/browser/web_view_guest_delegate.cc b/atom/browser/web_view_guest_delegate.cc index cfb3264963..85b034d02a 100644 --- a/atom/browser/web_view_guest_delegate.cc +++ b/atom/browser/web_view_guest_delegate.cc @@ -39,7 +39,9 @@ void WebViewGuestDelegate::Initialize(api::WebContents* api_web_contents) { void WebViewGuestDelegate::Destroy() { // Give the content module an opportunity to perform some cleanup. + embedder_zoom_controller_->RemoveObserver(this); guest_host_->WillDestroy(); + embedder_zoom_controller_ = nullptr; guest_host_ = nullptr; } @@ -107,6 +109,9 @@ void WebViewGuestDelegate::DidFinishNavigation( void WebViewGuestDelegate::DidAttach(int guest_proxy_routing_id) { api_web_contents_->Emit("did-attach"); + embedder_zoom_controller_ = + WebContentsZoomController::FromWebContents(embedder_web_contents_); + embedder_zoom_controller_->AddObserver(this); } content::WebContents* WebViewGuestDelegate::GetOwnerWebContents() const { @@ -134,6 +139,14 @@ void WebViewGuestDelegate::WillAttach( completion_callback.Run(); } +void WebViewGuestDelegate::OnZoomLevelChanged( + content::WebContents* web_contents, + double level) { + if (web_contents == GetOwnerWebContents()) { + api_web_contents_->GetZoomController()->SetZoomLevel(level); + } +} + void WebViewGuestDelegate::GuestSizeChangedDueToAutoSize( const gfx::Size& old_size, const gfx::Size& new_size) { api_web_contents_->Emit("size-changed", diff --git a/atom/browser/web_view_guest_delegate.h b/atom/browser/web_view_guest_delegate.h index eade31234c..4fc000fb06 100644 --- a/atom/browser/web_view_guest_delegate.h +++ b/atom/browser/web_view_guest_delegate.h @@ -5,6 +5,7 @@ #ifndef ATOM_BROWSER_WEB_VIEW_GUEST_DELEGATE_H_ #define ATOM_BROWSER_WEB_VIEW_GUEST_DELEGATE_H_ +#include "atom/browser/web_contents_zoom_controller.h" #include "content/public/browser/browser_plugin_guest_delegate.h" #include "content/public/browser/web_contents_observer.h" @@ -31,7 +32,8 @@ struct SetSizeParams { }; class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, - public content::WebContentsObserver { + public content::WebContentsObserver, + public WebContentsZoomController::Observer { public: WebViewGuestDelegate(); ~WebViewGuestDelegate() override; @@ -63,6 +65,10 @@ class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, content::RenderWidgetHost* GetOwnerRenderWidgetHost() override; content::SiteInstance* GetOwnerSiteInstance() override; + // WebContentsZoomController::Observer: + void OnZoomLevelChanged(content::WebContents* web_contents, + double level) override; + private: // This method is invoked when the contents auto-resized to give the container // an opportunity to match it if it wishes. @@ -78,6 +84,10 @@ class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, // The WebContents that attaches this guest view. content::WebContents* embedder_web_contents_; + // The zoom controller of the embedder that is used + // to subscribe for zoom changes. + WebContentsZoomController* embedder_zoom_controller_; + // The size of the container element. gfx::Size element_size_; diff --git a/filenames.gypi b/filenames.gypi index 5b16beaa91..d3dc7ed22c 100644 --- a/filenames.gypi +++ b/filenames.gypi @@ -341,6 +341,8 @@ 'atom/browser/web_contents_permission_helper.h', 'atom/browser/web_contents_preferences.cc', 'atom/browser/web_contents_preferences.h', + 'atom/browser/web_contents_zoom_controller.cc', + 'atom/browser/web_contents_zoom_controller.h', 'atom/browser/web_dialog_helper.cc', 'atom/browser/web_dialog_helper.h', 'atom/browser/web_view_guest_delegate.cc', diff --git a/lib/browser/guest-view-manager.js b/lib/browser/guest-view-manager.js index f1a460271b..e61b2574ad 100644 --- a/lib/browser/guest-view-manager.js +++ b/lib/browser/guest-view-manager.js @@ -184,7 +184,7 @@ const attachGuest = function (event, elementInstanceId, guestInstanceId, params) guestInstanceId: guestInstanceId, nodeIntegration: params.nodeintegration != null ? params.nodeintegration : false, plugins: params.plugins, - zoomFactor: params.zoomFactor, + zoomFactor: embedder.getZoomFactor(), webSecurity: !params.disablewebsecurity, blinkFeatures: params.blinkfeatures, disableBlinkFeatures: params.disableblinkfeatures diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index ba8ae32d46..9800bf9949 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -231,7 +231,6 @@ class WebViewImpl { const params = { instanceId: this.viewInstanceId, userAgentOverride: this.userAgentOverride, - zoomFactor: webFrame.getZoomFactor() } for (const attributeName in this.attributes) { if (hasProp.call(this.attributes, attributeName)) { From e3fe3cc490dc3c28b3b44434958dd0851e933b4c Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Mon, 30 Jan 2017 22:36:50 +0530 Subject: [PATCH 4/6] map webframe zoom api to use HostZoomMap --- atom/browser/api/atom_api_web_contents.cc | 17 ++++++++ atom/browser/api/atom_api_web_contents.h | 8 ++++ atom/browser/web_contents_zoom_controller.cc | 44 +++++++++++++++++++- atom/browser/web_contents_zoom_controller.h | 11 ++++- atom/browser/web_view_guest_delegate.cc | 13 +++++- atom/browser/web_view_guest_delegate.h | 3 +- atom/common/api/api_messages.h | 8 ++++ atom/renderer/api/atom_api_web_frame.cc | 17 ++++++-- lib/renderer/web-view/web-view.js | 10 +---- 9 files changed, 113 insertions(+), 18 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 8e513923de..8d012a6b5d 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -819,6 +819,10 @@ bool WebContents::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(AtomViewHostMsg_Message, OnRendererMessage) IPC_MESSAGE_HANDLER_DELAY_REPLY(AtomViewHostMsg_Message_Sync, OnRendererMessageSync) + IPC_MESSAGE_HANDLER_DELAY_REPLY(AtomViewHostMsg_SetTemporaryZoomLevel, + OnSetTemporaryZoomLevel) + IPC_MESSAGE_HANDLER_DELAY_REPLY(AtomViewHostMsg_GetZoomLevel, + OnGetZoomLevel) IPC_MESSAGE_HANDLER_CODE(ViewHostMsg_SetCursor, OnCursorChange, handled = false) IPC_MESSAGE_UNHANDLED(handled = false) @@ -1523,6 +1527,19 @@ double WebContents::GetZoomFactor() { return content::ZoomLevelToZoomFactor(level); } +void WebContents::OnSetTemporaryZoomLevel(double level, + IPC::Message* reply_msg) { + zoom_controller_->SetTemporaryZoomLevel(level); + double new_level = zoom_controller_->GetTemporaryZoomLevel(); + AtomViewHostMsg_SetTemporaryZoomLevel::WriteReplyParams(reply_msg, new_level); + Send(reply_msg); +} + +void WebContents::OnGetZoomLevel(IPC::Message* reply_msg) { + AtomViewHostMsg_GetZoomLevel::WriteReplyParams(reply_msg, GetZoomLevel()); + Send(reply_msg); +} + v8::Local WebContents::GetWebPreferences(v8::Isolate* isolate) { WebContentsPreferences* web_preferences = WebContentsPreferences::FromWebContents(web_contents()); diff --git a/atom/browser/api/atom_api_web_contents.h b/atom/browser/api/atom_api_web_contents.h index c65560a63d..a37fb8a91f 100644 --- a/atom/browser/api/atom_api_web_contents.h +++ b/atom/browser/api/atom_api_web_contents.h @@ -352,6 +352,14 @@ class WebContents : public mate::TrackableObject, const base::ListValue& args, IPC::Message* message); + // Called when received a synchronous message from renderer to + // set temporary zoom level. + void OnSetTemporaryZoomLevel(double level, IPC::Message* reply_msg); + + // Called when received a synchronous message from renderer to + // get the zoom level. + void OnGetZoomLevel(IPC::Message* reply_msg); + v8::Global session_; v8::Global devtools_web_contents_; v8::Global debugger_; diff --git a/atom/browser/web_contents_zoom_controller.cc b/atom/browser/web_contents_zoom_controller.cc index d0a8975eae..2b297f3eb7 100644 --- a/atom/browser/web_contents_zoom_controller.cc +++ b/atom/browser/web_contents_zoom_controller.cc @@ -22,6 +22,7 @@ WebContentsZoomController::WebContentsZoomController( content::WebContents* web_contents) : content::WebContentsObserver(web_contents) { default_zoom_factor_ = content::kEpsilon; + temporary_zoom_level_ = content::kEpsilon; host_zoom_map_ = content::HostZoomMap::GetForWebContents(web_contents); zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(base::Bind( &WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this))); @@ -43,6 +44,11 @@ void WebContentsZoomController::SetZoomLevel(double level) { if (!web_contents()->GetRenderViewHost()->IsRenderViewLive() || content::ZoomValuesEqual(GetZoomLevel(), level)) return; + + if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) { + temporary_zoom_level_ = content::kEpsilon; + } + auto new_zoom_factor = content::ZoomLevelToZoomFactor(level); content::NavigationEntry* entry = web_contents()->GetController().GetLastCommittedEntry(); @@ -54,7 +60,7 @@ void WebContentsZoomController::SetZoomLevel(double level) { content::HostZoomMap::SetZoomLevel(web_contents(), level); // Notify observers of zoom level changes. FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, - OnZoomLevelChanged(web_contents(), level)); + OnZoomLevelChanged(web_contents(), level, false)); } } @@ -70,6 +76,34 @@ double WebContentsZoomController::GetDefaultZoomFactor() { return default_zoom_factor_; } +bool WebContentsZoomController::UsesTemporaryZoomLevel() { + return !content::ZoomValuesEqual(temporary_zoom_level_, content::kEpsilon); +} + +double WebContentsZoomController::GetTemporaryZoomLevel() { + return temporary_zoom_level_; +} + +void WebContentsZoomController::SetTemporaryZoomLevel(double level) { + int render_process_id = web_contents()->GetRenderProcessHost()->GetID(); + int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID(); + host_zoom_map_->SetTemporaryZoomLevel(render_process_id, render_view_id, + level); + temporary_zoom_level_ = level; + // Notify observers of zoom level changes. + FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, + OnZoomLevelChanged(web_contents(), level, true)); +} + +void WebContentsZoomController::DidStartNavigation( + content::NavigationHandle* navigation_handle) { + if (!navigation_handle->IsInMainFrame() || navigation_handle->IsSamePage()) + return; + int render_process_id = web_contents()->GetRenderProcessHost()->GetID(); + int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID(); + host_zoom_map_->ClearTemporaryZoomLevel(render_process_id, render_view_id); +} + void WebContentsZoomController::DidFinishNavigation( content::NavigationHandle* navigation_handle) { if (!navigation_handle->IsInMainFrame() || !navigation_handle->HasCommitted()) @@ -108,6 +142,14 @@ void WebContentsZoomController::SetZoomFactorOnNavigationIfNeeded( if (content::ZoomValuesEqual(GetDefaultZoomFactor(), content::kEpsilon)) return; + if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) { + FOR_EACH_OBSERVER( + WebContentsZoomController::Observer, observers_, + OnZoomLevelChanged(web_contents(), GetTemporaryZoomLevel(), true)); + temporary_zoom_level_ = content::kEpsilon; + return; + } + // When kZoomFactor is available, it takes precedence over // pref store values but if the host has zoom factor set explicitly // then it takes precendence. diff --git a/atom/browser/web_contents_zoom_controller.h b/atom/browser/web_contents_zoom_controller.h index d109ccd8d8..32cc8be0cc 100644 --- a/atom/browser/web_contents_zoom_controller.h +++ b/atom/browser/web_contents_zoom_controller.h @@ -5,6 +5,9 @@ #ifndef ATOM_BROWSER_WEB_CONTENTS_ZOOM_CONTROLLER_H_ #define ATOM_BROWSER_WEB_CONTENTS_ZOOM_CONTROLLER_H_ +#include +#include + #include "content/public/browser/host_zoom_map.h" #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" @@ -19,7 +22,8 @@ class WebContentsZoomController class Observer { public: virtual void OnZoomLevelChanged(content::WebContents* web_contents, - double level) {} + double level, + bool is_temporary) {} protected: virtual ~Observer() {} @@ -36,9 +40,13 @@ class WebContentsZoomController double GetZoomLevel(); void SetDefaultZoomFactor(double factor); double GetDefaultZoomFactor(); + void SetTemporaryZoomLevel(double level); + bool UsesTemporaryZoomLevel(); + double GetTemporaryZoomLevel(); protected: // content::WebContentsObserver: + void DidStartNavigation(content::NavigationHandle* handle) override; void DidFinishNavigation(content::NavigationHandle* handle) override; void WebContentsDestroyed() override; void RenderFrameHostChanged(content::RenderFrameHost* old_host, @@ -55,6 +63,7 @@ class WebContentsZoomController // kZoomFactor. double default_zoom_factor_; + double temporary_zoom_level_; // Map between zoom factor and hosts in this webContent. std::map host_zoom_factor_; diff --git a/atom/browser/web_view_guest_delegate.cc b/atom/browser/web_view_guest_delegate.cc index 85b034d02a..a239633238 100644 --- a/atom/browser/web_view_guest_delegate.cc +++ b/atom/browser/web_view_guest_delegate.cc @@ -112,6 +112,10 @@ void WebViewGuestDelegate::DidAttach(int guest_proxy_routing_id) { embedder_zoom_controller_ = WebContentsZoomController::FromWebContents(embedder_web_contents_); embedder_zoom_controller_->AddObserver(this); + if (embedder_zoom_controller_->UsesTemporaryZoomLevel()) { + double level = embedder_zoom_controller_->GetTemporaryZoomLevel(); + api_web_contents_->GetZoomController()->SetTemporaryZoomLevel(level); + } } content::WebContents* WebViewGuestDelegate::GetOwnerWebContents() const { @@ -141,9 +145,14 @@ void WebViewGuestDelegate::WillAttach( void WebViewGuestDelegate::OnZoomLevelChanged( content::WebContents* web_contents, - double level) { + double level, + bool is_temporary) { if (web_contents == GetOwnerWebContents()) { - api_web_contents_->GetZoomController()->SetZoomLevel(level); + if (is_temporary) { + api_web_contents_->GetZoomController()->SetTemporaryZoomLevel(level); + } else { + api_web_contents_->GetZoomController()->SetZoomLevel(level); + } } } diff --git a/atom/browser/web_view_guest_delegate.h b/atom/browser/web_view_guest_delegate.h index 4fc000fb06..329b7ec317 100644 --- a/atom/browser/web_view_guest_delegate.h +++ b/atom/browser/web_view_guest_delegate.h @@ -67,7 +67,8 @@ class WebViewGuestDelegate : public content::BrowserPluginGuestDelegate, // WebContentsZoomController::Observer: void OnZoomLevelChanged(content::WebContents* web_contents, - double level) override; + double level, + bool is_temporary) override; private: // This method is invoked when the contents auto-resized to give the container diff --git a/atom/common/api/api_messages.h b/atom/common/api/api_messages.h index ab27d5a251..ef945d9eeb 100644 --- a/atom/common/api/api_messages.h +++ b/atom/common/api/api_messages.h @@ -41,3 +41,11 @@ IPC_MESSAGE_ROUTED1(AtomViewHostMsg_UpdateDraggableRegions, // Update renderer process preferences. IPC_MESSAGE_CONTROL1(AtomMsg_UpdatePreferences, base::ListValue) + +// Sent by renderer to set the temporary zoom level. +IPC_SYNC_MESSAGE_ROUTED1_1(AtomViewHostMsg_SetTemporaryZoomLevel, + double /* zoom level */, + double /* result */) + +// Sent by renderer to get the zoom level. +IPC_SYNC_MESSAGE_ROUTED0_1(AtomViewHostMsg_GetZoomLevel, double /* result */) diff --git a/atom/renderer/api/atom_api_web_frame.cc b/atom/renderer/api/atom_api_web_frame.cc index c750a455de..cc2d28ca96 100644 --- a/atom/renderer/api/atom_api_web_frame.cc +++ b/atom/renderer/api/atom_api_web_frame.cc @@ -4,6 +4,7 @@ #include "atom/renderer/api/atom_api_web_frame.h" +#include "atom/common/api/api_messages.h" #include "atom/common/api/event_emitter_caller.h" #include "atom/common/native_mate_converters/blink_converter.h" #include "atom/common/native_mate_converters/callback.h" @@ -72,13 +73,21 @@ void WebFrame::SetName(const std::string& name) { } double WebFrame::SetZoomLevel(double level) { - double ret = web_frame_->view()->setZoomLevel(level); - mate::EmitEvent(isolate(), GetWrapper(), "zoom-level-changed", ret); - return ret; + double result; + content::RenderView* render_view = + content::RenderView::FromWebView(web_frame_->view()); + render_view->Send(new AtomViewHostMsg_SetTemporaryZoomLevel( + render_view->GetRoutingID(), level, &result)); + return result; } double WebFrame::GetZoomLevel() const { - return web_frame_->view()->zoomLevel(); + double result; + content::RenderView* render_view = + content::RenderView::FromWebView(web_frame_->view()); + render_view->Send( + new AtomViewHostMsg_GetZoomLevel(render_view->GetRoutingID(), &result)); + return result; } double WebFrame::SetZoomFactor(double factor) { diff --git a/lib/renderer/web-view/web-view.js b/lib/renderer/web-view/web-view.js index 9800bf9949..c98b02d274 100644 --- a/lib/renderer/web-view/web-view.js +++ b/lib/renderer/web-view/web-view.js @@ -34,12 +34,6 @@ class WebViewImpl { this.viewInstanceId = getNextId() shadowRoot.appendChild(this.browserPluginNode) - // Subscribe to host's zoom level changes. - this.onZoomLevelChanged = (zoomLevel) => { - this.webviewNode.setZoomLevel(zoomLevel) - } - webFrame.on('zoom-level-changed', this.onZoomLevelChanged) - this.onVisibilityChanged = (event, visibilityState) => { this.webviewNode.send('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', visibilityState) } @@ -56,8 +50,6 @@ class WebViewImpl { // Resets some state upon reattaching element to the DOM. reset () { - // Unlisten the zoom-level-changed event. - webFrame.removeListener('zoom-level-changed', this.onZoomLevelChanged) ipcRenderer.removeListener('ELECTRON_RENDERER_WINDOW_VISIBILITY_CHANGE', this.onVisibilityChanged) // If guestInstanceId is defined then the has navigated and has @@ -230,7 +222,7 @@ class WebViewImpl { buildParams () { const params = { instanceId: this.viewInstanceId, - userAgentOverride: this.userAgentOverride, + userAgentOverride: this.userAgentOverride } for (const attributeName in this.attributes) { if (hasProp.call(this.attributes, attributeName)) { From cbeaa6be87b4a676440956233557cac28d984d4f Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Tue, 31 Jan 2017 14:45:45 +0530 Subject: [PATCH 5/6] simply handling temporary zoom levels of webview --- atom/browser/api/atom_api_web_contents.cc | 2 +- atom/browser/web_contents_zoom_controller.cc | 60 +++++++++++--------- atom/browser/web_contents_zoom_controller.h | 9 ++- atom/browser/web_view_guest_delegate.cc | 9 +-- 4 files changed, 45 insertions(+), 35 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 8d012a6b5d..0865ea0e5f 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -1530,7 +1530,7 @@ double WebContents::GetZoomFactor() { void WebContents::OnSetTemporaryZoomLevel(double level, IPC::Message* reply_msg) { zoom_controller_->SetTemporaryZoomLevel(level); - double new_level = zoom_controller_->GetTemporaryZoomLevel(); + double new_level = zoom_controller_->GetZoomLevel(); AtomViewHostMsg_SetTemporaryZoomLevel::WriteReplyParams(reply_msg, new_level); Send(reply_msg); } diff --git a/atom/browser/web_contents_zoom_controller.cc b/atom/browser/web_contents_zoom_controller.cc index 2b297f3eb7..a40b683092 100644 --- a/atom/browser/web_contents_zoom_controller.cc +++ b/atom/browser/web_contents_zoom_controller.cc @@ -7,6 +7,7 @@ #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.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" @@ -20,15 +21,19 @@ namespace atom { WebContentsZoomController::WebContentsZoomController( content::WebContents* web_contents) - : content::WebContentsObserver(web_contents) { + : old_process_id_(-1), + old_view_id_(-1), + embedder_zoom_controller_(nullptr), + content::WebContentsObserver(web_contents) { default_zoom_factor_ = content::kEpsilon; - temporary_zoom_level_ = content::kEpsilon; host_zoom_map_ = content::HostZoomMap::GetForWebContents(web_contents); zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(base::Bind( &WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this))); } -WebContentsZoomController::~WebContentsZoomController() {} +WebContentsZoomController::~WebContentsZoomController() { + embedder_zoom_controller_ = nullptr; +} void WebContentsZoomController::AddObserver( WebContentsZoomController::Observer* observer) { @@ -40,13 +45,21 @@ void WebContentsZoomController::RemoveObserver( observers_.RemoveObserver(observer); } +void WebContentsZoomController::SetEmbedderZoomController( + WebContentsZoomController* controller) { + embedder_zoom_controller_ = controller; +} + void WebContentsZoomController::SetZoomLevel(double level) { if (!web_contents()->GetRenderViewHost()->IsRenderViewLive() || content::ZoomValuesEqual(GetZoomLevel(), level)) return; - if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) { - temporary_zoom_level_ = content::kEpsilon; + int render_process_id = web_contents()->GetRenderProcessHost()->GetID(); + int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID(); + if (host_zoom_map_->UsesTemporaryZoomLevel(render_process_id, + render_view_id)) { + host_zoom_map_->ClearTemporaryZoomLevel(render_process_id, render_view_id); } auto new_zoom_factor = content::ZoomLevelToZoomFactor(level); @@ -76,32 +89,20 @@ double WebContentsZoomController::GetDefaultZoomFactor() { return default_zoom_factor_; } -bool WebContentsZoomController::UsesTemporaryZoomLevel() { - return !content::ZoomValuesEqual(temporary_zoom_level_, content::kEpsilon); -} - -double WebContentsZoomController::GetTemporaryZoomLevel() { - return temporary_zoom_level_; -} - void WebContentsZoomController::SetTemporaryZoomLevel(double level) { - int render_process_id = web_contents()->GetRenderProcessHost()->GetID(); - int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID(); - host_zoom_map_->SetTemporaryZoomLevel(render_process_id, render_view_id, - level); - temporary_zoom_level_ = level; + old_process_id_ = web_contents()->GetRenderProcessHost()->GetID(); + old_view_id_ = web_contents()->GetRenderViewHost()->GetRoutingID(); + host_zoom_map_->SetTemporaryZoomLevel(old_process_id_, old_view_id_, level); // Notify observers of zoom level changes. FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, OnZoomLevelChanged(web_contents(), level, true)); } -void WebContentsZoomController::DidStartNavigation( - content::NavigationHandle* navigation_handle) { - if (!navigation_handle->IsInMainFrame() || navigation_handle->IsSamePage()) - return; +bool WebContentsZoomController::UsesTemporaryZoomLevel() { int render_process_id = web_contents()->GetRenderProcessHost()->GetID(); int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID(); - host_zoom_map_->ClearTemporaryZoomLevel(render_process_id, render_view_id); + return host_zoom_map_->UsesTemporaryZoomLevel(render_process_id, + render_view_id); } void WebContentsZoomController::DidFinishNavigation( @@ -142,11 +143,14 @@ void WebContentsZoomController::SetZoomFactorOnNavigationIfNeeded( if (content::ZoomValuesEqual(GetDefaultZoomFactor(), content::kEpsilon)) return; - if (!content::ZoomValuesEqual(GetTemporaryZoomLevel(), content::kEpsilon)) { - FOR_EACH_OBSERVER( - WebContentsZoomController::Observer, observers_, - OnZoomLevelChanged(web_contents(), GetTemporaryZoomLevel(), true)); - temporary_zoom_level_ = content::kEpsilon; + if (host_zoom_map_->UsesTemporaryZoomLevel(old_process_id_, old_view_id_)) { + host_zoom_map_->ClearTemporaryZoomLevel(old_process_id_, old_view_id_); + } + + if (embedder_zoom_controller_ && + embedder_zoom_controller_->UsesTemporaryZoomLevel()) { + double level = embedder_zoom_controller_->GetZoomLevel(); + SetTemporaryZoomLevel(level); return; } diff --git a/atom/browser/web_contents_zoom_controller.h b/atom/browser/web_contents_zoom_controller.h index 32cc8be0cc..11db8745b3 100644 --- a/atom/browser/web_contents_zoom_controller.h +++ b/atom/browser/web_contents_zoom_controller.h @@ -35,6 +35,8 @@ class WebContentsZoomController void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); + void SetEmbedderZoomController(WebContentsZoomController* controller); + // Methods for managing zoom levels. void SetZoomLevel(double level); double GetZoomLevel(); @@ -42,11 +44,9 @@ class WebContentsZoomController double GetDefaultZoomFactor(); void SetTemporaryZoomLevel(double level); bool UsesTemporaryZoomLevel(); - double GetTemporaryZoomLevel(); protected: // content::WebContentsObserver: - void DidStartNavigation(content::NavigationHandle* handle) override; void DidFinishNavigation(content::NavigationHandle* handle) override; void WebContentsDestroyed() override; void RenderFrameHostChanged(content::RenderFrameHost* old_host, @@ -65,6 +65,11 @@ class WebContentsZoomController double default_zoom_factor_; double temporary_zoom_level_; + int old_process_id_; + int old_view_id_; + + WebContentsZoomController* embedder_zoom_controller_; + // Map between zoom factor and hosts in this webContent. std::map host_zoom_factor_; diff --git a/atom/browser/web_view_guest_delegate.cc b/atom/browser/web_view_guest_delegate.cc index a239633238..e8b1aee0ce 100644 --- a/atom/browser/web_view_guest_delegate.cc +++ b/atom/browser/web_view_guest_delegate.cc @@ -111,11 +111,9 @@ void WebViewGuestDelegate::DidAttach(int guest_proxy_routing_id) { api_web_contents_->Emit("did-attach"); embedder_zoom_controller_ = WebContentsZoomController::FromWebContents(embedder_web_contents_); + auto zoom_controller = api_web_contents_->GetZoomController(); embedder_zoom_controller_->AddObserver(this); - if (embedder_zoom_controller_->UsesTemporaryZoomLevel()) { - double level = embedder_zoom_controller_->GetTemporaryZoomLevel(); - api_web_contents_->GetZoomController()->SetTemporaryZoomLevel(level); - } + zoom_controller->SetEmbedderZoomController(embedder_zoom_controller_); } content::WebContents* WebViewGuestDelegate::GetOwnerWebContents() const { @@ -153,6 +151,9 @@ void WebViewGuestDelegate::OnZoomLevelChanged( } else { api_web_contents_->GetZoomController()->SetZoomLevel(level); } + // Change the default zoom factor to match the embedders' new zoom level. + double zoom_factor = content::ZoomLevelToZoomFactor(level); + api_web_contents_->GetZoomController()->SetDefaultZoomFactor(zoom_factor); } } From 7a0aff2bae6124beeec8b2f2ea0698f91fcd7efe Mon Sep 17 00:00:00 2001 From: deepak1556 Date: Tue, 31 Jan 2017 14:55:48 +0530 Subject: [PATCH 6/6] code cleanup --- atom/browser/api/atom_api_web_contents.cc | 8 ++++---- atom/browser/api/atom_api_web_view_manager.cc | 3 ++- atom/browser/web_contents_zoom_controller.cc | 14 ++++++-------- atom/browser/web_view_guest_delegate.cc | 12 +++++++----- atom/common/options_switches.cc | 1 - atom/common/options_switches.h | 1 - atom/renderer/api/atom_api_web_frame.cc | 4 ++-- 7 files changed, 21 insertions(+), 22 deletions(-) diff --git a/atom/browser/api/atom_api_web_contents.cc b/atom/browser/api/atom_api_web_contents.cc index 0865ea0e5f..ae040be5c4 100644 --- a/atom/browser/api/atom_api_web_contents.cc +++ b/atom/browser/api/atom_api_web_contents.cc @@ -248,8 +248,8 @@ WebContents::WebContents(v8::Isolate* isolate, content::WebContents* web_contents, Type type) : content::WebContentsObserver(web_contents), - zoom_controller_(nullptr), embedder_(nullptr), + zoom_controller_(nullptr), type_(type), request_id_(0), background_throttling_(true), @@ -267,8 +267,8 @@ WebContents::WebContents(v8::Isolate* isolate, } WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options) - : zoom_controller_(nullptr), - embedder_(nullptr), + : embedder_(nullptr), + zoom_controller_(nullptr), type_(BROWSER_WINDOW), request_id_(0), background_throttling_(true), @@ -354,7 +354,7 @@ void WebContents::InitWithSessionAndOptions(v8::Isolate* isolate, WebContentsZoomController::CreateForWebContents(web_contents); zoom_controller_ = WebContentsZoomController::FromWebContents(web_contents); double zoom_factor; - if (options.Get("zoomFactor", &zoom_factor)) + if (options.Get(options::kZoomFactor, &zoom_factor)) zoom_controller_->SetDefaultZoomFactor(zoom_factor); web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent()); diff --git a/atom/browser/api/atom_api_web_view_manager.cc b/atom/browser/api/atom_api_web_view_manager.cc index 33205b80c6..961cb03220 100644 --- a/atom/browser/api/atom_api_web_view_manager.cc +++ b/atom/browser/api/atom_api_web_view_manager.cc @@ -8,6 +8,7 @@ #include "atom/common/native_mate_converters/content_converter.h" #include "atom/common/native_mate_converters/value_converter.h" #include "atom/common/node_includes.h" +#include "atom/common/options_switches.h" #include "content/public/browser/browser_context.h" #include "native_mate/dictionary.h" @@ -26,7 +27,7 @@ void AddGuest(int guest_instance_id, guest_web_contents); double zoom_factor; - if (options.GetDouble("zoomFactor", &zoom_factor)) { + if (options.GetDouble(atom::options::kZoomFactor, &zoom_factor)) { atom::WebContentsZoomController::FromWebContents(guest_web_contents) ->SetDefaultZoomFactor(zoom_factor); } diff --git a/atom/browser/web_contents_zoom_controller.cc b/atom/browser/web_contents_zoom_controller.cc index a40b683092..92eb30fac8 100644 --- a/atom/browser/web_contents_zoom_controller.cc +++ b/atom/browser/web_contents_zoom_controller.cc @@ -7,7 +7,6 @@ #include "content/public/browser/navigation_details.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/navigation_handle.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" @@ -31,9 +30,7 @@ WebContentsZoomController::WebContentsZoomController( &WebContentsZoomController::OnZoomLevelChanged, base::Unretained(this))); } -WebContentsZoomController::~WebContentsZoomController() { - embedder_zoom_controller_ = nullptr; -} +WebContentsZoomController::~WebContentsZoomController() {} void WebContentsZoomController::AddObserver( WebContentsZoomController::Observer* observer) { @@ -72,8 +69,8 @@ void WebContentsZoomController::SetZoomLevel(double level) { host_zoom_factor_[host] = new_zoom_factor; content::HostZoomMap::SetZoomLevel(web_contents(), level); // Notify observers of zoom level changes. - FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, - OnZoomLevelChanged(web_contents(), level, false)); + for (Observer& observer : observers_) + observer.OnZoomLevelChanged(web_contents(), level, false); } } @@ -94,8 +91,8 @@ void WebContentsZoomController::SetTemporaryZoomLevel(double level) { old_view_id_ = web_contents()->GetRenderViewHost()->GetRoutingID(); host_zoom_map_->SetTemporaryZoomLevel(old_process_id_, old_view_id_, level); // Notify observers of zoom level changes. - FOR_EACH_OBSERVER(WebContentsZoomController::Observer, observers_, - OnZoomLevelChanged(web_contents(), level, true)); + for (Observer& observer : observers_) + observer.OnZoomLevelChanged(web_contents(), level, true); } bool WebContentsZoomController::UsesTemporaryZoomLevel() { @@ -122,6 +119,7 @@ void WebContentsZoomController::DidFinishNavigation( void WebContentsZoomController::WebContentsDestroyed() { observers_.Clear(); host_zoom_factor_.clear(); + embedder_zoom_controller_ = nullptr; } void WebContentsZoomController::RenderFrameHostChanged( diff --git a/atom/browser/web_view_guest_delegate.cc b/atom/browser/web_view_guest_delegate.cc index e8b1aee0ce..21b917ac61 100644 --- a/atom/browser/web_view_guest_delegate.cc +++ b/atom/browser/web_view_guest_delegate.cc @@ -23,11 +23,11 @@ const int kDefaultHeight = 300; } // namespace WebViewGuestDelegate::WebViewGuestDelegate() - : guest_host_(nullptr), + : embedder_zoom_controller_(nullptr), + guest_host_(nullptr), auto_size_enabled_(false), is_full_page_plugin_(false), - api_web_contents_(nullptr) { -} + api_web_contents_(nullptr) {} WebViewGuestDelegate::~WebViewGuestDelegate() { } @@ -39,9 +39,11 @@ void WebViewGuestDelegate::Initialize(api::WebContents* api_web_contents) { void WebViewGuestDelegate::Destroy() { // Give the content module an opportunity to perform some cleanup. - embedder_zoom_controller_->RemoveObserver(this); + if (embedder_zoom_controller_) { + embedder_zoom_controller_->RemoveObserver(this); + embedder_zoom_controller_ = nullptr; + } guest_host_->WillDestroy(); - embedder_zoom_controller_ = nullptr; guest_host_ = nullptr; } diff --git a/atom/common/options_switches.cc b/atom/common/options_switches.cc index 4729a28127..6db479ceb7 100644 --- a/atom/common/options_switches.cc +++ b/atom/common/options_switches.cc @@ -155,7 +155,6 @@ const char kAppUserModelId[] = "app-user-model-id"; // The command line switch versions of the options. const char kBackgroundColor[] = "background-color"; -const char kZoomFactor[] = "zoom-factor"; const char kPreloadScript[] = "preload"; const char kPreloadURL[] = "preload-url"; const char kNodeIntegration[] = "node-integration"; diff --git a/atom/common/options_switches.h b/atom/common/options_switches.h index c81ab529cf..abe3856cd8 100644 --- a/atom/common/options_switches.h +++ b/atom/common/options_switches.h @@ -81,7 +81,6 @@ extern const char kSecureSchemes[]; extern const char kAppUserModelId[]; extern const char kBackgroundColor[]; -extern const char kZoomFactor[]; extern const char kPreloadScript[]; extern const char kPreloadURL[]; extern const char kNodeIntegration[]; diff --git a/atom/renderer/api/atom_api_web_frame.cc b/atom/renderer/api/atom_api_web_frame.cc index cc2d28ca96..f103b89391 100644 --- a/atom/renderer/api/atom_api_web_frame.cc +++ b/atom/renderer/api/atom_api_web_frame.cc @@ -73,7 +73,7 @@ void WebFrame::SetName(const std::string& name) { } double WebFrame::SetZoomLevel(double level) { - double result; + double result = 0.0; content::RenderView* render_view = content::RenderView::FromWebView(web_frame_->view()); render_view->Send(new AtomViewHostMsg_SetTemporaryZoomLevel( @@ -82,7 +82,7 @@ double WebFrame::SetZoomLevel(double level) { } double WebFrame::GetZoomLevel() const { - double result; + double result = 0.0; content::RenderView* render_view = content::RenderView::FromWebView(web_frame_->view()); render_view->Send(