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 a6695969e1bef387e24164066cea0534e1e121ce..dc26f478f6dc8513e3140a3b822d5d5f20aad3ab 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::ZOOM_MODE_DEFAULT: |
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_AUTOMATIC; |
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_ORIGIN; |
+ break; |
+ case ZoomController::ZOOM_MODE_ISOLATED: |
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_AUTOMATIC; |
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB; |
+ break; |
+ case ZoomController::ZOOM_MODE_MANUAL: |
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_MANUAL; |
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB; |
+ break; |
+ case ZoomController::ZOOM_MODE_DISABLED: |
+ zoom_settings->mode = api::tabs::ZoomSettings::MODE_DISABLED; |
+ zoom_settings->scope = api::tabs::ZoomSettings::SCOPE_PER_TAB; |
+ break; |
+ } |
+} |
+ |
// Windows --------------------------------------------------------------------- |
bool WindowsGetFunction::RunSync() { |
@@ -1416,8 +1440,9 @@ bool TabsReloadFunction::RunSync() { |
NULL, |
&web_contents, |
NULL, |
- &error_)) |
- return false; |
+ &error_)) { |
+ return false; |
+ } |
} |
if (web_contents->ShowingInterstitialPage()) { |
@@ -1743,4 +1768,145 @@ bool TabsInsertCSSFunction::ShouldInsertCSS() const { |
return true; |
} |
+content::WebContents* ZoomAPIFunction::GetWebContents(int tab_id) { |
+ content::WebContents* web_contents = NULL; |
+ if (tab_id != -1) { |
+ // We assume this call leaves web_contents unchanged if it is unsuccessful. |
+ GetTabById(tab_id, |
+ GetProfile(), |
+ include_incognito(), |
+ NULL /* ignore Browser* output */, |
+ NULL /* ignore TabStripModel* output */, |
+ &web_contents, |
+ NULL /* ignore int tab_index output */, |
+ &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); |
+ |
+ int tab_id = params->tab_id ? *params->tab_id : -1; |
+ WebContents* web_contents = GetWebContents(tab_id); |
+ if (!web_contents) |
+ return false; |
+ |
+ GURL url(web_contents->GetVisibleURL()); |
+ if (PermissionsData::IsRestrictedUrl(url, url, GetExtension(), &error_)) |
+ 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); |
+ |
+ int tab_id = params->tab_id ? *params->tab_id : -1; |
+ WebContents* web_contents = GetWebContents(tab_id); |
+ 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); |
+ |
+ int tab_id = params->tab_id ? *params->tab_id : -1; |
+ WebContents* web_contents = GetWebContents(tab_id); |
+ if (!web_contents) |
+ return false; |
+ |
+ GURL url(web_contents->GetVisibleURL()); |
+ if (PermissionsData::IsRestrictedUrl(url, url, GetExtension(), &error_)) |
+ 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::ZOOM_MODE_DEFAULT; |
+ 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::ZOOM_MODE_DEFAULT; |
+ break; |
+ case ZoomSettings::SCOPE_PER_TAB: |
+ zoom_mode = ZoomController::ZOOM_MODE_ISOLATED; |
+ } |
+ break; |
+ case ZoomSettings::MODE_MANUAL: |
+ zoom_mode = ZoomController::ZOOM_MODE_MANUAL; |
+ break; |
+ case ZoomSettings::MODE_DISABLED: |
+ zoom_mode = ZoomController::ZOOM_MODE_DISABLED; |
+ } |
+ |
+ 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); |
+ |
+ int tab_id = params->tab_id ? *params->tab_id : -1; |
+ WebContents* web_contents = GetWebContents(tab_id); |
+ 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 |