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

Unified Diff: components/ui/zoom/zoom_controller.cc

Issue 2019423005: Move //components/ui/zoom to top-level under //components (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 7 months 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
« no previous file with comments | « components/ui/zoom/zoom_controller.h ('k') | components/ui/zoom/zoom_event_manager.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/ui/zoom/zoom_controller.cc
diff --git a/components/ui/zoom/zoom_controller.cc b/components/ui/zoom/zoom_controller.cc
deleted file mode 100644
index 18e58cdc389dcf2c92a929de5d49fb8d373a11d8..0000000000000000000000000000000000000000
--- a/components/ui/zoom/zoom_controller.cc
+++ /dev/null
@@ -1,376 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/ui/zoom/zoom_controller.h"
-
-#include "components/ui/zoom/zoom_event_manager.h"
-#include "components/ui/zoom/zoom_observer.h"
-#include "content/public/browser/host_zoom_map.h"
-#include "content/public/browser/navigation_details.h"
-#include "content/public/browser/navigation_entry.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(ui_zoom::ZoomController);
-
-namespace ui_zoom {
-
-double ZoomController::GetZoomLevelForWebContents(
- const content::WebContents* web_contents) {
- if (!web_contents)
- return 0.0;
-
- auto zoom_controller = FromWebContents(web_contents);
- if (zoom_controller)
- return zoom_controller->GetZoomLevel();
-
- return content::HostZoomMap::GetZoomLevel(web_contents);
-}
-
-ZoomController::ZoomController(content::WebContents* web_contents)
- : content::WebContentsObserver(web_contents),
- can_show_bubble_(true),
- zoom_mode_(ZOOM_MODE_DEFAULT),
- zoom_level_(1.0),
- browser_context_(web_contents->GetBrowserContext()) {
- host_zoom_map_ = content::HostZoomMap::GetForWebContents(web_contents);
- zoom_level_ = host_zoom_map_->GetDefaultZoomLevel();
-
- zoom_subscription_ = host_zoom_map_->AddZoomLevelChangedCallback(
- base::Bind(&ZoomController::OnZoomLevelChanged, base::Unretained(this)));
-
- UpdateState(std::string());
-}
-
-ZoomController::~ZoomController() {
-}
-
-bool ZoomController::IsAtDefaultZoom() const {
- return content::ZoomValuesEqual(GetZoomLevel(), GetDefaultZoomLevel());
-}
-
-ZoomController::RelativeZoom ZoomController::GetZoomRelativeToDefault() const {
- double current_level = GetZoomLevel();
- double default_level = GetDefaultZoomLevel();
- if (content::ZoomValuesEqual(current_level, default_level))
- return ZOOM_AT_DEFAULT_ZOOM;
- else if (current_level > default_level)
- return ZOOM_ABOVE_DEFAULT_ZOOM;
- return ZOOM_BELOW_DEFAULT_ZOOM;
-}
-
-void ZoomController::AddObserver(ZoomObserver* observer) {
- observers_.AddObserver(observer);
-}
-
-void ZoomController::RemoveObserver(ZoomObserver* observer) {
- observers_.RemoveObserver(observer);
-}
-
-double ZoomController::GetZoomLevel() const {
- return zoom_mode_ == ZOOM_MODE_MANUAL
- ? zoom_level_
- : content::HostZoomMap::GetZoomLevel(web_contents());
-}
-
-int ZoomController::GetZoomPercent() const {
- double zoom_factor = content::ZoomLevelToZoomFactor(GetZoomLevel());
- // Round double for return.
- return static_cast<int>(zoom_factor * 100 + 0.5);
-}
-
-bool ZoomController::SetZoomLevel(double zoom_level) {
- // A client did not initiate this zoom change.
- return SetZoomLevelByClient(zoom_level, NULL);
-}
-
-bool ZoomController::SetZoomLevelByClient(
- double zoom_level,
- const scoped_refptr<const ZoomRequestClient>& client) {
- content::NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- // Cannot zoom in disabled mode. Also, don't allow changing zoom level on
- // a crashed tab, an error page or an interstitial page.
- if (zoom_mode_ == ZOOM_MODE_DISABLED ||
- !web_contents()->GetRenderViewHost()->IsRenderViewLive())
- return false;
-
- // Store client data so the |client| can be attributed when the zoom
- // change completes. We expect that by the time this function returns that
- // any observers that require this information will have requested it.
- last_client_ = client;
-
- // Do not actually rescale the page in manual mode.
- if (zoom_mode_ == ZOOM_MODE_MANUAL) {
- // If the zoom level hasn't changed, early out to avoid sending an event.
- if (content::ZoomValuesEqual(zoom_level_, zoom_level))
- return true;
-
- double old_zoom_level = zoom_level_;
- zoom_level_ = zoom_level;
-
- // TODO(wjmaclean) Do we care about filling in host/scheme here?
- content::HostZoomMap::ZoomLevelChange change;
- change.mode = content::HostZoomMap::ZOOM_CHANGED_TEMPORARY_ZOOM;
- change.zoom_level = zoom_level;
- ZoomEventManager::GetForBrowserContext(browser_context_)
- ->OnZoomLevelChanged(change);
-
- bool can_show_bubble = can_show_bubble_;
- if (client && client->ShouldSuppressBubble())
- can_show_bubble = false;
-
- ZoomChangedEventData zoom_change_data(web_contents(), old_zoom_level,
- zoom_level_, zoom_mode_,
- can_show_bubble);
- FOR_EACH_OBSERVER(ZoomObserver, observers_,
- OnZoomChanged(zoom_change_data));
-
- last_client_ = NULL;
- return true;
- }
-
- content::HostZoomMap* zoom_map =
- content::HostZoomMap::GetForWebContents(web_contents());
- DCHECK(zoom_map);
- DCHECK(!event_data_);
- event_data_.reset(new ZoomChangedEventData(web_contents(), GetZoomLevel(),
- zoom_level, zoom_mode_,
- false /* can_show_bubble */));
- int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
- int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- if (zoom_mode_ == ZOOM_MODE_ISOLATED ||
- zoom_map->UsesTemporaryZoomLevel(render_process_id, render_view_id)) {
- zoom_map->SetTemporaryZoomLevel(render_process_id, render_view_id,
- zoom_level);
- } else {
- if (!entry) {
- last_client_ = NULL;
- // If we exit without triggering an update, we should clear event_data_,
- // else we may later trigger a DCHECK(event_data_).
- event_data_.reset();
- return false;
- }
- std::string host =
- net::GetHostOrSpecFromURL(content::HostZoomMap::GetURLFromEntry(entry));
- zoom_map->SetZoomLevelForHost(host, zoom_level);
- }
-
- DCHECK(!event_data_);
- last_client_ = NULL;
- return true;
-}
-
-void ZoomController::SetZoomMode(ZoomMode new_mode) {
- if (new_mode == zoom_mode_)
- return;
-
- content::HostZoomMap* zoom_map =
- content::HostZoomMap::GetForWebContents(web_contents());
- DCHECK(zoom_map);
- int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
- int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- double original_zoom_level = GetZoomLevel();
-
- DCHECK(!event_data_);
- event_data_.reset(new ZoomChangedEventData(
- web_contents(), original_zoom_level, original_zoom_level, new_mode,
- new_mode != ZOOM_MODE_DEFAULT));
-
- switch (new_mode) {
- case ZOOM_MODE_DEFAULT: {
- content::NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
-
- if (entry) {
- GURL url = content::HostZoomMap::GetURLFromEntry(entry);
- std::string host = net::GetHostOrSpecFromURL(url);
-
- if (zoom_map->HasZoomLevel(url.scheme(), host)) {
- // If there are other tabs with the same origin, then set this tab's
- // zoom level to match theirs. The temporary zoom level will be
- // cleared below, but this call will make sure this tab re-draws at
- // the correct zoom level.
- double origin_zoom_level =
- zoom_map->GetZoomLevelForHostAndScheme(url.scheme(), host);
- event_data_->new_zoom_level = origin_zoom_level;
- zoom_map->SetTemporaryZoomLevel(render_process_id, render_view_id,
- origin_zoom_level);
- } else {
- // The host will need a level prior to removing the temporary level.
- // We don't want the zoom level to change just because we entered
- // default mode.
- zoom_map->SetZoomLevelForHost(host, original_zoom_level);
- }
- }
- // Remove per-tab zoom data for this tab. No event callback expected.
- zoom_map->ClearTemporaryZoomLevel(render_process_id, render_view_id);
- break;
- }
- case ZOOM_MODE_ISOLATED: {
- // Unless the zoom mode was |ZOOM_MODE_DISABLED| before this call, the
- // page needs an initial isolated zoom back to the same level it was at
- // in the other mode.
- if (zoom_mode_ != ZOOM_MODE_DISABLED) {
- zoom_map->SetTemporaryZoomLevel(render_process_id, render_view_id,
- original_zoom_level);
- } else {
- // When we don't call any HostZoomMap set functions, we send the event
- // manually.
- FOR_EACH_OBSERVER(ZoomObserver, observers_,
- OnZoomChanged(*event_data_));
- event_data_.reset();
- }
- break;
- }
- case ZOOM_MODE_MANUAL: {
- // Unless the zoom mode was |ZOOM_MODE_DISABLED| before this call, the
- // page needs to be resized to the default zoom. While in manual mode,
- // the zoom level is handled independently.
- if (zoom_mode_ != ZOOM_MODE_DISABLED) {
- zoom_map->SetTemporaryZoomLevel(render_process_id, render_view_id,
- GetDefaultZoomLevel());
- zoom_level_ = original_zoom_level;
- } else {
- // When we don't call any HostZoomMap set functions, we send the event
- // manually.
- FOR_EACH_OBSERVER(ZoomObserver, observers_,
- OnZoomChanged(*event_data_));
- event_data_.reset();
- }
- break;
- }
- case ZOOM_MODE_DISABLED: {
- // The page needs to be zoomed back to default before disabling the zoom
- double new_zoom_level = GetDefaultZoomLevel();
- event_data_->new_zoom_level = new_zoom_level;
- zoom_map->SetTemporaryZoomLevel(render_process_id, render_view_id,
- new_zoom_level);
- break;
- }
- }
- // Any event data we've stored should have been consumed by this point.
- DCHECK(!event_data_);
-
- zoom_mode_ = new_mode;
-}
-
-void ZoomController::ResetZoomModeOnNavigationIfNeeded(const GURL& url) {
- if (zoom_mode_ != ZOOM_MODE_ISOLATED && zoom_mode_ != ZOOM_MODE_MANUAL)
- return;
-
- int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
- int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- content::HostZoomMap* zoom_map =
- content::HostZoomMap::GetForWebContents(web_contents());
- zoom_level_ = zoom_map->GetDefaultZoomLevel();
- double old_zoom_level = zoom_map->GetZoomLevel(web_contents());
- double new_zoom_level = zoom_map->GetZoomLevelForHostAndScheme(
- url.scheme(), net::GetHostOrSpecFromURL(url));
- event_data_.reset(new ZoomChangedEventData(
- web_contents(), old_zoom_level, new_zoom_level, ZOOM_MODE_DEFAULT,
- false /* can_show_bubble */));
- // The call to ClearTemporaryZoomLevel() doesn't generate any events from
- // HostZoomMap, but the call to UpdateState() at the end of this function
- // will notify our observers.
- // Note: it's possible the render_process/view ids have disappeared (e.g.
- // if we navigated to a new origin), but this won't cause a problem in the
- // call below.
- zoom_map->ClearTemporaryZoomLevel(render_process_id, render_view_id);
- zoom_mode_ = ZOOM_MODE_DEFAULT;
-}
-
-void ZoomController::DidNavigateMainFrame(
- const content::LoadCommittedDetails& details,
- const content::FrameNavigateParams& params) {
- if (details.entry && details.entry->GetPageType() == content::PAGE_TYPE_ERROR)
- content::HostZoomMap::SendErrorPageZoomLevelRefresh(web_contents());
-
- if (!details.is_in_page)
- ResetZoomModeOnNavigationIfNeeded(params.url);
-
- // If the main frame's content has changed, the new page may have a different
- // zoom level from the old one.
- UpdateState(std::string());
- DCHECK(!event_data_);
-}
-
-void ZoomController::WebContentsDestroyed() {
- // At this point we should no longer be sending any zoom events with this
- // WebContents.
- observers_.Clear();
-}
-
-void ZoomController::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(&ZoomController::OnZoomLevelChanged, base::Unretained(this)));
-}
-
-void ZoomController::OnZoomLevelChanged(
- const content::HostZoomMap::ZoomLevelChange& change) {
- UpdateState(change.host);
-}
-
-void ZoomController::UpdateState(const std::string& host) {
- // If |host| is empty, all observers should be updated.
- if (!host.empty()) {
- // Use the navigation entry's URL instead of the WebContents' so virtual
- // URLs work (e.g. chrome://settings). http://crbug.com/153950
- content::NavigationEntry* entry =
- web_contents()->GetController().GetLastCommittedEntry();
- if (!entry ||
- host != net::GetHostOrSpecFromURL(
- content::HostZoomMap::GetURLFromEntry(entry))) {
- return;
- }
- }
-
- if (event_data_) {
- // For state changes initiated within the ZoomController, information about
- // the change should be sent.
- ZoomChangedEventData zoom_change_data = *event_data_;
- event_data_.reset();
- // The zoom bubble should not be shown for zoom changes where the host
- // is empty.
- zoom_change_data.can_show_bubble = can_show_bubble_ && !host.empty();
- FOR_EACH_OBSERVER(ZoomObserver, observers_,
- OnZoomChanged(zoom_change_data));
- } else {
- // TODO(wjmaclean) Should we consider having HostZoomMap send both old and
- // new zoom levels here?
- double zoom_level = GetZoomLevel();
- // We never show a zoom bubble for an event we didn't generate.
- ZoomChangedEventData zoom_change_data(web_contents(), zoom_level,
- zoom_level, zoom_mode_,
- false /* can_show_bubble */);
- FOR_EACH_OBSERVER(ZoomObserver, observers_,
- OnZoomChanged(zoom_change_data));
- }
-}
-
-void ZoomController::SetPageScaleFactorIsOneForTesting(bool is_one) {
- int render_process_id = web_contents()->GetRenderProcessHost()->GetID();
- int render_view_id = web_contents()->GetRenderViewHost()->GetRoutingID();
- host_zoom_map_->SetPageScaleFactorIsOneForView(
- render_process_id, render_view_id, is_one);
-}
-
-bool ZoomController::PageScaleFactorIsOne() const {
- return content::HostZoomMap::PageScaleFactorIsOne(web_contents());
-}
-
-} // namespace ui_zoom
« no previous file with comments | « components/ui/zoom/zoom_controller.h ('k') | components/ui/zoom/zoom_event_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698