web_contents_view_aura.cc revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_view_aura.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/auto_reset.h" 8bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "base/command_line.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_factory.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/image_window_delegate.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/web_contents/aura/window_slider.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/touch_editable_impl_aura.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view_delegate.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_drag_dest_delegate.h" 36bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/content_switches.h" 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h" 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/net_util.h" 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_client.h" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_delegate.h" 431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/env.h" 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h" 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window_observer.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h" 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/dragdrop/drop_target_event.h" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_png_rep.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContentsViewPort* CreateWebContentsView( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostDelegateView** render_view_host_delegate_view) { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *render_view_host_delegate_view = rv; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool IsScrollEndEffectEnabled() { 79bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 80bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switches::kScrollEndEffect) == "1"; 81bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 82bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateForward(const NavigationController& controller, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) && 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoForward(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateBack(const NavigationController& controller, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) && 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoBack(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostViewAura* ToRenderWidgetHostViewAura( 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostView* view) { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!view || RenderViewHostFactory::has_factory()) 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; // Can't cast to RenderWidgetHostViewAura in unit tests. 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>( 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->GetRenderWidgetHost()->GetProcess()); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (process->IsGuest()) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RenderWidgetHostViewAura*>(view); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed. 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OverscrollWindowDelegate : public ImageWindowDelegate { 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate(WebContentsImpl* web_contents, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode overscroll_mode) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : web_contents_(web_contents), 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forward_events_(true) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents->GetController(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationEntryImpl* entry = NULL; 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, overscroll_mode)) { 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(1)); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(controller, overscroll_mode)) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(-1)); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image; 1267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (entry && entry->screenshot().get()) { 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<gfx::ImagePNGRep> image_reps; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetImageScale( 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetScaleFactorForNativeView(web_contents_window())))); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image = gfx::Image(image_reps); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetImage(image); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void stop_forwarding_events() { forward_events_ = false; } 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverscrollWindowDelegate() {} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* web_contents_window() { 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetContentNativeView(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler. 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnScrollEvent(event); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnGestureEvent(event); 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The window is displayed both during the gesture, and after the gesture 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // while the navigation is in progress. During the gesture, it is necessary to 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // forward input events to the content page (e.g. when the overscroll window 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // slides under the cursor and starts receiving scroll events). However, once 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the gesture is complete, and the window is being displayed as an overlay 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window during navigation, events should not be forwarded anymore. 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool forward_events_; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer. 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDragSourceAura : public base::MessageLoopForUI::Observer, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public NotificationObserver { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragSourceAura(aura::Window* window, WebContentsImpl* contents) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : window_(window), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_(contents) { 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->AddObserver(this); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(contents)); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebDragSourceAura() { 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->RemoveObserver(this); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MessageLoop::Observer implementation: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::EventStatus WillProcessEvent( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& event) OVERRIDE { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::EVENT_CONTINUE; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents_) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventType type = ui::EventTypeFromNative(event); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = NULL; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_DRAGGED: 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh = contents_->GetRenderViewHost(); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc_in_pixel = ui::EventLocationFromNative(event); 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Point screen_loc = ConvertViewPointToDIP(rvh->GetView(), 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_loc_in_pixel); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point client_loc = screen_loc; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = rvh->GetView()->GetNativeView(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->GetRootWindow(), 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window, &client_loc); 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_->DragSourceMovedTo(client_loc.x(), client_loc.y(), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_loc.x(), screen_loc.y()); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) OVERRIDE { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != NOTIFICATION_WEB_CONTENTS_DISCONNECTED) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the drag if it is still in progress. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::DragDropClient* dnd_client = 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetDragDropClient(window_->GetRootWindow()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dnd_client && dnd_client->IsDragDropInProgress()) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dnd_client->DragCancel(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = NULL; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_ = NULL; 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window() const { return window_; } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents_; 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationRegistrar registrar_; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Fill out the OSExchangeData with a file contents, synthesizing a name if 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// necessary. 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PrepareDragForFileContents(const DropData& drop_data, 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::OSExchangeData::Provider* provider) { 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath file_name(drop_data.file_description_filename); 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Images without ALT text will only have a file extension so we need to 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // synthesize one from the provided extension and URL. 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (file_name.BaseName().RemoveExtension().empty()) { 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const string16 extension = file_name.Extension(); 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Retrieve the name from the URL. 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) file_name = base::FilePath(net::GetSuggestedFilename( 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drop_data.url, "", "", "", "", "")).ReplaceExtension(extension); 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) provider->SetFileContents(file_name, drop_data.file_contents); 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 261eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a ui::OSExchangeDataProvider object from DropData. 262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDragData(const DropData& drop_data, 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData::Provider* provider) { 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We set the file contents before the URL because the URL also sets file 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // contents (to a .URL shortcut). We want to prefer file content data over 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a shortcut so we add it first. 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drop_data.file_contents.empty()) 26958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PrepareDragForFileContents(drop_data, provider); 27058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.text.string().empty()) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetString(drop_data.text.string()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drop_data.url.is_valid()) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetURL(drop_data.url, drop_data.url_title); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.html.string().empty()) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetHtml(drop_data.html.string(), drop_data.html_base_url); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.filenames.empty()) { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::OSExchangeData::FileInfo> filenames; 279eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<DropData::FileInfo>::const_iterator it = 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data.filenames.begin(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != drop_data.filenames.end(); ++it) { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filenames.push_back( 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData::FileInfo( 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->path)), 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->display_name)))); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetFilenames(filenames); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.custom_data.empty()) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a DropData object from ui::OSExchangeData. 298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 plain_text; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetString(&plain_text); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plain_text.empty()) 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->text = base::NullableString16(plain_text, false); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 url_title; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetURLAndTitle(&url, &url_title); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid()) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url = url; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url_title = url_title; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) string16 html; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL html_base_url; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetHtml(&html, &html_base_url); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!html.empty()) 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->html = base::NullableString16(html, false); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_base_url.is_valid()) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->html_base_url = html_base_url; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::OSExchangeData::FileInfo> files; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data.GetFilenames(&files) && !files.empty()) { 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<ui::OSExchangeData::FileInfo>::const_iterator 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = files.begin(); it != files.end(); ++it) { 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->filenames.push_back( 325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropData::FileInfo( 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(it->path.AsUTF8Unsafe()), 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16(it->display_name.AsUTF8Unsafe()))); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ReadCustomDataIntoMap( 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pickle.data(), pickle.size(), &drop_data->custom_data); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Utilities to convert between blink::WebDragOperationsMask and 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes. 339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int ConvertFromWeb(blink::WebDragOperationsMask ops) { 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drag_op = ui::DragDropTypes::DRAG_NONE; 341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationCopy) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_COPY; 343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationMove) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_MOVE; 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationLink) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_LINK; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return drag_op; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebDragOperationsMask ConvertToWeb(int drag_op) { 351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int web_drag_op = blink::WebDragOperationNone; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_COPY) 353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationCopy; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_MOVE) 355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationMove; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_LINK) 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationLink; 358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (blink::WebDragOperationsMask) web_drag_op; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) { 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int web_input_event_modifiers = 0; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_SHIFT_DOWN) 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ShiftKey; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_CONTROL_DOWN) 366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ControlKey; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_ALT_DOWN) 368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::AltKey; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_COMMAND_DOWN) 370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::MetaKey; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event_modifiers; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// A LayerDelegate that paints an image for the layer. 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ImageLayerDelegate : public ui::LayerDelegate { 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageLayerDelegate() {} 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ~ImageLayerDelegate() {} 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetImage(const gfx::Image& image) { 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_ = image; 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_size_ = image.AsImageSkia().size(); 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Image& image() const { return image_; } 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private: 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from ui::LayerDelegate: 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE { 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (image_.IsEmpty()) { 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas->DrawColor(SK_ColorGRAY); 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SkISize size = canvas->sk_canvas()->getDeviceSize(); 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (size.width() != image_size_.width() || 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch size.height() != image_size_.height()) { 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas->DrawColor(SK_ColorWHITE); 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch canvas->DrawImageInt(image_.AsImageSkia(), 0, 0); 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Called when the layer's device scale factor has changed. 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE { 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Invoked prior to the bounds changing. The returned closured is run after 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the bounds change. 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual base::Closure PrepareForLayerBoundsChange() OVERRIDE { 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return base::Closure(); 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Image image_; 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Size image_size_; 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DISALLOW_COPY_AND_ASSIGN(ImageLayerDelegate); 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}; 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a history navigation is triggered at the end of an overscroll 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// navigation, it is necessary to show the history-screenshot until the page is 4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// done navigating and painting. This class accomplishes this by showing the 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screenshot window on top of the page until the page has completed loading and 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// painting. 4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollNavigationOverlay : 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public RenderWidgetHostViewAura::PaintObserver, 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public WindowSlider::Delegate { 4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch explicit OverscrollNavigationOverlay(WebContentsImpl* web_contents) 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : web_contents_(web_contents), 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_delegate_(NULL), 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch view_(NULL), 4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loading_complete_(false), 4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_update_(false), 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_updated_(false), 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch slide_direction_(SLIDE_UNKNOWN), 4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_paint_update_(true) { 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverscrollNavigationOverlay() { 4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->set_paint_observer(NULL); 4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_window() const { return !!window_.get(); } 4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StartObservingView(RenderWidgetHostViewAura* view) { 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->set_paint_observer(NULL); 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loading_complete_ = false; 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_update_ = false; 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_updated_ = false; 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_ = view; 455c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (view_) 456c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view_->set_paint_observer(this); 4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Make sure the overlay window is on top. 4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_.get() && window_->parent()) 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->parent()->StackChildAtTop(window_.get()); 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void SetOverlayWindow(scoped_ptr<aura::Window> window, 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageWindowDelegate* delegate) { 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_ = window.Pass(); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (window_.get() && window_->parent()) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->parent()->StackChildAtTop(window_.get()); 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_delegate_ = delegate; 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (window_.get() && delegate->has_image()) { 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_slider_.reset(new WindowSlider(this, 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_->parent(), 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_.get())); 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch slide_direction_ = SLIDE_UNKNOWN; 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } else { 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_slider_.reset(); 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetupForTesting() { 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) need_paint_update_ = false; 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Stop observing the page if the page-load has completed and the page has 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // been painted, and a window-slide isn't in progress. 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void StopObservingIfDone() { 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is a screenshot displayed in the overlay window, then wait for 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the navigated page to complete loading and some paint update before 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hiding the overlay. 4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is no screenshot in the overlay window, then hide this view 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // as soon as there is any new painting notification. 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((need_paint_update_ && !received_paint_update_) || 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch (image_delegate_->has_image() && !loading_complete_)) { 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // If a slide is in progress, then do not destroy the window or the slide. 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (window_slider_.get() && window_slider_->IsSlideInProgress()) 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_slider_.reset(); 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.reset(); 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_delegate_ = NULL; 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (view_) { 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->set_paint_observer(NULL); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_ = NULL; 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Creates a layer to be used for window-slide. |offset| is the offset of the 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // NavigationEntry for the screenshot image to display. 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::Layer* CreateSlideLayer(int offset) { 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const NavigationControllerImpl& controller = web_contents_->GetController(); 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const NavigationEntryImpl* entry = NavigationEntryImpl::FromNavigationEntry( 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch controller.GetEntryAtOffset(offset)); 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::Image image; 5197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (entry && entry->screenshot().get()) { 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<gfx::ImagePNGRep> image_reps; 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), 52268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetImageScale( 52368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetScaleFactorForNativeView(window_.get())))); 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image = gfx::Image(image_reps); 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer_delegate_.SetImage(image); 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ui::Layer* layer = new ui::Layer(ui::LAYER_TEXTURED); 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch layer->set_delegate(&layer_delegate_); 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return layer; 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Overridden from WindowSlider::Delegate: 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ui::Layer* CreateBackLayer() OVERRIDE { 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!web_contents_->GetController().CanGoBack()) 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch slide_direction_ = SLIDE_BACK; 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CreateSlideLayer(-1); 539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual ui::Layer* CreateFrontLayer() OVERRIDE { 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!web_contents_->GetController().CanGoForward()) 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch slide_direction_ = SLIDE_FRONT; 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return CreateSlideLayer(1); 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnWindowSlideComplete() OVERRIDE { 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (slide_direction_ == SLIDE_UNKNOWN) { 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_slider_.reset(); 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StopObservingIfDone(); 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return; 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Change the image used for the overlay window. 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch image_delegate_->SetImage(layer_delegate_.image()); 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_->layer()->SetTransform(gfx::Transform()); 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch window_->SchedulePaintInRect(gfx::Rect(window_->bounds().size())); 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SlideDirection direction = slide_direction_; 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch slide_direction_ = SLIDE_UNKNOWN; 562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Reset state and wait for the new navigation page to complete 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // loading/painting. 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StartObservingView(ToRenderWidgetHostViewAura( 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_contents_->GetRenderWidgetHostView())); 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Perform the navigation. 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (direction == SLIDE_BACK) 570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_contents_->GetController().GoBack(); 571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else if (direction == SLIDE_FRONT) 572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch web_contents_->GetController().GoForward(); 573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch NOTREACHED(); 575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnWindowSlideAborted() OVERRIDE { 578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StopObservingIfDone(); 579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void OnWindowSliderDestroyed() OVERRIDE { 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The slider has just been destroyed. Release the ownership. 583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WindowSlider* slider ALLOW_UNUSED = window_slider_.release(); 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch StopObservingIfDone(); 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from RenderWidgetHostViewAura::PaintObserver: 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaintComplete() OVERRIDE { 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_update_ = true; 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StopObservingIfDone(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCompositingComplete() OVERRIDE { 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) received_paint_update_ = compositor_updated_; 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StopObservingIfDone(); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnUpdateCompositorContent() OVERRIDE { 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) compositor_updated_ = true; 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPageLoadComplete() OVERRIDE { 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) loading_complete_ = true; 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StopObservingIfDone(); 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnViewDestroyed() OVERRIDE { 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(view_); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->set_paint_observer(NULL); 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_ = NULL; 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The WebContents which is being navigated. 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch WebContentsImpl* web_contents_; 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> window_; 617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // This is the WindowDelegate of |window_|. The delegate manages its own 619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // lifetime (destroys itself when |window_| is destroyed). 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageWindowDelegate* image_delegate_; 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostViewAura* view_; 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool loading_complete_; 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool received_paint_update_; 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool compositor_updated_; 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch enum SlideDirection { 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SLIDE_UNKNOWN, 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SLIDE_BACK, 630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SLIDE_FRONT 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The |WindowSlider| that allows sliding history layers while the page is 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // being reloaded. 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<WindowSlider> window_slider_; 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The direction of the in-progress slide (if any). 638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SlideDirection slide_direction_; 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The LayerDelegate used for the back/front layers during a slide. 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ImageLayerDelegate layer_delegate_; 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // During tests, the aura windows don't get any paint updates. So the overlay 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // container keeps waiting for a paint update it never receives, causing a 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // timeout. So during tests, disable the wait for paint updates. 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool need_paint_update_; 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverscrollNavigationOverlay); 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : public aura::WindowObserver, public aura::RootWindowObserver { 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WindowObserver(WebContentsViewAura* view) 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : view_(view), 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_(NULL) { 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->AddObserver(this); 658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->window_->GetRootWindow()) 661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->window_->GetRootWindow()->AddObserver(this); 662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WindowObserver() { 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->RemoveObserver(this); 6671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (view_->window_->GetDispatcher()) 6681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) view_->window_->GetDispatcher()->RemoveRootWindowObserver(this); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent_) 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->RemoveObserver(this); 671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_window->RemoveObserver(this); 682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) 684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from aura::WindowObserver: 690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Constrained windows are added as children of the parent's parent's view 692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // which may overlap with windowed NPAPI plugins. In that case, tell the RWHV 693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // so that it can update the plugins' cutout rects accordingly. 694f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: this is hard coding how Chrome layer adds its dialogs. Since NPAPI is 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // going to be deprecated in a year, this is ok for now. The test for this is 696f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PrintPreviewTest.WindowedNPAPIPluginHidden. 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE { 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (new_window == view_->window_) 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (new_window == parent_) 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; // This happens if the parent moves to the root window. 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Observe sibling windows of the WebContents, or children of the root 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // window. 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (new_window->parent() == parent_ || 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_window->parent() == view_->window_->GetRootWindow()) { 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) new_window->AddObserver(this); 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE { 714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) 715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->RemoveObserver(this); 718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(window); 719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowVisibilityChanged(aura::Window* window, 722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool visible) OVERRIDE { 723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) 724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window->parent() == parent_ || 727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->parent() == view_->window_->GetRootWindow()) { 728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowParentChanged(aura::Window* window, 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent) OVERRIDE { 735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window != view_->window_) 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent_) 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->RemoveObserver(this); 739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view) 749f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view->UpdateConstrainedWindowRects(std::vector<gfx::Rect>()); 750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // When we get parented to the root window, the code below will watch the 753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // parent, aka root window. Since we already watch the root window on 754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Windows, unregister first so that the debug check doesn't fire. 755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent && parent == window->GetRootWindow()) 756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parent->RemoveObserver(this); 757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We need to undo the above if we were parented to the root window and then 759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // got parented to another window. At that point, the code before the ifdef 760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // would have stopped watching the root window. 761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window->GetRootWindow() && 762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parent != window->GetRootWindow() && 763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !window->GetRootWindow()->HasObserver(this)) { 764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 767f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_ = parent; 769f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent) { 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddObserver(this); 771f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 772f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent != window->GetRootWindow()) { 773f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent->children(); 774f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 775f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (children[i] != view_->window_) 776f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->AddObserver(this); 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 778f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 779f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowBoundsChanged(aura::Window* window, 7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& old_bounds, 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE { 786f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == parent_ || window == view_->window_) { 787f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendScreenRects(); 788f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->touch_editable_) 789f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->touch_editable_->UpdateEditingController(); 790f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 791f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 792f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 793f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 794f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE { 798f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 7991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window->GetDispatcher()->AddRootWindowObserver(this); 800f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 801f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!window->GetRootWindow()->HasObserver(this)) 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 803f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 804f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE { 808f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 8091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window->GetDispatcher()->RemoveRootWindowObserver(this); 810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->RemoveObserver(this); 812f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 813f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = 814f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->children(); 815f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 816f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_children[i] != view_->window_ && root_children[i] != parent_) 817f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 818f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 819f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 820f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden RootWindowObserver: 8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual void OnRootWindowHostMoved(const aura::RootWindow* root, 8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const gfx::Point& new_origin) OVERRIDE { 826f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT1("ui", 827f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "WebContentsViewAura::WindowObserver::OnRootWindowHostMoved", 828f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "new_origin", new_origin.ToString()); 829f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is for the desktop case (i.e. Aura desktop). 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendScreenRects() { 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())-> 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateConstrainedWindows(aura::Window* exclude) { 842c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!view) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<gfx::Rect> constrained_windows; 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 849f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 850f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (children[i] != view_->window_ && 852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i] != exclude && 853f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->IsVisible()) { 854f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back(children[i]->GetBoundsInRootWindow()); 855f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 856f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 857f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 858f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 859f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 860f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 862f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 863f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_children[i]->IsVisible() && 864f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !root_children[i]->Contains(view_->window_.get())) { 865f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back( 866f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->GetBoundsInRootWindow()); 867f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 868f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->UpdateConstrainedWindowRects(constrained_windows); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 873f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewAura* view_; 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 877f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We cache the old parent so that we can unregister when it's not the parent 878f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // anymore. 879f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* parent_; 880f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowObserver); 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public: 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura( 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate) 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : web_contents_(web_contents), 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 892f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_drag_op_(blink::WebDragOperationNone), 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_(NULL), 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_rvh_for_drag_(NULL), 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_change_brightness_(false), 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_(OVERSCROLL_NONE), 897c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) completed_overscroll_gesture_(OVERSCROLL_NONE), 898c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_(TouchEditableImplAura::Create()) { 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private: 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() { 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window_) 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_observer_.reset(); 909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window needs a valid delegate during its destructor, so we explicitly 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete it here. 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(); 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetupOverlayWindowForTesting() { 916c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (navigation_overlay_) 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_->SetupForTesting(); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::SetTouchEditableForTest( 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TouchEditableImplAura* touch_editable) { 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_.reset(touch_editable); 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) { 9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->SetSize(size); 9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = 9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderWidgetHostView(); 9315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetSize(size); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::EndDrag(blink::WebDragOperationsMask ops) { 9361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc = 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point client_loc = screen_loc; 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = web_contents_->GetRenderViewHost(); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = rvh->GetView()->GetNativeView(); 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(root_window, window, &client_loc); 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(), 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_loc.x(), screen_loc.y(), ops); 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() { 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is an existing |overscroll_window_| which is in the middle of an 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // animation, then destroying the window here causes the animation to be 9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // completed immidiately, which triggers |OnImplicitAnimationsCompleted()| 9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback, and that tries to reset |overscroll_window_| again, causing a 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // double-free. So use a temporary variable here. 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_window_) { 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<OverscrollMode> reset_state(¤t_overscroll_gesture_, 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> reset_window(overscroll_window_.release()); 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate( 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_, 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(new aura::Window(overscroll_delegate)); 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetType(aura::client::WINDOW_TYPE_CONTROL); 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetTransparent(true); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->Init(ui::LAYER_TEXTURED); 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_->layer()->SetMasksToBounds(false); 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetName("OverscrollOverlay"); 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_change_brightness_ = overscroll_delegate->has_image(); 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->AddChild(overscroll_window_.get()); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = gfx::Rect(window_->bounds().size()); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_)) { 9772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The overlay will be sliding in from the right edge towards the left in 9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-RTL, or sliding in from the left edge towards the right in RTL. 9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // So position the overlay window accordingly. 9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0); 9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* animate_window = GetWindowToAnimateForOverscroll(); 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animate_window == overscroll_window_) 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView()); 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 987c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView()); 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetBounds(bounds); 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->Show(); 993c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) overscroll_shadow_.reset(new ShadowLayerDelegate(animate_window->layer())); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() { 998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 999c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 1000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) content->layer()->GetAnimator()->AbortAllAnimations(); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->SetTransform(gfx::Transform()); 10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() { 10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!target) 10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 1015d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(gfx::Transform()); 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 1023d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) { 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Animate out the current view first. Navigate to the requested history at 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the end of the animation. 10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated", 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_, OVERSCROLL_COUNT); 1039b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 1040b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) overscroll_window_->delegate()); 1041b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) delegate->stop_forwarding_events(); 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = mode; 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 1048d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int content_width = 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()->GetViewBounds().width(); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width; 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(translate_x, 0); 10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(transform); 10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(translate_x); 10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() { 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ShouldNavigateForward(web_contents_->GetController(), 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_) ? 1065c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_.get() : GetContentNativeView(); 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x, 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int delta_y) { 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NORTH || 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ == OVERSCROLL_SOUTH) { 1072bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return gfx::Vector2d(0, delta_y); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For horizontal overscroll, scroll freely if a navigation is possible. Do a 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resistive scroll otherwise. 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents_->GetController(); 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds = GetViewBounds(); 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, current_overscroll_gesture_)) 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (ShouldNavigateBack(controller, current_overscroll_gesture_)) 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::min(bounds.width(), delta_x), 0); 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(); 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->delegate()); 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SchedulePaintInRect( 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(overscroll_window_->bounds().size())); 1090eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size())); 1091eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetTransform(gfx::Transform()); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(), 1093eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate); 1094c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura( 1095c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->GetRenderWidgetHostView())); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!overscroll_change_brightness_) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMin = -.1f; 11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMax = -.01f; 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ratio = fabs(delta_x) / GetViewBounds().width(); 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = std::min(1.f, ratio); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::i18n::IsRTL()) 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = 1.f - ratio; 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ? 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) : 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin); 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::max(kBrightnessMin, brightness); 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::min(kBrightnessMax, brightness); 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window = GetWindowToAnimateForOverscroll(); 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->layer()->SetLayerBrightness(brightness); 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::AttachTouchEditableToRenderView() { 1119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!touch_editable_) 1120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* rwhva = ToRenderWidgetHostViewAura( 1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_->AttachToView(rwhva); 1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1126bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid WebContentsViewAura::OverscrollUpdateForWebContentsDelegate(int delta_y) { 1127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (web_contents_->GetDelegate() && IsScrollEndEffectEnabled()) 1128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_contents_->GetDelegate()->OverscrollUpdate(delta_y); 1129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 1130bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation: 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const { 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_.get(); 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const { 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rwhv ? rwhv->GetNativeView() : NULL; 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const { 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetToplevelWindow(); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const { 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = window_->GetBoundsInScreen(); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnTabCrashed(base::TerminationStatus status, 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) { 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->bounds(); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.size() != size) { 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_size(size); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(bounds); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our size matches what we want but the renderers size may not match. 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend we were resized so that the renderers size is updated too. 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(size); 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() { 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) { 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->Focus(); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_.get() && delegate_->Focus()) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->Focus(); 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() { 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->FocusLocationBarByDefault()) 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->SetFocusToLocationBar(false); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Focus(); 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() { 1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->StoreFocus(); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() { 1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RestoreFocus(); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDropData* WebContentsViewAura::GetDropData() const { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_drop_data_.get(); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const { 12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_->GetBoundsInScreen(); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsViewPort implementation: 12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView( 12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size, gfx::NativeView context) { 12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: we ignore |initial_size| since in some cases it's wrong (such as 12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the bookmark bar is not shown and you create a new tab). The right 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value is set shortly after this, so its safe to ignore. 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::Env::CreateInstance(); 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.reset(new aura::Window(this)); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->set_owned_by_parent(false); 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetType(aura::client::WINDOW_TYPE_CONTROL); 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetTransparent(false); 12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->Init(ui::LAYER_NOT_DRAWN); 12211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = context ? context->GetRootWindow() : NULL; 12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There are places where there is no context currently because object 12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hierarchies are built before they're attached to a Widget. (See 12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::WebView as an example; GetWidget() returns NULL at the point 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // where we are created.) 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It should be OK to not set a default parent since such users will 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // explicitly add this WebContentsViewAura to their tree after they create 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // us. 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 12321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 12331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window_.get(), root_window, root_window->GetBoundsInScreen()); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->layer()->SetMasksToBounds(true); 12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetName("WebContentsViewAura"); 12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WindowObserver is not interesting and is problematic for Browser Plugin 1240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // guests. 1241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The use cases for WindowObserver do not apply to Browser Plugins: 1242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1) guests do not support NPAPI plugins. 1243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2) guests' window bounds are supposed to come from its embedder. 1244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!web_contents_->GetRenderProcessHost()->IsGuest()) 1245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_observer_.reset(new WindowObserver(this)); 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delegate_->GetDragDestDelegate() creates a new delegate on every call. 12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Hence, we save a reference to it locally. Similar model is used on other 12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // platforms as well. 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_dest_delegate_ = delegate_->GetDragDestDelegate(); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget( 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host->GetView()) { 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // During testing, the view will already be set up in most cases to the 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test view, so we don't want to clobber it with a real one. To verify that 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this actually is happening (and somebody isn't accidentally creating the 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // view twice), we check for the RVH Factory, which will be set when we're 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // making special ones (which go along with the special views). 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(RenderViewHostFactory::has_factory()); 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_widget_host->GetView(); 12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* view = 12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView::CreateViewForWidget(render_widget_host); 12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->InitAsChild(NULL); 1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetNativeView()->AddChild(view->GetNativeView()); 12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura(view)); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl* host_impl = 127658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl::From(render_widget_host); 127758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 127858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!host_impl->is_hidden()) 127958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view->Show(); 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We listen to drag drop events in the newly created view's window. 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetDragDropDelegate(view->GetNativeView(), this); 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->overscroll_controller() && 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!web_contents_->GetDelegate() || 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetDelegate()->CanOverscrollContent())) { 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host_impl->overscroll_controller()->set_delegate(this); 1288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!navigation_overlay_) 1289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return view; 12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForPopupWidget( 12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host); 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetPageTitle(const string16& title) { 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->set_title(title); 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 1310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) navigation_overlay_->StartObservingView( 1311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ToRenderWidgetHostViewAura(host->GetView())); 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1313c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) { 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>( 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetRenderViewHost()); 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host) { 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->SetOverscrollControllerEnabled(enabled); 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enabled) 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->overscroll_controller()->set_delegate(this); 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!enabled) 1326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) navigation_overlay_.reset(); 1327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (!navigation_overlay_) 1328eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation: 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(const ContextMenuParams& params) { 1335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (touch_editable_) 1336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_->EndTouchEditing(); 1337424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) { 1338424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) delegate_->ShowContextMenu(params); 1339424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WARNING: we may have been deleted during the call to ShowContextMenu(). 1340424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::ShowPopupMenu(const gfx::Rect& bounds, 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_height, 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double item_font_size, 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selected_item, 13477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::vector<MenuItem>& items, 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool right_aligned, 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_multiple_selection) { 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External popup menus are only used on Mac and Android. 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging( 1355eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DropData& drop_data, 1356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask operations, 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& image, 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Vector2d& image_offset, 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DragEventSourceInfo& event_info) { 13601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 1361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!aura::client::GetDragDropClient(root_window)) { 1362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (touch_editable_) 1367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_->EndTouchEditing(); 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider(); 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrepareDragData(drop_data, provider); 13712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data(provider); // takes ownership of |provider|. 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.isNull()) { 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_utils::SetDragImageOnDataObject(image, 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(image.width(), image.height()), image_offset, &data); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebDragSourceAura> drag_source( 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebDragSourceAura(GetNativeView(), web_contents_)); 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to enable recursive tasks on the message loop so we can get 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates while in the system DoDragDrop loop. 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_op = 0; 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView content_native_view = GetContentNativeView(); 1387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 1388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()); 1389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_op = aura::client::GetDragDropClient(root_window) 1390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->StartDragAndDrop(data, 1391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window, 1392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_native_view, 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_location, 1394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConvertFromWeb(operations), 1395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_source); 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bail out immediately if the contents view window is gone. Note that it is 1399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not safe to access any class members in this case since |this| may already 1400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be destroyed. The local variable |drag_source| will still be valid though, 1401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so we can use it to determine if the window is gone. 1402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!drag_source->window()) { 1403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note that in this case, we don't need to call SystemDragEnded() since the 1404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // renderer is going away. 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDrag(ConvertToWeb(result_op)); 1409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1412f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(blink::WebDragOperation operation) { 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drag_op_ = operation; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() { 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate()) 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->WebContentsFocused(web_contents_); 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate() && 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) && 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.get()) { 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->TakeFocus(reverse); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation: 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Rect WebContentsViewAura::GetVisibleBounds() const { 14331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 14341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!rwhv || !rwhv->IsShowing()) 14351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return gfx::Rect(); 14361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 14371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return rwhv->GetViewBounds(); 14381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 14391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) { 14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y); 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1450bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Vertical overscrolls don't participate in the navigation gesture. 1451bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ != OVERSCROLL_NORTH && 1452bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ != OVERSCROLL_SOUTH) { 1453bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transform.Translate(translate.x(), translate.y()); 1454bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch target->SetTransform(transform); 1455bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateOverscrollWindowBrightness(delta_x); 1456bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1457bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1458bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(translate.y()); 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) { 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT); 1463bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationControllerImpl& controller = web_contents_->GetController(); 14652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, mode) || 14662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldNavigateBack(controller, mode)) { 14672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteOverscrollNavigation(mode); 14682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 14702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode, 14752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode new_mode) { 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset any in-progress overscroll animation first. 14772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 14782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 147958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (new_mode != OVERSCROLL_NONE && touch_editable_) 148058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollStarted(); 148158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_mode == OVERSCROLL_NONE || 1483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !GetContentNativeView() || 1484bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ((new_mode == OVERSCROLL_EAST || new_mode == OVERSCROLL_WEST) && 1485bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_overlay_.get() && navigation_overlay_->has_window())) { 14862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 1487bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 14882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1489b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 1490b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (target) { 1491b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 1492b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) target->layer()->GetAnimator()->AbortAllAnimations(); 1493b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 14942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cleanup state of the content window first, because that can reset the 14952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |current_overscroll_gesture_|. 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareContentWindowForOverscroll(); 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = new_mode; 1499bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ == OVERSCROLL_EAST || 1500bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ == OVERSCROLL_WEST) 1501bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PrepareOverscrollWindow(); 15022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT); 15042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 15062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation: 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() { 1512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_shadow_.reset(); 1513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 15152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 15162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareOverscrollNavigationOverlay(); 15172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoForward(); 15182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(web_contents_->GetController(), 15192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 15202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareOverscrollNavigationOverlay(); 15212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoBack(); 152258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 152358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (touch_editable_) 152458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollCompleted(); 15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 1528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (content) { 1529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->SetTransform(gfx::Transform()); 1530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 15322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 15332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 15342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 15352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation: 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const { 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const { 15452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 15462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 15472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds, 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) { 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(new_bounds.size()); 1551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SizeChanged(new_bounds.size()); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constrained web dialogs, need to be kept centered over our content area. 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window_->children().size(); i++) { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_->children()[i]->GetProperty( 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::kConstrainedWindowKey)) { 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->children()[i]->bounds(); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_origin( 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point((new_bounds.width() - bounds.width()) / 2, 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_bounds.height() - bounds.height()) / 2)); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->children()[i]->SetBounds(bounds); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) { 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::kNullCursor; 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const { 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HTCLIENT; 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling( 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* child, 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() { 15828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do not take the focus if the render widget host view aura is gone or 15838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // is in the process of shutting down because neither the view window nor 15848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // this window can handle key events. 15858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 15868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 15878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (view != NULL && !view->IsClosing()) 15888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 15898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 15908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() { 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) { 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged( 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor) { 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying() { 16042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This means the destructor is going to be called soon. If there is an 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL), 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then destroying it in the WebContentsViewAura destructor can trigger other 16072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroy the overscroll window here. 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_.reset(); 16102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed() { 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) { 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->WasShown(); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->WasHidden(); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const { 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const { 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 163058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WebContentsViewAura::DidRecreateLayer(ui::Layer *old_layer, 163158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::Layer *new_layer) { 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation: 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) { 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents_->GetDelegate()) 16422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ActivateContents(web_contents_); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 16497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case ui::ET_MOUSE_EXITED: 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ContentsMouseEvent( 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_, 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 16537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event->type() == ui::ET_MOUSE_MOVED); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation: 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) { 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->DragInitialize(web_contents_); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_drop_data_.reset(new DropData()); 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrepareDropData(current_drop_data_.get(), event.data()); 1670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_rvh_for_drag_ = web_contents_->GetRenderViewHost(); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragEnter( 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *current_drop_data_.get(), event.location(), screen_pt, op, 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) { 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnReceiveDragData(event.data()); 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragEnter(); 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) { 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragOver( 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), screen_pt, op, 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 16965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragOver(); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ConvertFromWeb(current_drag_op_); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() { 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragLeave(); 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragLeave(); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) { 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDrop( 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDrop(); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_drag_op_; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1731