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; |
} |