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

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

Issue 225093019: Zoom Extension API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Using callbacks instead of zoom IDs. Created 6 years, 8 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 39607d2b0f7f2532c3d2d37871f069edea697e07..21b8bc8e1516a6b2aa6930bf269654150193c7cc 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"
@@ -60,6 +61,7 @@
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/notification_details.h"
+#include "content/public/browser/notification_service.h"
#include "content/public/browser/notification_source.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
@@ -215,6 +217,35 @@ Browser* CreateBrowserWindow(const Browser::CreateParams& params,
} // namespace
+void ZoomModeToZoomSettings(content::ZoomMode zoom_mode,
+ base::DictionaryValue* zoom_settings) {
+ std::string zoom_settings_mode;
+ std::string zoom_settings_scope;
not at google - send to devlin 2014/04/09 03:52:11 you could use const char* for both of these and av
paulmeyer 2014/04/11 03:01:02 Done.
+ switch (zoom_mode) {
+ case content::kZoomModeDefault:
+ zoom_settings_mode = "automatic";
+ zoom_settings_scope = "per-origin";
+ break;
+ case content::kZoomModeIsolated:
+ zoom_settings_mode = "automatic";
+ zoom_settings_scope = "per-tab";
+ break;
+ case content::kZoomModeManual:
+ zoom_settings_mode = "manual";
+ zoom_settings_scope = "per-tab";
+ break;
+ case content::kZoomModeDisabled:
+ zoom_settings_mode = "disabled";
+ zoom_settings_scope = "per-tab";
+ break;
+ default:
+ NOTREACHED();
not at google - send to devlin 2014/04/09 03:52:11 prefer not setting a default case so that you can
paulmeyer 2014/04/11 03:01:02 Done.
+ }
+
+ zoom_settings->SetString(keys::kZoomSettingsMode, zoom_settings_mode);
+ zoom_settings->SetString(keys::kZoomSettingsScope, zoom_settings_scope);
+}
+
// Windows ---------------------------------------------------------------------
bool WindowsGetFunction::RunImpl() {
@@ -1596,8 +1627,9 @@ bool TabsReloadFunction::RunImpl() {
NULL,
&web_contents,
NULL,
- &error_))
- return false;
+ &error_)) {
+ return false;
+ }
}
if (web_contents->ShowingInterstitialPage()) {
@@ -1917,4 +1949,168 @@ bool TabsInsertCSSFunction::ShouldInsertCSS() const {
return true;
}
+bool ZoomAPIFunction::GetWebContents(int* tab_id,
+ content::WebContents** web_contents) {
not at google - send to devlin 2014/04/09 03:52:11 surely this functionality is already implemented f
paulmeyer 2014/04/11 03:01:02 Unfortunately it is implemented but not in a share
+ if (tab_id) {
+ if (!GetTabById(*tab_id,
+ GetProfile(),
+ include_incognito(),
+ NULL,
+ NULL,
+ web_contents,
+ NULL,
+ &error_)) {
+ return false;
+ }
+ } else {
+ Browser* browser = GetCurrentBrowser();
+ if (!browser) {
+ error_ = keys::kNoCurrentWindowError;
+ return false;
+ }
+ if (!ExtensionTabUtil::GetDefaultTab(browser, web_contents, NULL)) {
+ error_ = keys::kNoCurrentTabError;
+ return false;
+ }
+ }
+ return true;
+}
+
+bool TabsSetZoomFunction::RunImpl() {
+ scoped_ptr<tabs::SetZoom::Params> params(
+ tabs::SetZoom::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = NULL;
+ if (!GetWebContents(params->tab_id.get(), &web_contents)) {
+ SendResponse(false);
+ return false;
+ } else if (web_contents->GetURL().SchemeIs("chrome")) {
not at google - send to devlin 2014/04/09 03:52:11 use kChromeUIScheme not "chrome".
paulmeyer 2014/04/11 03:01:02 Done.
+ error_ = keys::kCannotZoomChromePagesError;
+ SendResponse(false);
+ return false;
+ }
+
+ ZoomController* zoom_controller =
+ ZoomController::FromWebContents(web_contents);
+ double zoom_level = content::ZoomFactorToZoomLevel(params->zoom_factor);
+
+ // Attempt to set the zoom level with a callback.
+ scoped_refptr<TabsSetZoomFunction> this_ref = this;
not at google - send to devlin 2014/04/09 03:52:11 I don't think this makes any difference. just pass
paulmeyer 2014/04/11 03:01:02 I believe that the scoped_ptr is necessary to pres
not at google - send to devlin 2014/04/11 15:04:25 I looked at the documentation in callback.h. It re
paulmeyer 2014/04/11 19:09:49 Done.
+ if (!zoom_controller->SetZoomLevelByExtension(
+ zoom_level,
+ GetExtension(),
+ base::Bind(&TabsSetZoomFunction::Callback, this_ref))) {
not at google - send to devlin 2014/04/09 03:52:11 you can also bind to SendReseponse directly: base
paulmeyer 2014/04/11 03:01:02 Done.
+ // Tried to zoom a tab in disabled mode.
+ error_ = keys::kCannotZoomDisabledTabError;
+ SendResponse(false);
+ return false;
+ }
+
+ return true;
+}
+
+void TabsSetZoomFunction::Callback() {
+ SendResponse(true);
+}
+
+bool TabsGetZoomFunction::RunImpl() {
+ scoped_ptr<tabs::GetZoom::Params> params(
+ tabs::GetZoom::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = NULL;
+ if (!GetWebContents(params->tab_id.get(), &web_contents)) {
+ SendResponse(false);
+ return false;
+ }
+
+ double zoom_level = web_contents->GetZoomLevel();
+ double zoom_factor = content::ZoomLevelToZoomFactor(zoom_level);
+ SetResult(new base::FundamentalValue(zoom_factor));
not at google - send to devlin 2014/04/09 03:52:11 prefer result_ = tabs::getZoom::Result::Create(..
paulmeyer 2014/04/11 03:01:02 Done.
+ SendResponse(true);
+ return true;
+}
+
+bool TabsSetZoomSettingsFunction::RunImpl() {
+ scoped_ptr<tabs::SetZoomSettings::Params> params(
+ tabs::SetZoomSettings::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = NULL;
+ if (!GetWebContents(params->tab_id.get(), &web_contents)) {
+ SendResponse(false);
+ return false;
+ } else if (web_contents->GetURL().SchemeIs("chrome")) {
+ error_ = keys::kCannotChangeChromePageZoomSettingsError;
+ SendResponse(false);
+ return false;
+ }
+
+ // Set default mode when omitted.
+ if (params->zoom_settings.mode == api::tabs::ZoomSettings::MODE_NONE)
+ params->zoom_settings.mode = api::tabs::ZoomSettings::MODE_AUTOMATIC;
+
+ // "per-origin" scope is only available in "automatic" mode.
+ if (params->zoom_settings.scope ==
+ api::tabs::ZoomSettings::SCOPE_PER_ORIGIN &&
+ params->zoom_settings.mode != api::tabs::ZoomSettings::MODE_AUTOMATIC) {
+ error_ = keys::kPerOriginOnlyInAutomaticError;
+ SendResponse(false);
+ return false;
+ }
+
+ // Determine the correct internal zoom mode to set |web_contents| to from the
+ // user-specified |zoom_settings|.
+ content::ZoomMode zoom_mode = content::kZoomModeDefault;
+ switch (params->zoom_settings.mode) {
+ case api::tabs::ZoomSettings::MODE_AUTOMATIC:
+ switch (params->zoom_settings.scope) {
+ case api::tabs::ZoomSettings::SCOPE_NONE:
+ case api::tabs::ZoomSettings::SCOPE_PER_ORIGIN:
+ zoom_mode = content::kZoomModeDefault;
+ break;
+ case api::tabs::ZoomSettings::SCOPE_PER_TAB:
+ zoom_mode = content::kZoomModeIsolated;
+ break;
+ default:
not at google - send to devlin 2014/04/09 03:52:11 don't specify a default case, then you will get co
paulmeyer 2014/04/11 03:01:02 Done.
+ NOTREACHED();
+ }
+ break;
+ case api::tabs::ZoomSettings::MODE_MANUAL:
+ zoom_mode = content::kZoomModeManual;
+ break;
+ case api::tabs::ZoomSettings::MODE_DISABLED:
+ zoom_mode = content::kZoomModeDisabled;
+ break;
+ default:
not at google - send to devlin 2014/04/09 03:52:11 ditto
paulmeyer 2014/04/11 03:01:02 Done.
+ NOTREACHED();
+ }
+
+ web_contents->SetZoomMode(zoom_mode);
+
+ SendResponse(true);
+ return true;
+}
+
+bool TabsGetZoomSettingsFunction::RunImpl() {
+ scoped_ptr<tabs::GetZoomSettings::Params> params(
+ tabs::GetZoomSettings::Params::Create(*args_));
+ EXTENSION_FUNCTION_VALIDATE(params.get());
+
+ WebContents* web_contents = NULL;
+ if (!GetWebContents(params->tab_id.get(), &web_contents)) {
+ SendResponse(false);
+ return false;
+ }
+
+ content::ZoomMode zoom_mode = web_contents->GetZoomMode();
+ base::DictionaryValue* zoom_settings = new base::DictionaryValue();
+ ZoomModeToZoomSettings(zoom_mode, zoom_settings);
not at google - send to devlin 2014/04/09 03:52:11 my comments at the top aside - if this function is
paulmeyer 2014/04/11 03:01:02 It is also used in tabs_event_router.cc, but I imp
+
+ SetResult(zoom_settings);
+ SendResponse(true);
+ return true;
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698