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

Unified Diff: chrome/browser/extensions/api/tabs/tabs_api.cc

Issue 301733006: Zoom Extension API (chrome) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comments. Created 6 years, 6 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
Index: chrome/browser/extensions/api/tabs/tabs_api.cc
diff --git a/chrome/browser/extensions/api/tabs/tabs_api.cc b/chrome/browser/extensions/api/tabs/tabs_api.cc
index 71c441c6fdd825c7c6aa5b4fa285bcaff778c62b..9bc9c82736449a0cca1870aac612996c6f25e2b4 100644
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc
@@ -44,6 +44,7 @@
#include "chrome/browser/ui/panels/panel_manager.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/browser/ui/window_sizer/window_sizer.h"
+#include "chrome/browser/ui/zoom/zoom_controller.h"
#include "chrome/browser/web_applications/web_app.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/api/i18n/default_locale_handler.h"
@@ -163,6 +164,29 @@ void AssignOptionalValue(const scoped_ptr<T>& source,
} // namespace
+void ZoomModeToZoomSettings(ZoomController::ZoomMode zoom_mode,
+ api::tabs::ZoomSettings* zoom_settings) {
+ DCHECK(zoom_settings);
+ switch (zoom_mode) {
+ case ZoomController::kZoomModeDefault:
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_AUTOMATIC;
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_ORIGIN;
+ break;
+ case ZoomController::kZoomModeIsolated:
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_AUTOMATIC;
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB;
+ break;
+ case ZoomController::kZoomModeManual:
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_MANUAL;
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB;
+ break;
+ case ZoomController::kZoomModeDisabled:
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_DISABLED;
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB;
+ break;
+ }
+}
+
// Windows ---------------------------------------------------------------------
bool WindowsGetFunction::RunSync() {
@@ -1420,8 +1444,9 @@ bool TabsReloadFunction::RunSync() {
NULL,
&web_contents,
NULL,
- &error_))
- return false;
+ &error_)) {
+ return false;
+ }
}
if (web_contents->ShowingInterstitialPage()) {
@@ -1749,4 +1774,147 @@ bool TabsInsertCSSFunction::ShouldInsertCSS() const {
return true;
}
+content::WebContents* ZoomAPIFunction::GetWebContents(int* tab_id) {
Devlin 2014/06/19 21:15:28 nit: more common is to pass in -1 for "no tab id",
wjmaclean 2014/06/20 22:01:32 Done.
+ content::WebContents* web_contents = NULL;
+ if (tab_id) {
+ // We assume this call leaves web_contents unchanged if it is unsuccessful.
+ GetTabById(*tab_id,
+ GetProfile(),
+ include_incognito(),
+ NULL,
Devlin 2014/06/19 21:15:28 Please document anonymous nulls.
wjmaclean 2014/06/20 22:01:32 Done.
+ NULL,
+ &web_contents,
+ NULL,
+ &error_);
+ } else {
+ Browser* browser = GetCurrentBrowser();
+ if (!browser)
+ error_ = keys::kNoCurrentWindowError;
+ else if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, NULL))
+ error_ = keys::kNoSelectedTabError;
+ }
+ return web_contents;
+}
+
+bool TabsSetZoomFunction::RunAsync() {
+ scoped_ptr<tabs::SetZoom::Params> params(
+ tabs::SetZoom::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = GetWebContents(params->tab_id.get());
+ if (!web_contents)
+ return false;
+
+ GURL url(web_contents->GetURL());
Devlin 2014/06/19 21:15:28 GetURL is still deprecated. :)
wjmaclean 2014/06/20 22:01:32 Done.
+ if (url.SchemeIs(content::kChromeUIScheme) ||
+ !ExtensionsClient::Get()->IsScriptableURL(url, NULL)) {
Devlin 2014/06/19 21:15:28 Please document anonymous NULL. ...ExtensionsClien
wjmaclean 2014/06/20 22:01:32 Done.
+ error_ = keys::kCannotZoomChromePagesError;
+ return false;
+ }
+
+ ZoomController* zoom_controller =
+ ZoomController::FromWebContents(web_contents);
+ double zoom_level = content::ZoomFactorToZoomLevel(params->zoom_factor);
+
+ if (!zoom_controller->SetZoomLevelByExtension(zoom_level, GetExtension())) {
+ // Tried to zoom a tab in disabled mode.
+ error_ = keys::kCannotZoomDisabledTabError;
+ return false;
+ }
+
+ SendResponse(true);
+ return true;
+}
+
+bool TabsGetZoomFunction::RunAsync() {
+ scoped_ptr<tabs::GetZoom::Params> params(
+ tabs::GetZoom::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = GetWebContents(params->tab_id.get());
+ if (!web_contents)
+ return false;
+
+ double zoom_level =
+ ZoomController::FromWebContents(web_contents)->GetZoomLevel();
+ double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level);
+ results_ = tabs::GetZoom::Results::Create(zoom_factor);
+ SendResponse(true);
+ return true;
+}
+
+bool TabsSetZoomSettingsFunction::RunAsync() {
+ using api::tabs::ZoomSettings;
+
+ scoped_ptr<tabs::SetZoomSettings::Params> params(
+ tabs::SetZoomSettings::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = GetWebContents(params->tab_id.get());
+ if (!web_contents)
+ return false;
+
+ GURL url(web_contents->GetURL());
+ if (url.SchemeIs(content::kChromeUIScheme) ||
+ !ExtensionsClient::Get()->IsScriptableURL(url, NULL)) {
+ error_ = keys::kCannotChangeChromePageZoomSettingsError;
+ return false;
+ }
+
+ // "per-origin" scope is only available in "automatic" mode.
+ if (params->zoom_settings.scope == ZoomSettings::SCOPE_PER_ORIGIN &&
+ params->zoom_settings.mode != ZoomSettings::MODE_AUTOMATIC &&
+ params->zoom_settings.mode != ZoomSettings::MODE_NONE) {
+ error_ = keys::kPerOriginOnlyInAutomaticError;
+ return false;
+ }
+
+ // Determine the correct internal zoom mode to set |web_contents| to from the
+ // user-specified |zoom_settings|.
+ ZoomController::ZoomMode zoom_mode = ZoomController::kZoomModeDefault;
+ switch (params->zoom_settings.mode) {
+ case ZoomSettings::MODE_NONE:
+ case ZoomSettings::MODE_AUTOMATIC:
+ switch (params->zoom_settings.scope) {
+ case ZoomSettings::SCOPE_NONE:
+ case ZoomSettings::SCOPE_PER_ORIGIN:
+ zoom_mode = ZoomController::kZoomModeDefault;
+ break;
+ case ZoomSettings::SCOPE_PER_TAB:
+ zoom_mode = ZoomController::kZoomModeIsolated;
+ }
+ break;
+ case ZoomSettings::MODE_MANUAL:
+ zoom_mode = ZoomController::kZoomModeManual;
+ break;
+ case ZoomSettings::MODE_DISABLED:
+ zoom_mode = ZoomController::kZoomModeDisabled;
+ }
+
+ ZoomController::FromWebContents(web_contents)->SetZoomMode(zoom_mode);
+
+ SendResponse(true);
+ return true;
+}
+
+bool TabsGetZoomSettingsFunction::RunAsync() {
+ scoped_ptr<tabs::GetZoomSettings::Params> params(
+ tabs::GetZoomSettings::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = GetWebContents(params->tab_id.get());
+ if (!web_contents)
+ return false;
+ ZoomController* zoom_controller =
+ ZoomController::FromWebContents(web_contents);
+
+ ZoomController::ZoomMode zoom_mode = zoom_controller->zoom_mode();
+ api::tabs::ZoomSettings zoom_settings;
+ ZoomModeToZoomSettings(zoom_mode, &zoom_settings);
+
+ results_ = api::tabs::GetZoomSettings::Results::Create(zoom_settings);
+ SendResponse(true);
+ return true;
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698