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

Side by Side Diff: apps/app_window.cc

Issue 186343002: Create windows for new app window bounds API (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Self nit: comment Created 6 years, 9 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "apps/app_window.h" 5 #include "apps/app_window.h"
6 6
7 #include <algorithm>
benwells 2014/03/05 02:33:30 Is this needed?
tmdiep 2014/03/05 03:06:47 Apparently it is if you use std::min/max on VS2013
8
7 #include "apps/app_window_geometry_cache.h" 9 #include "apps/app_window_geometry_cache.h"
8 #include "apps/app_window_registry.h" 10 #include "apps/app_window_registry.h"
9 #include "apps/apps_client.h" 11 #include "apps/apps_client.h"
10 #include "apps/size_constraints.h" 12 #include "apps/size_constraints.h"
11 #include "apps/ui/native_app_window.h" 13 #include "apps/ui/native_app_window.h"
12 #include "base/command_line.h" 14 #include "base/command_line.h"
13 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
14 #include "base/strings/utf_string_conversions.h" 16 #include "base/strings/utf_string_conversions.h"
15 #include "base/values.h" 17 #include "base/values.h"
16 #include "chrome/browser/chrome_notification_types.h" 18 #include "chrome/browser/chrome_notification_types.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 SetConstraintProperty("minWidth", min_size.width(), bounds_properties.get()); 90 SetConstraintProperty("minWidth", min_size.width(), bounds_properties.get());
89 SetConstraintProperty( 91 SetConstraintProperty(
90 "minHeight", min_size.height(), bounds_properties.get()); 92 "minHeight", min_size.height(), bounds_properties.get());
91 SetConstraintProperty("maxWidth", max_size.width(), bounds_properties.get()); 93 SetConstraintProperty("maxWidth", max_size.width(), bounds_properties.get());
92 SetConstraintProperty( 94 SetConstraintProperty(
93 "maxHeight", max_size.height(), bounds_properties.get()); 95 "maxHeight", max_size.height(), bounds_properties.get());
94 96
95 window_properties->Set(bounds_name, bounds_properties.release()); 97 window_properties->Set(bounds_name, bounds_properties.release());
96 } 98 }
97 99
100 // Combines the constraints of the content and window, and returns constraints
101 // for the window.
102 gfx::Size GetCombinedWindowConstraints(const gfx::Size& window_size,
benwells 2014/03/05 02:33:30 Nit: I think window_size and content_size should b
103 const gfx::Size& content_size,
104 const gfx::Insets& frame_insets) {
105 gfx::Size combined_size(window_size);
106 if (content_size.width() > 0)
107 combined_size.set_width(content_size.width() + frame_insets.width());
108 if (content_size.height() > 0)
109 combined_size.set_height(content_size.height() + frame_insets.height());
110 return combined_size;
111 }
112
113 // Combines the constraints of the content and window, and returns constraints
114 // for the content.
115 gfx::Size GetCombinedContentConstraints(const gfx::Size& window_size,
116 const gfx::Size& content_size,
benwells 2014/03/05 02:33:30 Same here
117 const gfx::Insets& frame_insets) {
118 gfx::Size combined_size(content_size);
119 if (window_size.width() > 0) {
120 combined_size.set_width(
121 std::max(0, window_size.width() - frame_insets.width()));
122 }
123 if (window_size.height() > 0) {
124 combined_size.set_height(
125 std::max(0, window_size.height() - frame_insets.height()));
126 }
127 return combined_size;
128 }
129
98 } // namespace 130 } // namespace
99 131
132 // AppWindow::BoundsSpecification
133
134 // static
tapted 2014/03/05 03:14:03 nit: remove - Don't usually see `// static` for da
135 const int AppWindow::BoundsSpecification::kUnspecifiedPosition = INT_MIN;
136
137 AppWindow::BoundsSpecification::BoundsSpecification()
138 : bounds(kUnspecifiedPosition, kUnspecifiedPosition, 0, 0) {}
139
140 void AppWindow::BoundsSpecification::ResetBounds() {
141 bounds.set_x(kUnspecifiedPosition);
tapted 2014/03/05 03:14:03 nit: bounds.SetRect(kUnspecifiedPosition, kUnspeci
142 bounds.set_y(kUnspecifiedPosition);
143 bounds.set_width(0);
144 bounds.set_height(0);
145 }
146
147 AppWindow::BoundsSpecification::~BoundsSpecification() {}
tapted 2014/03/05 03:14:03 nit: move up below constructor
148
149 // AppWindow::CreateParams
150
100 AppWindow::CreateParams::CreateParams() 151 AppWindow::CreateParams::CreateParams()
101 : window_type(AppWindow::WINDOW_TYPE_DEFAULT), 152 : window_type(AppWindow::WINDOW_TYPE_DEFAULT),
102 frame(AppWindow::FRAME_CHROME), 153 frame(AppWindow::FRAME_CHROME),
103 has_frame_color(false), 154 has_frame_color(false),
104 transparent_background(false), 155 transparent_background(false),
105 bounds(INT_MIN, INT_MIN, 0, 0),
106 creator_process_id(0), 156 creator_process_id(0),
107 state(ui::SHOW_STATE_DEFAULT), 157 state(ui::SHOW_STATE_DEFAULT),
108 hidden(false), 158 hidden(false),
109 resizable(true), 159 resizable(true),
110 focused(true), 160 focused(true),
111 always_on_top(false) {} 161 always_on_top(false) {}
112 162
113 AppWindow::CreateParams::~CreateParams() {} 163 AppWindow::CreateParams::~CreateParams() {}
114 164
165 gfx::Rect AppWindow::CreateParams::GetInitialWindowBounds(
166 const gfx::Insets& frame_insets) const {
167 // Combine into a single window bounds.
168 gfx::Rect combined_bounds(window_spec.bounds);
169 if (content_spec.bounds.x() != BoundsSpecification::kUnspecifiedPosition)
170 combined_bounds.set_x(content_spec.bounds.x() - frame_insets.left());
171 if (content_spec.bounds.y() != BoundsSpecification::kUnspecifiedPosition)
172 combined_bounds.set_y(content_spec.bounds.y() - frame_insets.top());
173 if (content_spec.bounds.width() > 0) {
174 combined_bounds.set_width(
175 content_spec.bounds.width() + frame_insets.width());
176 }
177 if (content_spec.bounds.height() > 0) {
178 combined_bounds.set_height(
179 content_spec.bounds.height() + frame_insets.height());
180 }
181
182 // Constrain the bounds.
183 SizeConstraints constraints(
184 GetCombinedWindowConstraints(
185 window_spec.minimum_size, content_spec.minimum_size, frame_insets),
186 GetCombinedWindowConstraints(
187 window_spec.maximum_size, content_spec.maximum_size, frame_insets));
188 combined_bounds.set_size(constraints.ClampSize(combined_bounds.size()));
189
190 return combined_bounds;
191 }
192
193 gfx::Size AppWindow::CreateParams::GetContentMinimumSize(
194 const gfx::Insets& frame_insets) const {
195 return GetCombinedContentConstraints(window_spec.minimum_size,
196 content_spec.minimum_size,
197 frame_insets);
198 }
199
200 gfx::Size AppWindow::CreateParams::GetContentMaximumSize(
201 const gfx::Insets& frame_insets) const {
202 return GetCombinedContentConstraints(window_spec.maximum_size,
203 content_spec.maximum_size,
204 frame_insets);
205 }
206
207 gfx::Size AppWindow::CreateParams::GetWindowMinimumSize(
208 const gfx::Insets& frame_insets) const {
209 return GetCombinedWindowConstraints(window_spec.minimum_size,
210 content_spec.minimum_size,
211 frame_insets);
212 }
213
214 gfx::Size AppWindow::CreateParams::GetWindowMaximumSize(
215 const gfx::Insets& frame_insets) const {
216 return GetCombinedWindowConstraints(window_spec.maximum_size,
217 content_spec.maximum_size,
218 frame_insets);
219 }
220
221 // AppWindow::Delegate
222
115 AppWindow::Delegate::~Delegate() {} 223 AppWindow::Delegate::~Delegate() {}
116 224
225 // AppWindow
226
117 AppWindow::AppWindow(BrowserContext* context, 227 AppWindow::AppWindow(BrowserContext* context,
118 Delegate* delegate, 228 Delegate* delegate,
119 const extensions::Extension* extension) 229 const extensions::Extension* extension)
120 : browser_context_(context), 230 : browser_context_(context),
121 extension_(extension), 231 extension_(extension),
122 extension_id_(extension->id()), 232 extension_id_(extension->id()),
123 window_type_(WINDOW_TYPE_DEFAULT), 233 window_type_(WINDOW_TYPE_DEFAULT),
124 delegate_(delegate), 234 delegate_(delegate),
125 image_loader_ptr_factory_(this), 235 image_loader_ptr_factory_(this),
126 fullscreen_types_(FULLSCREEN_TYPE_NONE), 236 fullscreen_types_(FULLSCREEN_TYPE_NONE),
(...skipping 20 matching lines...) Expand all
147 delegate_->InitWebContents(web_contents); 257 delegate_->InitWebContents(web_contents);
148 WebContentsModalDialogManager::CreateForWebContents(web_contents); 258 WebContentsModalDialogManager::CreateForWebContents(web_contents);
149 extensions::ExtensionWebContentsObserver::CreateForWebContents(web_contents); 259 extensions::ExtensionWebContentsObserver::CreateForWebContents(web_contents);
150 260
151 web_contents->SetDelegate(this); 261 web_contents->SetDelegate(this);
152 WebContentsModalDialogManager::FromWebContents(web_contents) 262 WebContentsModalDialogManager::FromWebContents(web_contents)
153 ->SetDelegate(this); 263 ->SetDelegate(this);
154 extensions::SetViewType(web_contents, extensions::VIEW_TYPE_APP_WINDOW); 264 extensions::SetViewType(web_contents, extensions::VIEW_TYPE_APP_WINDOW);
155 265
156 // Initialize the window 266 // Initialize the window
157 CreateParams new_params = LoadDefaultsAndConstrain(params); 267 CreateParams new_params = LoadDefaults(params);
158 window_type_ = new_params.window_type; 268 window_type_ = new_params.window_type;
159 window_key_ = new_params.window_key; 269 window_key_ = new_params.window_key;
160 270
161 // Windows cannot be always-on-top in fullscreen mode for security reasons. 271 // Windows cannot be always-on-top in fullscreen mode for security reasons.
162 cached_always_on_top_ = new_params.always_on_top; 272 cached_always_on_top_ = new_params.always_on_top;
163 if (new_params.state == ui::SHOW_STATE_FULLSCREEN) 273 if (new_params.state == ui::SHOW_STATE_FULLSCREEN)
164 new_params.always_on_top = false; 274 new_params.always_on_top = false;
165 275
166 native_app_window_.reset(delegate_->CreateNativeAppWindow(this, new_params)); 276 native_app_window_.reset(delegate_->CreateNativeAppWindow(this, new_params));
167 277
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 client->GetOriginalContext(browser_context_))); 311 client->GetOriginalContext(browser_context_)));
202 312
203 app_window_contents_->LoadContents(new_params.creator_process_id); 313 app_window_contents_->LoadContents(new_params.creator_process_id);
204 314
205 if (CommandLine::ForCurrentProcess()->HasSwitch( 315 if (CommandLine::ForCurrentProcess()->HasSwitch(
206 switches::kEnableAppsShowOnFirstPaint)) { 316 switches::kEnableAppsShowOnFirstPaint)) {
207 // We want to show the window only when the content has been painted. For 317 // We want to show the window only when the content has been painted. For
208 // that to happen, we need to define a size for the content, otherwise the 318 // that to happen, we need to define a size for the content, otherwise the
209 // layout will happen in a 0x0 area. 319 // layout will happen in a 0x0 area.
210 // Note: WebContents::GetView() is guaranteed to be non-null. 320 // Note: WebContents::GetView() is guaranteed to be non-null.
211 web_contents->GetView()->SizeContents(new_params.bounds.size()); 321 gfx::Insets frame_insets = native_app_window_->GetFrameInsets();
322 gfx::Rect initial_bounds = new_params.GetInitialWindowBounds(frame_insets);
323 initial_bounds.Inset(frame_insets);
324 web_contents->GetView()->SizeContents(initial_bounds.size());
212 } 325 }
213 326
214 // Prevent the browser process from shutting down while this window is open. 327 // Prevent the browser process from shutting down while this window is open.
215 AppsClient::Get()->IncrementKeepAliveCount(); 328 AppsClient::Get()->IncrementKeepAliveCount();
216 329
217 UpdateExtensionAppIcon(); 330 UpdateExtensionAppIcon();
218 331
219 AppWindowRegistry::Get(browser_context_)->AddAppWindow(this); 332 AppWindowRegistry::Get(browser_context_)->AddAppWindow(this);
220 } 333 }
221 334
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 #endif 625 #endif
513 fullscreen_types_ |= FULLSCREEN_TYPE_OS; 626 fullscreen_types_ |= FULLSCREEN_TYPE_OS;
514 SetNativeWindowFullscreen(); 627 SetNativeWindowFullscreen();
515 } 628 }
516 629
517 void AppWindow::ForcedFullscreen() { 630 void AppWindow::ForcedFullscreen() {
518 fullscreen_types_ |= FULLSCREEN_TYPE_FORCED; 631 fullscreen_types_ |= FULLSCREEN_TYPE_FORCED;
519 SetNativeWindowFullscreen(); 632 SetNativeWindowFullscreen();
520 } 633 }
521 634
522 void AppWindow::SetMinimumSize(const gfx::Size& min_size) { 635 void AppWindow::SetContentMinimumSize(const gfx::Size& min_size) {
523 native_app_window_->SetMinimumSize(min_size); 636 native_app_window_->SetContentMinimumSize(min_size);
524 OnSizeConstraintsChanged(); 637 OnSizeConstraintsChanged();
525 } 638 }
526 639
527 void AppWindow::SetMaximumSize(const gfx::Size& max_size) { 640 void AppWindow::SetContentMaximumSize(const gfx::Size& max_size) {
528 native_app_window_->SetMaximumSize(max_size); 641 native_app_window_->SetContentMaximumSize(max_size);
529 OnSizeConstraintsChanged(); 642 OnSizeConstraintsChanged();
530 } 643 }
531 644
532 void AppWindow::Show(ShowType show_type) { 645 void AppWindow::Show(ShowType show_type) {
533 if (CommandLine::ForCurrentProcess()->HasSwitch( 646 if (CommandLine::ForCurrentProcess()->HasSwitch(
534 switches::kEnableAppsShowOnFirstPaint)) { 647 switches::kEnableAppsShowOnFirstPaint)) {
535 show_on_first_paint_ = true; 648 show_on_first_paint_ = true;
536 649
537 if (!first_paint_complete_) { 650 if (!first_paint_complete_) {
538 delayed_show_type_ = show_type; 651 delayed_show_type_ = show_type;
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 694
582 properties->SetBoolean("fullscreen", 695 properties->SetBoolean("fullscreen",
583 native_app_window_->IsFullscreenOrPending()); 696 native_app_window_->IsFullscreenOrPending());
584 properties->SetBoolean("minimized", native_app_window_->IsMinimized()); 697 properties->SetBoolean("minimized", native_app_window_->IsMinimized());
585 properties->SetBoolean("maximized", native_app_window_->IsMaximized()); 698 properties->SetBoolean("maximized", native_app_window_->IsMaximized());
586 properties->SetBoolean("alwaysOnTop", IsAlwaysOnTop()); 699 properties->SetBoolean("alwaysOnTop", IsAlwaysOnTop());
587 properties->SetBoolean("hasFrameColor", native_app_window_->HasFrameColor()); 700 properties->SetBoolean("hasFrameColor", native_app_window_->HasFrameColor());
588 properties->SetInteger("frameColor", native_app_window_->FrameColor()); 701 properties->SetInteger("frameColor", native_app_window_->FrameColor());
589 702
590 gfx::Rect content_bounds = GetClientBounds(); 703 gfx::Rect content_bounds = GetClientBounds();
704 gfx::Size content_min_size = native_app_window_->GetContentMinimumSize();
705 gfx::Size content_max_size = native_app_window_->GetContentMaximumSize();
591 SetBoundsProperties(content_bounds, 706 SetBoundsProperties(content_bounds,
592 native_app_window_->GetMinimumSize(), 707 content_min_size,
593 native_app_window_->GetMaximumSize(), 708 content_max_size,
594 "innerBounds", 709 "innerBounds",
595 properties); 710 properties);
596 711
597 // TODO(tmdiep): Frame constraints will be implemented in a future patch. 712 gfx::Insets frame_insets = native_app_window_->GetFrameInsets();
598 gfx::Rect frame_bounds = native_app_window_->GetBounds(); 713 gfx::Rect frame_bounds = native_app_window_->GetBounds();
714 gfx::Size frame_min_size =
715 SizeConstraints::InsetConstraints(content_min_size, -frame_insets);
716 gfx::Size frame_max_size =
717 SizeConstraints::InsetConstraints(content_max_size, -frame_insets);
599 SetBoundsProperties(frame_bounds, 718 SetBoundsProperties(frame_bounds,
600 gfx::Size(), 719 frame_min_size,
601 gfx::Size(), 720 frame_max_size,
602 "outerBounds", 721 "outerBounds",
603 properties); 722 properties);
604 } 723 }
605 724
606 //------------------------------------------------------------------------------ 725 //------------------------------------------------------------------------------
607 // Private methods 726 // Private methods
608 727
609 void AppWindow::UpdateBadgeIcon(const gfx::Image& image) { 728 void AppWindow::UpdateBadgeIcon(const gfx::Image& image) {
610 badge_icon_ = image; 729 badge_icon_ = image;
611 native_app_window_->UpdateBadgeIcon(); 730 native_app_window_->UpdateBadgeIcon();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
656 delegate_->PreferredIconSize(), 775 delegate_->PreferredIconSize(),
657 extensions::IconsInfo::GetDefaultAppIcon(), 776 extensions::IconsInfo::GetDefaultAppIcon(),
658 this)); 777 this));
659 778
660 // Triggers actual image loading with 1x resources. The 2x resource will 779 // Triggers actual image loading with 1x resources. The 2x resource will
661 // be handled by IconImage class when requested. 780 // be handled by IconImage class when requested.
662 app_icon_image_->image_skia().GetRepresentation(1.0f); 781 app_icon_image_->image_skia().GetRepresentation(1.0f);
663 } 782 }
664 783
665 void AppWindow::OnSizeConstraintsChanged() { 784 void AppWindow::OnSizeConstraintsChanged() {
666 SizeConstraints size_constraints(native_app_window_->GetMinimumSize(), 785 SizeConstraints size_constraints(native_app_window_->GetContentMinimumSize(),
667 native_app_window_->GetMaximumSize()); 786 native_app_window_->GetContentMaximumSize());
668 gfx::Rect bounds = GetClientBounds(); 787 gfx::Rect bounds = GetClientBounds();
669 gfx::Size constrained_size = size_constraints.ClampSize(bounds.size()); 788 gfx::Size constrained_size = size_constraints.ClampSize(bounds.size());
670 if (bounds.size() != constrained_size) { 789 if (bounds.size() != constrained_size) {
671 bounds.set_size(constrained_size); 790 bounds.set_size(constrained_size);
791 bounds.Inset(-native_app_window_->GetFrameInsets());
tmdiep 2014/03/04 03:13:14 Fixed bug - NativeAppWindow::SetBounds() sets fram
tapted 2014/03/05 03:14:03 Will this shift the origin too? (do we want that?)
tmdiep 2014/03/05 04:29:06 The existing code shifts the origin. With this cha
672 native_app_window_->SetBounds(bounds); 792 native_app_window_->SetBounds(bounds);
673 } 793 }
674 OnNativeWindowChanged(); 794 OnNativeWindowChanged();
675 } 795 }
676 796
677 void AppWindow::SetNativeWindowFullscreen() { 797 void AppWindow::SetNativeWindowFullscreen() {
678 native_app_window_->SetFullscreen(fullscreen_types_); 798 native_app_window_->SetFullscreen(fullscreen_types_);
679 799
680 if (cached_always_on_top_) 800 if (cached_always_on_top_)
681 UpdateNativeAlwaysOnTop(); 801 UpdateNativeAlwaysOnTop();
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 void AppWindow::SaveWindowPosition() { 971 void AppWindow::SaveWindowPosition() {
852 if (window_key_.empty()) 972 if (window_key_.empty())
853 return; 973 return;
854 if (!native_app_window_) 974 if (!native_app_window_)
855 return; 975 return;
856 976
857 AppWindowGeometryCache* cache = 977 AppWindowGeometryCache* cache =
858 AppWindowGeometryCache::Get(browser_context()); 978 AppWindowGeometryCache::Get(browser_context());
859 979
860 gfx::Rect bounds = native_app_window_->GetRestoredBounds(); 980 gfx::Rect bounds = native_app_window_->GetRestoredBounds();
861 bounds.Inset(native_app_window_->GetFrameInsets());
tmdiep 2014/03/04 03:13:14 If we store the content bounds in the window geome
862 gfx::Rect screen_bounds = 981 gfx::Rect screen_bounds =
863 gfx::Screen::GetNativeScreen()->GetDisplayMatching(bounds).work_area(); 982 gfx::Screen::GetNativeScreen()->GetDisplayMatching(bounds).work_area();
864 ui::WindowShowState window_state = native_app_window_->GetRestoredState(); 983 ui::WindowShowState window_state = native_app_window_->GetRestoredState();
865 cache->SaveGeometry( 984 cache->SaveGeometry(
866 extension()->id(), window_key_, bounds, screen_bounds, window_state); 985 extension()->id(), window_key_, bounds, screen_bounds, window_state);
867 } 986 }
868 987
869 void AppWindow::AdjustBoundsToBeVisibleOnScreen( 988 void AppWindow::AdjustBoundsToBeVisibleOnScreen(
870 const gfx::Rect& cached_bounds, 989 const gfx::Rect& cached_bounds,
871 const gfx::Rect& cached_screen_bounds, 990 const gfx::Rect& cached_screen_bounds,
(...skipping 17 matching lines...) Expand all
889 std::max(current_screen_bounds.x(), 1008 std::max(current_screen_bounds.x(),
890 std::min(bounds->x(), 1009 std::min(bounds->x(),
891 current_screen_bounds.right() - bounds->width()))); 1010 current_screen_bounds.right() - bounds->width())));
892 bounds->set_y( 1011 bounds->set_y(
893 std::max(current_screen_bounds.y(), 1012 std::max(current_screen_bounds.y(),
894 std::min(bounds->y(), 1013 std::min(bounds->y(),
895 current_screen_bounds.bottom() - bounds->height()))); 1014 current_screen_bounds.bottom() - bounds->height())));
896 } 1015 }
897 } 1016 }
898 1017
899 AppWindow::CreateParams AppWindow::LoadDefaultsAndConstrain(CreateParams params) 1018 AppWindow::CreateParams AppWindow::LoadDefaults(CreateParams params)
900 const { 1019 const {
901 if (params.bounds.width() == 0) 1020 // Ensure width and height are specified.
902 params.bounds.set_width(kDefaultWidth); 1021 if (params.content_spec.bounds.width() == 0 &&
903 if (params.bounds.height() == 0) 1022 params.window_spec.bounds.width() == 0) {
904 params.bounds.set_height(kDefaultHeight); 1023 params.window_spec.bounds.set_width(kDefaultWidth);
benwells 2014/03/05 02:33:30 I think we should set the default on the content_s
tapted 2014/03/05 03:14:03 should this be setting the content_spec instead of
1024 }
1025 if (params.content_spec.bounds.height() == 0 &&
1026 params.window_spec.bounds.height() == 0) {
1027 params.window_spec.bounds.set_height(kDefaultHeight);
1028 }
905 1029
906 // If left and top are left undefined, the native app window will center 1030 // If left and top are left undefined, the native app window will center
907 // the window on the main screen in a platform-defined manner. 1031 // the window on the main screen in a platform-defined manner.
908 1032
909 // Load cached state if it exists. 1033 // Load cached state if it exists.
910 if (!params.window_key.empty()) { 1034 if (!params.window_key.empty()) {
911 AppWindowGeometryCache* cache = 1035 AppWindowGeometryCache* cache =
912 AppWindowGeometryCache::Get(browser_context()); 1036 AppWindowGeometryCache::Get(browser_context());
913 1037
914 gfx::Rect cached_bounds; 1038 gfx::Rect cached_bounds;
915 gfx::Rect cached_screen_bounds; 1039 gfx::Rect cached_screen_bounds;
916 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT; 1040 ui::WindowShowState cached_state = ui::SHOW_STATE_DEFAULT;
917 if (cache->GetGeometry(extension()->id(), 1041 if (cache->GetGeometry(extension()->id(),
918 params.window_key, 1042 params.window_key,
919 &cached_bounds, 1043 &cached_bounds,
920 &cached_screen_bounds, 1044 &cached_screen_bounds,
921 &cached_state)) { 1045 &cached_state)) {
1046
922 // App window has cached screen bounds, make sure it fits on screen in 1047 // App window has cached screen bounds, make sure it fits on screen in
923 // case the screen resolution changed. 1048 // case the screen resolution changed.
924 gfx::Screen* screen = gfx::Screen::GetNativeScreen(); 1049 gfx::Screen* screen = gfx::Screen::GetNativeScreen();
925 gfx::Display display = screen->GetDisplayMatching(cached_bounds); 1050 gfx::Display display = screen->GetDisplayMatching(cached_bounds);
926 gfx::Rect current_screen_bounds = display.work_area(); 1051 gfx::Rect current_screen_bounds = display.work_area();
1052 SizeConstraints constraints(params.GetWindowMinimumSize(gfx::Insets()),
1053 params.GetWindowMaximumSize(gfx::Insets()));
927 AdjustBoundsToBeVisibleOnScreen(cached_bounds, 1054 AdjustBoundsToBeVisibleOnScreen(cached_bounds,
928 cached_screen_bounds, 1055 cached_screen_bounds,
929 current_screen_bounds, 1056 current_screen_bounds,
930 params.minimum_size, 1057 constraints.GetMinimumSize(),
931 &params.bounds); 1058 &params.window_spec.bounds);
932 params.state = cached_state; 1059 params.state = cached_state;
1060
1061 // Since we are restoring a cached state, reset the content bounds spec to
1062 // ensure it is not used.
1063 params.content_spec.ResetBounds();
933 } 1064 }
934 } 1065 }
935 1066
936 SizeConstraints size_constraints(params.minimum_size, params.maximum_size);
tmdiep 2014/03/04 03:13:14 Because the API lets you specify content or window
937 params.bounds.set_size(size_constraints.ClampSize(params.bounds.size()));
938 params.minimum_size = size_constraints.GetMinimumSize();
939 params.maximum_size = size_constraints.GetMaximumSize();
940
941 return params; 1067 return params;
942 } 1068 }
943 1069
944 // static 1070 // static
945 SkRegion* AppWindow::RawDraggableRegionsToSkRegion( 1071 SkRegion* AppWindow::RawDraggableRegionsToSkRegion(
946 const std::vector<extensions::DraggableRegion>& regions) { 1072 const std::vector<extensions::DraggableRegion>& regions) {
947 SkRegion* sk_region = new SkRegion; 1073 SkRegion* sk_region = new SkRegion;
948 for (std::vector<extensions::DraggableRegion>::const_iterator iter = 1074 for (std::vector<extensions::DraggableRegion>::const_iterator iter =
949 regions.begin(); 1075 regions.begin();
950 iter != regions.end(); 1076 iter != regions.end();
951 ++iter) { 1077 ++iter) {
952 const extensions::DraggableRegion& region = *iter; 1078 const extensions::DraggableRegion& region = *iter;
953 sk_region->op( 1079 sk_region->op(
954 region.bounds.x(), 1080 region.bounds.x(),
955 region.bounds.y(), 1081 region.bounds.y(),
956 region.bounds.right(), 1082 region.bounds.right(),
957 region.bounds.bottom(), 1083 region.bounds.bottom(),
958 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); 1084 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
959 } 1085 }
960 return sk_region; 1086 return sk_region;
961 } 1087 }
962 1088
963 } // namespace apps 1089 } // namespace apps
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698