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 d212cafc223bf329158f547c68b5884c1a69a766..3bcf3db1f36819a2804ad06844a2ba1d22171df6 100644 |
--- a/chrome/browser/extensions/api/tabs/tabs_api.cc |
+++ b/chrome/browser/extensions/api/tabs/tabs_api.cc |
@@ -181,6 +181,23 @@ void AssignOptionalValue(const scoped_ptr<T>& source, |
} |
} |
+ui::WindowShowState ConvertToWindowShowState(windows::WindowState state) { |
+ switch (state) { |
+ case windows::WINDOW_STATE_NORMAL: |
+ return ui::SHOW_STATE_NORMAL; |
+ case windows::WINDOW_STATE_MINIMIZED: |
+ return ui::SHOW_STATE_MINIMIZED; |
+ case windows::WINDOW_STATE_MAXIMIZED: |
+ return ui::SHOW_STATE_MAXIMIZED; |
+ case windows::WINDOW_STATE_FULLSCREEN: |
+ return ui::SHOW_STATE_FULLSCREEN; |
+ case windows::WINDOW_STATE_NONE: |
+ return ui::SHOW_STATE_DEFAULT; |
+ } |
+ NOTREACHED(); |
+ return ui::SHOW_STATE_DEFAULT; |
+} |
+ |
} // namespace |
void ZoomModeToZoomSettings(ZoomController::ZoomMode zoom_mode, |
@@ -558,6 +575,10 @@ bool WindowsCreateFunction::RunSync() { |
host_desktop_type); |
} |
create_params.initial_show_state = ui::SHOW_STATE_NORMAL; |
+ if (create_data && create_data->state) { |
+ create_params.initial_show_state = |
+ ConvertToWindowShowState(create_data->state); |
+ } |
create_params.host_desktop_type = chrome::GetActiveDesktop(); |
Browser* new_window = new Browser(create_params); |
@@ -599,15 +620,32 @@ bool WindowsCreateFunction::RunSync() { |
else |
new_window->window()->ShowInactive(); |
+ WindowController* controller = new_window->extension_window_controller(); |
+ |
+#if defined(OS_LINUX) || defined(OS_CHROMEOS) |
+ // On Desktop Linux, window managers may ignore hints until the X11 window is |
+ // mapped, which happens in the blocking call to Show() above. |
+ // DesktopWindowTreeHostX11 currently only checks for an attempt to maximize |
+ // once mapped, but not minimize or fullscreen. |
+ // For ChromeOS, manually Minimize(). Because minimzied window is not |
+ // considered to create new window. See http://crbug.com/473228. |
+ if (create_params.initial_show_state == ui::SHOW_STATE_MINIMIZED) |
+ new_window->window()->Minimize(); |
+#endif |
+#if (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || defined(OS_WIN) |
+ // On Desktop Linux and Windows, managers don't handle fullscreen state to |
+ // create window for now. |
+ if (create_params.initial_show_state == ui::SHOW_STATE_FULLSCREEN) |
+ controller->SetFullscreenMode(true, extension()->url()); |
+#endif |
+ |
if (new_window->profile()->IsOffTheRecord() && |
!GetProfile()->IsOffTheRecord() && !include_incognito()) { |
// Don't expose incognito windows if extension itself works in non-incognito |
// profile and CanCrossIncognito isn't allowed. |
SetResult(base::Value::CreateNullValue()); |
} else { |
- SetResult( |
- new_window->extension_window_controller()->CreateWindowValueWithTabs( |
- extension())); |
+ SetResult(controller->CreateWindowValueWithTabs(extension())); |
} |
return true; |
@@ -623,26 +661,8 @@ bool WindowsUpdateFunction::RunSync() { |
&controller)) |
return false; |
- ui::WindowShowState show_state = ui::SHOW_STATE_DEFAULT; // No change. |
- switch (params->update_info.state) { |
- case windows::WINDOW_STATE_NORMAL: |
- show_state = ui::SHOW_STATE_NORMAL; |
- break; |
- case windows::WINDOW_STATE_MINIMIZED: |
- show_state = ui::SHOW_STATE_MINIMIZED; |
- break; |
- case windows::WINDOW_STATE_MAXIMIZED: |
- show_state = ui::SHOW_STATE_MAXIMIZED; |
- break; |
- case windows::WINDOW_STATE_FULLSCREEN: |
- show_state = ui::SHOW_STATE_FULLSCREEN; |
- break; |
- case windows::WINDOW_STATE_NONE: |
- break; |
- default: |
- error_ = keys::kInvalidWindowStateError; |
- return false; |
- } |
+ ui::WindowShowState show_state = |
+ ConvertToWindowShowState(params->update_info.state); |
if (show_state != ui::SHOW_STATE_FULLSCREEN && |
show_state != ui::SHOW_STATE_DEFAULT) |