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)
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Update the |web contents| to be |visible|.
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void UpdateWebContentsVisibility(WebContentsImpl* web_contents, bool visible) {
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (visible) {
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (!web_contents->should_normally_be_visible())
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents->WasShown();
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (web_contents->should_normally_be_visible())
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      web_contents->WasHidden();
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostViewAura* ToRenderWidgetHostViewAura(
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostView* view) {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!view || RenderViewHostFactory::has_factory())
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;  // Can't cast to RenderWidgetHostViewAura in unit tests.
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RenderViewHost* rvh = RenderViewHost::From(view->GetRenderWidgetHost());
119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  WebContentsImpl* web_contents = static_cast<WebContentsImpl*>(
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      rvh ? WebContents::FromRenderViewHost(rvh) : NULL);
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (BrowserPluginGuest::IsGuest(web_contents))
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return static_cast<RenderWidgetHostViewAura*>(view);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed.
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OverscrollWindowDelegate : public ImageWindowDelegate {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate(WebContentsImpl* web_contents,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           OverscrollMode overscroll_mode)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : web_contents_(web_contents),
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forward_events_(true) {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationControllerImpl& controller = web_contents->GetController();
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationEntryImpl* entry = NULL;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ShouldNavigateForward(controller, overscroll_mode)) {
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(1));
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (ShouldNavigateBack(controller, overscroll_mode)) {
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(-1));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Image image;
1467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (entry && entry->screenshot().get()) {
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::vector<gfx::ImagePNGRep> image_reps;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(),
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          ui::GetScaleFactorForNativeView(web_contents_window())));
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      image = gfx::Image(image_reps);
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetImage(image);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void stop_forwarding_events() { forward_events_ = false; }
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverscrollWindowDelegate() {}
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* web_contents_window() {
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return web_contents_->GetView()->GetContentNativeView();
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler.
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnScrollEvent(event);
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnGestureEvent(event);
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  WebContentsImpl* web_contents_;
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The window is displayed both during the gesture, and after the gesture
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // while the navigation is in progress. During the gesture, it is necessary to
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // forward input events to the content page (e.g. when the overscroll window
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // slides under the cursor and starts receiving scroll events). However, once
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the gesture is complete, and the window is being displayed as an overlay
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window during navigation, events should not be forwarded anymore.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool forward_events_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate);
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer.
190c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass WebDragSourceAura : public NotificationObserver {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDragSourceAura(aura::Window* window, WebContentsImpl* contents)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : window_(window),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents_(contents) {
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    registrar_.Add(this,
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Source<WebContents>(contents));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDragSourceAura() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // NotificationObserver:
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NotificationSource& source,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NotificationDetails& details) OVERRIDE {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type != NOTIFICATION_WEB_CONTENTS_DISCONNECTED)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel the drag if it is still in progress.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::client::DragDropClient* dnd_client =
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aura::client::GetDragDropClient(window_->GetRootWindow());
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dnd_client && dnd_client->IsDragDropInProgress())
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dnd_client->DragCancel();
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_ = NULL;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents_ = NULL;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window() const { return window_; }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* contents_;
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationRegistrar registrar_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN)
23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Fill out the OSExchangeData with a file contents, synthesizing a name if
23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// necessary.
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)void PrepareDragForFileContents(const DropData& drop_data,
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                ui::OSExchangeData::Provider* provider) {
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  base::FilePath file_name =
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      base::FilePath::FromUTF16Unsafe(drop_data.file_description_filename);
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Images without ALT text will only have a file extension so we need to
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // synthesize one from the provided extension and URL.
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (file_name.BaseName().RemoveExtension().empty()) {
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    const base::FilePath::StringType extension = file_name.Extension();
24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    // Retrieve the name from the URL.
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    file_name = net::GenerateFileName(drop_data.url, "", "", "", "", "")
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                    .ReplaceExtension(extension);
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  provider->SetFileContents(file_name, drop_data.file_contents);
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if defined(OS_WIN)
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void PrepareDragForDownload(
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const DropData& drop_data,
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::OSExchangeData::Provider* provider,
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    WebContentsImpl* web_contents) {
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const GURL& page_url = web_contents->GetLastCommittedURL();
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const std::string& page_encoding = web_contents->GetEncoding();
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Parse the download metadata.
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 mime_type;
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath file_name;
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  GURL download_url;
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!ParseDownloadMetadata(drop_data.download_metadata,
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             &mime_type,
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             &file_name,
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             &download_url))
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Generate the file name based on both mime type and proposed file name.
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string default_name =
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      GetContentClient()->browser()->GetDefaultDownloadName();
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath generated_download_file_name =
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      net::GenerateFileName(download_url,
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            std::string(),
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            std::string(),
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::UTF16ToUTF8(file_name.value()),
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            base::UTF16ToUTF8(mime_type),
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                            default_name);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // http://crbug.com/332579
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::ThreadRestrictions::ScopedAllowIO allow_file_operations;
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath temp_dir_path;
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!base::CreateNewTempDirectory(FILE_PATH_LITERAL("chrome_drag"),
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    &temp_dir_path))
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::FilePath download_path =
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      temp_dir_path.Append(generated_download_file_name);
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // We cannot know when the target application will be done using the temporary
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // file, so schedule it to be deleted after rebooting.
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DeleteFileAfterReboot(download_path);
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::DeleteFileAfterReboot(temp_dir_path);
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Provide the data as file (CF_HDROP). A temporary download file with the
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Zone.Identifier ADS (Alternate Data Stream) attached will be created.
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<DragDownloadFile> download_file =
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      new DragDownloadFile(
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          download_path,
299c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch          base::File(),
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          download_url,
3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          Referrer(page_url, drop_data.referrer_policy),
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          page_encoding,
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          web_contents);
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ui::OSExchangeData::DownloadFileInfo file_download(base::FilePath(),
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                     download_file.get());
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  provider->SetDownloadFileInfo(file_download);
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif  // defined(OS_WIN)
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Returns the CustomFormat to store file system files.
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst ui::OSExchangeData::CustomFormat& GetFileSystemFileCustomFormat() {
3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  static const char kFormatString[] = "chromium/x-file-system-files";
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  CR_DEFINE_STATIC_LOCAL(ui::OSExchangeData::CustomFormat,
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                         format,
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                         (ui::Clipboard::GetFormatType(kFormatString)));
3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return format;
3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Writes file system files to the pickle.
3200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid WriteFileSystemFilesToPickle(
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const std::vector<DropData::FileSystemFileInfo>& file_system_files,
3220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Pickle* pickle) {
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  pickle->WriteUInt64(file_system_files.size());
3240529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (size_t i = 0; i < file_system_files.size(); ++i) {
3250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    pickle->WriteString(file_system_files[i].url.spec());
3260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    pickle->WriteInt64(file_system_files[i].size);
3270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Reads file system files from the pickle.
3310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochbool ReadFileSystemFilesFromPickle(
3320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const Pickle& pickle,
3330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::vector<DropData::FileSystemFileInfo>* file_system_files) {
3340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  PickleIterator iter(pickle);
3350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  uint64 num_files = 0;
3370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!pickle.ReadUInt64(&iter, &num_files))
3380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    return false;
3390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  file_system_files->resize(num_files);
3400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  for (uint64 i = 0; i < num_files; ++i) {
3420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    std::string url_string;
3430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int64 size = 0;
3440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!pickle.ReadString(&iter, &url_string) ||
3450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        !pickle.ReadInt64(&iter, &size))
3460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return false;
3470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3480529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    GURL url(url_string);
3490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    if (!url.is_valid())
3500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return false;
3510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    (*file_system_files)[i].url = url;
3530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    (*file_system_files)[i].size = size;
3540529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return true;
3560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
3570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
358eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a ui::OSExchangeDataProvider object from DropData.
359eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDragData(const DropData& drop_data,
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     ui::OSExchangeData::Provider* provider,
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                     WebContentsImpl* web_contents) {
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  provider->MarkOriginatedFromRenderer();
36358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#if defined(OS_WIN)
3645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Put download before file contents to prefer the download of a image over
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // its thumbnail link.
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!drop_data.download_metadata.empty())
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrepareDragForDownload(drop_data, provider, web_contents);
368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#endif
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#if (!defined(OS_CHROMEOS) && defined(USE_X11)) || defined(OS_WIN)
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // We set the file contents before the URL because the URL also sets file
37158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // contents (to a .URL shortcut).  We want to prefer file content data over
37258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // a shortcut so we add it first.
37358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!drop_data.file_contents.empty())
37458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    PrepareDragForFileContents(drop_data, provider);
37558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.text.string().empty())
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetString(drop_data.text.string());
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drop_data.url.is_valid())
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetURL(drop_data.url, drop_data.url_title);
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.html.string().empty())
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetHtml(drop_data.html.string(), drop_data.html_base_url);
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (!drop_data.filenames.empty())
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    provider->SetFilenames(drop_data.filenames);
3840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (!drop_data.file_system_files.empty()) {
3850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Pickle pickle;
3860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    WriteFileSystemFilesToPickle(drop_data.file_system_files, &pickle);
3870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    provider->SetPickledData(GetFileSystemFileCustomFormat(), pickle);
3880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.custom_data.empty()) {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle pickle;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             pickle);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Utility to fill a DropData object from ui::OSExchangeData.
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid PrepareDropData(DropData* drop_data, const ui::OSExchangeData& data) {
399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  drop_data->did_originate_from_renderer = data.DidOriginateFromRenderer();
400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 plain_text;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetString(&plain_text);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plain_text.empty())
4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    drop_data->text = base::NullableString16(plain_text, false);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 url_title;
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  data.GetURLAndTitle(
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ui::OSExchangeData::DO_NOT_CONVERT_FILENAMES, &url, &url_title);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url.is_valid()) {
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url = url;
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url_title = url_title;
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 html;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url;
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetHtml(&html, &html_base_url);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!html.empty())
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    drop_data->html = base::NullableString16(html, false);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (html_base_url.is_valid())
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->html_base_url = html_base_url;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  data.GetFilenames(&drop_data->filenames);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle;
4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<DropData::FileSystemFileInfo> file_system_files;
4270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (data.GetPickledData(GetFileSystemFileCustomFormat(), &pickle) &&
4280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ReadFileSystemFilesFromPickle(pickle, &file_system_files))
4290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    drop_data->file_system_files = file_system_files;
4300529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle))
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ReadCustomDataIntoMap(
43390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        pickle.data(), pickle.size(), &drop_data->custom_data);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
436f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Utilities to convert between blink::WebDragOperationsMask and
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes.
438f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int ConvertFromWeb(blink::WebDragOperationsMask ops) {
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int drag_op = ui::DragDropTypes::DRAG_NONE;
440f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ops & blink::WebDragOperationCopy)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_COPY;
442f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ops & blink::WebDragOperationMove)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_MOVE;
444f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  if (ops & blink::WebDragOperationLink)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_LINK;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return drag_op;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
449f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebDragOperationsMask ConvertToWeb(int drag_op) {
450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int web_drag_op = blink::WebDragOperationNone;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_COPY)
452f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_drag_op |= blink::WebDragOperationCopy;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_MOVE)
454f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_drag_op |= blink::WebDragOperationMove;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_LINK)
456f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_drag_op |= blink::WebDragOperationLink;
457f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return (blink::WebDragOperationsMask) web_drag_op;
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) {
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int web_input_event_modifiers = 0;
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_SHIFT_DOWN)
463f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_input_event_modifiers |= blink::WebInputEvent::ShiftKey;
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_CONTROL_DOWN)
465f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_input_event_modifiers |= blink::WebInputEvent::ControlKey;
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_ALT_DOWN)
467f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_input_event_modifiers |= blink::WebInputEvent::AltKey;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_COMMAND_DOWN)
469f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    web_input_event_modifiers |= blink::WebInputEvent::MetaKey;
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_input_event_modifiers;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver
476a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : public aura::WindowObserver, public aura::WindowTreeHostObserver {
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(WebContentsViewAura* view)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view),
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_(NULL) {
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
482f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
484f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (view_->window_->GetRootWindow())
485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      view_->window_->GetRootWindow()->AddObserver(this);
486f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (view_->window_->GetHost())
492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      view_->window_->GetHost()->RemoveObserver(this);
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
495f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (parent_) {
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const aura::Window::Windows& children = parent_->children();
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < children.size(); ++i)
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        children[i]->RemoveObserver(this);
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    aura::Window* root_window = view_->window_->GetRootWindow();
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (root_window) {
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      root_window->RemoveObserver(this);
506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const aura::Window::Windows& root_children = root_window->children();
507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < root_children.size(); ++i)
508f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        root_children[i]->RemoveObserver(this);
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
515f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Constrained windows are added as children of the parent's parent's view
516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // which may overlap with windowed NPAPI plugins. In that case, tell the RWHV
517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // so that it can update the plugins' cutout rects accordingly.
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Note: this is hard coding how Chrome layer adds its dialogs. Since NPAPI is
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // going to be deprecated in a year, this is ok for now. The test for this is
520f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // PrintPreviewTest.WindowedNPAPIPluginHidden.
521f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE {
5225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (new_window != view_->window_) {
5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      // Skip the case when the parent moves to the root window.
5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      if (new_window != parent_) {
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // Observe sibling windows of the WebContents, or children of the root
5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        // window.
5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        if (new_window->parent() == parent_ ||
5285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            new_window->parent() == view_->window_->GetRootWindow()) {
5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          new_window->AddObserver(this);
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        }
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      }
5325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
533f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (new_window->parent() == parent_) {
535f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
536f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
537f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
538f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
539f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE {
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window == view_->window_)
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      return;
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window->RemoveObserver(this);
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    UpdateConstrainedWindows(window);
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnWindowVisibilityChanged(aura::Window* window,
548f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                         bool visible) OVERRIDE {
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (window == view_->window_ ||
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        window->parent() == parent_ ||
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window->parent() == view_->window_->GetRootWindow()) {
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
553f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
554f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
555f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
556f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowParentChanged(aura::Window* window,
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     aura::Window* parent) OVERRIDE {
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window != view_->window_)
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
563f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
564f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
565f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (parent_) {
566f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const aura::Window::Windows& children = parent_->children();
567f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < children.size(); ++i)
568f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        children[i]->RemoveObserver(this);
569f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          view_->web_contents_->GetRenderWidgetHostView());
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (view)
573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        view->UpdateConstrainedWindowRects(std::vector<gfx::Rect>());
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
575f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // When we get parented to the root window, the code below will watch the
577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // parent, aka root window. Since we already watch the root window on
578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // Windows, unregister first so that the debug check doesn't fire.
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (parent && parent == window->GetRootWindow())
580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      parent->RemoveObserver(this);
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // We need to undo the above if we were parented to the root window and then
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // got parented to another window. At that point, the code before the ifdef
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    // would have stopped watching the root window.
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window->GetRootWindow() &&
586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        parent != window->GetRootWindow() &&
587f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        !window->GetRootWindow()->HasObserver(this)) {
588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window->GetRootWindow()->AddObserver(this);
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_ = parent;
593f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (parent) {
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent->AddObserver(this);
595f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
596f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (parent != window->GetRootWindow()) {
597f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        const aura::Window::Windows& children = parent->children();
598f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        for (size_t i = 0; i < children.size(); ++i) {
599f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          if (children[i] != view_->window_)
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            children[i]->AddObserver(this);
601f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
602f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
604f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window == parent_ || window == view_->window_) {
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SendScreenRects();
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (view_->touch_editable_)
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        view_->touch_editable_->UpdateEditingController();
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window == view_->window_) {
623a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      window->GetHost()->AddObserver(this);
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      if (!window->GetRootWindow()->HasObserver(this))
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        window->GetRootWindow()->AddObserver(this);
627f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
628f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
631effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void OnWindowRemovingFromRootWindow(aura::Window* window,
632effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                              aura::Window* new_root) OVERRIDE {
633f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (window == view_->window_) {
634a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      window->GetHost()->RemoveObserver(this);
635f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN)
636f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      window->GetRootWindow()->RemoveObserver(this);
637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
638f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const aura::Window::Windows& root_children =
639f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          window->GetRootWindow()->children();
640f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < root_children.size(); ++i) {
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (root_children[i] != view_->window_ && root_children[i] != parent_)
642f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          root_children[i]->RemoveObserver(this);
643f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
645f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
648a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Overridden WindowTreeHostObserver:
649a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnHostMoved(const aura::WindowTreeHost* host,
650a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                           const gfx::Point& new_origin) OVERRIDE {
651f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    TRACE_EVENT1("ui",
652a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 "WebContentsViewAura::WindowObserver::OnHostMoved",
653f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 "new_origin", new_origin.ToString());
654f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is for the desktop case (i.e. Aura desktop).
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendScreenRects();
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendScreenRects() {
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())->
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SendScreenRects();
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateConstrainedWindows(aura::Window* exclude) {
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        view_->web_contents_->GetRenderWidgetHostView());
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!view)
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> constrained_windows;
673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (parent_) {
674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const aura::Window::Windows& children = parent_->children();
675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < children.size(); ++i) {
676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (children[i] != view_->window_ &&
677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            children[i] != exclude &&
678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            children[i]->IsVisible()) {
679f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          constrained_windows.push_back(children[i]->GetBoundsInRootWindow());
680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
681f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
682f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
683f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    aura::Window* root_window = view_->window_->GetRootWindow();
685f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const aura::Window::Windows& root_children = root_window->children();
686f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (root_window) {
687f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      for (size_t i = 0; i < root_children.size(); ++i) {
688f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        if (root_children[i]->IsVisible() &&
689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            !root_children[i]->Contains(view_->window_.get())) {
690f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          constrained_windows.push_back(
691f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              root_children[i]->GetBoundsInRootWindow());
692f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        }
693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      }
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->UpdateConstrainedWindowRects(constrained_windows);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
698f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsViewAura* view_;
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // We cache the old parent so that we can unregister when it's not the parent
703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // anymore.
704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  aura::Window* parent_;
705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public:
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura(
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* web_contents,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      current_drag_op_(blink::WebDragOperationNone),
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drag_dest_delegate_(NULL),
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_rvh_for_drag_(NULL),
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_change_brightness_(false),
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_(OVERSCROLL_NONE),
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      completed_overscroll_gesture_(OVERSCROLL_NONE),
723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_editable_(TouchEditableImplAura::Create()) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private:
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() {
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!window_)
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_->RemoveObserver(this);
735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window needs a valid delegate during its destructor, so we explicitly
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete it here.
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.reset();
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
741c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::SetTouchEditableForTest(
742c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TouchEditableImplAura* touch_editable) {
743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  touch_editable_.reset(touch_editable);
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage())
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->SetSize(size);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv =
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderWidgetHostView();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->SetSize(size);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::EndDrag(blink::WebDragOperationsMask ops) {
7571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = GetNativeView()->GetRootWindow();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_loc =
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point client_loc = screen_loc;
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = web_contents_->GetRenderViewHost();
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = rvh->GetView()->GetNativeView();
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_window, window, &client_loc);
764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents_)
765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(),
767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      screen_loc.x(), screen_loc.y(), ops);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::InstallOverscrollControllerDelegate(
77146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    RenderWidgetHostViewAura* view) {
772a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  const std::string value = CommandLine::ForCurrentProcess()->
773a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      GetSwitchValueASCII(switches::kOverscrollHistoryNavigation);
774a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value == "0") {
775a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    navigation_overlay_.reset();
776a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
777a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
778a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (value == "2") {
779a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    navigation_overlay_.reset();
780a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (!gesture_nav_simple_)
781a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      gesture_nav_simple_.reset(new GestureNavSimple(web_contents_));
78246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    view->overscroll_controller()->set_delegate(gesture_nav_simple_.get());
783a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    return;
784a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
78546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  view->overscroll_controller()->set_delegate(this);
786a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (!navigation_overlay_)
787a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_));
788a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
789a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() {
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is an existing |overscroll_window_| which is in the middle of an
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation, then destroying the window here causes the animation to be
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // completed immidiately, which triggers |OnImplicitAnimationsCompleted()|
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback, and that tries to reset |overscroll_window_| again, causing a
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // double-free. So use a temporary variable here.
796c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (overscroll_window_) {
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoReset<OverscrollMode> reset_state(&current_overscroll_gesture_,
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                current_overscroll_gesture_);
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<aura::Window> reset_window(overscroll_window_.release());
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate(
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_,
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_);
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset(new aura::Window(overscroll_delegate));
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  overscroll_window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetTransparent(true);
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  overscroll_window_->Init(aura::WINDOW_LAYER_TEXTURED);
809c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_window_->layer()->SetMasksToBounds(false);
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetName("OverscrollOverlay");
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_change_brightness_ = overscroll_delegate->has_image();
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->AddChild(overscroll_window_.get());
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds = gfx::Rect(window_->bounds().size());
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_)) {
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The overlay will be sliding in from the right edge towards the left in
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // non-RTL, or sliding in from the left edge towards the right in RTL.
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So position the overlay window accordingly.
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0);
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* animate_window = GetWindowToAnimateForOverscroll();
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (animate_window == overscroll_window_)
826c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView());
827c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
828c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView());
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(0.f);
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetBounds(bounds);
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->Show();
834c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  overscroll_shadow_.reset(new ShadowLayerDelegate(animate_window->layer()));
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() {
839b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  StopObservingImplicitAnimations();
840c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* content = GetContentNativeView();
841b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content->layer()->GetAnimator()->AbortAllAnimations();
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->SetTransform(gfx::Transform());
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->layer()->SetLayerBrightness(0.f);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() {
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!target)
8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
8542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
856d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    settings.SetTweenType(gfx::Tween::EASE_OUT);
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.AddObserver(this);
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target->SetTransform(gfx::Transform());
8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
864d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    settings.SetTweenType(gfx::Tween::EASE_OUT);
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateOverscrollWindowBrightness(0.f);
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) {
8702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Animate out the current view first. Navigate to the requested history at
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the end of the animation.
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated",
8792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_, OVERSCROLL_COUNT);
880b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
881b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      overscroll_window_->delegate());
882b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  delegate->stop_forwarding_events();
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = mode;
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
889d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  settings.SetTweenType(gfx::Tween::EASE_OUT);
8902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.AddObserver(this);
8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
8922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int content_width =
8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView()->GetViewBounds().width();
8942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width;
8952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(translate_x, 0);
8962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetTransform(transform);
8972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(translate_x);
8982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() {
9012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
9022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
9032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ShouldNavigateForward(web_contents_->GetController(),
9052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               current_overscroll_gesture_) ?
906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      overscroll_window_.get() : GetContentNativeView();
9072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x,
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                               int delta_y) {
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NORTH ||
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_ == OVERSCROLL_SOUTH) {
913bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    return gfx::Vector2d(0, delta_y);
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For horizontal overscroll, scroll freely if a navigation is possible. Do a
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resistive scroll otherwise.
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NavigationControllerImpl& controller = web_contents_->GetController();
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect& bounds = GetViewBounds();
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, current_overscroll_gesture_))
9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0);
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (ShouldNavigateBack(controller, current_overscroll_gesture_))
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::min(bounds.width(), delta_x), 0);
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Vector2d();
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() {
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_window_->delegate());
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SchedulePaintInRect(
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(overscroll_window_->bounds().size()));
931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  overscroll_window_->SetBounds(gfx::Rect(window_->bounds().size()));
932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  overscroll_window_->SetTransform(gfx::Transform());
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(),
934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                        delegate);
9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  navigation_overlay_->StartObserving();
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) {
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!overscroll_change_brightness_)
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMin = -.1f;
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMax = -.01f;
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float ratio = fabs(delta_x) / GetViewBounds().width();
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ratio = std::min(1.f, ratio);
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL())
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ratio = 1.f - ratio;
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ?
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) :
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin);
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::max(kBrightnessMin, brightness);
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::min(kBrightnessMax, brightness);
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindowToAnimateForOverscroll();
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->layer()->SetLayerBrightness(brightness);
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::AttachTouchEditableToRenderView() {
959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!touch_editable_)
960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostViewAura* rwhva = ToRenderWidgetHostViewAura(
962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView());
963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  touch_editable_->AttachToView(rwhva);
964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
966bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdochvoid WebContentsViewAura::OverscrollUpdateForWebContentsDelegate(int delta_y) {
967bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (web_contents_->GetDelegate() && IsScrollEndEffectEnabled())
968bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    web_contents_->GetDelegate()->OverscrollUpdate(delta_y);
969bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch}
970bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation:
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const {
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_.get();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const {
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rwhv ? rwhv->GetNativeView() : NULL;
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const {
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->GetToplevelWindow();
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const {
9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out = window_->GetBoundsInScreen();
9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) {
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = window_->bounds();
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bounds.size() != size) {
9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_size(size);
9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(bounds);
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Our size matches what we want but the renderers size may not match.
9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pretend we were resized so that the renderers size is updated too.
9995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SizeChangedCommon(size);
10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() {
10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage()) {
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->Focus();
10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get() && delegate_->Focus())
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->Focus();
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() {
10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->FocusLocationBarByDefault())
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->SetFocusToLocationBar(false);
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Focus();
10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() {
1025c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->StoreFocus();
10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() {
1030c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RestoreFocus();
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochDropData* WebContentsViewAura::GetDropData() const {
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_drop_data_.get();
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const {
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return window_->GetBoundsInScreen();
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1043010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation:
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView(
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size& initial_size, gfx::NativeView context) {
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: we ignore |initial_size| since in some cases it's wrong (such as
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the bookmark bar is not shown and you create a new tab). The right
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // value is set shortly after this, so its safe to ignore.
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1051010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  aura::Env::CreateInstance(true);
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_.reset(new aura::Window(this));
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_owned_by_parent(false);
10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->SetType(ui::wm::WINDOW_TYPE_CONTROL);
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetTransparent(false);
10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  window_->Init(aura::WINDOW_LAYER_NOT_DRAWN);
1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  window_->AddObserver(this);
10581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = context ? context->GetRootWindow() : NULL;
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root_window) {
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // There are places where there is no context currently because object
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hierarchies are built before they're attached to a Widget. (See
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // views::WebView as an example; GetWidget() returns NULL at the point
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // where we are created.)
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It should be OK to not set a default parent since such users will
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // explicitly add this WebContentsViewAura to their tree after they create
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // us.
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root_window) {
10691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      aura::client::ParentWindowWithContext(
10701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          window_.get(), root_window, root_window->GetBoundsInScreen());
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->layer()->SetMasksToBounds(true);
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetName("WebContentsViewAura");
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1076f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // WindowObserver is not interesting and is problematic for Browser Plugin
1077f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // guests.
1078f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The use cases for WindowObserver do not apply to Browser Plugins:
1079f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 1) guests do not support NPAPI plugins.
1080f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // 2) guests' window bounds are supposed to come from its embedder.
1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!BrowserPluginGuest::IsGuest(web_contents_))
1082f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    window_observer_.reset(new WindowObserver(this));
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delegate_->GetDragDestDelegate() creates a new delegate on every call.
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Hence, we save a reference to it locally. Similar model is used on other
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platforms as well.
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drag_dest_delegate_ = delegate_->GetDragDestDelegate();
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1091010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForWidget(
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_widget_host->GetView()) {
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // During testing, the view will already be set up in most cases to the
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // test view, so we don't want to clobber it with a real one. To verify that
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this actually is happening (and somebody isn't accidentally creating the
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // view twice), we check for the RVH Factory, which will be set when we're
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // making special ones (which go along with the special views).
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(RenderViewHostFactory::has_factory());
1100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return static_cast<RenderWidgetHostViewBase*>(
1101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        render_widget_host->GetView());
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
110446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  RenderWidgetHostViewAura* view =
110546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      new RenderWidgetHostViewAura(render_widget_host);
11062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->InitAsChild(NULL);
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetNativeView()->AddChild(view->GetNativeView());
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    navigation_overlay_->StartObserving();
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
111358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  RenderWidgetHostImpl* host_impl =
111458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      RenderWidgetHostImpl::From(render_widget_host);
111558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
111658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!host_impl->is_hidden())
111758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    view->Show();
11182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We listen to drag drop events in the newly created view's window.
11202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetDragDropDelegate(view->GetNativeView(), this);
11212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
112246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (view->overscroll_controller() &&
11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!web_contents_->GetDelegate() ||
11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       web_contents_->GetDelegate()->CanOverscrollContent())) {
112546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InstallOverscrollControllerDelegate(view);
11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
11292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
11302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)RenderWidgetHostViewBase* WebContentsViewAura::CreateViewForPopupWidget(
11332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
1134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return new RenderWidgetHostViewAura(render_widget_host);
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentsViewAura::SetPageTitle(const base::string16& title) {
11382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_title(title);
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) {
11422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) {
11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window())
11465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    navigation_overlay_->StartObserving();
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
11482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) {
115146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  RenderWidgetHostViewAura* view =
115246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      ToRenderWidgetHostViewAura(web_contents_->GetRenderWidgetHostView());
115346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (view) {
115446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    view->SetOverscrollControllerEnabled(enabled);
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (enabled)
115646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      InstallOverscrollControllerDelegate(view);
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1158868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1159868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!enabled)
1160868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    navigation_overlay_.reset();
1161868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else if (!navigation_overlay_)
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    navigation_overlay_.reset(new OverscrollNavigationOverlay(web_contents_));
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation:
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(RenderFrameHost* render_frame_host,
11695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                          const ContextMenuParams& params) {
1170a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (touch_editable_) {
11715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editable_->EndTouchEditing(false);
1172a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
1173424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  if (delegate_) {
11745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    delegate_->ShowContextMenu(render_frame_host, params);
1175424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    // WARNING: we may have been deleted during the call to ShowContextMenu().
1176424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  }
11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging(
1180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const DropData& drop_data,
1181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebDragOperationsMask operations,
11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& image,
11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Vector2d& image_offset,
11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DragEventSourceInfo& event_info) {
11851e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window = GetNativeView()->GetRootWindow();
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!aura::client::GetDragDropClient(root_window)) {
1187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents_->SystemDragEnded();
11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editable_)
11925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    touch_editable_->EndTouchEditing(false);
11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider();
11955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PrepareDragData(drop_data, provider, web_contents_);
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData data(provider);  // takes ownership of |provider|.
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!image.isNull())
1200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    drag_utils::SetDragImageOnDataObject(image, image_offset, &data);
12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDragSourceAura> drag_source(
12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebDragSourceAura(GetNativeView(), web_contents_));
12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to enable recursive tasks on the message loop so we can get
12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates while in the system DoDragDrop loop.
12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_op = 0;
12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView content_native_view = GetContentNativeView();
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::ScopedNestableTaskAllower allow(
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::MessageLoop::current());
1212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result_op = aura::client::GetDragDropClient(root_window)
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ->StartDragAndDrop(data,
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           root_window,
1215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           content_native_view,
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           event_info.event_location,
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           ConvertFromWeb(operations),
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           event_info.event_source);
12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bail out immediately if the contents view window is gone. Note that it is
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // not safe to access any class members in this case since |this| may already
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // be destroyed. The local variable |drag_source| will still be valid though,
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so we can use it to determine if the window is gone.
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!drag_source->window()) {
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Note that in this case, we don't need to call SystemDragEnded() since the
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // renderer is going away.
12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndDrag(ConvertToWeb(result_op));
1232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_contents_->SystemDragEnded();
12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(blink::WebDragOperation operation) {
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drag_op_ = operation;
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() {
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate())
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetDelegate()->WebContentsFocused(web_contents_);
12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) {
12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate() &&
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) &&
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_.get()) {
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->TakeFocus(reverse);
12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation:
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)gfx::Rect WebContentsViewAura::GetVisibleBounds() const {
12561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
12571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!rwhv || !rwhv->IsShowing())
12581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return gfx::Rect();
12591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return rwhv->GetViewBounds();
12611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
12621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) {
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y);
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1271bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // Vertical overscrolls don't participate in the navigation gesture.
1272bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  if (current_overscroll_gesture_ != OVERSCROLL_NORTH &&
1273bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      current_overscroll_gesture_ != OVERSCROLL_SOUTH) {
1274bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    transform.Translate(translate.x(), translate.y());
1275bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    target->SetTransform(transform);
1276bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    UpdateOverscrollWindowBrightness(delta_x);
1277bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  }
1278bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
1279bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  OverscrollUpdateForWebContentsDelegate(translate.y());
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) {
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT);
1284bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  OverscrollUpdateForWebContentsDelegate(0);
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationControllerImpl& controller = web_contents_->GetController();
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, mode) ||
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShouldNavigateBack(controller, mode)) {
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CompleteOverscrollNavigation(mode);
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
12932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode,
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 OverscrollMode new_mode) {
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset any in-progress overscroll animation first.
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (new_mode != OVERSCROLL_NONE && touch_editable_)
130158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    touch_editable_->OverscrollStarted();
130258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
13032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_mode == OVERSCROLL_NONE ||
1304c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetContentNativeView() ||
1305bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      ((new_mode == OVERSCROLL_EAST || new_mode == OVERSCROLL_WEST) &&
1306bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch       navigation_overlay_.get() && navigation_overlay_->has_window())) {
13072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = OVERSCROLL_NONE;
1308bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    OverscrollUpdateForWebContentsDelegate(0);
13092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    aura::Window* target = GetWindowToAnimateForOverscroll();
1311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (target) {
1312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      StopObservingImplicitAnimations();
1313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      target->layer()->GetAnimator()->AbortAllAnimations();
1314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
13152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cleanup state of the content window first, because that can reset the
13162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // value of |current_overscroll_gesture_|.
13172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareContentWindowForOverscroll();
13182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = new_mode;
1320bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch    if (current_overscroll_gesture_ == OVERSCROLL_EAST ||
1321bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch        current_overscroll_gesture_ == OVERSCROLL_WEST)
1322bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch      PrepareOverscrollWindow();
13232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT);
13252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
13272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation:
13312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() {
1333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_shadow_.reset();
1334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
13362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            completed_overscroll_gesture_)) {
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoForward();
1338c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    PrepareOverscrollNavigationOverlay();
13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (ShouldNavigateBack(web_contents_->GetController(),
13402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                completed_overscroll_gesture_)) {
13412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoBack();
1342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    PrepareOverscrollNavigationOverlay();
134358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  } else {
134458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    if (touch_editable_)
134558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      touch_editable_->OverscrollCompleted();
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* content = GetContentNativeView();
1349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (content) {
1350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content->SetTransform(gfx::Transform());
1351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content->layer()->SetLayerBrightness(0.f);
13522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_overscroll_gesture_ = OVERSCROLL_NONE;
13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation:
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const {
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const {
13662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
13672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Rect& new_bounds) {
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SizeChangedCommon(new_bounds.size());
1372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SizeChanged(new_bounds.size());
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constrained web dialogs, need to be kept centered over our content area.
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < window_->children().size(); i++) {
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window_->children()[i]->GetProperty(
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::kConstrainedWindowKey)) {
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect bounds = window_->children()[i]->bounds();
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds.set_origin(
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point((new_bounds.width() - bounds.width()) / 2,
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (new_bounds.height() - bounds.height()) / 2));
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->children()[i]->SetBounds(bounds);
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) {
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::kNullCursor;
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const {
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling(
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() {
14038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Do not take the focus if the render widget host view aura is gone or
14048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // is in the process of shutting down because neither the view window nor
14058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // this window can handle key events.
14068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
14078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView());
14088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (view != NULL && !view->IsClosing())
14098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return true;
14108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
14118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  return false;
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() {
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) {
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged(
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1424a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying(aura::Window* window) {
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This means the destructor is going to be called soon. If there is an
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL),
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then destroying it in the WebContentsViewAura destructor can trigger other
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroy the overscroll window here.
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_.reset();
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
14325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed(aura::Window* window) {
14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) {
14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const {
14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const {
14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation:
14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) {
14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) {
14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents_->GetDelegate())
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ActivateContents(web_contents_);
14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
14627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case ui::ET_MOUSE_EXITED:
14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ContentsMouseEvent(
14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_,
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
14667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          event->type() == ui::ET_MOUSE_MOVED);
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation:
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
1477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  current_rvh_for_drag_ = web_contents_->GetRenderViewHost();
1478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  current_drop_data_.reset(new DropData());
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  PrepareDropData(current_drop_data_.get(), event.data());
1481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Give the delegate an opportunity to cancel the drag.
1484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!web_contents_->GetDelegate()->CanDragEnter(web_contents_,
1485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  *current_drop_data_.get(),
1486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  op)) {
1487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    current_drop_data_.reset(NULL);
1488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
1490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (drag_dest_delegate_)
1492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    drag_dest_delegate_->DragInitialize(web_contents_);
1493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragEnter(
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *current_drop_data_.get(), event.location(), screen_pt, op,
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_) {
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnReceiveDragData(event.data());
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragEnter();
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!current_drop_data_)
1512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ui::DragDropTypes::DRAG_NONE;
1513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1514f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragOver(
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      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_->OnDragOver();
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertFromWeb(current_drag_op_);
15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() {
15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!current_drop_data_)
1533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragLeave();
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragLeave();
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) {
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!current_drop_data_)
1548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return ui::DragDropTypes::DRAG_NONE;
1549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDrop(
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event.location(),
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDrop();
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
15575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ConvertFromWeb(current_drag_op_);
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsViewAura::OnWindowParentChanged(aura::Window* window,
1561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                aura::Window* parent) {
1562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // On Windows we will get called with a parent of NULL as part of the shut
1563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // down process. As such we do only change the visibility when a parent gets
1564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // set.
1565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (parent)
1566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    UpdateWebContentsVisibility(web_contents_, window->IsVisible());
1567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void WebContentsViewAura::OnWindowVisibilityChanged(aura::Window* window,
1570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                    bool visible) {
1571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Ignore any visibility changes in the hierarchy below.
1572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (window != window_.get() && window_->Contains(window))
1573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UpdateWebContentsVisibility(web_contents_, visible);
1576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1579