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/fullscreen/fullscreen_controller.h" | 5 #include "chrome/browser/ui/fullscreen/fullscreen_controller.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "chrome/browser/app_mode/app_mode_utils.h" | 10 #include "chrome/browser/app_mode/app_mode_utils.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 | 40 |
41 FullscreenController::FullscreenController(Browser* browser) | 41 FullscreenController::FullscreenController(Browser* browser) |
42 : browser_(browser), | 42 : browser_(browser), |
43 window_(browser->window()), | 43 window_(browser->window()), |
44 profile_(browser->profile()), | 44 profile_(browser->profile()), |
45 fullscreened_tab_(NULL), | 45 fullscreened_tab_(NULL), |
46 state_prior_to_tab_fullscreen_(STATE_INVALID), | 46 state_prior_to_tab_fullscreen_(STATE_INVALID), |
47 tab_fullscreen_accepted_(false), | 47 tab_fullscreen_accepted_(false), |
48 toggled_into_fullscreen_(false), | 48 toggled_into_fullscreen_(false), |
49 mouse_lock_tab_(NULL), | 49 mouse_lock_tab_(NULL), |
| 50 is_presentation_browser_fullscreen(false), |
50 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED), | 51 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED), |
51 reentrant_window_state_change_call_check_(false), | 52 reentrant_window_state_change_call_check_(false), |
52 is_privileged_fullscreen_for_testing_(false), | 53 is_privileged_fullscreen_for_testing_(false), |
53 ptr_factory_(this) { | 54 ptr_factory_(this) { |
54 DCHECK(window_); | 55 DCHECK(window_); |
55 DCHECK(profile_); | 56 DCHECK(profile_); |
56 } | 57 } |
57 | 58 |
58 FullscreenController::~FullscreenController() { | 59 FullscreenController::~FullscreenController() { |
59 } | 60 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
160 NotifyTabOfExitIfNecessary(); | 161 NotifyTabOfExitIfNecessary(); |
161 | 162 |
162 // This is only a change between Browser and Tab fullscreen. We generate | 163 // This is only a change between Browser and Tab fullscreen. We generate |
163 // a fullscreen notification now because there is no window change. | 164 // a fullscreen notification now because there is no window change. |
164 PostFullscreenChangeNotification(true); | 165 PostFullscreenChangeNotification(true); |
165 } | 166 } |
166 } | 167 } |
167 } | 168 } |
168 } | 169 } |
169 | 170 |
| 171 void FullscreenController::TogglePresentationMode() { |
| 172 extension_caused_fullscreen_ = GURL(); |
| 173 ToggleFullscreenModeInternal(PRESENTATION); |
| 174 } |
| 175 |
| 176 bool FullscreenController::IsPresentationFullscreen() { |
| 177 return is_presentation_browser_fullscreen; |
| 178 } |
| 179 |
170 void FullscreenController::ToggleFullscreenModeWithExtension( | 180 void FullscreenController::ToggleFullscreenModeWithExtension( |
171 const GURL& extension_url) { | 181 const GURL& extension_url) { |
172 // |extension_caused_fullscreen_| will be reset if this causes fullscreen to | 182 // |extension_caused_fullscreen_| will be reset if this causes fullscreen to |
173 // exit. | 183 // exit. |
174 extension_caused_fullscreen_ = extension_url; | 184 extension_caused_fullscreen_ = extension_url; |
175 ToggleFullscreenModeInternal(BROWSER); | 185 ToggleFullscreenModeInternal(BROWSER); |
176 } | 186 } |
177 | 187 |
178 bool FullscreenController::IsInMetroSnapMode() { | 188 bool FullscreenController::IsInMetroSnapMode() { |
179 #if defined(OS_WIN) | 189 #if defined(OS_WIN) |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 } | 315 } |
306 } | 316 } |
307 | 317 |
308 bool FullscreenController::HandleUserPressedEscape() { | 318 bool FullscreenController::HandleUserPressedEscape() { |
309 if (IsFullscreenForTabOrPending() || | 319 if (IsFullscreenForTabOrPending() || |
310 IsMouseLocked() || IsMouseLockRequested()) { | 320 IsMouseLocked() || IsMouseLockRequested()) { |
311 ExitTabFullscreenOrMouseLockIfNecessary(); | 321 ExitTabFullscreenOrMouseLockIfNecessary(); |
312 return true; | 322 return true; |
313 } | 323 } |
314 | 324 |
| 325 if (IsPresentationFullscreen()) { |
| 326 ExitFullscreenModeInternal(); |
| 327 return true; |
| 328 } |
| 329 |
315 return false; | 330 return false; |
316 } | 331 } |
317 | 332 |
318 void FullscreenController::ExitTabOrBrowserFullscreenToPreviousState() { | 333 void FullscreenController::ExitTabOrBrowserFullscreenToPreviousState() { |
319 if (IsFullscreenForTabOrPending()) | 334 if (IsFullscreenForTabOrPending()) |
320 ExitTabFullscreenOrMouseLockIfNecessary(); | 335 ExitTabFullscreenOrMouseLockIfNecessary(); |
321 else if (IsFullscreenForBrowser()) | 336 else if (IsFullscreenForBrowser()) |
322 ExitFullscreenModeInternal(); | 337 ExitFullscreenModeInternal(); |
323 } | 338 } |
324 | 339 |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
457 } | 472 } |
458 } | 473 } |
459 } else { // Not tab full screen. | 474 } else { // Not tab full screen. |
460 if (IsMouseLocked()) { | 475 if (IsMouseLocked()) { |
461 return FEB_TYPE_MOUSELOCK_EXIT_INSTRUCTION; | 476 return FEB_TYPE_MOUSELOCK_EXIT_INSTRUCTION; |
462 } else if (IsMouseLockRequested()) { | 477 } else if (IsMouseLockRequested()) { |
463 return FEB_TYPE_MOUSELOCK_BUTTONS; | 478 return FEB_TYPE_MOUSELOCK_BUTTONS; |
464 } else { | 479 } else { |
465 if (!extension_caused_fullscreen_.is_empty()) { | 480 if (!extension_caused_fullscreen_.is_empty()) { |
466 return FEB_TYPE_BROWSER_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION; | 481 return FEB_TYPE_BROWSER_EXTENSION_FULLSCREEN_EXIT_INSTRUCTION; |
467 } else if (toggled_into_fullscreen_ && !app_mode) { | 482 } else if (toggled_into_fullscreen_ && !app_mode && |
| 483 !is_presentation_browser_fullscreen) { |
468 return FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION; | 484 return FEB_TYPE_BROWSER_FULLSCREEN_EXIT_INSTRUCTION; |
| 485 } else if (is_presentation_browser_fullscreen) { |
| 486 return FEB_TYPE_PRESENTATION_FULLSCREEN_EXIT_INSTRUCTION; |
469 } else { | 487 } else { |
470 return FEB_TYPE_NONE; | 488 return FEB_TYPE_NONE; |
471 } | 489 } |
472 } | 490 } |
473 } | 491 } |
474 NOTREACHED(); | 492 NOTREACHED(); |
475 return FEB_TYPE_NONE; | 493 return FEB_TYPE_NONE; |
476 } | 494 } |
477 | 495 |
478 void FullscreenController::UpdateNotificationRegistrations() { | 496 void FullscreenController::UpdateNotificationRegistrations() { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 GURL url; | 601 GURL url; |
584 if (option == TAB) { | 602 if (option == TAB) { |
585 url = browser_->tab_strip_model()->GetActiveWebContents()->GetURL(); | 603 url = browser_->tab_strip_model()->GetActiveWebContents()->GetURL(); |
586 tab_fullscreen_accepted_ = | 604 tab_fullscreen_accepted_ = |
587 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; | 605 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; |
588 } else { | 606 } else { |
589 if (!extension_caused_fullscreen_.is_empty()) | 607 if (!extension_caused_fullscreen_.is_empty()) |
590 url = extension_caused_fullscreen_; | 608 url = extension_caused_fullscreen_; |
591 } | 609 } |
592 | 610 |
593 if (option == BROWSER) | 611 if (option == BROWSER || option == PRESENTATION) |
594 content::RecordAction(UserMetricsAction("ToggleFullscreen")); | 612 content::RecordAction(UserMetricsAction("ToggleFullscreen")); |
595 // TODO(scheib): Record metrics for WITH_CHROME, without counting transitions | 613 // TODO(scheib): Record metrics for WITH_CHROME, without counting transitions |
596 // from tab fullscreen out to browser with chrome. | 614 // from tab fullscreen out to browser with chrome. |
597 | 615 |
598 #if defined(OS_MACOSX) | 616 #if defined(OS_MACOSX) |
599 if (option == BROWSER_WITH_CHROME) { | 617 if (option == BROWSER_WITH_CHROME) { |
600 CHECK(chrome::mac::SupportsSystemFullscreen()); | 618 CHECK(chrome::mac::SupportsSystemFullscreen()); |
601 window_->EnterFullscreenWithChrome(); | 619 window_->EnterFullscreenWithChrome(); |
602 } else { | 620 } else { |
603 #else | 621 #else |
604 { | 622 { |
605 #endif | 623 #endif |
| 624 |
| 625 if (option == PRESENTATION) |
| 626 is_presentation_browser_fullscreen = true; |
| 627 |
606 window_->EnterFullscreen(url, GetFullscreenExitBubbleType()); | 628 window_->EnterFullscreen(url, GetFullscreenExitBubbleType()); |
607 } | 629 } |
608 | 630 |
609 UpdateFullscreenExitBubbleContent(); | 631 UpdateFullscreenExitBubbleContent(); |
610 | 632 |
611 // Once the window has become fullscreen it'll call back to | 633 // Once the window has become fullscreen it'll call back to |
612 // WindowFullscreenStateChanged(). We don't do this immediately as | 634 // WindowFullscreenStateChanged(). We don't do this immediately as |
613 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let | 635 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let |
614 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate. | 636 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate. |
615 } | 637 } |
616 | 638 |
617 void FullscreenController::ExitFullscreenModeInternal() { | 639 void FullscreenController::ExitFullscreenModeInternal() { |
618 toggled_into_fullscreen_ = false; | 640 toggled_into_fullscreen_ = false; |
619 #if defined(OS_MACOSX) | 641 #if defined(OS_MACOSX) |
620 // Mac windows report a state change instantly, and so we must also clear | 642 // Mac windows report a state change instantly, and so we must also clear |
621 // state_prior_to_tab_fullscreen_ to match them else other logic using | 643 // state_prior_to_tab_fullscreen_ to match them else other logic using |
622 // state_prior_to_tab_fullscreen_ will be incorrect. | 644 // state_prior_to_tab_fullscreen_ will be incorrect. |
623 NotifyTabOfExitIfNecessary(); | 645 NotifyTabOfExitIfNecessary(); |
624 #endif | 646 #endif |
625 window_->ExitFullscreen(); | 647 if (is_presentation_browser_fullscreen) |
| 648 window_->Close(); |
| 649 else |
| 650 window_->ExitFullscreen(); |
626 extension_caused_fullscreen_ = GURL(); | 651 extension_caused_fullscreen_ = GURL(); |
| 652 is_presentation_browser_fullscreen = false; |
627 | 653 |
628 UpdateFullscreenExitBubbleContent(); | 654 UpdateFullscreenExitBubbleContent(); |
629 } | 655 } |
630 | 656 |
631 void FullscreenController::SetFullscreenedTab(WebContents* tab) { | 657 void FullscreenController::SetFullscreenedTab(WebContents* tab) { |
632 fullscreened_tab_ = tab; | 658 fullscreened_tab_ = tab; |
633 UpdateNotificationRegistrations(); | 659 UpdateNotificationRegistrations(); |
634 } | 660 } |
635 | 661 |
636 void FullscreenController::SetMouseLockTab(WebContents* tab) { | 662 void FullscreenController::SetMouseLockTab(WebContents* tab) { |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
696 (fullscreened_tab_ == mouse_lock_tab_ && IsPrivilegedFullscreenForTab()) ? | 722 (fullscreened_tab_ == mouse_lock_tab_ && IsPrivilegedFullscreenForTab()) ? |
697 mouse_lock_tab_->GetFullscreenRenderWidgetHostView() : NULL; | 723 mouse_lock_tab_->GetFullscreenRenderWidgetHostView() : NULL; |
698 if (!mouse_lock_view) { | 724 if (!mouse_lock_view) { |
699 RenderViewHost* const rvh = mouse_lock_tab_->GetRenderViewHost(); | 725 RenderViewHost* const rvh = mouse_lock_tab_->GetRenderViewHost(); |
700 if (rvh) | 726 if (rvh) |
701 mouse_lock_view = rvh->GetView(); | 727 mouse_lock_view = rvh->GetView(); |
702 } | 728 } |
703 if (mouse_lock_view) | 729 if (mouse_lock_view) |
704 mouse_lock_view->UnlockMouse(); | 730 mouse_lock_view->UnlockMouse(); |
705 } | 731 } |
OLD | NEW |