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

Unified Diff: chrome/browser/extensions/extension_tabs_module.cc

Issue 9428018: Create BaseWindow and ExtensionWindowWrapper for extension API access to Panels (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 8 years, 10 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 | « chrome/browser/extensions/extension_tab_util.cc ('k') | chrome/browser/extensions/extension_tabs_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/extensions/extension_tabs_module.cc
diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc
index 2b021068eecf499ae93055423375cca61e05fa1f..a6a9ddc22ffc25fc93e8d744589942b133a1ce95 100644
--- a/chrome/browser/extensions/extension_tabs_module.cc
+++ b/chrome/browser/extensions/extension_tabs_module.cc
@@ -23,6 +23,8 @@
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_tabs_module_constants.h"
+#include "chrome/browser/extensions/extension_window_controller.h"
+#include "chrome/browser/extensions/extension_window_list.h"
#include "chrome/browser/net/url_fixer_upper.h"
#include "chrome/browser/prefs/incognito_mode_prefs.h"
#include "chrome/browser/profiles/profile.h"
@@ -126,6 +128,44 @@ bool GetBrowserFromWindowID(
return true;
}
+ExtensionWindowController::ProfileMatchType ProfileMatchType(
+ bool include_incognito) {
+ return include_incognito ?
+ ExtensionWindowController::MATCH_INCOGNITO
+ : ExtensionWindowController::MATCH_NORMAL_ONLY;
+}
+
+bool GetWindowFromWindowID(UIThreadExtensionFunction* function,
+ int window_id,
+ ExtensionWindowController** controller) {
+ if (window_id == extension_misc::kCurrentWindowId) {
+ Browser* browser = function->dispatcher()->delegate()->GetBrowser();
+ // If there is a windowed browser associated with this extension, use that.
+ if (browser && browser->extension_window_controller()) {
+ *controller = browser->extension_window_controller();
+ } else {
+ // Otherwise get the focused or most recently added window.
+ *controller = ExtensionWindowList::GetInstance()->CurrentWindow(
+ function->profile(),
+ ProfileMatchType(function->include_incognito()));
+ }
+ if (!(*controller)) {
+ function->SetError(keys::kNoCurrentWindowError);
+ return false;
+ }
+ } else {
+ *controller = ExtensionWindowList::GetInstance()->FindWindowById(
+ function->profile(),
+ ProfileMatchType(function->include_incognito()),
+ window_id);
+ if (!(*controller)) {
+ function->SetError(ExtensionErrorUtils::FormatErrorMessage(
+ keys::kWindowNotFoundError, base::IntToString(window_id)));
+ return false;
+ }
+ }
+ return true;
+}
// |error_message| can optionally be passed in and will be set with an
// appropriate message if the tab cannot be found by id.
bool GetTabById(int tab_id,
@@ -231,11 +271,14 @@ bool GetWindowFunction::RunImpl() {
if (params->get_info.get() && params->get_info->populate.get())
populate_tabs = *params->get_info->populate;
- Browser* browser = NULL;
- if (!GetBrowserFromWindowID(this, params->window_id, &browser))
+ ExtensionWindowController* controller;
+ if (!GetWindowFromWindowID(this, params->window_id, &controller))
return false;
- result_.reset(ExtensionTabUtil::CreateWindowValue(browser, populate_tabs));
+ if (populate_tabs)
+ result_.reset(controller->CreateWindowValueWithTabs());
+ else
+ result_.reset(controller->CreateWindowValue());
return true;
}
@@ -247,12 +290,16 @@ bool GetCurrentWindowFunction::RunImpl() {
if (params->get_info.get() && params->get_info->populate.get())
populate_tabs = *params->get_info->populate;
- Browser* browser = GetCurrentBrowser();
- if (!browser || !browser->window()) {
- error_ = keys::kNoCurrentWindowError;
+ ExtensionWindowController* controller;
+ if (!GetWindowFromWindowID(this,
+ extension_misc::kCurrentWindowId,
+ &controller)) {
return false;
}
- result_.reset(ExtensionTabUtil::CreateWindowValue(browser, populate_tabs));
+ if (populate_tabs)
+ result_.reset(controller->CreateWindowValueWithTabs());
+ else
+ result_.reset(controller->CreateWindowValue());
return true;
}
@@ -265,13 +312,21 @@ bool GetLastFocusedWindowFunction::RunImpl() {
if (params->get_info.get() && params->get_info->populate.get())
populate_tabs = *params->get_info->populate;
+ // Note: currently this returns the last active browser. If we decide to
+ // include other window types (e.g. panels), we will need to add logic to
+ // ExtensionWindowList that mirrors the active behavior of BrowserList.
Browser* browser = BrowserList::FindAnyBrowser(
profile(), include_incognito());
if (!browser || !browser->window()) {
error_ = keys::kNoLastFocusedWindowError;
return false;
}
- result_.reset(ExtensionTabUtil::CreateWindowValue(browser, populate_tabs));
+ ExtensionWindowController* controller =
+ browser->extension_window_controller();
+ if (populate_tabs)
+ result_.reset(controller->CreateWindowValueWithTabs());
+ else
+ result_.reset(controller->CreateWindowValue());
return true;
}
@@ -283,21 +338,21 @@ bool GetAllWindowsFunction::RunImpl() {
if (params->get_info.get() && params->get_info->populate.get())
populate_tabs = *params->get_info->populate;
- result_.reset(new ListValue());
- Profile* incognito_profile =
- include_incognito() && profile()->HasOffTheRecordProfile() ?
- profile()->GetOffTheRecordProfile() : NULL;
- for (BrowserList::const_iterator browser = BrowserList::begin();
- browser != BrowserList::end(); ++browser) {
- // Only examine browsers in the current profile that have windows.
- if (((*browser)->profile() == profile() ||
- (*browser)->profile() == incognito_profile) &&
- (*browser)->window()) {
- static_cast<ListValue*>(result_.get())->
- Append(ExtensionTabUtil::CreateWindowValue(*browser, populate_tabs));
- }
+ ListValue* window_list = new ListValue();
+ const ExtensionWindowList::WindowList& windows =
+ ExtensionWindowList::GetInstance()->windows();
+ for (ExtensionWindowList::WindowList::const_iterator iter =
+ windows.begin();
+ iter != windows.end(); ++iter) {
+ if (!(*iter)->MatchesProfile(
+ profile(), ProfileMatchType(include_incognito())))
+ continue;
+ if (populate_tabs)
+ window_list->Append((*iter)->CreateWindowValueWithTabs());
+ else
+ window_list->Append((*iter)->CreateWindowValue());
}
-
+ result_.reset(window_list);
return true;
}
@@ -531,7 +586,7 @@ bool CreateWindowFunction::RunImpl() {
}
#if defined(USE_AURA)
- // Aura Panels create a new PanelDOMView.
+ // Aura Panels create a new PanelViewAura.
if (CommandLine::ForCurrentProcess()->HasSwitch(
ash::switches::kAuraPanelManager) &&
window_type == Browser::TYPE_PANEL) {
@@ -540,9 +595,8 @@ bool CreateWindowFunction::RunImpl() {
web_app::GenerateApplicationNameFromExtensionId(extension_id);
PanelViewAura* panel_view = new PanelViewAura(title);
panel_view->Init(window_profile, urls[0], panel_bounds);
- // TODO(stevenjb): Provide an interface enable handles for any view, not
- // just browsers. See crbug.com/113412.
- result_.reset(Value::CreateNullValue());
+ result_.reset(
+ panel_view->extension_window_controller()->CreateWindowValueWithTabs());
return true;
}
#endif
@@ -583,7 +637,8 @@ bool CreateWindowFunction::RunImpl() {
// Don't expose incognito windows if the extension isn't allowed.
result_.reset(Value::CreateNullValue());
} else {
- result_.reset(ExtensionTabUtil::CreateWindowValue(new_window, true));
+ result_.reset(
+ new_window->extension_window_controller()->CreateWindowValueWithTabs());
}
return true;
@@ -595,8 +650,8 @@ bool UpdateWindowFunction::RunImpl() {
DictionaryValue* update_props;
EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &update_props));
- Browser* browser = NULL;
- if (!GetBrowserFromWindowID(this, window_id, &browser))
+ ExtensionWindowController* controller;
+ if (!GetWindowFromWindowID(this, window_id, &controller))
return false;
ui::WindowShowState show_state = ui::SHOW_STATE_DEFAULT; // No change.
@@ -618,32 +673,35 @@ bool UpdateWindowFunction::RunImpl() {
}
}
- if (browser->window()->IsFullscreen() &&
- show_state != ui::SHOW_STATE_FULLSCREEN &&
+ if (show_state != ui::SHOW_STATE_FULLSCREEN &&
show_state != ui::SHOW_STATE_DEFAULT)
- browser->ToggleFullscreenModeWithExtension(*GetExtension());
+ controller->SetFullscreenMode(false, GetExtension()->url());
switch (show_state) {
case ui::SHOW_STATE_MINIMIZED:
- browser->window()->Minimize();
+ controller->window()->Minimize();
break;
case ui::SHOW_STATE_MAXIMIZED:
- browser->window()->Maximize();
+ controller->window()->Maximize();
break;
case ui::SHOW_STATE_FULLSCREEN:
- if (browser->window()->IsMinimized() || browser->window()->IsMaximized())
- browser->window()->Restore();
- if (!browser->window()->IsFullscreen())
- browser->ToggleFullscreenModeWithExtension(*GetExtension());
+ if (controller->window()->IsMinimized() ||
+ controller->window()->IsMaximized())
+ controller->window()->Restore();
+ controller->SetFullscreenMode(true, GetExtension()->url());
break;
case ui::SHOW_STATE_NORMAL:
- browser->window()->Restore();
+ controller->window()->Restore();
break;
default:
break;
}
- gfx::Rect bounds = browser->window()->GetRestoredBounds();
+ gfx::Rect bounds;
+ if (controller->window()->IsMinimized())
+ bounds = controller->window()->GetRestoredBounds();
+ else
+ bounds = controller->window()->GetBounds();
bool set_bounds = false;
// Any part of the bounds can optionally be set by the caller.
@@ -687,7 +745,7 @@ bool UpdateWindowFunction::RunImpl() {
error_ = keys::kInvalidWindowStateError;
return false;
}
- browser->window()->SetBounds(bounds);
+ controller->window()->SetBounds(bounds);
}
bool active_val = false;
@@ -699,14 +757,14 @@ bool UpdateWindowFunction::RunImpl() {
error_ = keys::kInvalidWindowStateError;
return false;
}
- browser->window()->Activate();
+ controller->window()->Activate();
} else {
if (show_state == ui::SHOW_STATE_MAXIMIZED ||
show_state == ui::SHOW_STATE_FULLSCREEN) {
error_ = keys::kInvalidWindowStateError;
return false;
}
- browser->window()->Deactivate();
+ controller->window()->Deactivate();
}
}
@@ -714,10 +772,10 @@ bool UpdateWindowFunction::RunImpl() {
if (update_props->HasKey(keys::kDrawAttentionKey)) {
EXTENSION_FUNCTION_VALIDATE(update_props->GetBoolean(
keys::kDrawAttentionKey, &draw_attention));
- browser->window()->FlashFrame(draw_attention);
+ controller->window()->FlashFrame(draw_attention);
}
- result_.reset(ExtensionTabUtil::CreateWindowValue(browser, false));
+ result_.reset(controller->CreateWindowValue());
return true;
}
@@ -726,20 +784,17 @@ bool RemoveWindowFunction::RunImpl() {
int window_id = -1;
EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &window_id));
- Browser* browser = GetBrowserInProfileWithId(profile(), window_id,
- include_incognito(), &error_);
- if (!browser)
+ ExtensionWindowController* controller;
+ if (!GetWindowFromWindowID(this, window_id, &controller))
return false;
- // Don't let the extension remove the window if the user is dragging tabs
- // in that window.
- if (!browser->IsTabStripEditable()) {
- error_ = keys::kTabStripNotEditableError;
+ ExtensionWindowController::Reason reason;
+ if (!controller->CanClose(&reason)) {
+ if (reason == ExtensionWindowController::REASON_TAB_STRIP_NOT_EDITABLE)
+ error_ = keys::kTabStripNotEditableError;
return false;
}
-
- browser->CloseWindow();
-
+ controller->window()->Close();
return true;
}
@@ -1094,7 +1149,8 @@ bool HighlightTabsFunction::RunImpl() {
selection.set_active(active_index);
browser->tabstrip_model()->SetSelectionFromModel(selection);
- result_.reset(ExtensionTabUtil::CreateWindowValue(browser, true));
+ result_.reset(
+ browser->extension_window_controller()->CreateWindowValueWithTabs());
return true;
}
« no previous file with comments | « chrome/browser/extensions/extension_tab_util.cc ('k') | chrome/browser/extensions/extension_tabs_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698