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

Side by Side Diff: chrome/browser/ui/fullscreen_controller.cc

Issue 10378061: Exit tabbed fullscreen mode on navigation. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: add comment Created 8 years, 6 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 | Annotate | Revision Log
OLDNEW
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_controller.h" 5 #include "chrome/browser/ui/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.h" 9 #include "base/message_loop.h"
10 #include "chrome/browser/content_settings/host_content_settings_map.h" 10 #include "chrome/browser/content_settings/host_content_settings_map.h"
11 #include "chrome/browser/download/download_shelf.h" 11 #include "chrome/browser/download/download_shelf.h"
12 #include "chrome/browser/profiles/profile.h" 12 #include "chrome/browser/profiles/profile.h"
13 #include "chrome/browser/ui/browser.h" 13 #include "chrome/browser/ui/browser.h"
14 #include "chrome/browser/ui/browser_window.h" 14 #include "chrome/browser/ui/browser_window.h"
15 #include "chrome/browser/ui/tab_contents/tab_contents.h" 15 #include "chrome/browser/ui/tab_contents/tab_contents.h"
16 #include "chrome/common/chrome_notification_types.h" 16 #include "chrome/common/chrome_notification_types.h"
17 #include "chrome/common/chrome_switches.h" 17 #include "chrome/common/chrome_switches.h"
18 #include "chrome/common/extensions/extension.h" 18 #include "chrome/common/extensions/extension.h"
19 #include "content/public/browser/navigation_details.h"
20 #include "content/public/browser/navigation_entry.h"
19 #include "content/public/browser/notification_service.h" 21 #include "content/public/browser/notification_service.h"
20 #include "content/public/browser/render_view_host.h" 22 #include "content/public/browser/render_view_host.h"
21 #include "content/public/browser/render_widget_host_view.h" 23 #include "content/public/browser/render_widget_host_view.h"
22 #include "content/public/browser/user_metrics.h" 24 #include "content/public/browser/user_metrics.h"
23 #include "content/public/browser/web_contents.h" 25 #include "content/public/browser/web_contents.h"
24 26
25 using content::RenderViewHost; 27 using content::RenderViewHost;
26 using content::UserMetricsAction; 28 using content::UserMetricsAction;
27 using content::WebContents; 29 using content::WebContents;
28 30
29 FullscreenController::FullscreenController(BrowserWindow* window, 31 FullscreenController::FullscreenController(BrowserWindow* window,
30 Profile* profile, 32 Profile* profile,
31 Browser* browser) 33 Browser* browser)
32 : window_(window), 34 : window_(window),
33 profile_(profile), 35 profile_(profile),
34 browser_(browser), 36 browser_(browser),
35 fullscreened_tab_(NULL), 37 fullscreened_tab_(NULL),
36 tab_caused_fullscreen_(false), 38 tab_caused_fullscreen_(false),
37 tab_fullscreen_accepted_(false), 39 tab_fullscreen_accepted_(false),
38 toggled_into_fullscreen_(false), 40 toggled_into_fullscreen_(false),
39 mouse_lock_tab_(NULL), 41 mouse_lock_tab_(NULL),
40 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED) { 42 mouse_lock_state_(MOUSELOCK_NOT_REQUESTED),
43 cancel_fullscreen_on_navigate_mode_(false) {
44 }
45
46 void FullscreenController::Observe(int type,
47 const content::NotificationSource& source,
48 const content::NotificationDetails& details) {
49 switch (type) {
50 case content::NOTIFICATION_NAV_ENTRY_COMMITTED:
51 if (content::Details<content::LoadCommittedDetails>(details)->
52 is_navigation_to_different_page()) {
53 ExitTabFullscreenOrMouseLockIfNecessary();
54 }
55 break;
56
57 default:
58 NOTREACHED() << "Got a notification we didn't register for.";
59 }
41 } 60 }
42 61
43 bool FullscreenController::IsFullscreenForBrowser() const { 62 bool FullscreenController::IsFullscreenForBrowser() const {
44 return window_->IsFullscreen() && !tab_caused_fullscreen_; 63 return window_->IsFullscreen() && !tab_caused_fullscreen_;
45 } 64 }
46 65
47 bool FullscreenController::IsFullscreenForTabOrPending() const { 66 bool FullscreenController::IsFullscreenForTabOrPending() const {
48 return fullscreened_tab_ != NULL; 67 return fullscreened_tab_ != NULL;
49 } 68 }
50 69
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 return; 150 return;
132 151
133 bool in_browser_or_tab_fullscreen_mode; 152 bool in_browser_or_tab_fullscreen_mode;
134 #if defined(OS_MACOSX) 153 #if defined(OS_MACOSX)
135 in_browser_or_tab_fullscreen_mode = window_->InPresentationMode(); 154 in_browser_or_tab_fullscreen_mode = window_->InPresentationMode();
136 #else 155 #else
137 in_browser_or_tab_fullscreen_mode = window_->IsFullscreen(); 156 in_browser_or_tab_fullscreen_mode = window_->IsFullscreen();
138 #endif 157 #endif
139 158
140 if (enter_fullscreen) { 159 if (enter_fullscreen) {
141 fullscreened_tab_ = TabContents::FromWebContents(web_contents); 160 fullscreened_tab_ = TabContents::FromWebContents(web_contents);
sky 2012/06/15 15:01:08 Do we know when we get here fullscreened_tab_ is a
koz (OOO until 15th September) 2012/06/18 02:28:10 I'm not sure. scheib, or yzshen would probably be
scheib 2012/06/18 03:58:09 As far as I can tell by inspection last Friday: I
142 if (!in_browser_or_tab_fullscreen_mode) { 161 if (!in_browser_or_tab_fullscreen_mode) {
162 EnterCancelFullscreenOnNavigateMode();
143 tab_caused_fullscreen_ = true; 163 tab_caused_fullscreen_ = true;
144 #if defined(OS_MACOSX) 164 #if defined(OS_MACOSX)
145 TogglePresentationModeInternal(true); 165 TogglePresentationModeInternal(true);
146 #else 166 #else
147 ToggleFullscreenModeInternal(true); 167 ToggleFullscreenModeInternal(true);
148 #endif 168 #endif
149 } else { 169 } else {
170 ExitCancelFullscreenOnNavigateMode();
scheib 2012/06/15 16:12:31 Are you certain that we only want to be in CancelF
koz (OOO until 15th September) 2012/06/18 02:28:10 Ah yes, good point. Wouldn't I want to move the Ex
scheib 2012/06/18 03:58:09 Line 180 sounds right -- mis-reading of the } else
150 // We need to update the fullscreen exit bubble, e.g., going from browser 171 // We need to update the fullscreen exit bubble, e.g., going from browser
151 // fullscreen to tab fullscreen will need to show different content. 172 // fullscreen to tab fullscreen will need to show different content.
152 const GURL& url = web_contents->GetURL(); 173 const GURL& url = web_contents->GetURL();
153 if (!tab_fullscreen_accepted_) { 174 if (!tab_fullscreen_accepted_) {
154 tab_fullscreen_accepted_ = 175 tab_fullscreen_accepted_ =
155 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW; 176 GetFullscreenSetting(url) == CONTENT_SETTING_ALLOW;
156 } 177 }
157 UpdateFullscreenExitBubbleContent(); 178 UpdateFullscreenExitBubbleContent();
158 } 179 }
159 } else { 180 } else {
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 return true; 347 return true;
327 } 348 }
328 349
329 return false; 350 return false;
330 } 351 }
331 352
332 FullscreenController::~FullscreenController() {} 353 FullscreenController::~FullscreenController() {}
333 354
334 void FullscreenController::NotifyTabOfExitIfNecessary() { 355 void FullscreenController::NotifyTabOfExitIfNecessary() {
335 if (fullscreened_tab_) { 356 if (fullscreened_tab_) {
357 ExitCancelFullscreenOnNavigateMode();
336 RenderViewHost* rvh = 358 RenderViewHost* rvh =
337 fullscreened_tab_->web_contents()->GetRenderViewHost(); 359 fullscreened_tab_->web_contents()->GetRenderViewHost();
338 fullscreened_tab_ = NULL; 360 fullscreened_tab_ = NULL;
339 tab_caused_fullscreen_ = false; 361 tab_caused_fullscreen_ = false;
340 tab_fullscreen_accepted_ = false; 362 tab_fullscreen_accepted_ = false;
341 if (rvh) 363 if (rvh)
342 rvh->ExitFullscreen(); 364 rvh->ExitFullscreen();
343 } 365 }
344 366
345 if (mouse_lock_tab_) { 367 if (mouse_lock_tab_) {
346 WebContents* web_contents = mouse_lock_tab_->web_contents(); 368 WebContents* web_contents = mouse_lock_tab_->web_contents();
347 if (IsMouseLockRequested()) { 369 if (IsMouseLockRequested()) {
348 web_contents->GotResponseToLockMouseRequest(false); 370 web_contents->GotResponseToLockMouseRequest(false);
349 } else if (web_contents->GetRenderViewHost() && 371 } else if (web_contents->GetRenderViewHost() &&
350 web_contents->GetRenderViewHost()->GetView()) { 372 web_contents->GetRenderViewHost()->GetView()) {
351 web_contents->GetRenderViewHost()->GetView()->UnlockMouse(); 373 web_contents->GetRenderViewHost()->GetView()->UnlockMouse();
352 } 374 }
353 mouse_lock_tab_ = NULL; 375 mouse_lock_tab_ = NULL;
354 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED; 376 mouse_lock_state_ = MOUSELOCK_NOT_REQUESTED;
355 } 377 }
356 378
357 UpdateFullscreenExitBubbleContent(); 379 UpdateFullscreenExitBubbleContent();
358 } 380 }
359 381
382 void FullscreenController::EnterCancelFullscreenOnNavigateMode() {
383 if (cancel_fullscreen_on_navigate_mode_)
384 return;
385 cancel_fullscreen_on_navigate_mode_ = true;
386 registrar_.Add(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
387 content::Source<content::NavigationController>(
388 &fullscreened_tab_->web_contents()->GetController()));
389 }
390
391 void FullscreenController::ExitCancelFullscreenOnNavigateMode() {
392 if (!cancel_fullscreen_on_navigate_mode_)
393 return;
394 cancel_fullscreen_on_navigate_mode_ = false;
395 registrar_.Remove(this, content::NOTIFICATION_NAV_ENTRY_COMMITTED,
sky 2012/06/15 15:01:08 I think you should removeall here. Less error pron
koz (OOO until 15th September) 2012/06/18 02:28:10 Done.
396 content::Source<content::NavigationController>(
397 &fullscreened_tab_->web_contents()->GetController()));
398 }
399
400
360 void FullscreenController::ExitTabFullscreenOrMouseLockIfNecessary() { 401 void FullscreenController::ExitTabFullscreenOrMouseLockIfNecessary() {
361 if (tab_caused_fullscreen_) 402 if (tab_caused_fullscreen_)
362 ToggleFullscreenMode(); 403 ToggleFullscreenMode();
363 else 404 else
364 NotifyTabOfExitIfNecessary(); 405 NotifyTabOfExitIfNecessary();
365 } 406 }
366 407
367 void FullscreenController::UpdateFullscreenExitBubbleContent() { 408 void FullscreenController::UpdateFullscreenExitBubbleContent() {
368 GURL url; 409 GURL url;
369 if (fullscreened_tab_) 410 if (fullscreened_tab_)
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 window_->ExitFullscreen(); 559 window_->ExitFullscreen();
519 extension_caused_fullscreen_ = GURL(); 560 extension_caused_fullscreen_ = GURL();
520 } 561 }
521 UpdateFullscreenExitBubbleContent(); 562 UpdateFullscreenExitBubbleContent();
522 563
523 // Once the window has become fullscreen it'll call back to 564 // Once the window has become fullscreen it'll call back to
524 // WindowFullscreenStateChanged(). We don't do this immediately as 565 // WindowFullscreenStateChanged(). We don't do this immediately as
525 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let 566 // BrowserWindow::EnterFullscreen() asks for bookmark_bar_state_, so we let
526 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate. 567 // the BrowserWindow invoke WindowFullscreenStateChanged when appropriate.
527 } 568 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698