OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/ui/extensions/shell_window.h" | 5 #include "chrome/browser/ui/extensions/shell_window.h" |
6 | 6 |
7 #include "base/utf_string_conversions.h" | 7 #include "base/utf_string_conversions.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "chrome/browser/extensions/app_window_contents.h" | 9 #include "chrome/browser/extensions/app_window_contents.h" |
10 #include "chrome/browser/extensions/extension_process_manager.h" | 10 #include "chrome/browser/extensions/extension_process_manager.h" |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
66 const int kPreferredIconSize = extension_misc::EXTENSION_ICON_SMALL; | 66 const int kPreferredIconSize = extension_misc::EXTENSION_ICON_SMALL; |
67 #endif | 67 #endif |
68 | 68 |
69 } // namespace | 69 } // namespace |
70 | 70 |
71 ShellWindow::CreateParams::CreateParams() | 71 ShellWindow::CreateParams::CreateParams() |
72 : window_type(ShellWindow::WINDOW_TYPE_DEFAULT), | 72 : window_type(ShellWindow::WINDOW_TYPE_DEFAULT), |
73 frame(ShellWindow::FRAME_CHROME), | 73 frame(ShellWindow::FRAME_CHROME), |
74 transparent_background(false), | 74 transparent_background(false), |
75 bounds(INT_MIN, INT_MIN, 0, 0), | 75 bounds(INT_MIN, INT_MIN, 0, 0), |
76 creator_process_id(0), hidden(false), resizable(true), focused(true) { | 76 creator_process_id(0), |
77 state(STATE_NORMAL), | |
78 hidden(false), | |
79 resizable(true), | |
80 focused(true) { | |
77 } | 81 } |
78 | 82 |
79 ShellWindow::CreateParams::~CreateParams() { | 83 ShellWindow::CreateParams::~CreateParams() { |
80 } | 84 } |
81 | 85 |
82 ShellWindow* ShellWindow::Create(Profile* profile, | 86 ShellWindow* ShellWindow::Create(Profile* profile, |
83 const extensions::Extension* extension, | 87 const extensions::Extension* extension, |
84 const GURL& url, | 88 const GURL& url, |
85 const CreateParams& params) { | 89 const CreateParams& params) { |
86 // This object will delete itself when the window is closed. | 90 // This object will delete itself when the window is closed. |
87 ShellWindow* window = new ShellWindow(profile, extension); | 91 ShellWindow* window = new ShellWindow(profile, extension); |
88 window->Init(url, new AppWindowContents(window), params); | 92 window->Init(url, new AppWindowContents(window), params); |
89 extensions::ShellWindowRegistry::Get(profile)->AddShellWindow(window); | 93 extensions::ShellWindowRegistry::Get(profile)->AddShellWindow(window); |
90 return window; | 94 return window; |
91 } | 95 } |
92 | 96 |
93 ShellWindow::ShellWindow(Profile* profile, | 97 ShellWindow::ShellWindow(Profile* profile, |
94 const extensions::Extension* extension) | 98 const extensions::Extension* extension) |
95 : profile_(profile), | 99 : profile_(profile), |
96 extension_(extension), | 100 extension_(extension), |
97 window_type_(WINDOW_TYPE_DEFAULT), | 101 window_type_(WINDOW_TYPE_DEFAULT), |
98 ALLOW_THIS_IN_INITIALIZER_LIST(image_loader_ptr_factory_(this)) { | 102 ALLOW_THIS_IN_INITIALIZER_LIST(image_loader_ptr_factory_(this)), |
103 fullscreen_for_window_api_(false), | |
104 fullscreen_for_tab_(false) { | |
99 } | 105 } |
100 | 106 |
101 void ShellWindow::Init(const GURL& url, | 107 void ShellWindow::Init(const GURL& url, |
102 ShellWindowContents* shell_window_contents, | 108 ShellWindowContents* shell_window_contents, |
103 const ShellWindow::CreateParams& params) { | 109 const ShellWindow::CreateParams& params) { |
104 // Initialize the render interface and web contents | 110 // Initialize the render interface and web contents |
105 shell_window_contents_.reset(shell_window_contents); | 111 shell_window_contents_.reset(shell_window_contents); |
106 shell_window_contents_->Initialize(profile(), url); | 112 shell_window_contents_->Initialize(profile(), url); |
107 WebContents* web_contents = shell_window_contents_->GetWebContents(); | 113 WebContents* web_contents = shell_window_contents_->GetWebContents(); |
108 WebContentsModalDialogManager::CreateForWebContents(web_contents); | 114 WebContentsModalDialogManager::CreateForWebContents(web_contents); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
156 if (maximum_size.height() && bounds.height() > maximum_size.height()) | 162 if (maximum_size.height() && bounds.height() > maximum_size.height()) |
157 bounds.set_height(maximum_size.height()); | 163 bounds.set_height(maximum_size.height()); |
158 if (bounds.height() != INT_MIN && bounds.height() < minimum_size.height()) | 164 if (bounds.height() != INT_MIN && bounds.height() < minimum_size.height()) |
159 bounds.set_height(minimum_size.height()); | 165 bounds.set_height(minimum_size.height()); |
160 | 166 |
161 new_params.bounds = bounds; | 167 new_params.bounds = bounds; |
162 | 168 |
163 native_app_window_.reset(NativeAppWindow::Create(this, new_params)); | 169 native_app_window_.reset(NativeAppWindow::Create(this, new_params)); |
164 OnNativeWindowChanged(); | 170 OnNativeWindowChanged(); |
165 | 171 |
172 switch (params.state) { | |
173 case CreateParams::STATE_NORMAL: | |
174 break; | |
175 case CreateParams::STATE_FULLSCREEN: | |
176 Fullscreen(); | |
177 break; | |
178 case CreateParams::STATE_MAXIMIZED: | |
179 Maximize(); | |
180 break; | |
181 case CreateParams::STATE_MINIMIZED: | |
182 Minimize(); | |
183 break; | |
184 } | |
jeremya
2013/04/05 20:00:35
default: NOTREACHED()?
Are these all okay to do b
scheib
2013/04/05 21:47:52
Google code style suggests NOT having a default if
jeremya
2013/04/08 17:13:54
I hope nobody ever upcasts an int into that enum,
| |
185 | |
166 if (!params.hidden) { | 186 if (!params.hidden) { |
167 if (window_type_is_panel()) | 187 if (window_type_is_panel()) |
168 GetBaseWindow()->ShowInactive(); // Panels are not activated by default. | 188 GetBaseWindow()->ShowInactive(); // Panels are not activated by default. |
169 else | 189 else |
170 GetBaseWindow()->Show(); | 190 GetBaseWindow()->Show(); |
171 } | 191 } |
172 | 192 |
173 // When the render view host is changed, the native window needs to know | 193 // When the render view host is changed, the native window needs to know |
174 // about it in case it has any setup to do to make the renderer appear | 194 // about it in case it has any setup to do to make the renderer appear |
175 // properly. In particular, on Windows, the view's clickthrough region needs | 195 // properly. In particular, on Windows, the view's clickthrough region needs |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
373 } | 393 } |
374 | 394 |
375 void ShellWindow::UpdateAppIcon(const gfx::Image& image) { | 395 void ShellWindow::UpdateAppIcon(const gfx::Image& image) { |
376 if (image.IsEmpty()) | 396 if (image.IsEmpty()) |
377 return; | 397 return; |
378 app_icon_ = image; | 398 app_icon_ = image; |
379 native_app_window_->UpdateWindowIcon(); | 399 native_app_window_->UpdateWindowIcon(); |
380 extensions::ShellWindowRegistry::Get(profile_)->ShellWindowIconChanged(this); | 400 extensions::ShellWindowRegistry::Get(profile_)->ShellWindowIconChanged(this); |
381 } | 401 } |
382 | 402 |
403 void ShellWindow::Fullscreen() { | |
404 fullscreen_for_window_api_ = true; | |
405 GetBaseWindow()->SetFullscreen(true); | |
406 } | |
407 | |
408 void ShellWindow::Maximize() { | |
409 GetBaseWindow()->Maximize(); | |
410 } | |
411 | |
412 void ShellWindow::Minimize() { | |
413 GetBaseWindow()->Minimize(); | |
414 } | |
415 | |
416 void ShellWindow::Restore() { | |
417 fullscreen_for_window_api_ = false; | |
418 fullscreen_for_tab_ = false; | |
419 if (GetBaseWindow()->IsFullscreenOrPending()) { | |
420 GetBaseWindow()->SetFullscreen(false); | |
421 } else { | |
422 GetBaseWindow()->Restore(); | |
423 } | |
424 } | |
425 | |
383 //------------------------------------------------------------------------------ | 426 //------------------------------------------------------------------------------ |
384 // Private methods | 427 // Private methods |
385 | 428 |
386 void ShellWindow::OnImageLoaded(const gfx::Image& image) { | 429 void ShellWindow::OnImageLoaded(const gfx::Image& image) { |
387 UpdateAppIcon(image); | 430 UpdateAppIcon(image); |
388 } | 431 } |
389 | 432 |
390 void ShellWindow::DidDownloadFavicon(int id, | 433 void ShellWindow::DidDownloadFavicon(int id, |
391 const GURL& image_url, | 434 const GURL& image_url, |
392 int requested_size, | 435 int requested_size, |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
446 void ShellWindow::NavigationStateChanged( | 489 void ShellWindow::NavigationStateChanged( |
447 const content::WebContents* source, unsigned changed_flags) { | 490 const content::WebContents* source, unsigned changed_flags) { |
448 if (changed_flags & content::INVALIDATE_TYPE_TITLE) | 491 if (changed_flags & content::INVALIDATE_TYPE_TITLE) |
449 native_app_window_->UpdateWindowTitle(); | 492 native_app_window_->UpdateWindowTitle(); |
450 else if (changed_flags & content::INVALIDATE_TYPE_TAB) | 493 else if (changed_flags & content::INVALIDATE_TYPE_TAB) |
451 native_app_window_->UpdateWindowIcon(); | 494 native_app_window_->UpdateWindowIcon(); |
452 } | 495 } |
453 | 496 |
454 void ShellWindow::ToggleFullscreenModeForTab(content::WebContents* source, | 497 void ShellWindow::ToggleFullscreenModeForTab(content::WebContents* source, |
455 bool enter_fullscreen) { | 498 bool enter_fullscreen) { |
456 bool has_permission = IsExtensionWithPermissionOrSuggestInConsole( | 499 if (!IsExtensionWithPermissionOrSuggestInConsole( |
457 APIPermission::kFullscreen, | 500 APIPermission::kFullscreen, |
458 extension_, | 501 extension_, |
459 source->GetRenderViewHost()); | 502 source->GetRenderViewHost())) { |
503 return; | |
504 } | |
460 | 505 |
461 if (has_permission) | 506 fullscreen_for_tab_ = enter_fullscreen; |
462 native_app_window_->SetFullscreen(enter_fullscreen); | 507 |
508 if (enter_fullscreen) { | |
509 native_app_window_->SetFullscreen(true); | |
510 } else if (!fullscreen_for_window_api_) { | |
jeremya
2013/04/05 20:00:35
fdsdsffasafdsf.
There must be a better way :(
scheib
2013/04/05 21:47:52
I haven't thought of it. We can fold these two var
jeremya
2013/04/08 17:13:54
I guess there's no way to combine it all into one
| |
511 native_app_window_->SetFullscreen(false); | |
512 } | |
463 } | 513 } |
464 | 514 |
465 bool ShellWindow::IsFullscreenForTabOrPending( | 515 bool ShellWindow::IsFullscreenForTabOrPending( |
466 const content::WebContents* source) const { | 516 const content::WebContents* source) const { |
467 return native_app_window_->IsFullscreenOrPending(); | 517 return fullscreen_for_tab_; |
468 } | 518 } |
469 | 519 |
470 void ShellWindow::Observe(int type, | 520 void ShellWindow::Observe(int type, |
471 const content::NotificationSource& source, | 521 const content::NotificationSource& source, |
472 const content::NotificationDetails& details) { | 522 const content::NotificationDetails& details) { |
473 switch (type) { | 523 switch (type) { |
474 case content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED: { | 524 case content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED: { |
475 // TODO(jianli): once http://crbug.com/123007 is fixed, we'll no longer | 525 // TODO(jianli): once http://crbug.com/123007 is fixed, we'll no longer |
476 // need to make the native window (ShellWindowViews specially) update | 526 // need to make the native window (ShellWindowViews specially) update |
477 // the clickthrough region for the new RVH. | 527 // the clickthrough region for the new RVH. |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
532 const extensions::DraggableRegion& region = *iter; | 582 const extensions::DraggableRegion& region = *iter; |
533 sk_region->op( | 583 sk_region->op( |
534 region.bounds.x(), | 584 region.bounds.x(), |
535 region.bounds.y(), | 585 region.bounds.y(), |
536 region.bounds.right(), | 586 region.bounds.right(), |
537 region.bounds.bottom(), | 587 region.bounds.bottom(), |
538 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); | 588 region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op); |
539 } | 589 } |
540 return sk_region; | 590 return sk_region; |
541 } | 591 } |
OLD | NEW |