web_contents_view_aura.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_factory.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/image_window_delegate.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/browser/web_contents/touch_editable_impl_aura.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view_delegate.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_drag_dest_delegate.h"
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_client.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_delegate.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window_observer.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h"
4290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/clipboard/clipboard.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event_utils.h"
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_png_rep.h"
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webdropdata.h"
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContentsViewPort* CreateWebContentsView(
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* web_contents,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostDelegateView** render_view_host_delegate_view) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *render_view_host_delegate_view = rv;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateForward(const NavigationController& controller,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           OverscrollMode mode) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) &&
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         controller.CanGoForward();
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateBack(const NavigationController& controller,
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OverscrollMode mode) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) &&
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         controller.CanGoBack();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RenderWidgetHostViewAura* ToRenderWidgetHostViewAura(
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostView* view) {
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!view || RenderViewHostFactory::has_factory())
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;  // Can't cast to RenderWidgetHostViewAura in unit tests.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderProcessHostImpl* process = static_cast<RenderProcessHostImpl*>(
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      view->GetRenderWidgetHost()->GetProcess());
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (process->IsGuest())
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return NULL;
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return static_cast<RenderWidgetHostViewAura*>(view);
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed.
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class OverscrollWindowDelegate : public ImageWindowDelegate {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate(WebContentsImpl* web_contents,
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           OverscrollMode overscroll_mode)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : web_contents_(web_contents),
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forward_events_(true) {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationControllerImpl& controller = web_contents->GetController();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationEntryImpl* entry = NULL;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ShouldNavigateForward(controller, overscroll_mode)) {
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(1));
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (ShouldNavigateBack(controller, overscroll_mode)) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(-1));
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    gfx::Image image;
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (entry && entry->screenshot()) {
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::vector<gfx::ImagePNGRep> image_reps;
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(),
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            ui::GetScaleFactorForNativeView(web_contents_window())));
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      image = gfx::Image(image_reps);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SetImage(image);
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void stop_forwarding_events() { forward_events_ = false; }
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverscrollWindowDelegate() {}
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* web_contents_window() {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return web_contents_->GetView()->GetContentNativeView();
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnScrollEvent(event);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnGestureEvent(event);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The window is displayed both during the gesture, and after the gesture
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // while the navigation is in progress. During the gesture, it is necessary to
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // forward input events to the content page (e.g. when the overscroll window
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // slides under the cursor and starts receiving scroll events). However, once
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the gesture is complete, and the window is being displayed as an overlay
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window during navigation, events should not be forwarded anymore.
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool forward_events_;
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate);
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer.
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class WebDragSourceAura : public base::MessageLoopForUI::Observer,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public NotificationObserver {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDragSourceAura(aura::Window* window, WebContentsImpl* contents)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : window_(window),
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents_(contents) {
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoopForUI::current()->AddObserver(this);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    registrar_.Add(this,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Source<WebContents>(contents));
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDragSourceAura() {
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoopForUI::current()->RemoveObserver(this);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MessageLoop::Observer implementation:
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::EventStatus WillProcessEvent(
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::NativeEvent& event) OVERRIDE {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::EVENT_CONTINUE;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!contents_)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::EventType type = ui::EventTypeFromNative(event);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = NULL;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ui::ET_MOUSE_DRAGGED:
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh = contents_->GetRenderViewHost();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rvh) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point screen_loc_in_pixel = ui::EventLocationFromNative(event);
18990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          gfx::Point screen_loc = ConvertViewPointToDIP(rvh->GetView(),
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              screen_loc_in_pixel);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point client_loc = screen_loc;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aura::Window* window = rvh->GetView()->GetNativeView();
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aura::Window::ConvertPointToTarget(window->GetRootWindow(),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window, &client_loc);
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          contents_->DragSourceMovedTo(client_loc.x(), client_loc.y(),
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              screen_loc.x(), screen_loc.y());
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
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)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Utility to fill a ui::OSExchangeDataProvider object from WebDropData.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrepareDragData(const WebDropData& drop_data,
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     ui::OSExchangeData::Provider* provider) {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.text.string().empty())
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetString(drop_data.text.string());
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drop_data.url.is_valid())
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetURL(drop_data.url, drop_data.url_title);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.html.string().empty())
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetHtml(drop_data.html.string(), drop_data.html_base_url);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.filenames.empty()) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<ui::OSExchangeData::FileInfo> filenames;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<WebDropData::FileInfo>::const_iterator it =
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             drop_data.filenames.begin();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != drop_data.filenames.end(); ++it) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      filenames.push_back(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ui::OSExchangeData::FileInfo(
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->path)),
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->display_name))));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetFilenames(filenames);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.custom_data.empty()) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle pickle;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             pickle);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utility to fill a WebDropData object from ui::OSExchangeData.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrepareWebDropData(WebDropData* drop_data,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const ui::OSExchangeData& data) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 plain_text;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetString(&plain_text);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plain_text.empty())
2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    drop_data->text = base::NullableString16(plain_text, false);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 url_title;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetURLAndTitle(&url, &url_title);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url.is_valid()) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url = url;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url_title = url_title;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 html;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetHtml(&html, &html_base_url);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!html.empty())
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    drop_data->html = base::NullableString16(html, false);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (html_base_url.is_valid())
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->html_base_url = html_base_url;
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ui::OSExchangeData::FileInfo> files;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.GetFilenames(&files) && !files.empty()) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<ui::OSExchangeData::FileInfo>::const_iterator
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             it = files.begin(); it != files.end(); ++it) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drop_data->filenames.push_back(
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WebDropData::FileInfo(
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              UTF8ToUTF16(it->path.AsUTF8Unsafe()),
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              UTF8ToUTF16(it->display_name.AsUTF8Unsafe())));
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle;
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(), &pickle))
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ui::ReadCustomDataIntoMap(
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)        pickle.data(), pickle.size(), &drop_data->custom_data);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utilities to convert between WebKit::WebDragOperationsMask and
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertFromWeb(WebKit::WebDragOperationsMask ops) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int drag_op = ui::DragDropTypes::DRAG_NONE;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationCopy)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_COPY;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationMove)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_MOVE;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationLink)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_LINK;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return drag_op;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebDragOperationsMask ConvertToWeb(int drag_op) {
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int web_drag_op = WebKit::WebDragOperationNone;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_COPY)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationCopy;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_MOVE)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationMove;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_LINK)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationLink;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (WebKit::WebDragOperationsMask) web_drag_op;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) {
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int web_input_event_modifiers = 0;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_SHIFT_DOWN)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::ShiftKey;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_CONTROL_DOWN)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::ControlKey;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_ALT_DOWN)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::AltKey;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_COMMAND_DOWN)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::MetaKey;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_input_event_modifiers;
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a history navigation is triggered at the end of an overscroll
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// navigation, it is necessary to show the history-screenshot until the page is
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// done navigating and painting. This class accomplishes this by showing the
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screenshot window on top of the page until the page has completed loading and
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// painting.
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollNavigationOverlay :
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public RenderWidgetHostViewAura::PaintObserver {
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollNavigationOverlay()
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(NULL),
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loading_complete_(false),
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        received_paint_update_(false),
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        compositor_updated_(false),
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        has_screenshot_(false),
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        need_paint_update_(true) {
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverscrollNavigationOverlay() {
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_window() const { return !!window_.get(); }
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartObservingView(RenderWidgetHostViewAura* view) {
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loading_complete_ = false;
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = false;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositor_updated_ = false;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = view;
371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (view_)
372c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      view_->set_paint_observer(this);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure the overlay window is on top.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window_.get() && window_->parent())
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->parent()->StackChildAtTop(window_.get());
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetOverlayWindow(scoped_ptr<aura::Window> window, bool has_screenshot) {
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_ = window.Pass();
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window_.get() && window_->parent())
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->parent()->StackChildAtTop(window_.get());
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    has_screenshot_ = has_screenshot;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetupForTesting() {
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    need_paint_update_ = false;
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stop observing the page if the page-load has completed and the page has
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // been painted.
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopObservingIfDone() {
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is a screenshot displayed in the overlay window, then wait for
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the navigated page to complete loading and some paint update before
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hiding the overlay.
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is no screenshot in the overlay window, then hide this view
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // as soon as there is any new painting notification.
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((need_paint_update_ && !received_paint_update_) ||
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (has_screenshot_ && !loading_complete_)) {
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_.reset();
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_) {
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_ = NULL;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from RenderWidgetHostViewAura::PaintObserver:
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaintComplete() OVERRIDE {
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = true;
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnCompositingComplete() OVERRIDE {
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = compositor_updated_;
4192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnUpdateCompositorContent() OVERRIDE {
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositor_updated_ = true;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPageLoadComplete() OVERRIDE {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loading_complete_ = true;
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnViewDestroyed() OVERRIDE {
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(view_);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->set_paint_observer(NULL);
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = NULL;
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window_;
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* view_;
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool loading_complete_;
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool received_paint_update_;
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool compositor_updated_;
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_screenshot_;
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // During tests, the aura windows don't get any paint updates. So the overlay
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // container keeps waiting for a paint update it never receives, causing a
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // timeout. So during tests, disable the wait for paint updates.
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool need_paint_update_;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverscrollNavigationOverlay);
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public aura::WindowObserver, public aura::RootWindowObserver {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(WebContentsViewAura* view)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view),
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_(NULL) {
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_->window_->GetRootWindow())
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->window_->GetRootWindow()->RemoveRootWindowObserver(this);
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowParentChanged(aura::Window* window,
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     aura::Window* parent) OVERRIDE {
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == parent_)
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_ = parent;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent)
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent->AddObserver(this);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendScreenRects();
485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (view_->touch_editable_)
486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      view_->touch_editable_->UpdateEditingController();
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window != parent_)
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->GetRootWindow()->AddRootWindowObserver(this);
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE {
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window != parent_)
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->GetRootWindow()->RemoveRootWindowObserver(this);
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden RootWindowObserver:
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnRootWindowHostMoved(const aura::RootWindow* root,
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     const gfx::Point& new_origin) OVERRIDE {
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is for the desktop case (i.e. Aura desktop).
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendScreenRects();
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendScreenRects() {
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())->
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SendScreenRects();
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsViewAura* view_;
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We cache the old parent so that we can unregister when it's not the parent
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // anymore.
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* parent_;
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Constrained windows are added as children of the WebContent's view which may
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// overlap with windowed NPAPI plugins. In that case, tell the RWHV so that it
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can update the plugins' cutout rects accordingly.
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::ChildWindowObserver : public aura::WindowObserver,
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 public WebContentsObserver {
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ChildWindowObserver(WebContentsViewAura* view)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(view->web_contents_),
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        view_(view),
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents_destroyed_(false) {
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ChildWindowObserver() {
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const aura::Window::Windows& children = view_->window_->children();
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < children.size(); ++i)
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      children[i]->RemoveObserver(this);
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE {
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If new child windows are added to the WebContent's view, tell the RWHV.
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We also start watching them to know when their size is updated. Of
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // course, ignore the shadow window that contains the RWHV and child windows
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of the child windows that we are watching.
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        view_->web_contents_->GetRenderWidgetHostView());
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* content_window = view ? view->GetNativeView() : NULL;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (new_window->parent() == view_->window_ &&
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        new_window != content_window) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_window->AddObserver(this);
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE {
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        view_->web_contents_->GetRenderWidgetHostView());
561c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* content_window = view ? view->GetNativeView() : NULL;
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window->parent() == view_->window_ &&
563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        window != content_window) {
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->RemoveObserver(this);
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(window);
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window->parent() == view_->window_ &&
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        window != view_->GetContentNativeView()) {
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from WebContentsObserver:
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE {
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_destroyed_ = true;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateConstrainedWindows(aura::Window* exclude) {
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (web_contents_destroyed_)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RenderWidgetHostViewAura* view = ToRenderWidgetHostViewAura(
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        view_->web_contents_->GetRenderWidgetHostView());
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!view)
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> constrained_windows;
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const aura::Window::Windows& children = view_->window_->children();
595c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    aura::Window* content = view_->GetContentNativeView();
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < children.size(); ++i) {
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if (children[i] != content && children[i] != exclude)
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        constrained_windows.push_back(children[i]->GetBoundsInRootWindow());
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->UpdateConstrainedWindowRects(constrained_windows);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsViewAura* view_;
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool web_contents_destroyed_;
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChildWindowObserver);
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public:
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura(
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* web_contents,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_drag_op_(WebKit::WebDragOperationNone),
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drag_dest_delegate_(NULL),
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_rvh_for_drag_(NULL),
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_change_brightness_(false),
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_(OVERSCROLL_NONE),
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      completed_overscroll_gesture_(OVERSCROLL_NONE),
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      touch_editable_(TouchEditableImplAura::Create()) {
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private:
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() {
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!window_)
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child_window_observer_.reset();
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window needs a valid delegate during its destructor, so we explicitly
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete it here.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.reset();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetupOverlayWindowForTesting() {
645c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (navigation_overlay_)
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_overlay_->SetupForTesting();
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
649c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::SetTouchEditableForTest(
650c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    TouchEditableImplAura* touch_editable) {
651c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  touch_editable_.reset(touch_editable);
652c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
654c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) {
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage())
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->SetSize(size);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv =
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderWidgetHostView();
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->SetSize(size);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::EndDrag(WebKit::WebDragOperationsMask ops) {
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_loc =
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point client_loc = screen_loc;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = web_contents_->GetRenderViewHost();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = rvh->GetView()->GetNativeView();
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_window, window, &client_loc);
672c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!web_contents_)
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
674c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_contents_->DragSourceEndedAt(client_loc.x(), client_loc.y(),
675c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      screen_loc.x(), screen_loc.y(), ops);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() {
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is an existing |overscroll_window_| which is in the middle of an
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation, then destroying the window here causes the animation to be
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // completed immidiately, which triggers |OnImplicitAnimationsCompleted()|
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback, and that tries to reset |overscroll_window_| again, causing a
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // double-free. So use a temporary variable here.
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (overscroll_window_) {
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoReset<OverscrollMode> reset_state(&current_overscroll_gesture_,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                current_overscroll_gesture_);
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<aura::Window> reset_window(overscroll_window_.release());
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate(
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_,
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_);
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset(new aura::Window(overscroll_delegate));
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetTransparent(true);
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->Init(ui::LAYER_TEXTURED);
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_window_->layer()->SetMasksToBounds(false);
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetName("OverscrollOverlay");
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_change_brightness_ = overscroll_delegate->has_image();
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->AddChild(overscroll_window_.get());
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds = gfx::Rect(window_->bounds().size());
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_)) {
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The overlay will be sliding in from the right edge towards the left in
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // non-RTL, or sliding in from the left edge towards the right in RTL.
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So position the overlay window accordingly.
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* animate_window = GetWindowToAnimateForOverscroll();
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (animate_window == overscroll_window_)
714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    window_->StackChildAbove(overscroll_window_.get(), GetContentNativeView());
715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    window_->StackChildBelow(overscroll_window_.get(), GetContentNativeView());
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(0.f);
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetBounds(bounds);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->Show();
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  overscroll_shadow_.reset(new ShadowLayerDelegate(animate_window->layer()));
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() {
727b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  StopObservingImplicitAnimations();
728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* content = GetContentNativeView();
729b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  content->layer()->GetAnimator()->AbortAllAnimations();
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->SetTransform(gfx::Transform());
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->layer()->SetLayerBrightness(0.f);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!target)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetTweenType(ui::Tween::EASE_OUT);
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.AddObserver(this);
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target->SetTransform(gfx::Transform());
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetTweenType(ui::Tween::EASE_OUT);
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateOverscrollWindowBrightness(0.f);
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) {
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Animate out the current view first. Navigate to the requested history at
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the end of the animation.
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated",
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_, OVERSCROLL_COUNT);
768b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
769b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      overscroll_window_->delegate());
770b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  delegate->stop_forwarding_events();
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = mode;
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTweenType(ui::Tween::EASE_OUT);
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.AddObserver(this);
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int content_width =
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView()->GetViewBounds().width();
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width;
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(translate_x, 0);
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetTransform(transform);
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(translate_x);
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() {
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ShouldNavigateForward(web_contents_->GetController(),
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               current_overscroll_gesture_) ?
794c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      overscroll_window_.get() : GetContentNativeView();
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x,
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                               int delta_y) {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NORTH ||
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_ == OVERSCROLL_SOUTH) {
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore vertical overscroll.
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d();
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For horizontal overscroll, scroll freely if a navigation is possible. Do a
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resistive scroll otherwise.
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NavigationControllerImpl& controller = web_contents_->GetController();
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect& bounds = GetViewBounds();
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, current_overscroll_gesture_))
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0);
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (ShouldNavigateBack(controller, current_overscroll_gesture_))
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::min(bounds.width(), delta_x), 0);
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Vector2d();
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() {
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_window_->delegate());
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SchedulePaintInRect(
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(overscroll_window_->bounds().size()));
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(),
823c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                        delegate->has_image());
824c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura(
825c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView()));
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) {
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!overscroll_change_brightness_)
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMin = -.1f;
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMax = -.01f;
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float ratio = fabs(delta_x) / GetViewBounds().width();
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ratio = std::min(1.f, ratio);
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL())
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ratio = 1.f - ratio;
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ?
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) :
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin);
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::max(kBrightnessMin, brightness);
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::min(kBrightnessMax, brightness);
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindowToAnimateForOverscroll();
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->layer()->SetLayerBrightness(brightness);
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
848c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebContentsViewAura::AttachTouchEditableToRenderView() {
849c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!touch_editable_)
850c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return;
851c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  RenderWidgetHostViewAura* rwhva = ToRenderWidgetHostViewAura(
852c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView());
853c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  touch_editable_->AttachToView(rwhva);
854c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
855c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation:
8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const {
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_.get();
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const {
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
8652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rwhv ? rwhv->GetNativeView() : NULL;
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const {
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->GetToplevelWindow();
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const {
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out = window_->GetBoundsInScreen();
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnTabCrashed(base::TerminationStatus status,
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int error_code) {
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the focus to the parent because neither the view window nor this
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window can handle key events.
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window_->HasFocus() && window_->parent())
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->parent()->Focus();
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) {
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = window_->bounds();
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bounds.size() != size) {
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_size(size);
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(bounds);
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Our size matches what we want but the renderers size may not match.
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pretend we were resized so that the renderers size is updated too.
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SizeChangedCommon(size);
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() {
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage()) {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->Focus();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get() && delegate_->Focus())
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->Focus();
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() {
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->FocusLocationBarByDefault())
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->SetFocusToLocationBar(false);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Focus();
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() {
918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->StoreFocus();
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() {
923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RestoreFocus();
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDropData* WebContentsViewAura::GetDropData() const {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_drop_data_.get();
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const {
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return window_->GetBoundsInScreen();
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsViewPort implementation:
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView(
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size& initial_size, gfx::NativeView context) {
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: we ignore |initial_size| since in some cases it's wrong (such as
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the bookmark bar is not shown and you create a new tab). The right
9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // value is set shortly after this, so its safe to ignore.
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_.reset(new aura::Window(this));
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_owned_by_parent(false);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetTransparent(false);
9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->Init(ui::LAYER_NOT_DRAWN);
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root_window = context ? context->GetRootWindow() : NULL;
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root_window) {
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // There are places where there is no context currently because object
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hierarchies are built before they're attached to a Widget. (See
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // views::WebView as an example; GetWidget() returns NULL at the point
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // where we are created.)
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It should be OK to not set a default parent since such users will
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // explicitly add this WebContentsViewAura to their tree after they create
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // us.
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root_window) {
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->SetDefaultParentByRootWindow(
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          root_window, root_window->GetBoundsInScreen());
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->layer()->SetMasksToBounds(true);
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetName("WebContentsViewAura");
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset(new WindowObserver(this));
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child_window_observer_.reset(new ChildWindowObserver(this));
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delegate_->GetDragDestDelegate() creates a new delegate on every call.
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Hence, we save a reference to it locally. Similar model is used on other
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platforms as well.
975c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
9762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drag_dest_delegate_ = delegate_->GetDragDestDelegate();
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget(
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_widget_host->GetView()) {
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // During testing, the view will already be set up in most cases to the
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // test view, so we don't want to clobber it with a real one. To verify that
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this actually is happening (and somebody isn't accidentally creating the
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // view twice), we check for the RVH Factory, which will be set when we're
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // making special ones (which go along with the special views).
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(RenderViewHostFactory::has_factory());
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return render_widget_host->GetView();
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* view =
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderWidgetHostView::CreateViewForWidget(render_widget_host);
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->InitAsChild(NULL);
994c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetNativeView()->AddChild(view->GetNativeView());
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
997c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    navigation_overlay_->StartObservingView(ToRenderWidgetHostViewAura(view));
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->Show();
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We listen to drag drop events in the newly created view's window.
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetDragDropDelegate(view->GetNativeView(), this);
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostImpl* host_impl =
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderWidgetHostImpl::From(render_widget_host);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_impl->overscroll_controller() &&
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!web_contents_->GetDelegate() ||
10092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       web_contents_->GetDelegate()->CanOverscrollContent())) {
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_impl->overscroll_controller()->set_delegate(this);
1011c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (!navigation_overlay_)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigation_overlay_.reset(new OverscrollNavigationOverlay());
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForPopupWidget(
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host);
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetPageTitle(const string16& title) {
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_title(title);
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) {
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) {
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
1033c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    navigation_overlay_->StartObservingView(
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ToRenderWidgetHostViewAura(host->GetView()));
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1036c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AttachTouchEditableToRenderView();
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) {
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>(
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderViewHost());
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host) {
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host->SetOverscrollControllerEnabled(enabled);
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (enabled)
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host->overscroll_controller()->set_delegate(this);
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1047868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1048868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  if (!enabled)
1049868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    navigation_overlay_.reset();
1050868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  else if (!navigation_overlay_)
1051868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    navigation_overlay_.reset(new OverscrollNavigationOverlay());
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation:
10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(const ContextMenuParams& params) {
1058c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
10597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    delegate_->ShowContextMenu(params);
1060c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editable_)
1061c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editable_->EndTouchEditing();
1062c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::ShowPopupMenu(const gfx::Rect& bounds,
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int item_height,
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        double item_font_size,
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int selected_item,
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::vector<WebMenuItem>& items,
10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool right_aligned,
10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool allow_multiple_selection) {
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // External popup menus are only used on Mac and Android.
10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging(
10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebDropData& drop_data,
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebDragOperationsMask operations,
10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& image,
10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Vector2d& image_offset,
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DragEventSourceInfo& event_info) {
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
1083c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!aura::client::GetDragDropClient(root_window)) {
1084c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    web_contents_->SystemDragEnded();
10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1086c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
1087c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1088c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (touch_editable_)
1089c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    touch_editable_->EndTouchEditing();
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider();
10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareDragData(drop_data, provider);
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData data(provider);  // takes ownership of |provider|.
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image.isNull()) {
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drag_utils::SetDragImageOnDataObject(image,
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size(image.width(), image.height()), image_offset, &data);
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDragSourceAura> drag_source(
11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebDragSourceAura(GetNativeView(), web_contents_));
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to enable recursive tasks on the message loop so we can get
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates while in the system DoDragDrop loop.
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_op = 0;
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView content_native_view = GetContentNativeView();
1109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::ScopedNestableTaskAllower allow(
1110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::MessageLoop::current());
1111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    result_op = aura::client::GetDragDropClient(root_window)
1112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        ->StartDragAndDrop(data,
1113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           root_window,
1114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           content_native_view,
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           event_info.event_location,
1116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           ConvertFromWeb(operations),
1117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                           event_info.event_source);
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bail out immediately if the contents view window is gone. Note that it is
1121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // not safe to access any class members in this case since |this| may already
1122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // be destroyed. The local variable |drag_source| will still be valid though,
1123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // so we can use it to determine if the window is gone.
1124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (!drag_source->window()) {
1125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Note that in this case, we don't need to call SystemDragEnded() since the
1126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // renderer is going away.
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndDrag(ConvertToWeb(result_op));
1131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_contents_->SystemDragEnded();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(WebKit::WebDragOperation operation) {
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drag_op_ = operation;
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() {
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate())
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetDelegate()->WebContentsFocused(web_contents_);
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate() &&
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) &&
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_.get()) {
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->TakeFocus(reverse);
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
11522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation:
11532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) {
11552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
11562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
11592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
11602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
11612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y);
11622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
11632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(translate.x(), translate.y());
11642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetTransform(transform);
11652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(delta_x);
11672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) {
11702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT);
11712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationControllerImpl& controller = web_contents_->GetController();
11732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, mode) ||
11742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShouldNavigateBack(controller, mode)) {
11752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CompleteOverscrollNavigation(mode);
11762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
11802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode,
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 OverscrollMode new_mode) {
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset any in-progress overscroll animation first.
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_mode == OVERSCROLL_NONE ||
1188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !GetContentNativeView() ||
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (navigation_overlay_.get() && navigation_overlay_->has_window())) {
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = OVERSCROLL_NONE;
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
1192b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    aura::Window* target = GetWindowToAnimateForOverscroll();
1193b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    if (target) {
1194b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      StopObservingImplicitAnimations();
1195b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      target->layer()->GetAnimator()->AbortAllAnimations();
1196b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    }
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cleanup state of the content window first, because that can reset the
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // value of |current_overscroll_gesture_|.
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareContentWindowForOverscroll();
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = new_mode;
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollWindow();
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT);
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation:
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() {
1213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  overscroll_shadow_.reset();
1214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            completed_overscroll_gesture_)) {
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollNavigationOverlay();
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoForward();
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (ShouldNavigateBack(web_contents_->GetController(),
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                completed_overscroll_gesture_)) {
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollNavigationOverlay();
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoBack();
12232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  aura::Window* content = GetContentNativeView();
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (content) {
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content->SetTransform(gfx::Transform());
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    content->layer()->SetLayerBrightness(0.f);
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_overscroll_gesture_ = OVERSCROLL_NONE;
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation:
12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const {
12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const {
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Rect& new_bounds) {
12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SizeChangedCommon(new_bounds.size());
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (delegate_)
12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SizeChanged(new_bounds.size());
12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constrained web dialogs, need to be kept centered over our content area.
12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < window_->children().size(); i++) {
12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window_->children()[i]->GetProperty(
12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::kConstrainedWindowKey)) {
12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect bounds = window_->children()[i]->bounds();
12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds.set_origin(
12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point((new_bounds.width() - bounds.width()) / 2,
12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (new_bounds.height() - bounds.height()) / 2));
12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->children()[i]->SetBounds(bounds);
12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) {
12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::kNullCursor;
12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const {
12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling(
12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() {
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not take the focus if the render widget host view is gone because
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // neither the view window nor this window can handle key events.
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return web_contents_->GetRenderWidgetHostView() != NULL;
12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() {
12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) {
12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged(
12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying() {
12962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This means the destructor is going to be called soon. If there is an
12972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL),
12982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then destroying it in the WebContentsViewAura destructor can trigger other
12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So
13002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroy the overscroll window here.
13012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_.reset();
13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed() {
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) {
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible)
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->WasShown();
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->WasHidden();
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const {
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const {
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<ui::Texture> WebContentsViewAura::CopyTexture() {
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The layer we create doesn't have an external texture, so this should never
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get invoked.
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_refptr<ui::Texture>();
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation:
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) {
13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) {
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents_->GetDelegate())
13372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ActivateContents(web_contents_);
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ContentsMouseEvent(
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_,
13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          true);
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation:
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->DragInitialize(web_contents_);
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset(new WebDropData());
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareWebDropData(current_drop_data_.get(), event.data());
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_rvh_for_drag_ = web_contents_->GetRenderViewHost();
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragEnter(
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *current_drop_data_.get(), event.location(), screen_pt, op,
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_) {
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnReceiveDragData(event.data());
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragEnter();
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragOver(
13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event.location(), screen_pt, op,
13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragOver();
13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertFromWeb(current_drag_op_);
13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() {
13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragLeave();
14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragLeave();
14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) {
14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDrop(
14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event.location(),
14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDrop();
14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_drag_op_;
14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1425