web_contents_view_aura.cc revision 23730a6e56a168d1879203e4b3819bb36e3d8f1f
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" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/file_util.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/download/drag_download_util.h" 131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_factory.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/web_contents/aura/gesture_nav_simple.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/image_window_delegate.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/web_contents/aura/overscroll_navigation_overlay.h" 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/web_contents/aura/window_slider.h" 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/touch_editable_impl_aura.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view_delegate.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_drag_dest_delegate.h" 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_client.h" 42bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/content_switches.h" 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h" 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "net/base/net_util.h" 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_client.h" 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_delegate.h" 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/env.h" 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host_observer.h" 5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h" 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h" 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/dragdrop/drop_target_event.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_png_rep.h" 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContentsViewPort* CreateWebContentsView( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostDelegateView** render_view_host_delegate_view) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *render_view_host_delegate_view = rv; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 84bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool IsScrollEndEffectEnabled() { 85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switches::kScrollEndEffect) == "1"; 87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateForward(const NavigationController& controller, 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) && 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoForward(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateBack(const NavigationController& controller, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) && 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoBack(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostViewAura* ToRenderWidgetHostViewAura( 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostView* view) { 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!view || RenderViewHostFactory::has_factory()) 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; // Can't cast to RenderWidgetHostViewAura in unit tests. 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>( 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) view->GetRenderWidgetHost()->GetProcess()); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (process->IsGuest()) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RenderWidgetHostViewAura*>(view); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed. 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OverscrollWindowDelegate : public ImageWindowDelegate { 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate(WebContentsImpl* web_contents, 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode overscroll_mode) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : web_contents_(web_contents), 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forward_events_(true) { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents->GetController(); 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationEntryImpl* entry = NULL; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, overscroll_mode)) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(1)); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(controller, overscroll_mode)) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(-1)); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image; 1327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (entry && entry->screenshot().get()) { 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<gfx::ImagePNGRep> image_reps; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetImageScale( 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ui::GetScaleFactorForNativeView(web_contents_window())))); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image = gfx::Image(image_reps); 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetImage(image); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void stop_forwarding_events() { forward_events_ = false; } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverscrollWindowDelegate() {} 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* web_contents_window() { 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetContentNativeView(); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler. 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnScrollEvent(event); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnGestureEvent(event); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* web_contents_; 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The window is displayed both during the gesture, and after the gesture 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // while the navigation is in progress. During the gesture, it is necessary to 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // forward input events to the content page (e.g. when the overscroll window 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // slides under the cursor and starts receiving scroll events). However, once 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the gesture is complete, and the window is being displayed as an overlay 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window during navigation, events should not be forwarded anymore. 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool forward_events_; 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer. 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDragSourceAura : public base::MessageLoopForUI::Observer, 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public NotificationObserver { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragSourceAura(aura::Window* window, WebContentsImpl* contents) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : window_(window), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_(contents) { 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->AddObserver(this); 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) registrar_.Add(this, 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTIFICATION_WEB_CONTENTS_DISCONNECTED, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Source<WebContents>(contents)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~WebDragSourceAura() { 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoopForUI::current()->RemoveObserver(this); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MessageLoop::Observer implementation: 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual base::EventStatus WillProcessEvent( 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::NativeEvent& event) OVERRIDE { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::EVENT_CONTINUE; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!contents_) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::EventType type = ui::EventTypeFromNative(event); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = NULL; 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (type) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_DRAGGED: 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rvh = contents_->GetRenderViewHost(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rvh) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc_in_pixel = ui::EventLocationFromNative(event); 20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::Point screen_loc = ConvertViewPointToDIP(rvh->GetView(), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_loc_in_pixel); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point client_loc = screen_loc; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = rvh->GetView()->GetNativeView(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(window->GetRootWindow(), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window, &client_loc); 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) contents_->DragSourceMovedTo(client_loc.x(), client_loc.y(), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) screen_loc.x(), screen_loc.y()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) OVERRIDE { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != NOTIFICATION_WEB_CONTENTS_DISCONNECTED) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the drag if it is still in progress. 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::DragDropClient* dnd_client = 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetDragDropClient(window_->GetRootWindow()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dnd_client && dnd_client->IsDragDropInProgress()) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dnd_client->DragCancel(); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = NULL; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_ = NULL; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window() const { return window_; } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window_; 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents_; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationRegistrar registrar_; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Fill out the OSExchangeData with a file contents, synthesizing a name if 25158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// necessary. 25258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PrepareDragForFileContents(const DropData& drop_data, 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::OSExchangeData::Provider* provider) { 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::FilePath file_name(drop_data.file_description_filename); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Images without ALT text will only have a file extension so we need to 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // synthesize one from the provided extension and URL. 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (file_name.BaseName().RemoveExtension().empty()) { 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16 extension = file_name.Extension(); 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Retrieve the name from the URL. 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) file_name = base::FilePath(net::GetSuggestedFilename( 26158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) drop_data.url, "", "", "", "", "")).ReplaceExtension(extension); 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) provider->SetFileContents(file_name, drop_data.file_contents); 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrepareDragForDownload( 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DropData& drop_data, 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::Provider* provider, 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsImpl* web_contents) { 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& page_url = web_contents->GetLastCommittedURL(); 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& page_encoding = web_contents->GetEncoding(); 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Parse the download metadata. 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 mime_type; 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_name; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL download_url; 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ParseDownloadMetadata(drop_data.download_metadata, 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &mime_type, 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &file_name, 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &download_url)) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate the file name based on both mime type and proposed file name. 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string default_name = 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->browser()->GetDefaultDownloadName(); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath generated_download_file_name = 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::GenerateFileName(download_url, 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(file_name.value()), 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(mime_type), 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default_name); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // http://crbug.com/332579 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_file_operations; 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath temp_dir_path; 2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_drag"), 2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &temp_dir_path)) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath download_path = 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_dir_path.Append(generated_download_file_name); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We cannot know when the target application will be done using the temporary 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // file, so schedule it to be deleted after rebooting. 3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DeleteFileAfterReboot(download_path); 3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DeleteFileAfterReboot(temp_dir_path); 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Provide the data as file (CF_HDROP). A temporary download file with the 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Zone.Identifier ADS (Alternate Data Stream) attached will be created. 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<DragDownloadFile> download_file = 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new DragDownloadFile( 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_path, 3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<net::FileStream>(), 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_url, 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(page_url, drop_data.referrer_policy), 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_encoding, 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents); 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(), 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_file.get()); 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider->SetDownloadFileInfo(file_download); 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 32458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 32558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 326eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a ui::OSExchangeDataProvider object from DropData. 327eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDragData(const DropData& drop_data, 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::Provider* provider, 3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsImpl* web_contents) { 33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Put download before file contents to prefer the download of a image over 3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // its thumbnail link. 3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!drop_data.download_metadata.empty()) 3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrepareDragForDownload(drop_data, provider, web_contents); 33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We set the file contents before the URL because the URL also sets file 33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // contents (to a .URL shortcut). We want to prefer file content data over 33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a shortcut so we add it first. 33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drop_data.file_contents.empty()) 33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PrepareDragForFileContents(drop_data, provider); 34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.text.string().empty()) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetString(drop_data.text.string()); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drop_data.url.is_valid()) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetURL(drop_data.url, drop_data.url_title); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.html.string().empty()) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetHtml(drop_data.html.string(), drop_data.html_base_url); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.filenames.empty()) { 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::OSExchangeData::FileInfo> filenames; 349eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch for (std::vector<DropData::FileInfo>::const_iterator it = 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data.filenames.begin(); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it != drop_data.filenames.end(); ++it) { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filenames.push_back( 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData::FileInfo( 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe(base::UTF16ToUTF8(it->path)), 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath::FromUTF8Unsafe( 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(it->display_name)))); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetFilenames(filenames); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.custom_data.empty()) { 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a DropData object from ui::OSExchangeData. 369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { 370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 plain_text; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetString(&plain_text); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plain_text.empty()) 3737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->text = base::NullableString16(plain_text, false); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 url_title; 3775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.GetURLAndTitle( 3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &url_title); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid()) { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url = url; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url_title = url_title; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL html_base_url; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetHtml(&html, &html_base_url); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!html.empty()) 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->html = base::NullableString16(html, false); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_base_url.is_valid()) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->html_base_url = html_base_url; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::OSExchangeData::FileInfo> files; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (data.GetFilenames(&files) && !files.empty()) { 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (std::vector<ui::OSExchangeData::FileInfo>::const_iterator 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) it = files.begin(); it != files.end(); ++it) { 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->filenames.push_back( 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DropData::FileInfo( 3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(it->path.AsUTF8Unsafe()), 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(it->display_name.AsUTF8Unsafe()))); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 40490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) 40590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ReadCustomDataIntoMap( 40690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pickle.data(), pickle.size(), &drop_data->custom_data); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 409f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Utilities to convert between blink::WebDragOperationsMask and 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes. 411f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int ConvertFromWeb(blink::WebDragOperationsMask ops) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drag_op = ui::DragDropTypes::DRAG_NONE; 413f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationCopy) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_COPY; 415f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationMove) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_MOVE; 417f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationLink) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_LINK; 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return drag_op; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 422f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebDragOperationsMask ConvertToWeb(int drag_op) { 423f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int web_drag_op = blink::WebDragOperationNone; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_COPY) 425f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationCopy; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_MOVE) 427f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationMove; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_LINK) 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationLink; 430f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (blink::WebDragOperationsMask) web_drag_op; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) { 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int web_input_event_modifiers = 0; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_SHIFT_DOWN) 436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ShiftKey; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_CONTROL_DOWN) 438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ControlKey; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_ALT_DOWN) 440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::AltKey; 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_COMMAND_DOWN) 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::MetaKey; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event_modifiers; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver 449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public aura::WindowObserver, public aura::WindowTreeHostObserver { 4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WindowObserver(WebContentsViewAura* view) 4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : view_(view), 4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_(NULL) { 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->AddObserver(this); 455f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->window_->GetRootWindow()) 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->window_->GetRootWindow()->AddObserver(this); 459f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WindowObserver() { 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->RemoveObserver(this); 464a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (view_->window_->GetHost()) 465a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->window_->GetHost()->RemoveObserver(this); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent_) 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->RemoveObserver(this); 468f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 470f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 471f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 472f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 473f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 474f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_window->RemoveObserver(this); 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 480f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from aura::WindowObserver: 487f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Constrained windows are added as children of the parent's parent's view 489f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // which may overlap with windowed NPAPI plugins. In that case, tell the RWHV 490f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // so that it can update the plugins' cutout rects accordingly. 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: this is hard coding how Chrome layer adds its dialogs. Since NPAPI is 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // going to be deprecated in a year, this is ok for now. The test for this is 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PrintPreviewTest.WindowedNPAPIPluginHidden. 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE { 4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_window != view_->window_) { 4965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Skip the case when the parent moves to the root window. 4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_window != parent_) { 4985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Observe sibling windows of the WebContents, or children of the root 4995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // window. 5005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_window->parent() == parent_ || 5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_window->parent() == view_->window_->GetRootWindow()) { 5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_window->AddObserver(this); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (new_window->parent() == parent_) { 508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE { 513f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) 514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->RemoveObserver(this); 517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(window); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowVisibilityChanged(aura::Window* window, 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool visible) OVERRIDE { 5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (window == view_->window_ || 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window->parent() == parent_ || 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->parent() == view_->window_->GetRootWindow()) { 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 528f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 529f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowParentChanged(aura::Window* window, 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent) OVERRIDE { 532f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window != view_->window_) 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (parent_) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_->RemoveObserver(this); 536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view) 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view->UpdateConstrainedWindowRects(std::vector<gfx::Rect>()); 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // When we get parented to the root window, the code below will watch the 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // parent, aka root window. Since we already watch the root window on 551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Windows, unregister first so that the debug check doesn't fire. 552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent && parent == window->GetRootWindow()) 553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parent->RemoveObserver(this); 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We need to undo the above if we were parented to the root window and then 556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // got parented to another window. At that point, the code before the ifdef 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // would have stopped watching the root window. 558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window->GetRootWindow() && 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) parent != window->GetRootWindow() && 560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !window->GetRootWindow()->HasObserver(this)) { 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent_ = parent; 566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent) { 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) parent->AddObserver(this); 568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent != window->GetRootWindow()) { 570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent->children(); 571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (children[i] != view_->window_) 573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->AddObserver(this); 574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowBoundsChanged(aura::Window* window, 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& old_bounds, 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE { 583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == parent_ || window == view_->window_) { 584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendScreenRects(); 585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->touch_editable_) 586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->touch_editable_->UpdateEditingController(); 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE { 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 596a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window->GetHost()->AddObserver(this); 597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!window->GetRootWindow()->HasObserver(this)) 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE { 605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 606a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window->GetHost()->RemoveObserver(this); 607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->RemoveObserver(this); 609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->children(); 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_children[i] != view_->window_ && root_children[i] != parent_) 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 620a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Overridden WindowTreeHostObserver: 621a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnHostMoved(const aura::WindowTreeHost* host, 622a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Point& new_origin) OVERRIDE { 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT1("ui", 624a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "WebContentsViewAura::WindowObserver::OnHostMoved", 625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "new_origin", new_origin.ToString()); 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is for the desktop case (i.e. Aura desktop). 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendScreenRects() { 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())-> 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateConstrainedWindows(aura::Window* exclude) { 639c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!view) 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<gfx::Rect> constrained_windows; 645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (parent_) { 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& children = parent_->children(); 647f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 648f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (children[i] != view_->window_ && 649f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i] != exclude && 650f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->IsVisible()) { 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back(children[i]->GetBoundsInRootWindow()); 652f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 659f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 660f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_children[i]->IsVisible() && 661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !root_children[i]->Contains(view_->window_.get())) { 662f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back( 663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->GetBoundsInRootWindow()); 664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->UpdateConstrainedWindowRects(constrained_windows); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 670f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewAura* view_; 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We cache the old parent so that we can unregister when it's not the parent 675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // anymore. 676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* parent_; 677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowObserver); 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public: 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura( 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : web_contents_(web_contents), 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_drag_op_(blink::WebDragOperationNone), 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_(NULL), 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_rvh_for_drag_(NULL), 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_change_brightness_(false), 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_(OVERSCROLL_NONE), 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) completed_overscroll_gesture_(OVERSCROLL_NONE), 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_(TouchEditableImplAura::Create()) { 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private: 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window_) 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_observer_.reset(); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window needs a valid delegate during its destructor, so we explicitly 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete it here. 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetupOverlayWindowForTesting() { 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (navigation_overlay_) 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_->SetupForTesting(); 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::SetTouchEditableForTest( 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TouchEditableImplAura* touch_editable) { 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_.reset(touch_editable); 720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->SetSize(size); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderWidgetHostView(); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetSize(size); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::EndDrag(blink::WebDragOperationsMask ops) { 7331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc = 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point client_loc = screen_loc; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = web_contents_->GetRenderViewHost(); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = rvh->GetView()->GetNativeView(); 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(root_window, window, &client_loc); 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(), 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_loc.x(), screen_loc.y(), ops); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 746a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::InstallOverscrollControllerDelegate( 747a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) RenderWidgetHostImpl* host) { 748a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string value = CommandLine::ForCurrentProcess()-> 749a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); 750a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value == "0") { 751a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(); 752a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 753a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value == "2") { 755a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(); 756a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!gesture_nav_simple_) 757a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gesture_nav_simple_.reset(new GestureNavSimple(web_contents_)); 758a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host->overscroll_controller()->set_delegate(gesture_nav_simple_.get()); 759a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 760a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 761a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) host->overscroll_controller()->set_delegate(this); 762a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!navigation_overlay_) 763a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 764a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 765a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() { 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is an existing |overscroll_window_| which is in the middle of an 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // animation, then destroying the window here causes the animation to be 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // completed immidiately, which triggers |OnImplicitAnimationsCompleted()| 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback, and that tries to reset |overscroll_window_| again, causing a 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // double-free. So use a temporary variable here. 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_window_) { 7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<OverscrollMode> reset_state(¤t_overscroll_gesture_, 7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> reset_window(overscroll_window_.release()); 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate( 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_, 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(new aura::Window(overscroll_delegate)); 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) overscroll_window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetTransparent(true); 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) overscroll_window_->Init(aura::WINDOW_LAYER_TEXTURED); 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_->layer()->SetMasksToBounds(false); 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetName("OverscrollOverlay"); 7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_change_brightness_ = overscroll_delegate->has_image(); 7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->AddChild(overscroll_window_.get()); 7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = gfx::Rect(window_->bounds().size()); 7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_)) { 7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The overlay will be sliding in from the right edge towards the left in 7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-RTL, or sliding in from the left edge towards the right in RTL. 7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // So position the overlay window accordingly. 7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0); 7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* animate_window = GetWindowToAnimateForOverscroll(); 801c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animate_window == overscroll_window_) 802c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView()); 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView()); 8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetBounds(bounds); 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->Show(); 810c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) overscroll_shadow_.reset(new ShadowLayerDelegate(animate_window->layer())); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() { 815b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 816c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 817b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) content->layer()->GetAnimator()->AbortAllAnimations(); 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->SetTransform(gfx::Transform()); 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() { 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!target) 8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 832d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(gfx::Transform()); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 840d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) { 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Animate out the current view first. Navigate to the requested history at 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the end of the animation. 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated", 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_, OVERSCROLL_COUNT); 856b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 857b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) overscroll_window_->delegate()); 858b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) delegate->stop_forwarding_events(); 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = mode; 8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 865d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int content_width = 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()->GetViewBounds().width(); 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width; 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(translate_x, 0); 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(transform); 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(translate_x); 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() { 8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ShouldNavigateForward(web_contents_->GetController(), 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_) ? 882c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_.get() : GetContentNativeView(); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x, 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int delta_y) { 8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NORTH || 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ == OVERSCROLL_SOUTH) { 889bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return gfx::Vector2d(0, delta_y); 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For horizontal overscroll, scroll freely if a navigation is possible. Do a 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resistive scroll otherwise. 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents_->GetController(); 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds = GetViewBounds(); 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, current_overscroll_gesture_)) 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0); 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (ShouldNavigateBack(controller, current_overscroll_gesture_)) 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::min(bounds.width(), delta_x), 0); 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(); 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { 9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->delegate()); 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SchedulePaintInRect( 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(overscroll_window_->bounds().size())); 907eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size())); 908eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetTransform(gfx::Transform()); 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(), 910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate); 9115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!overscroll_change_brightness_) 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMin = -.1f; 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMax = -.01f; 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ratio = fabs(delta_x) / GetViewBounds().width(); 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = std::min(1.f, ratio); 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::i18n::IsRTL()) 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = 1.f - ratio; 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ? 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) : 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::max(kBrightnessMin, brightness); 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::min(kBrightnessMax, brightness); 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window = GetWindowToAnimateForOverscroll(); 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->layer()->SetLayerBrightness(brightness); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 934c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::AttachTouchEditableToRenderView() { 935c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!touch_editable_) 936c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* rwhva = ToRenderWidgetHostViewAura( 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_->AttachToView(rwhva); 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 942bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid WebContentsViewAura::OverscrollUpdateForWebContentsDelegate(int delta_y) { 943bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (web_contents_->GetDelegate() && IsScrollEndEffectEnabled()) 944bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_contents_->GetDelegate()->OverscrollUpdate(delta_y); 945bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 946bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation: 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const { 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_.get(); 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const { 9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rwhv ? rwhv->GetNativeView() : NULL; 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetToplevelWindow(); 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const { 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = window_->GetBoundsInScreen(); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnTabCrashed(base::TerminationStatus status, 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int error_code) { 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) { 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->bounds(); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.size() != size) { 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_size(size); 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(bounds); 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our size matches what we want but the renderers size may not match. 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend we were resized so that the renderers size is updated too. 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(size); 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() { 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) { 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->Focus(); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_.get() && delegate_->Focus()) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->Focus(); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() { 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->FocusLocationBarByDefault()) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->SetFocusToLocationBar(false); 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Focus(); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() { 1005c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->StoreFocus(); 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() { 1010c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RestoreFocus(); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1014eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDropData* WebContentsViewAura::GetDropData() const { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_drop_data_.get(); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const { 10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_->GetBoundsInScreen(); 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsViewPort implementation: 10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView( 10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size, gfx::NativeView context) { 10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: we ignore |initial_size| since in some cases it's wrong (such as 10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the bookmark bar is not shown and you create a new tab). The right 10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value is set shortly after this, so its safe to ignore. 10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) aura::Env::CreateInstance(); 10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.reset(new aura::Window(this)); 10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->set_owned_by_parent(false); 10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); 10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetTransparent(false); 10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 10371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = context ? context->GetRootWindow() : NULL; 10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There are places where there is no context currently because object 10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hierarchies are built before they're attached to a Widget. (See 10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::WebView as an example; GetWidget() returns NULL at the point 10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // where we are created.) 10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It should be OK to not set a default parent since such users will 10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // explicitly add this WebContentsViewAura to their tree after they create 10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // us. 10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 10481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 10491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window_.get(), root_window, root_window->GetBoundsInScreen()); 10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->layer()->SetMasksToBounds(true); 10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetName("WebContentsViewAura"); 10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1055f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WindowObserver is not interesting and is problematic for Browser Plugin 1056f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // guests. 1057f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The use cases for WindowObserver do not apply to Browser Plugins: 1058f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1) guests do not support NPAPI plugins. 1059f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2) guests' window bounds are supposed to come from its embedder. 1060f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!web_contents_->GetRenderProcessHost()->IsGuest()) 1061f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_observer_.reset(new WindowObserver(this)); 10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delegate_->GetDragDestDelegate() creates a new delegate on every call. 10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Hence, we save a reference to it locally. Similar model is used on other 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // platforms as well. 1066c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_dest_delegate_ = delegate_->GetDragDestDelegate(); 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget( 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host->GetView()) { 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // During testing, the view will already be set up in most cases to the 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test view, so we don't want to clobber it with a real one. To verify that 10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this actually is happening (and somebody isn't accidentally creating the 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // view twice), we check for the RVH Factory, which will be set when we're 10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // making special ones (which go along with the special views). 10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(RenderViewHostFactory::has_factory()); 10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return render_widget_host->GetView(); 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* view = 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView::CreateViewForWidget(render_widget_host); 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->InitAsChild(NULL); 1085c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetNativeView()->AddChild(view->GetNativeView()); 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl* host_impl = 109258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl::From(render_widget_host); 109358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 109458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!host_impl->is_hidden()) 109558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view->Show(); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We listen to drag drop events in the newly created view's window. 10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetDragDropDelegate(view->GetNativeView(), this); 10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host_impl->overscroll_controller() && 11012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!web_contents_->GetDelegate() || 11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetDelegate()->CanOverscrollContent())) { 1103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InstallOverscrollControllerDelegate(host_impl); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return view; 11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForPopupWidget( 11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host); 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsViewAura::SetPageTitle(const base::string16& title) { 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->set_title(title); 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) { 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>( 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetRenderViewHost()); 11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (host) { 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) host->SetOverscrollControllerEnabled(enabled); 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enabled) 1134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) InstallOverscrollControllerDelegate(host); 11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!enabled) 1138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) navigation_overlay_.reset(); 1139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (!navigation_overlay_) 1140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation: 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(RenderFrameHost* render_frame_host, 11475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 1148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (touch_editable_) { 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_editable_->EndTouchEditing(false); 1150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1151424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) { 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowContextMenu(render_frame_host, params); 1153424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WARNING: we may have been deleted during the call to ShowContextMenu(). 1154424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::ShowPopupMenu(const gfx::Rect& bounds, 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int item_height, 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) double item_font_size, 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int selected_item, 11617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const std::vector<MenuItem>& items, 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool right_aligned, 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_multiple_selection) { 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // External popup menus are only used on Mac and Android. 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging( 1169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DropData& drop_data, 1170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask operations, 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& image, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Vector2d& image_offset, 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DragEventSourceInfo& event_info) { 11741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!aura::client::GetDragDropClient(root_window)) { 1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (touch_editable_) 11815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_editable_->EndTouchEditing(false); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider(); 11845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrepareDragData(drop_data, provider, web_contents_); 11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data(provider); // takes ownership of |provider|. 11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!image.isNull()) { 11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_utils::SetDragImageOnDataObject(image, 11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size(image.width(), image.height()), image_offset, &data); 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebDragSourceAura> drag_source( 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebDragSourceAura(GetNativeView(), web_contents_)); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to enable recursive tasks on the message loop so we can get 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates while in the system DoDragDrop loop. 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_op = 0; 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView content_native_view = GetContentNativeView(); 1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()); 1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_op = aura::client::GetDragDropClient(root_window) 1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->StartDragAndDrop(data, 1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window, 1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_native_view, 1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_location, 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConvertFromWeb(operations), 1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_source); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bail out immediately if the contents view window is gone. Note that it is 1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not safe to access any class members in this case since |this| may already 1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be destroyed. The local variable |drag_source| will still be valid though, 1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so we can use it to determine if the window is gone. 1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!drag_source->window()) { 1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note that in this case, we don't need to call SystemDragEnded() since the 1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // renderer is going away. 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDrag(ConvertToWeb(result_op)); 1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(blink::WebDragOperation operation) { 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drag_op_ = operation; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() { 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate()) 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->WebContentsFocused(web_contents_); 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate() && 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) && 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.get()) { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->TakeFocus(reverse); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation: 12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Rect WebContentsViewAura::GetVisibleBounds() const { 12471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 12481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!rwhv || !rwhv->IsShowing()) 12491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return gfx::Rect(); 12501e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 12511e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return rwhv->GetViewBounds(); 12521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 12531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) { 12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET); 12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y); 12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1264bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Vertical overscrolls don't participate in the navigation gesture. 1265bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ != OVERSCROLL_NORTH && 1266bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ != OVERSCROLL_SOUTH) { 1267bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transform.Translate(translate.x(), translate.y()); 1268bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch target->SetTransform(transform); 1269bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateOverscrollWindowBrightness(delta_x); 1270bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1271bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1272bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(translate.y()); 12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) { 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT); 1277bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationControllerImpl& controller = web_contents_->GetController(); 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, mode) || 12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldNavigateBack(controller, mode)) { 12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteOverscrollNavigation(mode); 12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode, 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode new_mode) { 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset any in-progress overscroll animation first. 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 129358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (new_mode != OVERSCROLL_NONE && touch_editable_) 129458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollStarted(); 129558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_mode == OVERSCROLL_NONE || 1297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !GetContentNativeView() || 1298bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ((new_mode == OVERSCROLL_EAST || new_mode == OVERSCROLL_WEST) && 1299bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_overlay_.get() && navigation_overlay_->has_window())) { 13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 1301bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 1304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (target) { 1305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 1306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) target->layer()->GetAnimator()->AbortAllAnimations(); 1307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cleanup state of the content window first, because that can reset the 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |current_overscroll_gesture_|. 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareContentWindowForOverscroll(); 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = new_mode; 1313bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ == OVERSCROLL_EAST || 1314bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ == OVERSCROLL_WEST) 1315bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PrepareOverscrollWindow(); 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT); 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation: 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() { 1326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_shadow_.reset(); 1327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareOverscrollNavigationOverlay(); 13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoForward(); 13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(web_contents_->GetController(), 13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 13342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareOverscrollNavigationOverlay(); 13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoBack(); 133658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 133758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (touch_editable_) 133858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollCompleted(); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 1342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (content) { 1343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->SetTransform(gfx::Transform()); 1344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation: 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const { 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(); 13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const { 13592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds, 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) { 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(new_bounds.size()); 1365c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SizeChanged(new_bounds.size()); 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constrained web dialogs, need to be kept centered over our content area. 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window_->children().size(); i++) { 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_->children()[i]->GetProperty( 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::kConstrainedWindowKey)) { 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->children()[i]->bounds(); 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_origin( 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point((new_bounds.width() - bounds.width()) / 2, 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_bounds.height() - bounds.height()) / 2)); 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->children()[i]->SetBounds(bounds); 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) { 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::kNullCursor; 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const { 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HTCLIENT; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling( 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* child, 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location) { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() { 13968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do not take the focus if the render widget host view aura is gone or 13978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // is in the process of shutting down because neither the view window nor 13988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // this window can handle key events. 13998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 14008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 14018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (view != NULL && !view->IsClosing()) 14028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 14038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() { 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) { 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged( 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor) { 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1417a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying(aura::Window* window) { 14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This means the destructor is going to be called soon. If there is an 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL), 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then destroying it in the WebContentsViewAura destructor can trigger other 14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So 14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroy the overscroll window here. 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_.reset(); 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1427a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed(aura::Window* window) { 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) { 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (visible) 14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->WasShown(); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->WasHidden(); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const { 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const { 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 144458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void WebContentsViewAura::DidRecreateLayer(ui::Layer *old_layer, 144558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::Layer *new_layer) { 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation: 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) { 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) { 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents_->GetDelegate()) 14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ActivateContents(web_contents_); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 14637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case ui::ET_MOUSE_EXITED: 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ContentsMouseEvent( 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_, 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 14677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event->type() == ui::ET_MOUSE_MOVED); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation: 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) { 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->DragInitialize(web_contents_); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_drop_data_.reset(new DropData()); 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrepareDropData(current_drop_data_.get(), event.data()); 1484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_rvh_for_drag_ = web_contents_->GetRenderViewHost(); 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragEnter( 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *current_drop_data_.get(), event.location(), screen_pt, op, 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) { 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnReceiveDragData(event.data()); 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragEnter(); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) { 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragOver( 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), screen_pt, op, 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragOver(); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ConvertFromWeb(current_drag_op_); 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() { 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragLeave(); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragLeave(); 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) { 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDrop( 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDrop(); 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ConvertFromWeb(current_drag_op_); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1545