web_contents_view_aura.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/browser/browser_plugin/browser_plugin_guest.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/download/drag_download_util.h" 141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/interstitial_page_impl.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/browser/frame_host/navigation_entry_impl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_factory.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h" 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/browser/web_contents/aura/gesture_nav_simple.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/image_window_delegate.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/browser/web_contents/aura/overscroll_navigation_overlay.h" 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/browser/web_contents/aura/window_slider.h" 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/touch_editable_impl_aura.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/browser/content_browser_client.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h" 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view_delegate.h" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_drag_dest_delegate.h" 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/common/content_client.h" 43bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/public/common/content_switches.h" 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/common/drop_data.h" 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h" 481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/aura/client/window_tree_client.h" 494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/aura/env.h" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h" 5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "ui/aura/window_tree_host.h" 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host_observer.h" 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h" 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/base/dragdrop/drop_target_event.h" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h" 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h" 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h" 63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h" 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_png_rep.h" 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h" 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h" 70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/drag_drop_client.h" 71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/drag_drop_delegate.h" 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)WebContentsView* CreateWebContentsView( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHostDelegateView** render_view_host_delegate_view) { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *render_view_host_delegate_view = rv; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rv; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochbool IsScrollEndEffectEnabled() { 86bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return CommandLine::ForCurrentProcess()->GetSwitchValueASCII( 87bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch switches::kScrollEndEffect) == "1"; 88bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 89bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateForward(const NavigationController& controller, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) && 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoForward(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateBack(const NavigationController& controller, 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode mode) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) && 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.CanGoBack(); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostViewAura* ToRenderWidgetHostViewAura( 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostView* view) { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!view || RenderViewHostFactory::has_factory()) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; // Can't cast to RenderWidgetHostViewAura in unit tests. 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RenderViewHost* rvh = RenderViewHost::From(view->GetRenderWidgetHost()); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rvh ? WebContents::FromRenderViewHost(rvh) : NULL); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (BrowserPluginGuest::IsGuest(web_contents)) 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return NULL; 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return static_cast<RenderWidgetHostViewAura*>(view); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed. 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OverscrollWindowDelegate : public ImageWindowDelegate { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate(WebContentsImpl* web_contents, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode overscroll_mode) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : web_contents_(web_contents), 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) forward_events_(true) { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents->GetController(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationEntryImpl* entry = NULL; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, overscroll_mode)) { 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(1)); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(controller, overscroll_mode)) { 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) entry = NavigationEntryImpl::FromNavigationEntry( 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) controller.GetEntryAtOffset(-1)); 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Image image; 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (entry && entry->screenshot().get()) { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<gfx::ImagePNGRep> image_reps; 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(), 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::GetScaleFactorForNativeView(web_contents_window()))); 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) image = gfx::Image(image_reps); 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SetImage(image); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void stop_forwarding_events() { forward_events_ = false; } 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~OverscrollWindowDelegate() {} 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* web_contents_window() { 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return web_contents_->GetView()->GetContentNativeView(); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from ui::EventHandler. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnScrollEvent(event); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE { 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (forward_events_ && web_contents_window()) 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_window()->delegate()->OnGestureEvent(event); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) WebContentsImpl* web_contents_; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The window is displayed both during the gesture, and after the gesture 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // while the navigation is in progress. During the gesture, it is necessary to 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // forward input events to the content page (e.g. when the overscroll window 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // slides under the cursor and starts receiving scroll events). However, once 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the gesture is complete, and the window is being displayed as an overlay 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // window during navigation, events should not be forwarded anymore. 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool forward_events_; 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer. 179c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass WebDragSourceAura : public NotificationObserver { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebDragSourceAura(aura::Window* window, WebContentsImpl* contents) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : window_(window), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_(contents) { 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() { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 192c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // NotificationObserver: 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationSource& source, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NotificationDetails& details) OVERRIDE { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type != NOTIFICATION_WEB_CONTENTS_DISCONNECTED) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cancel the drag if it is still in progress. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::DragDropClient* dnd_client = 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::GetDragDropClient(window_->GetRootWindow()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dnd_client && dnd_client->IsDragDropInProgress()) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dnd_client->DragCancel(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_ = NULL; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents_ = NULL; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window() const { return window_; } 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* contents_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NotificationRegistrar registrar_; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN) 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Fill out the OSExchangeData with a file contents, synthesizing a name if 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// necessary. 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PrepareDragForFileContents(const DropData& drop_data, 22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui::OSExchangeData::Provider* provider) { 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FilePath file_name = 225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch base::FilePath::FromUTF16Unsafe(drop_data.file_description_filename); 22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Images without ALT text will only have a file extension so we need to 22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // synthesize one from the provided extension and URL. 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (file_name.BaseName().RemoveExtension().empty()) { 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath::StringType extension = file_name.Extension(); 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Retrieve the name from the URL. 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch file_name = net::GenerateFileName(drop_data.url, "", "", "", "", "") 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch .ReplaceExtension(extension); 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) provider->SetFileContents(file_name, drop_data.file_contents); 23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN) 2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrepareDragForDownload( 2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DropData& drop_data, 2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::Provider* provider, 2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsImpl* web_contents) { 2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const GURL& page_url = web_contents->GetLastCommittedURL(); 2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& page_encoding = web_contents->GetEncoding(); 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Parse the download metadata. 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 mime_type; 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath file_name; 2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GURL download_url; 2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!ParseDownloadMetadata(drop_data.download_metadata, 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &mime_type, 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &file_name, 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &download_url)) 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Generate the file name based on both mime type and proposed file name. 2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string default_name = 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetContentClient()->browser()->GetDefaultDownloadName(); 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath generated_download_file_name = 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) net::GenerateFileName(download_url, 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string(), 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(file_name.value()), 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF16ToUTF8(mime_type), 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default_name); 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // http://crbug.com/332579 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ThreadRestrictions::ScopedAllowIO allow_file_operations; 2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath temp_dir_path; 2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_drag"), 2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) &temp_dir_path)) 2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return; 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::FilePath download_path = 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) temp_dir_path.Append(generated_download_file_name); 2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // We cannot know when the target application will be done using the temporary 2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // file, so schedule it to be deleted after rebooting. 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DeleteFileAfterReboot(download_path); 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::DeleteFileAfterReboot(temp_dir_path); 2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Provide the data as file (CF_HDROP). A temporary download file with the 2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Zone.Identifier ADS (Alternate Data Stream) attached will be created. 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<DragDownloadFile> download_file = 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new DragDownloadFile( 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_path, 288c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::File(), 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_url, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Referrer(page_url, drop_data.referrer_policy), 2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) page_encoding, 2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) web_contents); 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(), 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) download_file.get()); 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) provider->SetDownloadFileInfo(file_download); 2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif // defined(OS_WIN) 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Returns the CustomFormat to store file system files. 3000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst ui::OSExchangeData::CustomFormat& GetFileSystemFileCustomFormat() { 3010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch static const char kFormatString[] = "chromium/x-file-system-files"; 3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CR_DEFINE_STATIC_LOCAL(ui::OSExchangeData::CustomFormat, 3030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch format, 3040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (ui::Clipboard::GetFormatType(kFormatString))); 3050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return format; 3060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3070529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Writes file system files to the pickle. 3090529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WriteFileSystemFilesToPickle( 3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::vector<DropData::FileSystemFileInfo>& file_system_files, 3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Pickle* pickle) { 3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch pickle->WriteUInt64(file_system_files.size()); 3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (size_t i = 0; i < file_system_files.size(); ++i) { 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch pickle->WriteString(file_system_files[i].url.spec()); 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch pickle->WriteInt64(file_system_files[i].size); 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Reads file system files from the pickle. 3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool ReadFileSystemFilesFromPickle( 3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const Pickle& pickle, 3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::vector<DropData::FileSystemFileInfo>* file_system_files) { 3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch PickleIterator iter(pickle); 3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch uint64 num_files = 0; 3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!pickle.ReadUInt64(&iter, &num_files)) 3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch file_system_files->resize(num_files); 3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch for (uint64 i = 0; i < num_files; ++i) { 3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::string url_string; 3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch int64 size = 0; 3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!pickle.ReadString(&iter, &url_string) || 3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch !pickle.ReadInt64(&iter, &size)) 3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch GURL url(url_string); 3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!url.is_valid()) 3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return false; 3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (*file_system_files)[i].url = url; 3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch (*file_system_files)[i].size = size; 3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return true; 3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch} 3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 347eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a ui::OSExchangeDataProvider object from DropData. 348eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDragData(const DropData& drop_data, 3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::Provider* provider, 3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebContentsImpl* web_contents) { 351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch provider->MarkOriginatedFromRenderer(); 35258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN) 3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Put download before file contents to prefer the download of a image over 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // its thumbnail link. 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!drop_data.download_metadata.empty()) 3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrepareDragForDownload(drop_data, provider, web_contents); 357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif 358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN) 35958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // We set the file contents before the URL because the URL also sets file 36058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // contents (to a .URL shortcut). We want to prefer file content data over 36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // a shortcut so we add it first. 36258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!drop_data.file_contents.empty()) 36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) PrepareDragForFileContents(drop_data, provider); 36458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Call SetString() before SetURL() when we actually have a custom string. 366116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // SetURL() will itself do SetString() when a string hasn't been set yet, 367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // but we want to prefer drop_data.text.string() over the URL string if it 368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // exists. 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.text.string().empty()) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetString(drop_data.text.string()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drop_data.url.is_valid()) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetURL(drop_data.url, drop_data.url_title); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.html.string().empty()) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetHtml(drop_data.html.string(), drop_data.html_base_url); 375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!drop_data.filenames.empty()) 376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch provider->SetFilenames(drop_data.filenames); 3770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!drop_data.file_system_files.empty()) { 3780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch Pickle pickle; 3790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch WriteFileSystemFilesToPickle(drop_data.file_system_files, &pickle); 3800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch provider->SetPickledData(GetFileSystemFileCustomFormat(), pickle); 3810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!drop_data.custom_data.empty()) { 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pickle); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a DropData object from ui::OSExchangeData. 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) { 392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch drop_data->did_originate_from_renderer = data.DidOriginateFromRenderer(); 393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 plain_text; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetString(&plain_text); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!plain_text.empty()) 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->text = base::NullableString16(plain_text, false); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url; 400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 url_title; 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) data.GetURLAndTitle( 4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &url_title); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (url.is_valid()) { 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url = url; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->url_title = url_title; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL html_base_url; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.GetHtml(&html, &html_base_url); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!html.empty()) 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) drop_data->html = base::NullableString16(html, false); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_base_url.is_valid()) 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drop_data->html_base_url = html_base_url; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch data.GetFilenames(&drop_data->filenames); 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Pickle pickle; 4190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch std::vector<DropData::FileSystemFileInfo> file_system_files; 4200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (data.GetPickledData(GetFileSystemFileCustomFormat(), &pickle) && 4210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch ReadFileSystemFilesFromPickle(pickle, &file_system_files)) 4220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch drop_data->file_system_files = file_system_files; 4230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 42490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle)) 42590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::ReadCustomDataIntoMap( 42690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) pickle.data(), pickle.size(), &drop_data->custom_data); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 429f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Utilities to convert between blink::WebDragOperationsMask and 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes. 431f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int ConvertFromWeb(blink::WebDragOperationsMask ops) { 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int drag_op = ui::DragDropTypes::DRAG_NONE; 433f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationCopy) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_COPY; 435f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationMove) 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_MOVE; 437f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (ops & blink::WebDragOperationLink) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_op |= ui::DragDropTypes::DRAG_LINK; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return drag_op; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebDragOperationsMask ConvertToWeb(int drag_op) { 443f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int web_drag_op = blink::WebDragOperationNone; 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_COPY) 445f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationCopy; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_MOVE) 447f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationMove; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_op & ui::DragDropTypes::DRAG_LINK) 449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_drag_op |= blink::WebDragOperationLink; 450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return (blink::WebDragOperationsMask) web_drag_op; 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) { 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int web_input_event_modifiers = 0; 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_SHIFT_DOWN) 456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ShiftKey; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_CONTROL_DOWN) 458f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::ControlKey; 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_ALT_DOWN) 460f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::AltKey; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aura_event_flags & ui::EF_COMMAND_DOWN) 462f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) web_input_event_modifiers |= blink::WebInputEvent::MetaKey; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return web_input_event_modifiers; 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver 469a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : public aura::WindowObserver, public aura::WindowTreeHostObserver { 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit WindowObserver(WebContentsViewAura* view) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : view_(view), 473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_(NULL) { 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->AddObserver(this); 475f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->window_->GetRootWindow()) 478f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->window_->GetRootWindow()->AddObserver(this); 479f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~WindowObserver() { 4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->window_->RemoveObserver(this); 484a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (view_->window_->GetHost()) 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) view_->window_->GetHost()->RemoveObserver(this); 486116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window_) 487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_->RemoveObserver(this); 488f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window_) { 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const aura::Window::Windows& children = host_window_->children(); 491f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 492f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 493f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 494f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_window->RemoveObserver(this); 498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overridden from aura::WindowObserver: 5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnWindowHierarchyChanged( 5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const aura::WindowObserver::HierarchyChangeParams& params) OVERRIDE { 5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (params.receiver != view_->window_.get() || 5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) !params.target->Contains(view_->window_.get())) { 5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return; 5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Use the new parent's root window for calculating HiDPI subpixel offset. 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderWidgetHostViewAura* rwhv = ToRenderWidgetHostViewAura( 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (rwhv) 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rwhv->SnapToPhysicalPixelBoundary(); 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Constrained windows are added as children of the parent's parent's view 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // which may overlap with windowed NPAPI plugins. In that case, tell the RWHV 523f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // so that it can update the plugins' cutout rects accordingly. 524f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Note: this is hard coding how Chrome layer adds its dialogs. Since NPAPI is 525f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // going to be deprecated in a year, this is ok for now. The test for this is 526f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // PrintPreviewTest.WindowedNPAPIPluginHidden. 527f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE { 528116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!new_window->Contains(view_->window_.get())) { 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Skip the case when the parent moves to the root window. 530116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (new_window != host_window_) { 5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Observe sibling windows of the WebContents, or children of the root 5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // window. 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (new_window->parent() == host_window_ || 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_window->parent() == view_->window_->GetRootWindow()) { 5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new_window->AddObserver(this); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 540116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (new_window->parent() == host_window_) { 541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE { 546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) 547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 549f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->RemoveObserver(this); 550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(window); 551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnWindowVisibilityChanged(aura::Window* window, 554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool visible) OVERRIDE { 5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (window == view_->window_ || 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window->parent() == host_window_ || 557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->parent() == view_->window_->GetRootWindow()) { 558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 561f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 562f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowParentChanged(aura::Window* window, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* parent) OVERRIDE { 565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window != view_->window_) 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 567116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 568116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch aura::Window* host_window = 569116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window->GetProperty(aura::client::kHostWindowKey); 570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!host_window) 571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window = parent; 572116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 573116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window_) 574116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_->RemoveObserver(this); 575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 577116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window_) { 578116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const aura::Window::Windows& children = host_window_->children(); 579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) 580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->RemoveObserver(this); 5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RenderWidgetHostViewAura* rwhv = ToRenderWidgetHostViewAura( 5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (rwhv) 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch rwhv->UpdateConstrainedWindowRects(std::vector<gfx::Rect>()); 585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // When we get parented to the root window, the code below will watch the 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // host window, aka root window. Since we already watch the root window on 589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Windows, unregister first so that the debug check doesn't fire. 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window && host_window == window->GetRootWindow()) 591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window->RemoveObserver(this); 592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We need to undo the above if we were parented to the root window and then 594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // got parented to another window. At that point, the code before the ifdef 595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // would have stopped watching the root window. 596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window->GetRootWindow() && 597116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window != window->GetRootWindow() && 598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !window->GetRootWindow()->HasObserver(this)) { 599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 603116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_ = host_window; 604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window) { 605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window->AddObserver(this); 606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window != window->GetRootWindow()) { 608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const aura::Window::Windows& children = host_window->children(); 609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!children[i]->Contains(view_->window_.get())) 611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->AddObserver(this); 612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowBoundsChanged(aura::Window* window, 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& old_bounds, 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE { 621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (window == host_window_ || window == view_->window_) { 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SendScreenRects(); 623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (view_->touch_editable_) 624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) view_->touch_editable_->UpdateEditingController(); 625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) UpdateConstrainedWindows(NULL); 628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 629f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void OnWindowDestroying(aura::Window* window) OVERRIDE { 633116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (window == host_window_) { 634116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_->RemoveObserver(this); 635116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch host_window_ = NULL; 636116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 637116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 638116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE { 640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window->GetHost()->AddObserver(this); 642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!window->GetRootWindow()->HasObserver(this)) 644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->AddObserver(this); 645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 646f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 649effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch virtual void OnWindowRemovingFromRootWindow(aura::Window* window, 650effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch aura::Window* new_root) OVERRIDE { 651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (window == view_->window_) { 652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) window->GetHost()->RemoveObserver(this); 653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->RemoveObserver(this); 655f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 656f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = 657f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window->GetRootWindow()->children(); 658f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 659116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (root_children[i] != view_->window_ && 660116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch root_children[i] != host_window_) { 661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->RemoveObserver(this); 662116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 663f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 664f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 665f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 668a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Overridden WindowTreeHostObserver: 669a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void OnHostMoved(const aura::WindowTreeHost* host, 670a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const gfx::Point& new_origin) OVERRIDE { 671f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TRACE_EVENT1("ui", 672a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) "WebContentsViewAura::WindowObserver::OnHostMoved", 673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) "new_origin", new_origin.ToString()); 674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is for the desktop case (i.e. Aura desktop). 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendScreenRects() { 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())-> 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendScreenRects(); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateConstrainedWindows(aura::Window* exclude) { 687c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view_->web_contents_->GetRenderWidgetHostView()); 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!view) 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<gfx::Rect> constrained_windows; 693116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (host_window_) { 694116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const aura::Window::Windows& children = host_window_->children(); 695f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < children.size(); ++i) { 696116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!children[i]->Contains(view_->window_.get()) && 697f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i] != exclude && 698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) children[i]->IsVisible()) { 699f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back(children[i]->GetBoundsInRootWindow()); 700f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) aura::Window* root_window = view_->window_->GetRootWindow(); 705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const aura::Window::Windows& root_children = root_window->children(); 706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_window) { 707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < root_children.size(); ++i) { 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (root_children[i]->IsVisible() && 709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) !root_children[i]->Contains(view_->window_.get())) { 710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) constrained_windows.push_back( 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) root_children[i]->GetBoundsInRootWindow()); 712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->UpdateConstrainedWindowRects(constrained_windows); 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContentsViewAura* view_; 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 722116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The parent window that hosts the constrained windows. We cache the old host 723116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // view so that we can unregister when it's not the parent anymore. 724116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch aura::Window* host_window_; 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WindowObserver); 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public: 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura( 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsImpl* web_contents, 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebContentsViewDelegate* delegate) 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : web_contents_(web_contents), 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate), 737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) current_drag_op_(blink::WebDragOperationNone), 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_(NULL), 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_rvh_for_drag_(NULL), 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_change_brightness_(false), 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_(OVERSCROLL_NONE), 742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) completed_overscroll_gesture_(OVERSCROLL_NONE), 743116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch touch_editable_(TouchEditableImplAura::Create()), 744116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_or_was_visible_(false) { 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private: 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() { 7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!window_) 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_observer_.reset(); 755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) window_->RemoveObserver(this); 756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Window needs a valid delegate during its destructor, so we explicitly 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // delete it here. 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_.reset(); 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 762c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::SetTouchEditableForTest( 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TouchEditableImplAura* touch_editable) { 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_.reset(touch_editable); 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->SetSize(size); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderWidgetHostView(); 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->SetSize(size); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::EndDrag(blink::WebDragOperationsMask ops) { 7781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_loc = 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point client_loc = screen_loc; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* rvh = web_contents_->GetRenderViewHost(); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* window = rvh->GetView()->GetNativeView(); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window::ConvertPointToTarget(root_window, window, &client_loc); 785c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!web_contents_) 786c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 787c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(), 788c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) screen_loc.x(), screen_loc.y(), ops); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 791a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::InstallOverscrollControllerDelegate( 79246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RenderWidgetHostViewAura* view) { 793a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string value = CommandLine::ForCurrentProcess()-> 794a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) GetSwitchValueASCII(switches::kOverscrollHistoryNavigation); 795a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value == "0") { 796a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(); 797a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 798a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 799a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (value == "2") { 800a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(); 801a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!gesture_nav_simple_) 802a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) gesture_nav_simple_.reset(new GestureNavSimple(web_contents_)); 80346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) view->overscroll_controller()->set_delegate(gesture_nav_simple_.get()); 804a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 805a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 80646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) view->overscroll_controller()->set_delegate(this); 807a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!navigation_overlay_) 808a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 809a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 810a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() { 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If there is an existing |overscroll_window_| which is in the middle of an 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // animation, then destroying the window here causes the animation to be 8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // completed immidiately, which triggers |OnImplicitAnimationsCompleted()| 8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // callback, and that tries to reset |overscroll_window_| again, causing a 8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // double-free. So use a temporary variable here. 817c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (overscroll_window_) { 8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::AutoReset<OverscrollMode> reset_state(¤t_overscroll_gesture_, 8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<aura::Window> reset_window(overscroll_window_.release()); 8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate( 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_, 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(new aura::Window(overscroll_delegate)); 8275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) overscroll_window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetTransparent(true); 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) overscroll_window_->Init(aura::WINDOW_LAYER_TEXTURED); 830c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_->layer()->SetMasksToBounds(false); 8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetName("OverscrollOverlay"); 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 833c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_change_brightness_ = overscroll_delegate->has_image(); 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->AddChild(overscroll_window_.get()); 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect bounds = gfx::Rect(window_->bounds().size()); 8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_)) { 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The overlay will be sliding in from the right edge towards the left in 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // non-RTL, or sliding in from the left edge towards the right in RTL. 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // So position the overlay window accordingly. 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0); 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* animate_window = GetWindowToAnimateForOverscroll(); 846c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (animate_window == overscroll_window_) 847c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView()); 848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else 849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView()); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SetBounds(bounds); 8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->Show(); 855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) overscroll_shadow_.reset(new ShadowLayerDelegate(animate_window->layer())); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() { 860b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 861c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 862b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) content->layer()->GetAnimator()->AbortAllAnimations(); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->SetTransform(gfx::Transform()); 8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() { 8682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!target) 8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(gfx::Transform()); 8802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 8812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 8822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 885d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(0.f); 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) { 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!web_contents_->GetRenderWidgetHostView()) 8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Animate out the current view first. Navigate to the requested history at 8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the end of the animation. 8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated", 9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_, OVERSCROLL_COUNT); 901b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 902b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) overscroll_window_->delegate()); 903b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) delegate->stop_forwarding_events(); 9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = mode; 9062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator()); 9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.SetPreemptionStrategy( 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET); 910d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) settings.SetTweenType(gfx::Tween::EASE_OUT); 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) settings.AddObserver(this); 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int content_width = 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()->GetViewBounds().width(); 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width; 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) transform.Translate(translate_x, 0); 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) target->SetTransform(transform); 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UpdateOverscrollWindowBrightness(translate_x); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() { 9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return ShouldNavigateForward(web_contents_->GetController(), 9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_) ? 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_window_.get() : GetContentNativeView(); 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x, 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int delta_y) { 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NORTH || 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ == OVERSCROLL_SOUTH) { 934bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch return gfx::Vector2d(0, delta_y); 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For horizontal overscroll, scroll freely if a navigation is possible. Do a 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // resistive scroll otherwise. 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const NavigationControllerImpl& controller = web_contents_->GetController(); 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Rect& bounds = GetViewBounds(); 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, current_overscroll_gesture_)) 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (ShouldNavigateBack(controller, current_overscroll_gesture_)) 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(std::min(bounds.width(), delta_x), 0); 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Vector2d(); 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() { 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>( 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->delegate()); 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_->SchedulePaintInRect( 9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect(overscroll_window_->bounds().size())); 952eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size())); 953eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch overscroll_window_->SetTransform(gfx::Transform()); 9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(), 955eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch delegate); 9565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) { 9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!overscroll_change_brightness_) 9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMin = -.1f; 9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const float kBrightnessMax = -.01f; 9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float ratio = fabs(delta_x) / GetViewBounds().width(); 9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = std::min(1.f, ratio); 9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (base::i18n::IsRTL()) 9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ratio = 1.f - ratio; 9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ? 9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) : 9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin); 9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::max(kBrightnessMin, brightness); 9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) brightness = std::min(kBrightnessMax, brightness); 9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* window = GetWindowToAnimateForOverscroll(); 9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window->layer()->SetLayerBrightness(brightness); 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 979c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::AttachTouchEditableToRenderView() { 980c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!touch_editable_) 981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return; 982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) RenderWidgetHostViewAura* rwhva = ToRenderWidgetHostViewAura( 983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) touch_editable_->AttachToView(rwhva); 985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 986c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 987bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid WebContentsViewAura::OverscrollUpdateForWebContentsDelegate(int delta_y) { 988bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (web_contents_->GetDelegate() && IsScrollEndEffectEnabled()) 989bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch web_contents_->GetDelegate()->OverscrollUpdate(delta_y); 990bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch} 991bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation: 9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const { 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_.get(); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const { 10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return rwhv ? rwhv->GetNativeView() : NULL; 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const { 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return window_->GetToplevelWindow(); 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const { 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *out = window_->GetBoundsInScreen(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) { 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->bounds(); 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (bounds.size() != size) { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_size(size); 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->SetBounds(bounds); 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our size matches what we want but the renderers size may not match. 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pretend we were resized so that the renderers size is updated too. 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(size); 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() { 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetInterstitialPage()) { 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetInterstitialPage()->Focus(); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delegate_.get() && delegate_->Focus()) 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rwhv) 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rwhv->Focus(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() { 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->FocusLocationBarByDefault()) 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->SetFocusToLocationBar(false); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Focus(); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() { 1046c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->StoreFocus(); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() { 1051c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->RestoreFocus(); 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDropData* WebContentsViewAura::GetDropData() const { 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return current_drop_data_.get(); 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const { 10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return window_->GetBoundsInScreen(); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1064010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation: 10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView( 10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& initial_size, gfx::NativeView context) { 10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // NOTE: we ignore |initial_size| since in some cases it's wrong (such as 10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the bookmark bar is not shown and you create a new tab). The right 10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value is set shortly after this, so its safe to ignore. 10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) aura::Env::CreateInstance(true); 10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_.reset(new aura::Window(this)); 10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->set_owned_by_parent(false); 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->SetType(ui::wm::WINDOW_TYPE_CONTROL); 10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetTransparent(false); 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) window_->Init(aura::WINDOW_LAYER_NOT_DRAWN); 1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) window_->AddObserver(this); 10791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = context ? context->GetRootWindow() : NULL; 10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // There are places where there is no context currently because object 10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // hierarchies are built before they're attached to a Widget. (See 10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // views::WebView as an example; GetWidget() returns NULL at the point 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // where we are created.) 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It should be OK to not set a default parent since such users will 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // explicitly add this WebContentsViewAura to their tree after they create 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // us. 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (root_window) { 10901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::client::ParentWindowWithContext( 10911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) window_.get(), root_window, root_window->GetBoundsInScreen()); 10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->layer()->SetMasksToBounds(true); 10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) window_->SetName("WebContentsViewAura"); 10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1097f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WindowObserver is not interesting and is problematic for Browser Plugin 1098f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // guests. 1099f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The use cases for WindowObserver do not apply to Browser Plugins: 1100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1) guests do not support NPAPI plugins. 1101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2) guests' window bounds are supposed to come from its embedder. 1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!BrowserPluginGuest::IsGuest(web_contents_)) 1103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) window_observer_.reset(new WindowObserver(this)); 11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // delegate_->GetDragDestDelegate() creates a new delegate on every call. 11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Hence, we save a reference to it locally. Similar model is used on other 11072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // platforms as well. 1108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) drag_dest_delegate_ = delegate_->GetDragDestDelegate(); 11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget( 11132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 11142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (render_widget_host->GetView()) { 11152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // During testing, the view will already be set up in most cases to the 11162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // test view, so we don't want to clobber it with a real one. To verify that 11172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this actually is happening (and somebody isn't accidentally creating the 11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // view twice), we check for the RVH Factory, which will be set when we're 11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // making special ones (which go along with the special views). 11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(RenderViewHostFactory::has_factory()); 1121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return static_cast<RenderWidgetHostViewBase*>( 1122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) render_widget_host->GetView()); 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 112546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RenderWidgetHostViewAura* view = 112646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new RenderWidgetHostViewAura(render_widget_host); 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) view->InitAsChild(NULL); 1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetNativeView()->AddChild(view->GetNativeView()); 11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) { 11315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 11322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl* host_impl = 113558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) RenderWidgetHostImpl::From(render_widget_host); 113658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 113758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!host_impl->is_hidden()) 113858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) view->Show(); 11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // We listen to drag drop events in the newly created view's window. 11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::client::SetDragDropDelegate(view->GetNativeView(), this); 11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 114346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (view->overscroll_controller() && 11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (!web_contents_->GetDelegate() || 11452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetDelegate()->CanOverscrollContent())) { 114646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InstallOverscrollControllerDelegate(view); 11472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return view; 11512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForPopupWidget( 11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidgetHost* render_widget_host) { 1155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return new RenderWidgetHostViewAura(render_widget_host); 11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1158a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsViewAura::SetPageTitle(const base::string16& title) { 1159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch window_->SetTitle(title); 11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) { 11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) { 11665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (navigation_overlay_.get() && navigation_overlay_->has_window()) 11675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) navigation_overlay_->StartObserving(); 1168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AttachTouchEditableToRenderView(); 11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) { 117246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RenderWidgetHostViewAura* view = 117346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ToRenderWidgetHostViewAura(web_contents_->GetRenderWidgetHostView()); 117446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (view) { 117546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) view->SetOverscrollControllerEnabled(enabled); 11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (enabled) 117746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InstallOverscrollControllerDelegate(view); 11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1180868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (!enabled) 1181868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) navigation_overlay_.reset(); 1182868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) else if (!navigation_overlay_) 1183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_)); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation: 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(RenderFrameHost* render_frame_host, 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const ContextMenuParams& params) { 1191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (touch_editable_) { 11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_editable_->EndTouchEditing(false); 1193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 1194424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (delegate_) { 11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_->ShowContextMenu(render_frame_host, params); 1196424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // WARNING: we may have been deleted during the call to ShowContextMenu(). 1197424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) } 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging( 1201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const DropData& drop_data, 1202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask operations, 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::ImageSkia& image, 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Vector2d& image_offset, 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const DragEventSourceInfo& event_info) { 12061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) aura::Window* root_window = GetNativeView()->GetRootWindow(); 1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!aura::client::GetDragDropClient(root_window)) { 1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (touch_editable_) 12135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) touch_editable_->EndTouchEditing(false); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider(); 12165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) PrepareDragData(drop_data, provider, web_contents_); 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData data(provider); // takes ownership of |provider|. 12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1220f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!image.isNull()) 1221f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) drag_utils::SetDragImageOnDataObject(image, image_offset, &data); 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebDragSourceAura> drag_source( 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new WebDragSourceAura(GetNativeView(), web_contents_)); 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need to enable recursive tasks on the message loop so we can get 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updates while in the system DoDragDrop loop. 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int result_op = 0; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::NativeView content_native_view = GetContentNativeView(); 1231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::ScopedNestableTaskAllower allow( 1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::MessageLoop::current()); 1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) result_op = aura::client::GetDragDropClient(root_window) 1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ->StartDragAndDrop(data, 1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_window, 1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_native_view, 1237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_location, 1238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ConvertFromWeb(operations), 1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) event_info.event_source); 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bail out immediately if the contents view window is gone. Note that it is 1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not safe to access any class members in this case since |this| may already 1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // be destroyed. The local variable |drag_source| will still be valid though, 1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // so we can use it to determine if the window is gone. 1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!drag_source->window()) { 1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Note that in this case, we don't need to call SystemDragEnded() since the 1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // renderer is going away. 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EndDrag(ConvertToWeb(result_op)); 1253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) web_contents_->SystemDragEnded(); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(blink::WebDragOperation operation) { 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drag_op_ = operation; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() { 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate()) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->WebContentsFocused(web_contents_); 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) { 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (web_contents_->GetDelegate() && 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) && 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_.get()) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->TakeFocus(reverse); 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation: 12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Rect WebContentsViewAura::GetVisibleBounds() const { 12771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView(); 12781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) if (!rwhv || !rwhv->IsShowing()) 12791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return gfx::Rect(); 12801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 12811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return rwhv->GetViewBounds(); 12821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)} 12831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) { 12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (current_overscroll_gesture_ == OVERSCROLL_NONE) 12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y); 12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Transform transform; 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1292bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Vertical overscrolls don't participate in the navigation gesture. 1293bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ != OVERSCROLL_NORTH && 1294bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ != OVERSCROLL_SOUTH) { 1295bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch transform.Translate(translate.x(), translate.y()); 1296bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch target->SetTransform(transform); 1297bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch UpdateOverscrollWindowBrightness(delta_x); 1298bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1299bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 1300bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(translate.y()); 13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) { 13042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT); 1305bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 13062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NavigationControllerImpl& controller = web_contents_->GetController(); 13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(controller, mode) || 13082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ShouldNavigateBack(controller, mode)) { 13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CompleteOverscrollNavigation(mode); 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode, 13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverscrollMode new_mode) { 13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Reset any in-progress overscroll animation first. 13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetOverscrollTransform(); 13202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (new_mode != OVERSCROLL_NONE && touch_editable_) 132258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollStarted(); 132358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (new_mode == OVERSCROLL_NONE || 1325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) !GetContentNativeView() || 1326bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ((new_mode == OVERSCROLL_EAST || new_mode == OVERSCROLL_WEST) && 1327bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch navigation_overlay_.get() && navigation_overlay_->has_window())) { 13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 1329bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch OverscrollUpdateForWebContentsDelegate(0); 13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) aura::Window* target = GetWindowToAnimateForOverscroll(); 1332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) if (target) { 1333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) StopObservingImplicitAnimations(); 1334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) target->layer()->GetAnimator()->AbortAllAnimations(); 1335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) } 13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Cleanup state of the content window first, because that can reset the 13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // value of |current_overscroll_gesture_|. 13382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrepareContentWindowForOverscroll(); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = new_mode; 1341bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch if (current_overscroll_gesture_ == OVERSCROLL_EAST || 1342bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch current_overscroll_gesture_ == OVERSCROLL_WEST) 1343bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch PrepareOverscrollWindow(); 13442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 13482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation: 13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() { 1354c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) overscroll_shadow_.reset(); 1355c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ShouldNavigateForward(web_contents_->GetController(), 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoForward(); 1359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PrepareOverscrollNavigationOverlay(); 13602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (ShouldNavigateBack(web_contents_->GetController(), 13612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_)) { 13622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) web_contents_->GetController().GoBack(); 1363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch PrepareOverscrollNavigationOverlay(); 136458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 136558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (touch_editable_) 136658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) touch_editable_->OverscrollCompleted(); 13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) aura::Window* content = GetContentNativeView(); 1370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (content) { 1371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->SetTransform(gfx::Transform()); 1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content->layer()->SetLayerBrightness(0.f); 13732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 13742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) current_overscroll_gesture_ = OVERSCROLL_NONE; 13752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) completed_overscroll_gesture_ = OVERSCROLL_NONE; 13762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 13772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation: 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const { 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Size(); 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const { 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(); 13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds, 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) { 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SizeChangedCommon(new_bounds.size()); 1393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (delegate_) 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->SizeChanged(new_bounds.size()); 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constrained web dialogs, need to be kept centered over our content area. 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < window_->children().size(); i++) { 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_->children()[i]->GetProperty( 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::client::kConstrainedWindowKey)) { 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = window_->children()[i]->bounds(); 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bounds.set_origin( 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point((new_bounds.width() - bounds.width()) / 2, 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (new_bounds.height() - bounds.height()) / 2)); 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) window_->children()[i]->SetBounds(bounds); 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) { 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::kNullCursor; 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const { 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return HTCLIENT; 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling( 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) aura::Window* child, 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location) { 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() { 14248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Do not take the focus if the render widget host view aura is gone or 14258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // is in the process of shutting down because neither the view window nor 14268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // this window can handle key events. 14278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura( 14288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) web_contents_->GetRenderWidgetHostView()); 14298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) if (view != NULL && !view->IsClosing()) 14308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return true; 14318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 14328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return false; 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() { 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) { 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged( 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor) { 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying(aura::Window* window) { 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This means the destructor is going to be called soon. If there is an 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL), 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // then destroying it in the WebContentsViewAura destructor can trigger other 14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So 14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // destroy the overscroll window here. 14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) navigation_overlay_.reset(); 14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) overscroll_window_.reset(); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed(aura::Window* window) { 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) { 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const { 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const { 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation: 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) { 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) { 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!web_contents_->GetDelegate()) 14762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (event->type()) { 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ActivateContents(web_contents_); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ui::ET_MOUSE_MOVED: 14837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch case ui::ET_MOUSE_EXITED: 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetDelegate()->ContentsMouseEvent( 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_, 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 14877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch event->type() == ui::ET_MOUSE_MOVED); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation: 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) { 1498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_rvh_for_drag_ = web_contents_->GetRenderViewHost(); 1499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch current_drop_data_.reset(new DropData()); 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PrepareDropData(current_drop_data_.get(), event.data()); 1502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Give the delegate an opportunity to cancel the drag. 1505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_contents_->GetDelegate() && 1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch !web_contents_->GetDelegate()->CanDragEnter( 1507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_, *current_drop_data_.get(), op)) { 1508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_drop_data_.reset(NULL); 1509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (drag_dest_delegate_) 1513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) drag_dest_delegate_->DragInitialize(web_contents_); 1514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragEnter( 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *current_drop_data_.get(), event.location(), screen_pt, op, 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) { 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnReceiveDragData(event.data()); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragEnter(); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) { 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!current_drop_data_) 1533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 1534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations()); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point screen_pt = 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(); 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragOver( 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), screen_pt, op, 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragOver(); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ConvertFromWeb(current_drag_op_); 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() { 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!current_drop_data_) 1554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDragLeave(); 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDragLeave(); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) { 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(current_rvh_for_drag_); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost()) 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OnDragEntered(event); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!current_drop_data_) 1569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ui::DragDropTypes::DRAG_NONE; 1570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) web_contents_->GetRenderViewHost()->DragTargetDrop( 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event.location(), 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(), 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConvertAuraEventFlagsToWebInputEventModifiers(event.flags())); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (drag_dest_delegate_) 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) drag_dest_delegate_->OnDrop(); 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_drop_data_.reset(); 15785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return ConvertFromWeb(current_drag_op_); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsViewAura::OnWindowParentChanged(aura::Window* window, 1582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) aura::Window* parent) { 1583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ignore any visibility changes in the hierarchy below. 1584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (window != window_.get() && window_->Contains(window)) 1585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // On Windows we will get called with a parent of NULL as part of the shut 1588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // down process. As such we do only change the visibility when a parent gets 1589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // set. 1590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (parent) 1591116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UpdateWebContentsVisibility(window->IsVisible()); 1592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsViewAura::OnWindowVisibilityChanged(aura::Window* window, 1595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool visible) { 1596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Ignore any visibility changes in the hierarchy below. 1597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (window != window_.get() && window_->Contains(window)) 1598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1600116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch UpdateWebContentsVisibility(visible); 1601116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 1602116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1603116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentsViewAura::UpdateWebContentsVisibility(bool visible) { 1604116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!is_or_was_visible_) { 1605116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // We should not hide the web contents before it was shown the first time, 1606116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // since resources would immediately be destroyed and only re-created after 1607116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // content got loaded. In this state the window content is undefined and can 1608116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // show garbage. 1609116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // However - the page load mechanism requires an activation call through a 1610116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // visibility call to (re)load. 1611116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (visible) { 1612116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch is_or_was_visible_ = true; 1613116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->WasShown(); 1614116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1615116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 1616116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1617116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (visible) { 1618116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_contents_->should_normally_be_visible()) 1619116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->WasShown(); 1620116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 1621116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (web_contents_->should_normally_be_visible()) 1622116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch web_contents_->WasHidden(); 1623116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 1627