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