Index: chrome/browser/ui/extensions/shell_window.cc |
diff --git a/chrome/browser/ui/extensions/shell_window.cc b/chrome/browser/ui/extensions/shell_window.cc |
index 6e30846329c6aed4fbd27f8be0c410d652b6c9fa..7290b57e5a8a9fa8d354081a1330d36cc00460bd 100644 |
--- a/chrome/browser/ui/extensions/shell_window.cc |
+++ b/chrome/browser/ui/extensions/shell_window.cc |
@@ -152,6 +152,7 @@ void ShellWindow::Init(const GURL& url, |
// If left and top are left undefined, the native shell window will center |
// the window on the main screen in a platform-defined manner. |
+ gfx::Rect cached_work_area; |
ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT; |
if (!params.window_key.empty()) { |
window_key_ = params.window_key; |
@@ -161,7 +162,7 @@ void ShellWindow::Init(const GURL& url, |
gfx::Rect cached_bounds; |
if (cache->GetGeometry(extension()->id(), params.window_key, |
- &cached_bounds, &cached_state)) { |
+ &cached_bounds, &cached_work_area, &cached_state)) { |
bounds = cached_bounds; |
} |
} |
@@ -195,6 +196,14 @@ void ShellWindow::Init(const GURL& url, |
native_app_window_.reset(NativeAppWindow::Create(this, new_params)); |
+ // App window has cached work area, make sure it fits on screen in case of the |
scheib
2013/06/18 21:52:06
Why not place this above, before new_params.bounds
zhchbin
2013/06/19 05:43:32
Because in the AdjustBoundsToBeVisibleOnMonitorCon
|
+ // screen resolution changed before show. |
+ if (!cached_work_area.IsEmpty()) { |
+ gfx::Rect new_bounds; |
+ AdjustBoundsToBeVisibleOnMonitorContaining(bounds, cached_work_area, |
+ &new_bounds); |
+ native_app_window_->SetBounds(new_bounds); |
+ } |
if (!new_params.hidden) { |
if (window_type_is_panel()) |
GetBaseWindow()->ShowInactive(); // Panels are not activated by default. |
@@ -617,10 +626,45 @@ void ShellWindow::SaveWindowPosition() { |
gfx::Rect bounds = native_app_window_->GetRestoredBounds(); |
bounds.Inset(native_app_window_->GetFrameInsets()); |
+ gfx::Rect work_area = native_app_window_->GetWindowWorkArea(); |
ui::WindowShowState window_state = native_app_window_->GetRestoredState(); |
- cache->SaveGeometry(extension()->id(), window_key_, bounds, window_state); |
+ cache->SaveGeometry(extension()->id(), |
+ window_key_, |
+ bounds, |
+ work_area, |
+ window_state); |
} |
+void ShellWindow::AdjustBoundsToBeVisibleOnMonitorContaining( |
scheib
2013/06/18 21:52:06
Monitor is inconsistent with naming elsewhere. 'Wo
scheib
2013/06/18 21:52:06
Please add several tests for this function, for sh
zhchbin
2013/06/20 06:35:50
Done.
zhchbin
2013/06/20 06:35:50
Done.
|
+ const gfx::Rect& cached_bounds, |
+ const gfx::Rect& cached_work_area, |
+ gfx::Rect* bounds) const { |
+ if (!native_app_window_) |
+ return; |
+ if (!bounds) |
+ return; |
+ |
+ *bounds = cached_bounds; |
+ gfx::Rect work_area = native_app_window_->GetWindowWorkArea(); |
+ |
+ // Reposition and resize the bounds if the saved_work_area is different from |
+ // the current work area and the current work area doesn't completely contain |
+ // the bounds. |
+ if (!cached_work_area.IsEmpty() && |
+ cached_work_area != work_area && |
+ !work_area.Contains(cached_bounds)) { |
+ bounds->set_width(std::min(bounds->width(), work_area.width())); |
scheib
2013/06/18 21:52:06
We can not resize to a smaller window than minimum
zhchbin
2013/06/20 06:35:50
Done.
|
+ bounds->set_height(std::min(bounds->height(), work_area.height())); |
+ bounds->set_x( |
+ std::max(work_area.x(), |
+ std::min(bounds->x(), work_area.right() - bounds->width()))); |
+ bounds->set_y( |
+ std::max(work_area.y(), |
+ std::min(bounds->y(), work_area.bottom() - bounds->height()))); |
+ } |
+} |
+ |
+ |
// static |
SkRegion* ShellWindow::RawDraggableRegionsToSkRegion( |
const std::vector<extensions::DraggableRegion>& regions) { |