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

Side by Side Diff: content/browser/web_contents/web_contents_view_aura.cc

Issue 153913004: gesture-nav: Use a WebContentsObserver to more reliably dismiss the navigation overlay. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 10 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
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "content/browser/web_contents/web_contents_view_aura.h" 5 #include "content/browser/web_contents/web_contents_view_aura.h"
6 6
7 #include "base/auto_reset.h" 7 #include "base/auto_reset.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/file_util.h" 9 #include "base/file_util.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 DISALLOW_COPY_AND_ASSIGN(ImageLayerDelegate); 485 DISALLOW_COPY_AND_ASSIGN(ImageLayerDelegate);
486 }; 486 };
487 487
488 } // namespace 488 } // namespace
489 489
490 // When a history navigation is triggered at the end of an overscroll 490 // When a history navigation is triggered at the end of an overscroll
491 // navigation, it is necessary to show the history-screenshot until the page is 491 // navigation, it is necessary to show the history-screenshot until the page is
492 // done navigating and painting. This class accomplishes this by showing the 492 // done navigating and painting. This class accomplishes this by showing the
493 // screenshot window on top of the page until the page has completed loading and 493 // screenshot window on top of the page until the page has completed loading and
494 // painting. 494 // painting.
495 class OverscrollNavigationOverlay : 495 class OverscrollNavigationOverlay : public WebContentsObserver,
496 public RenderWidgetHostViewAura::PaintObserver, 496 public WindowSlider::Delegate {
497 public WindowSlider::Delegate {
498 public: 497 public:
499 explicit OverscrollNavigationOverlay(WebContentsImpl* web_contents) 498 explicit OverscrollNavigationOverlay(WebContentsImpl* web_contents)
500 : web_contents_(web_contents), 499 : web_contents_(web_contents),
501 image_delegate_(NULL), 500 image_delegate_(NULL),
502 view_(NULL),
503 loading_complete_(false), 501 loading_complete_(false),
504 received_paint_update_(false), 502 received_paint_update_(false),
505 compositor_updated_(false),
506 slide_direction_(SLIDE_UNKNOWN), 503 slide_direction_(SLIDE_UNKNOWN),
507 need_paint_update_(true) { 504 need_paint_update_(true) {
508 } 505 }
509 506
510 virtual ~OverscrollNavigationOverlay() { 507 virtual ~OverscrollNavigationOverlay() {
511 if (view_)
512 view_->set_paint_observer(NULL);
513 } 508 }
514 509
515 bool has_window() const { return !!window_.get(); } 510 bool has_window() const { return !!window_.get(); }
516 511
517 void StartObservingView(RenderWidgetHostViewAura* view) { 512 void StartObserving() {
518 if (view_)
519 view_->set_paint_observer(NULL);
520
521 loading_complete_ = false; 513 loading_complete_ = false;
522 received_paint_update_ = false; 514 received_paint_update_ = false;
523 compositor_updated_ = false; 515 Observe(web_contents_);
524 view_ = view;
525 if (view_)
526 view_->set_paint_observer(this);
527 516
528 // Make sure the overlay window is on top. 517 // Make sure the overlay window is on top.
529 if (window_.get() && window_->parent()) 518 if (window_.get() && window_->parent())
530 window_->parent()->StackChildAtTop(window_.get()); 519 window_->parent()->StackChildAtTop(window_.get());
531 } 520 }
532 521
533 void SetOverlayWindow(scoped_ptr<aura::Window> window, 522 void SetOverlayWindow(scoped_ptr<aura::Window> window,
534 ImageWindowDelegate* delegate) { 523 ImageWindowDelegate* delegate) {
535 window_ = window.Pass(); 524 window_ = window.Pass();
536 if (window_.get() && window_->parent()) 525 if (window_.get() && window_->parent())
(...skipping 25 matching lines...) Expand all
562 // as soon as there is any new painting notification. 551 // as soon as there is any new painting notification.
563 if ((need_paint_update_ && !received_paint_update_) || 552 if ((need_paint_update_ && !received_paint_update_) ||
564 (image_delegate_->has_image() && !loading_complete_)) { 553 (image_delegate_->has_image() && !loading_complete_)) {
565 return; 554 return;
566 } 555 }
567 556
568 // If a slide is in progress, then do not destroy the window or the slide. 557 // If a slide is in progress, then do not destroy the window or the slide.
569 if (window_slider_.get() && window_slider_->IsSlideInProgress()) 558 if (window_slider_.get() && window_slider_->IsSlideInProgress())
570 return; 559 return;
571 560
561 Observe(NULL);
572 window_slider_.reset(); 562 window_slider_.reset();
573 window_.reset(); 563 window_.reset();
574 image_delegate_ = NULL; 564 image_delegate_ = NULL;
575 if (view_) {
576 view_->set_paint_observer(NULL);
577 view_ = NULL;
578 }
579 } 565 }
580 566
581 // Creates a layer to be used for window-slide. |offset| is the offset of the 567 // Creates a layer to be used for window-slide. |offset| is the offset of the
582 // NavigationEntry for the screenshot image to display. 568 // NavigationEntry for the screenshot image to display.
583 ui::Layer* CreateSlideLayer(int offset) { 569 ui::Layer* CreateSlideLayer(int offset) {
584 const NavigationControllerImpl& controller = web_contents_->GetController(); 570 const NavigationControllerImpl& controller = web_contents_->GetController();
585 const NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 571 const NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry(
586 controller.GetEntryAtOffset(offset)); 572 controller.GetEntryAtOffset(offset));
587 573
588 gfx::Image image; 574 gfx::Image image;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
625 // Change the image used for the overlay window. 611 // Change the image used for the overlay window.
626 image_delegate_->SetImage(layer_delegate_.image()); 612 image_delegate_->SetImage(layer_delegate_.image());
627 window_->layer()->SetTransform(gfx::Transform()); 613 window_->layer()->SetTransform(gfx::Transform());
628 window_->SchedulePaintInRect(gfx::Rect(window_->bounds().size())); 614 window_->SchedulePaintInRect(gfx::Rect(window_->bounds().size()));
629 615
630 SlideDirection direction = slide_direction_; 616 SlideDirection direction = slide_direction_;
631 slide_direction_ = SLIDE_UNKNOWN; 617 slide_direction_ = SLIDE_UNKNOWN;
632 618
633 // Reset state and wait for the new navigation page to complete 619 // Reset state and wait for the new navigation page to complete
634 // loading/painting. 620 // loading/painting.
635 StartObservingView(ToRenderWidgetHostViewAura( 621 StartObserving();
636 web_contents_->GetRenderWidgetHostView()));
637 622
638 // Perform the navigation. 623 // Perform the navigation.
639 if (direction == SLIDE_BACK) 624 if (direction == SLIDE_BACK)
640 web_contents_->GetController().GoBack(); 625 web_contents_->GetController().GoBack();
641 else if (direction == SLIDE_FRONT) 626 else if (direction == SLIDE_FRONT)
642 web_contents_->GetController().GoForward(); 627 web_contents_->GetController().GoForward();
643 else 628 else
644 NOTREACHED(); 629 NOTREACHED();
645 } 630 }
646 631
647 virtual void OnWindowSlideAborted() OVERRIDE { 632 virtual void OnWindowSlideAborted() OVERRIDE {
648 StopObservingIfDone(); 633 StopObservingIfDone();
649 } 634 }
650 635
651 virtual void OnWindowSliderDestroyed() OVERRIDE { 636 virtual void OnWindowSliderDestroyed() OVERRIDE {
652 // The slider has just been destroyed. Release the ownership. 637 // The slider has just been destroyed. Release the ownership.
653 WindowSlider* slider ALLOW_UNUSED = window_slider_.release(); 638 WindowSlider* slider ALLOW_UNUSED = window_slider_.release();
654 StopObservingIfDone(); 639 StopObservingIfDone();
655 } 640 }
656 641
657 // Overridden from RenderWidgetHostViewAura::PaintObserver: 642 // Overridden from WebContentsObserver:
658 virtual void OnPaintComplete() OVERRIDE { 643 virtual void DidFirstVisuallyNonEmptyPaint(int32 page_id) OVERRIDE {
659 received_paint_update_ = true; 644 received_paint_update_ = true;
660 StopObservingIfDone(); 645 StopObservingIfDone();
661 } 646 }
662 647
663 virtual void OnCompositingComplete() OVERRIDE { 648 virtual void DidStopLoading(RenderViewHost* host) OVERRIDE {
664 received_paint_update_ = compositor_updated_;
665 StopObservingIfDone();
666 }
667
668 virtual void OnUpdateCompositorContent() OVERRIDE {
669 compositor_updated_ = true;
670 }
671
672 virtual void OnPageLoadComplete() OVERRIDE {
673 loading_complete_ = true; 649 loading_complete_ = true;
674 StopObservingIfDone(); 650 StopObservingIfDone();
675 } 651 }
676 652
677 virtual void OnViewDestroyed() OVERRIDE {
678 DCHECK(view_);
679 view_->set_paint_observer(NULL);
680 view_ = NULL;
681 }
682
683 // The WebContents which is being navigated. 653 // The WebContents which is being navigated.
684 WebContentsImpl* web_contents_; 654 WebContentsImpl* web_contents_;
685 655
686 scoped_ptr<aura::Window> window_; 656 scoped_ptr<aura::Window> window_;
687 657
688 // This is the WindowDelegate of |window_|. The delegate manages its own 658 // This is the WindowDelegate of |window_|. The delegate manages its own
689 // lifetime (destroys itself when |window_| is destroyed). 659 // lifetime (destroys itself when |window_| is destroyed).
690 ImageWindowDelegate* image_delegate_; 660 ImageWindowDelegate* image_delegate_;
691 661
692 RenderWidgetHostViewAura* view_;
693 bool loading_complete_; 662 bool loading_complete_;
694 bool received_paint_update_; 663 bool received_paint_update_;
695 bool compositor_updated_;
696 664
697 enum SlideDirection { 665 enum SlideDirection {
698 SLIDE_UNKNOWN, 666 SLIDE_UNKNOWN,
699 SLIDE_BACK, 667 SLIDE_BACK,
700 SLIDE_FRONT 668 SLIDE_FRONT
701 }; 669 };
702 670
703 // The |WindowSlider| that allows sliding history layers while the page is 671 // The |WindowSlider| that allows sliding history layers while the page is
704 // being reloaded. 672 // being reloaded.
705 scoped_ptr<WindowSlider> window_slider_; 673 scoped_ptr<WindowSlider> window_slider_;
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 1122
1155 void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { 1123 void WebContentsViewAura::PrepareOverscrollNavigationOverlay() {
1156 OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 1124 OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
1157 overscroll_window_->delegate()); 1125 overscroll_window_->delegate());
1158 overscroll_window_->SchedulePaintInRect( 1126 overscroll_window_->SchedulePaintInRect(
1159 gfx::Rect(overscroll_window_->bounds().size())); 1127 gfx::Rect(overscroll_window_->bounds().size()));
1160 overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size())); 1128 overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size()));
1161 overscroll_window_->SetTransform(gfx::Transform()); 1129 overscroll_window_->SetTransform(gfx::Transform());
1162 navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(), 1130 navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(),
1163 delegate); 1131 delegate);
1164 navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura( 1132 navigation_overlay_->StartObserving();
1165 web_contents_->GetRenderWidgetHostView()));
1166 } 1133 }
1167 1134
1168 void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { 1135 void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) {
1169 if (!overscroll_change_brightness_) 1136 if (!overscroll_change_brightness_)
1170 return; 1137 return;
1171 1138
1172 const float kBrightnessMin = -.1f; 1139 const float kBrightnessMin = -.1f;
1173 const float kBrightnessMax = -.01f; 1140 const float kBrightnessMax = -.01f;
1174 1141
1175 float ratio = fabs(delta_x) / GetViewBounds().width(); 1142 float ratio = fabs(delta_x) / GetViewBounds().width();
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
1332 DCHECK(RenderViewHostFactory::has_factory()); 1299 DCHECK(RenderViewHostFactory::has_factory());
1333 return render_widget_host->GetView(); 1300 return render_widget_host->GetView();
1334 } 1301 }
1335 1302
1336 RenderWidgetHostView* view = 1303 RenderWidgetHostView* view =
1337 RenderWidgetHostView::CreateViewForWidget(render_widget_host); 1304 RenderWidgetHostView::CreateViewForWidget(render_widget_host);
1338 view->InitAsChild(NULL); 1305 view->InitAsChild(NULL);
1339 GetNativeView()->AddChild(view->GetNativeView()); 1306 GetNativeView()->AddChild(view->GetNativeView());
1340 1307
1341 if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 1308 if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
1342 navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura(view)); 1309 navigation_overlay_->StartObserving();
1343 } 1310 }
1344 1311
1345 RenderWidgetHostImpl* host_impl = 1312 RenderWidgetHostImpl* host_impl =
1346 RenderWidgetHostImpl::From(render_widget_host); 1313 RenderWidgetHostImpl::From(render_widget_host);
1347 1314
1348 if (!host_impl->is_hidden()) 1315 if (!host_impl->is_hidden())
1349 view->Show(); 1316 view->Show();
1350 1317
1351 // We listen to drag drop events in the newly created view's window. 1318 // We listen to drag drop events in the newly created view's window.
1352 aura::client::SetDragDropDelegate(view->GetNativeView(), this); 1319 aura::client::SetDragDropDelegate(view->GetNativeView(), this);
(...skipping 16 matching lines...) Expand all
1369 } 1336 }
1370 1337
1371 void WebContentsViewAura::SetPageTitle(const base::string16& title) { 1338 void WebContentsViewAura::SetPageTitle(const base::string16& title) {
1372 window_->set_title(title); 1339 window_->set_title(title);
1373 } 1340 }
1374 1341
1375 void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { 1342 void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) {
1376 } 1343 }
1377 1344
1378 void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { 1345 void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) {
1379 if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 1346 if (navigation_overlay_.get() && navigation_overlay_->has_window())
1380 navigation_overlay_->StartObservingView( 1347 navigation_overlay_->StartObserving();
1381 ToRenderWidgetHostViewAura(host->GetView()));
1382 }
1383 AttachTouchEditableToRenderView(); 1348 AttachTouchEditableToRenderView();
1384 } 1349 }
1385 1350
1386 void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) { 1351 void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) {
1387 RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>( 1352 RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>(
1388 web_contents_->GetRenderViewHost()); 1353 web_contents_->GetRenderViewHost());
1389 if (host) { 1354 if (host) {
1390 host->SetOverscrollControllerEnabled(enabled); 1355 host->SetOverscrollControllerEnabled(enabled);
1391 if (enabled) 1356 if (enabled)
1392 host->overscroll_controller()->set_delegate(this); 1357 host->overscroll_controller()->set_delegate(this);
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
1792 event.location(), 1757 event.location(),
1793 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 1758 gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
1794 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 1759 ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
1795 if (drag_dest_delegate_) 1760 if (drag_dest_delegate_)
1796 drag_dest_delegate_->OnDrop(); 1761 drag_dest_delegate_->OnDrop();
1797 current_drop_data_.reset(); 1762 current_drop_data_.reset();
1798 return ConvertFromWeb(current_drag_op_); 1763 return ConvertFromWeb(current_drag_op_);
1799 } 1764 }
1800 1765
1801 } // namespace content 1766 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/renderer_host/render_widget_host_view_aura.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698