web_contents_view_aura.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_view_aura.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/auto_reset.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/dip_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/overscroll_controller.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/render_view_host_factory.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_view_host_impl.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_impl.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/renderer_host/render_widget_host_view_aura.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/interstitial_page_impl.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/web_contents/navigation_entry_impl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/web_contents_impl.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_types.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/overscroll_configuration.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_view_delegate.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_drag_dest_delegate.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/effects/SkGradientShader.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/aura_constants.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_client.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/client/drag_drop_delegate.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/root_window.h"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/root_window_observer.h"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/window_observer.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/custom_data_helper.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/dragdrop/drag_utils.h"
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/os_exchange_data.h"
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event_utils.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/hit_test.h"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/compositor/scoped_layer_animation_settings.h"
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h"
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image.h"
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_png_rep.h"
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/skia_util.h"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "webkit/glue/webdropdata.h"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/clipboard/clipboard_util_win.h"
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContentsViewPort* CreateWebContentsView(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* web_contents,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHostDelegateView** render_view_host_delegate_view) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsViewAura* rv = new WebContentsViewAura(web_contents, delegate);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *render_view_host_delegate_view = rv;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return rv;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kShadowLightColor = SkColorSetARGB(0x0, 0, 0, 0);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kShadowDarkColor = SkColorSetARGB(0x70, 0, 0, 0);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kShadowThick = 7;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum ShadowEdge {
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SHADOW_NONE,
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SHADOW_LEFT,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SHADOW_RIGHT,
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SHADOW_TOP,
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SHADOW_BOTTOM
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateForward(const NavigationController& controller,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           OverscrollMode mode) {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mode == (base::i18n::IsRTL() ? OVERSCROLL_EAST : OVERSCROLL_WEST) &&
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         controller.CanGoForward();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ShouldNavigateBack(const NavigationController& controller,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OverscrollMode mode) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return mode == (base::i18n::IsRTL() ? OVERSCROLL_WEST : OVERSCROLL_EAST) &&
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)         controller.CanGoBack();
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The window delegate for the overscroll window. This redirects trackpad events
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// to the web-contents window. The delegate destroys itself when the window is
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// destroyed.
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollWindowDelegate : public aura::WindowDelegate {
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate(WebContentsImpl* web_contents,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           OverscrollMode overscroll_mode)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : web_contents_(web_contents),
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        show_shadow_(false),
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        forward_events_(true) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationControllerImpl& controller = web_contents->GetController();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const NavigationEntryImpl* entry = NULL;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (ShouldNavigateForward(controller, overscroll_mode)) {
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(1));
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (ShouldNavigateBack(controller, overscroll_mode)) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      entry = NavigationEntryImpl::FromNavigationEntry(
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          controller.GetEntryAtOffset(-1));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!entry || !entry->screenshot())
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::ImagePNGRep> image_reps;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_reps.push_back(gfx::ImagePNGRep(entry->screenshot(),
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ui::GetScaleFactorForNativeView(web_contents_window())));
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    image_ = gfx::Image(image_reps);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (image_.AsImageSkia().size() != web_contents_window()->bounds().size())
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      image_ = gfx::Image();
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_screenshot() const { return !image_.IsEmpty(); }
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_show_shadow(bool show) {
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    show_shadow_ = show;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void stop_forwarding_events() { forward_events_ = false; }
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverscrollWindowDelegate() {}
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* web_contents_window() {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return web_contents_->GetView()->GetContentNativeView();
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aura::WindowDelegate implementation:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetMinimumSize() const OVERRIDE {
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::Size GetMaximumSize() const OVERRIDE {
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Size();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBoundsChanged(const gfx::Rect& old_bounds,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               const gfx::Rect& new_bounds) OVERRIDE {
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::kNullCursor;
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE {
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return HTNOWHERE;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool ShouldDescendIntoChildForEventHandling(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      aura::Window* child,
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Point& location) OVERRIDE {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanFocus() OVERRIDE {
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnCaptureLost() OVERRIDE {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (show_shadow_) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->Save();
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->Translate(gfx::Vector2d(kShadowThick, 0));
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (image_.IsEmpty())
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->DrawColor(SK_ColorGRAY);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->DrawImageInt(image_.AsImageSkia(), 0, 0);
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (show_shadow_) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->Restore();
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkPoint points[2];
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      points[0].iset(0, 0);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      points[1].iset(kShadowThick, 0);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkColor colors[2] = { kShadowLightColor, kShadowDarkColor };
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      skia::RefPtr<SkShader> shader = skia::AdoptRef(
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          SkGradientShader::CreateLinear(points, colors, NULL,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              arraysize(points), SkShader::kRepeat_TileMode, NULL));
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkRect rect = { SkIntToScalar(0),
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      SkIntToScalar(0),
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      SkIntToScalar(kShadowThick),
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      SkIntToScalar(web_contents_window()->bounds().height()) };
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      SkPaint paint;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      paint.setShader(shader.get());
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      canvas->sk_canvas()->drawRect(rect, paint);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowDestroying() OVERRIDE {
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowDestroyed() OVERRIDE {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delete this;
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE {
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool HasHitTestMask() const OVERRIDE {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE {
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual scoped_refptr<ui::Texture> CopyTexture() OVERRIDE {
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return scoped_refptr<ui::Texture>();
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::EventHandler.
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnScrollEvent(ui::ScrollEvent* event) OVERRIDE {
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnScrollEvent(event);
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (forward_events_ && web_contents_window())
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_window()->delegate()->OnGestureEvent(event);
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContents* web_contents_;
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Image image_;
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool show_shadow_;
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The window is displayed both during the gesture, and after the gesture
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // while the navigation is in progress. During the gesture, it is necessary to
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // forward input events to the content page (e.g. when the overscroll window
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // slides under the cursor and starts receiving scroll events). However, once
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the gesture is complete, and the window is being displayed as an overlay
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // window during navigation, events should not be forwarded anymore.
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool forward_events_;
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverscrollWindowDelegate);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Listens to all mouse drag events during a drag and drop and sends them to
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the renderer.
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebDragSourceAura : public MessageLoopForUI::Observer,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          public NotificationObserver {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDragSourceAura(aura::Window* window, WebContentsImpl* contents)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : window_(window),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        contents_(contents) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoopForUI::current()->AddObserver(this);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar_.Add(this, NOTIFICATION_WEB_CONTENTS_DISCONNECTED,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   Source<WebContents>(contents));
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebDragSourceAura() {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoopForUI::current()->RemoveObserver(this);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // MessageLoop::Observer implementation:
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual base::EventStatus WillProcessEvent(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const base::NativeEvent& event) OVERRIDE {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::EVENT_CONTINUE;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DidProcessEvent(const base::NativeEvent& event) OVERRIDE {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!contents_)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::EventType type = ui::EventTypeFromNative(event);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RenderViewHost* rvh = NULL;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type) {
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ui::ET_MOUSE_DRAGGED:
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rvh = contents_->GetRenderViewHost();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (rvh) {
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point screen_loc_in_pixel = ui::EventLocationFromNative(event);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point screen_loc = ConvertPointToDIP(rvh->GetView(),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              screen_loc_in_pixel);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point client_loc = screen_loc;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aura::Window* window = rvh->GetView()->GetNativeView();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          aura::Window::ConvertPointToTarget(window->GetRootWindow(),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              window, &client_loc);
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rvh->DragSourceMovedTo(client_loc.x(), client_loc.y(),
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              screen_loc.x(), screen_loc.y());
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NotificationSource& source,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NotificationDetails& details) OVERRIDE {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type != NOTIFICATION_WEB_CONTENTS_DISCONNECTED)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cancel the drag if it is still in progress.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::client::DragDropClient* dnd_client =
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        aura::client::GetDragDropClient(window_->GetRootWindow());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (dnd_client && dnd_client->IsDragDropInProgress())
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      dnd_client->DragCancel();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_ = NULL;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contents_ = NULL;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window() const { return window_; }
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window_;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebContentsImpl* contents_;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NotificationRegistrar registrar_;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebDragSourceAura);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Utility to fill a ui::OSExchangeDataProvider object from WebDropData.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrepareDragData(const WebDropData& drop_data,
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     ui::OSExchangeData::Provider* provider) {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.text.string().empty())
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetString(drop_data.text.string());
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drop_data.url.is_valid())
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetURL(drop_data.url, drop_data.url_title);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.html.string().empty())
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetHtml(drop_data.html.string(), drop_data.html_base_url);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.filenames.empty()) {
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<ui::OSExchangeData::FileInfo> filenames;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<WebDropData::FileInfo>::const_iterator it =
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             drop_data.filenames.begin();
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != drop_data.filenames.end(); ++it) {
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      filenames.push_back(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          ui::OSExchangeData::FileInfo(
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->path)),
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::FilePath::FromUTF8Unsafe(UTF16ToUTF8(it->display_name))));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetFilenames(filenames);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drop_data.custom_data.empty()) {
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Pickle pickle;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::WriteCustomDataToPickle(drop_data.custom_data, &pickle);
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    provider->SetPickledData(
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::ClipboardUtil::GetWebCustomDataFormat()->cfFormat, pickle);
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    provider->SetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             pickle);
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utility to fill a WebDropData object from ui::OSExchangeData.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrepareWebDropData(WebDropData* drop_data,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const ui::OSExchangeData& data) {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 plain_text;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetString(&plain_text);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plain_text.empty())
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->text = NullableString16(plain_text, false);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 url_title;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetURLAndTitle(&url, &url_title);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (url.is_valid()) {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url = url;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->url_title = url_title;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  string16 html;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL html_base_url;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  data.GetHtml(&html, &html_base_url);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!html.empty())
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->html = NullableString16(html, false);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (html_base_url.is_valid())
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drop_data->html_base_url = html_base_url;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<ui::OSExchangeData::FileInfo> files;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.GetFilenames(&files) && !files.empty()) {
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (std::vector<ui::OSExchangeData::FileInfo>::const_iterator
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             it = files.begin(); it != files.end(); ++it) {
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drop_data->filenames.push_back(
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          WebDropData::FileInfo(
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              UTF8ToUTF16(it->path.AsUTF8Unsafe()),
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              UTF8ToUTF16(it->display_name.AsUTF8Unsafe())));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle;
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (data.GetPickledData(ui::ClipboardUtil::GetWebCustomDataFormat()->cfFormat,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          &pickle))
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (data.GetPickledData(ui::Clipboard::GetWebCustomDataFormatType(),
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          &pickle))
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ui::ReadCustomDataIntoMap(pickle.data(), pickle.size(),
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              &drop_data->custom_data);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Utilities to convert between WebKit::WebDragOperationsMask and
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ui::DragDropTypes.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertFromWeb(WebKit::WebDragOperationsMask ops) {
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int drag_op = ui::DragDropTypes::DRAG_NONE;
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationCopy)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_COPY;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationMove)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_MOVE;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (ops & WebKit::WebDragOperationLink)
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_op |= ui::DragDropTypes::DRAG_LINK;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return drag_op;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebDragOperationsMask ConvertToWeb(int drag_op) {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int web_drag_op = WebKit::WebDragOperationNone;
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_COPY)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationCopy;
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_MOVE)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationMove;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_op & ui::DragDropTypes::DRAG_LINK)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_drag_op |= WebKit::WebDragOperationLink;
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (WebKit::WebDragOperationsMask) web_drag_op;
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ConvertAuraEventFlagsToWebInputEventModifiers(int aura_event_flags) {
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int web_input_event_modifiers = 0;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_SHIFT_DOWN)
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::ShiftKey;
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_CONTROL_DOWN)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::ControlKey;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_ALT_DOWN)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::AltKey;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (aura_event_flags & ui::EF_COMMAND_DOWN)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_input_event_modifiers |= WebKit::WebInputEvent::MetaKey;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return web_input_event_modifiers;
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ShadowWindow is used to paint shadows around a content window.
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// A ShadowWindow destroys itself when the content window is destroyed, and
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// updates its bounds to make sure the shadows are painted in the correct size.
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ShadowWindow : public aura::Window,
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     public aura::WindowObserver {
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ShadowWindow(aura::Window* window)
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : aura::Window(NULL),
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window_(window),
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        edge_(SHADOW_NONE) {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(aura::client::WINDOW_TYPE_CONTROL);
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetTransparent(true);
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    set_owned_by_parent(false);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Init(ui::LAYER_NOT_DRAWN);
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer()->SetMasksToBounds(false);
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    AddChild(window);
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->AddObserver(this);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetBounds(gfx::Rect(window->bounds().size()));
4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Show();
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetShadowEdge(ShadowEdge edge) {
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    edge_ = edge;
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (edge_ == SHADOW_NONE) {
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      shadow_.reset();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shadow_.reset(new ui::Layer(ui::LAYER_TEXTURED));
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shadow_->set_delegate(this);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shadow_->SetFillsBoundsOpaquely(false);
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer()->Add(shadow_.get());
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    layer()->StackBelow(shadow_.get(), window_->layer());
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateShadowBounds();
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class base::DeleteHelper<content::ShadowWindow>;
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ShadowWindow() {
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateShadowBounds() {
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!shadow_.get())
4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::Rect bound;
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (edge_) {
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_LEFT:
4992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bound.SetRect(-kShadowThick, 0, kShadowThick, bounds().height());
5002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_RIGHT:
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bound.SetRect(bounds().right(), 0, kShadowThick, bounds().height());
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_TOP:
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bound.SetRect(0, -kShadowThick, bounds().width(), kShadowThick);
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_BOTTOM:
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        bound.SetRect(0, bounds().bottom(), bounds().width(), kShadowThick);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_NONE:
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    shadow_->SetBounds(bound);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(Window* window,
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetBounds(gfx::Rect(new_bounds.size()));
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateShadowBounds();
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK_EQ(window, window_);
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->RemoveObserver(this);
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_ = NULL;
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    MessageLoop::current()->DeleteSoon(FROM_HERE, this);
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from ui::LayerDelegate:
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaintLayer(gfx::Canvas* canvas) OVERRIDE {
5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPoint points[2];
5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkColor colors[2];
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    points[0].iset(0, 0);
5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (edge_) {
5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_LEFT:
5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_RIGHT:
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        points[1].iset(shadow_->bounds().width(), 0);
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_TOP:
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_BOTTOM:
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        points[1].iset(0, shadow_->bounds().height());
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (edge_) {
5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_LEFT:
5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_TOP:
5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        colors[0] = kShadowLightColor;
5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        colors[1] = kShadowDarkColor;
5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_RIGHT:
5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case SHADOW_BOTTOM:
5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        colors[0] = kShadowDarkColor;
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        colors[1] = kShadowLightColor;
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      default:
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    skia::RefPtr<SkShader> shader = skia::AdoptRef(
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SkGradientShader::CreateLinear(points, colors, NULL,
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            arraysize(points), SkShader::kRepeat_TileMode, NULL));
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SkPaint paint;
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    paint.setShader(shader.get());
5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    canvas->sk_canvas()->drawRect(gfx::RectToSkRect(bounds()), paint);
5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window_;
5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ui::Layer> shadow_;
5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ShadowEdge edge_;
5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ShadowWindow);
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// When a history navigation is triggered at the end of an overscroll
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// navigation, it is necessary to show the history-screenshot until the page is
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// done navigating and painting. This class accomplishes this by showing the
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screenshot window on top of the page until the page has completed loading and
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// painting.
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class OverscrollNavigationOverlay :
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public RenderWidgetHostViewAura::PaintObserver {
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollNavigationOverlay()
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(NULL),
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        loading_complete_(false),
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        received_paint_update_(false),
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        compositor_updated_(false),
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        has_screenshot_(false),
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        need_paint_update_(true) {
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~OverscrollNavigationOverlay() {
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_window() const { return !!window_.get(); }
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StartObservingView(RenderWidgetHostViewAura* view) {
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_)
6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loading_complete_ = false;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = false;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositor_updated_ = false;
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = view;
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->set_paint_observer(this);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Make sure the overlay window is on top.
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window_.get() && window_->parent())
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->parent()->StackChildAtTop(window_.get());
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetOverlayWindow(scoped_ptr<aura::Window> window, bool has_screenshot) {
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_ = window.Pass();
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window_.get() && window_->parent())
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->parent()->StackChildAtTop(window_.get());
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    has_screenshot_ = has_screenshot;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetupForTesting() {
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    need_paint_update_ = false;
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Stop observing the page if the page-load has completed and the page has
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // been painted.
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopObservingIfDone() {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is a screenshot displayed in the overlay window, then wait for
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // the navigated page to complete loading and some paint update before
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hiding the overlay.
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is no screenshot in the overlay window, then hide this view
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // as soon as there is any new painting notification.
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((need_paint_update_ && !received_paint_update_) ||
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        (has_screenshot_ && !loading_complete_)) {
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_.reset();
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_) {
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->set_paint_observer(NULL);
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_ = NULL;
6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from RenderWidgetHostViewAura::PaintObserver:
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPaintComplete() OVERRIDE {
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = true;
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnCompositingComplete() OVERRIDE {
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    received_paint_update_ = compositor_updated_;
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnUpdateCompositorContent() OVERRIDE {
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    compositor_updated_ = true;
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPageLoadComplete() OVERRIDE {
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    loading_complete_ = true;
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    StopObservingIfDone();
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnViewDestroyed() OVERRIDE {
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(view_);
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->set_paint_observer(NULL);
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_ = NULL;
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<aura::Window> window_;
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostViewAura* view_;
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool loading_complete_;
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool received_paint_update_;
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool compositor_updated_;
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool has_screenshot_;
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // During tests, the aura windows don't get any paint updates. So the overlay
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // container keeps waiting for a paint update it never receives, causing a
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // timeout. So during tests, disable the wait for paint updates.
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool need_paint_update_;
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(OverscrollNavigationOverlay);
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::WindowObserver
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public aura::WindowObserver, public aura::RootWindowObserver {
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit WindowObserver(WebContentsViewAura* view)
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : view_(view),
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parent_(NULL) {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~WindowObserver() {
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (view_->window_->GetRootWindow())
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      view_->window_->GetRootWindow()->RemoveRootWindowObserver(this);
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowParentChanged(aura::Window* window,
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     aura::Window* parent) OVERRIDE {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window == parent_)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent_)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent_->RemoveObserver(this);
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    parent_ = parent;
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (parent)
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      parent->AddObserver(this);
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendScreenRects();
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowAddedToRootWindow(aura::Window* window) OVERRIDE {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window != parent_)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->GetRootWindow()->AddRootWindowObserver(this);
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowRemovingFromRootWindow(aura::Window* window) OVERRIDE {
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window != parent_)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->GetRootWindow()->RemoveRootWindowObserver(this);
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden RootWindowObserver:
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnRootWindowMoved(const aura::RootWindow* root,
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 const gfx::Point& new_origin) OVERRIDE {
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // This is for the desktop case (i.e. Aura desktop).
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SendScreenRects();
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendScreenRects() {
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHostImpl::From(view_->web_contents_->GetRenderViewHost())->
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        SendScreenRects();
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsViewAura* view_;
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We cache the old parent so that we can unregister when it's not the parent
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // anymore.
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* parent_;
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WindowObserver);
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Constrained windows are added as children of the WebContent's view which may
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// overlap with windowed NPAPI plugins. In that case, tell the RWHV so that it
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// can update the plugins' cutout rects accordingly.
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebContentsViewAura::ChildWindowObserver : public aura::WindowObserver,
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 public WebContentsObserver {
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit ChildWindowObserver(WebContentsViewAura* view)
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : WebContentsObserver(view->web_contents_),
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        view_(view),
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        web_contents_destroyed_(false) {
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->AddObserver(this);
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~ChildWindowObserver() {
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view_->window_->RemoveObserver(this);
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const aura::Window::Windows& children = view_->window_->children();
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < children.size(); ++i)
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      children[i]->RemoveObserver(this);
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from aura::WindowObserver:
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowAdded(aura::Window* new_window) OVERRIDE {
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If new child windows are added to the WebContent's view, tell the RWHV.
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // We also start watching them to know when their size is updated. Of
7892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // course, ignore the shadow window that contains the RWHV and child windows
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // of the child windows that we are watching.
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (new_window->parent() == view_->window_ &&
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new_window != view_->content_container_) {
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      new_window->AddObserver(this);
7942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
7952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
7962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
7972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWillRemoveWindow(aura::Window* window) OVERRIDE {
7992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window->parent() == view_->window_ &&
8002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window != view_->content_container_) {
8012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window->RemoveObserver(this);
8022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(window);
8032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& old_bounds,
8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE {
8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (window->parent() == view_->window_ &&
8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        window != view_->content_container_) {
8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateConstrainedWindows(NULL);
8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from WebContentsObserver:
8162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void WebContentsDestroyed(WebContents* web_contents) OVERRIDE {
8172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_destroyed_ = true;
8182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
8212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateConstrainedWindows(aura::Window* exclude) {
8222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (RenderViewHostFactory::has_factory())
8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;  // Can't cast to RenderWidgetHostViewAura in unit tests.
8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (web_contents_destroyed_)
8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHostViewAura* view = static_cast<RenderWidgetHostViewAura*>(
8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        view_->web_contents_->GetRenderWidgetHostView());
8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!view)
8312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    std::vector<gfx::Rect> constrained_windows;
8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const aura::Window::Windows& children = view_->window_->children();
8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (size_t i = 0; i < children.size(); ++i) {
8362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      if (children[i] != view_->content_container_ && children[i] != exclude)
8372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        constrained_windows.push_back(children[i]->GetBoundsInRootWindow());
8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    view->UpdateConstrainedWindowRects(constrained_windows);
8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebContentsViewAura* view_;
8442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool web_contents_destroyed_;
8452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ChildWindowObserver);
8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
8482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, public:
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::WebContentsViewAura(
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsImpl* web_contents,
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContentsViewDelegate* delegate)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(web_contents),
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_(delegate),
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      current_drag_op_(WebKit::WebDragOperationNone),
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      drag_dest_delegate_(NULL),
8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_rvh_for_drag_(NULL),
8612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_container_(NULL),
8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_change_brightness_(false),
8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_(OVERSCROLL_NONE),
8642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      completed_overscroll_gesture_(OVERSCROLL_NONE) {
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, private:
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebContentsViewAura::~WebContentsViewAura() {
8712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!window_)
8722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
8732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset();
8752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
8762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child_window_observer_.reset();
8772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Window needs a valid delegate during its destructor, so we explicitly
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delete it here.
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.reset();
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetupOverlayWindowForTesting() {
8842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get())
8852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_overlay_->SetupForTesting();
8862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
8872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeChangedCommon(const gfx::Size& size) {
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage())
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->SetSize(size);
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv =
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderWidgetHostView();
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->SetSize(size);
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::EndDrag(WebKit::WebDragOperationsMask ops) {
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_loc =
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point client_loc = screen_loc;
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderViewHost* rvh = web_contents_->GetRenderViewHost();
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* window = rvh->GetView()->GetNativeView();
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window::ConvertPointToTarget(root_window, window, &client_loc);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rvh->DragSourceEndedAt(client_loc.x(), client_loc.y(), screen_loc.x(),
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      screen_loc.y(), ops);
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollWindow() {
9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If there is an existing |overscroll_window_| which is in the middle of an
9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // animation, then destroying the window here causes the animation to be
9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // completed immidiately, which triggers |OnImplicitAnimationsCompleted()|
9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // callback, and that tries to reset |overscroll_window_| again, causing a
9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // double-free. So use a temporary variable here.
9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (overscroll_window_.get()) {
9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::AutoReset<OverscrollMode> reset_state(&current_overscroll_gesture_,
9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                current_overscroll_gesture_);
9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    scoped_ptr<aura::Window> reset_window(overscroll_window_.release());
9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* overscroll_delegate = new OverscrollWindowDelegate(
9222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_,
9232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_);
9242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset(new aura::Window(overscroll_delegate));
9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
9262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetTransparent(true);
9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->Init(ui::LAYER_TEXTURED);
9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->layer()->SetMasksToBounds(true);
9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetName("OverscrollOverlay");
9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_change_brightness_ = overscroll_delegate->has_screenshot();
9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->AddChild(overscroll_window_.get());
9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect bounds = gfx::Rect(window_->bounds().size());
9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_)) {
9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The overlay will be sliding in from the right edge towards the left in
9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // non-RTL, or sliding in from the left edge towards the right in RTL.
9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // So position the overlay window accordingly.
9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bounds.Offset(base::i18n::IsRTL() ? -bounds.width() : bounds.width(), 0);
9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetWindowToAnimateForOverscroll() == overscroll_window_.get()) {
9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    overscroll_delegate->set_show_shadow(true);
9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->StackChildAbove(overscroll_window_.get(), content_container_);
9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    window_->StackChildBelow(overscroll_window_.get(), content_container_);
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    switch (current_overscroll_gesture_) {
9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_EAST:
9512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_container_->SetShadowEdge(SHADOW_LEFT);
9522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_WEST:
9552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_container_->SetShadowEdge(SHADOW_RIGHT);
9562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_NORTH:
9592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_container_->SetShadowEdge(SHADOW_BOTTOM);
9602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_SOUTH:
9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        content_container_->SetShadowEdge(SHADOW_TOP);
9642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        break;
9652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_NONE:
9672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case OVERSCROLL_COUNT:
9682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        NOTREACHED();
9692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
9702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
9712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(0.f);
9732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SetBounds(bounds);
9752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->Show();
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareContentWindowForOverscroll() {
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(content_container_);
9802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK_EQ(content_container_, GetContentNativeView()->parent());
9812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* content = content_container_;
9832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(content->layer()->GetAnimator());
9842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
9852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->SetTransform(gfx::Transform());
9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content->layer()->SetLayerBrightness(0.f);
9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::ResetOverscrollTransform() {
9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
9932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!target)
9942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
9952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
9972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
9982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetTweenType(ui::Tween::EASE_OUT);
10002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.AddObserver(this);
10012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    target->SetTransform(gfx::Transform());
10022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  {
10042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
10052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetPreemptionStrategy(
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    settings.SetTweenType(ui::Tween::EASE_OUT);
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UpdateOverscrollWindowBrightness(0.f);
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CompleteOverscrollNavigation(OverscrollMode mode) {
10132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!web_contents_->GetRenderWidgetHostView())
10142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Animate out the current view first. Navigate to the requested history at
10172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the end of the animation.
10182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
10192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Navigated",
10222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            current_overscroll_gesture_, OVERSCROLL_COUNT);
10232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = mode;
10252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
10262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
10272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(
10282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::LayerAnimator::IMMEDIATELY_ANIMATE_TO_NEW_TARGET);
10292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetTweenType(ui::Tween::EASE_OUT);
10302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.AddObserver(this);
10312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
10322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int content_width =
10332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderWidgetHostView()->GetViewBounds().width();
10342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int translate_x = mode == OVERSCROLL_WEST ? -content_width : content_width;
10352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(translate_x, 0);
10362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetTransform(transform);
10372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(translate_x);
10382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)aura::Window* WebContentsViewAura::GetWindowToAnimateForOverscroll() {
10412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
10422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
10432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return ShouldNavigateForward(web_contents_->GetController(),
10452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               current_overscroll_gesture_) ?
10462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_window_.get() : content_container_;
10472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Vector2d WebContentsViewAura::GetTranslationForOverscroll(int delta_x,
10502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                               int delta_y) {
10512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NORTH ||
10522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      current_overscroll_gesture_ == OVERSCROLL_SOUTH) {
10532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Ignore vertical overscroll.
10542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d();
10552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
10562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For horizontal overscroll, scroll freely if a navigation is possible. Do a
10582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // resistive scroll otherwise.
10592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const NavigationControllerImpl& controller = web_contents_->GetController();
10602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect& bounds = GetViewBounds();
10612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, current_overscroll_gesture_))
10622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::max(-bounds.width(), delta_x), 0);
10632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  else if (ShouldNavigateBack(controller, current_overscroll_gesture_))
10642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gfx::Vector2d(std::min(bounds.width(), delta_x), 0);
10652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Vector2d();
10672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::PrepareOverscrollNavigationOverlay() {
10702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  OverscrollWindowDelegate* delegate = static_cast<OverscrollWindowDelegate*>(
10712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      overscroll_window_->delegate());
10722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->set_show_shadow(false);
10732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate->stop_forwarding_events();
10742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_->SchedulePaintInRect(
10752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      gfx::Rect(overscroll_window_->bounds().size()));
10762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_->SetOverlayWindow(overscroll_window_.Pass(),
10772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        delegate->has_screenshot());
10782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_->StartObservingView(static_cast<
10792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderWidgetHostViewAura*>(web_contents_->GetRenderWidgetHostView()));
10802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
10812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::UpdateOverscrollWindowBrightness(float delta_x) {
10832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!overscroll_change_brightness_)
10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMin = -.1f;
10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const float kBrightnessMax = -.01f;
10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float ratio = fabs(delta_x) / GetViewBounds().width();
10902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ratio = std::min(1.f, ratio);
10912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (base::i18n::IsRTL())
10922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ratio = 1.f - ratio;
10932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float brightness = current_overscroll_gesture_ == OVERSCROLL_WEST ?
10942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMin + ratio * (kBrightnessMax - kBrightnessMin) :
10952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      kBrightnessMax - ratio * (kBrightnessMax - kBrightnessMin);
10962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::max(kBrightnessMin, brightness);
10972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  brightness = std::min(kBrightnessMax, brightness);
10982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* window = GetWindowToAnimateForOverscroll();
10992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window->layer()->SetLayerBrightness(brightness);
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
11032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsView implementation:
11042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetNativeView() const {
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_.get();
11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeView WebContentsViewAura::GetContentNativeView() const {
11102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
11112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return rwhv ? rwhv->GetNativeView() : NULL;
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeWindow WebContentsViewAura::GetTopLevelNativeWindow() const {
11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_->GetToplevelWindow();
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetContainerBounds(gfx::Rect *out) const {
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out = window_->GetBoundsInScreen();
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnTabCrashed(base::TerminationStatus status,
11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int error_code) {
11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the focus to the parent because neither the view window nor this
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // window can handle key events.
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (window_->HasFocus() && window_->parent())
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->parent()->Focus();
11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SizeContents(const gfx::Size& size) {
11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = window_->bounds();
11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bounds.size() != size) {
11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_size(size);
11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window_->SetBounds(bounds);
11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Our size matches what we want but the renderers size may not match.
11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Pretend we were resized so that the renderers size is updated too.
11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SizeChangedCommon(size);
11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::Focus() {
11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetInterstitialPage()) {
11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetInterstitialPage()->Focus();
11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get() && delegate_->Focus())
11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RenderWidgetHostView* rwhv = web_contents_->GetRenderWidgetHostView();
11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rwhv)
11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rwhv->Focus();
11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::SetInitialFocus() {
11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->FocusLocationBarByDefault())
11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->SetFocusToLocationBar(false);
11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Focus();
11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StoreFocus() {
11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get())
11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->StoreFocus();
11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::RestoreFocus() {
11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get())
11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->RestoreFocus();
11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebDropData* WebContentsViewAura::GetDropData() const {
11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_drop_data_.get();
11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect WebContentsViewAura::GetViewBounds() const {
11782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return window_->GetBoundsInScreen();
11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
11822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, WebContentsViewPort implementation:
11832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::CreateView(
11852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Size& initial_size, gfx::NativeView context) {
11862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // NOTE: we ignore |initial_size| since in some cases it's wrong (such as
11872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the bookmark bar is not shown and you create a new tab). The right
11882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // value is set shortly after this, so its safe to ignore.
11892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
11902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_.reset(new aura::Window(this));
11912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_owned_by_parent(false);
11922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetType(aura::client::WINDOW_TYPE_CONTROL);
11932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetTransparent(false);
11942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->Init(ui::LAYER_NOT_DRAWN);
11952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::RootWindow* root_window = context ? context->GetRootWindow() : NULL;
11962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (root_window) {
11972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // There are places where there is no context currently because object
11982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // hierarchies are built before they're attached to a Widget. (See
11992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // views::WebView as an example; GetWidget() returns NULL at the point
12002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // where we are created.)
12012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    //
12022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // It should be OK to not set a default parent since such users will
12032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // explicitly add this WebContentsViewAura to their tree after they create
12042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // us.
12052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (root_window) {
12062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      window_->SetDefaultParentByRootWindow(
12072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          root_window, root_window->GetBoundsInScreen());
12082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
12092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->layer()->SetMasksToBounds(true);
12112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->SetName("WebContentsViewAura");
12122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_observer_.reset(new WindowObserver(this));
12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN)
12152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  child_window_observer_.reset(new ChildWindowObserver(this));
12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // delegate_->GetDragDestDelegate() creates a new delegate on every call.
12192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Hence, we save a reference to it locally. Similar model is used on other
12202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // platforms as well.
12212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (delegate_.get())
12222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drag_dest_delegate_ = delegate_->GetDragDestDelegate();
12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForWidget(
12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (render_widget_host->GetView()) {
12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // During testing, the view will already be set up in most cases to the
12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // test view, so we don't want to clobber it with a real one. To verify that
12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // this actually is happening (and somebody isn't accidentally creating the
12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // view twice), we check for the RVH Factory, which will be set when we're
12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // making special ones (which go along with the special views).
12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DCHECK(RenderViewHostFactory::has_factory());
12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return render_widget_host->GetView();
12352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostView* view =
12382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderWidgetHostView::CreateViewForWidget(render_widget_host);
12392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->InitAsChild(NULL);
12402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content_container_ = new ShadowWindow(view->GetNativeView());
12412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetNativeView()->AddChild(content_container_);
12422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
12442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_overlay_->StartObservingView(static_cast<
12452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderWidgetHostViewAura*>(view));
12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  view->Show();
12492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We listen to drag drop events in the newly created view's window.
12512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::client::SetDragDropDelegate(view->GetNativeView(), this);
12522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderWidgetHostImpl* host_impl =
12542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      RenderWidgetHostImpl::From(render_widget_host);
12552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host_impl->overscroll_controller() &&
12562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (!web_contents_->GetDelegate() ||
12572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       web_contents_->GetDelegate()->CanOverscrollContent())) {
12582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_impl->overscroll_controller()->set_delegate(this);
12592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!navigation_overlay_.get())
12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      navigation_overlay_.reset(new OverscrollNavigationOverlay());
12612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return view;
12642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)RenderWidgetHostView* WebContentsViewAura::CreateViewForPopupWidget(
12672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RenderWidgetHost* render_widget_host) {
12682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return RenderWidgetHostViewPort::CreateViewForWidget(render_widget_host);
12692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetPageTitle(const string16& title) {
12722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  window_->set_title(title);
12732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewCreated(RenderViewHost* host) {
12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::RenderViewSwappedIn(RenderViewHost* host) {
12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (navigation_overlay_.get() && navigation_overlay_->has_window()) {
12802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    navigation_overlay_->StartObservingView(static_cast<
12812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        RenderWidgetHostViewAura*>(host->GetView()));
12822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
12842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::SetOverscrollControllerEnabled(bool enabled) {
12862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RenderViewHostImpl* host = static_cast<RenderViewHostImpl*>(
12872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      web_contents_->GetRenderViewHost());
12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (host) {
12892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host->SetOverscrollControllerEnabled(enabled);
12902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (enabled)
12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host->overscroll_controller()->set_delegate(this);
12922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, RenderViewHostDelegateView implementation:
12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::ShowContextMenu(
12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContextMenuParams& params,
13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContextMenuSourceType type) {
13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get())
13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->ShowContextMenu(params, type);
13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::ShowPopupMenu(const gfx::Rect& bounds,
13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int item_height,
13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        double item_font_size,
13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        int selected_item,
13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const std::vector<WebMenuItem>& items,
13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool right_aligned,
13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        bool allow_multiple_selection) {
13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // External popup menus are only used on Mac and Android.
13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::StartDragging(
13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebDropData& drop_data,
13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebDragOperationsMask operations,
13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::ImageSkia& image,
13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Vector2d& image_offset,
13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const DragEventSourceInfo& event_info) {
13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::RootWindow* root_window = GetNativeView()->GetRootWindow();
13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!aura::client::GetDragDropClient(root_window))
13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData::Provider* provider = ui::OSExchangeData::CreateProvider();
13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareDragData(drop_data, provider);
13282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::OSExchangeData data(provider);  // takes ownership of |provider|.
13302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!image.isNull()) {
13322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    drag_utils::SetDragImageOnDataObject(image,
13332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        gfx::Size(image.width(), image.height()), image_offset, &data);
13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebDragSourceAura> drag_source(
13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WebDragSourceAura(GetNativeView(), web_contents_));
13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to enable recursive tasks on the message loop so we can get
13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // updates while in the system DoDragDrop loop.
13415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int result_op = 0;
13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
13432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    gfx::NativeView content_native_view = GetContentNativeView();
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MessageLoop::ScopedNestableTaskAllower allow(MessageLoop::current());
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    result_op = aura::client::GetDragDropClient(root_window)->StartDragAndDrop(
13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        data, root_window, content_native_view,
13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event_info.event_location, ConvertFromWeb(operations),
13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event_info.event_source);
13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Bail out immediately if the contents view window is gone. Note that it is
13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // not safe to access any class members after system drag-and-drop returns
13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the class instance might be gone. The local variable |drag_source|
13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is still valid and we can check its window property that is set to NULL
13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // when the contents are gone.
13565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!drag_source->window())
13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndDrag(ConvertToWeb(result_op));
13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragSourceSystemDragEnded();
13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::UpdateDragCursor(WebKit::WebDragOperation operation) {
13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drag_op_ = operation;
13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GotFocus() {
13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate())
13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->GetDelegate()->WebContentsFocused(web_contents_);
13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::TakeFocus(bool reverse) {
13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (web_contents_->GetDelegate() &&
13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !web_contents_->GetDelegate()->TakeFocus(web_contents_, reverse) &&
13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delegate_.get()) {
13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->TakeFocus(reverse);
13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
13795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
13812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, OverscrollControllerDelegate implementation:
13822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollUpdate(float delta_x, float delta_y) {
13842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (current_overscroll_gesture_ == OVERSCROLL_NONE)
13852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
13862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  aura::Window* target = GetWindowToAnimateForOverscroll();
13882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ui::ScopedLayerAnimationSettings settings(target->layer()->GetAnimator());
13892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.SetPreemptionStrategy(ui::LayerAnimator::IMMEDIATELY_SET_NEW_TARGET);
13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Vector2d translate = GetTranslationForOverscroll(delta_x, delta_y);
13912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
13922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.Translate(translate.x(), translate.y());
13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  target->SetTransform(transform);
13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UpdateOverscrollWindowBrightness(delta_x);
13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
13972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
13982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollComplete(OverscrollMode mode) {
13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_ENUMERATION("Overscroll.Completed", mode, OVERSCROLL_COUNT);
14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NavigationControllerImpl& controller = web_contents_->GetController();
14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(controller, mode) ||
14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ShouldNavigateBack(controller, mode)) {
14042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CompleteOverscrollNavigation(mode);
14052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
14062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
14092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnOverscrollModeChange(OverscrollMode old_mode,
14122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                 OverscrollMode new_mode) {
14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Reset any in-progress overscroll animation first.
14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ResetOverscrollTransform();
14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the content window has been prepared correctly before allowing
14172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // overscroll.
14182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool content_window_ready =
14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content_container_ &&
14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentNativeView() &&
14212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GetContentNativeView()->parent() == content_container_;
14222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (new_mode == OVERSCROLL_NONE ||
14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !content_window_ready ||
14252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (navigation_overlay_.get() && navigation_overlay_->has_window())) {
14262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = OVERSCROLL_NONE;
14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Cleanup state of the content window first, because that can reset the
14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // value of |current_overscroll_gesture_|.
14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareContentWindowForOverscroll();
14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    current_overscroll_gesture_ = new_mode;
14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollWindow();
14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_ENUMERATION("Overscroll.Started", new_mode, OVERSCROLL_COUNT);
14362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
14382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// WebContentsViewAura, ui::ImplicitAnimationObserver implementation:
14422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnImplicitAnimationsCompleted() {
14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (ShouldNavigateForward(web_contents_->GetController(),
14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            completed_overscroll_gesture_)) {
14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollNavigationOverlay();
14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoForward();
14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (ShouldNavigateBack(web_contents_->GetController(),
14492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                completed_overscroll_gesture_)) {
14502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrepareOverscrollNavigationOverlay();
14512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    web_contents_->GetController().GoBack();
14522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (GetContentNativeView()) {
14552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_container_->SetTransform(gfx::Transform());
14562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_container_->layer()->SetLayerBrightness(0.f);
14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content_container_->SetShadowEdge(SHADOW_NONE);
14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_overscroll_gesture_ = OVERSCROLL_NONE;
14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  completed_overscroll_gesture_ = OVERSCROLL_NONE;
14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::WindowDelegate implementation:
14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Size WebContentsViewAura::GetMinimumSize() const {
14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Size WebContentsViewAura::GetMaximumSize() const {
14722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::Size();
14732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnBoundsChanged(const gfx::Rect& old_bounds,
14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          const gfx::Rect& new_bounds) {
14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SizeChangedCommon(new_bounds.size());
14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delegate_.get())
14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delegate_->SizeChanged(new_bounds.size());
14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Constrained web dialogs, need to be kept centered over our content area.
14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < window_->children().size(); i++) {
14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (window_->children()[i]->GetProperty(
14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            aura::client::kConstrainedWindowKey)) {
14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect bounds = window_->children()[i]->bounds();
14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bounds.set_origin(
14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Point((new_bounds.width() - bounds.width()) / 2,
14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     (new_bounds.height() - bounds.height()) / 2));
14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_->children()[i]->SetBounds(bounds);
14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::NativeCursor WebContentsViewAura::GetCursor(const gfx::Point& point) {
14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::kNullCursor;
14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::GetNonClientComponent(const gfx::Point& point) const {
14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return HTCLIENT;
15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::ShouldDescendIntoChildForEventHandling(
15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    aura::Window* child,
15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const gfx::Point& location) {
15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::CanFocus() {
15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Do not take the focus if the render widget host view is gone because
15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // neither the view window nor this window can handle key events.
15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return web_contents_->GetRenderWidgetHostView() != NULL;
15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnCaptureLost() {
15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnPaint(gfx::Canvas* canvas) {
15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDeviceScaleFactorChanged(
15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    float device_scale_factor) {
15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroying() {
15252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This means the destructor is going to be called soon. If there is an
15262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // overscroll gesture in progress (i.e. |overscroll_window_| is not NULL),
15272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // then destroying it in the WebContentsViewAura destructor can trigger other
15282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // virtual functions to be called (e.g. OnImplicitAnimationsCompleted()). So
15292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // destroy the overscroll window here.
15302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  navigation_overlay_.reset();
15312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  overscroll_window_.reset();
15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowDestroyed() {
15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnWindowTargetVisibilityChanged(bool visible) {
15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (visible)
15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->WasShown();
15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    web_contents_->WasHidden();
15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebContentsViewAura::HasHitTestMask() const {
15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::GetHitTestMask(gfx::Path* mask) const {
15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<ui::Texture> WebContentsViewAura::CopyTexture() {
15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The layer we create doesn't have an external texture, so this should never
15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // get invoked.
15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scoped_refptr<ui::Texture>();
15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, ui::EventHandler implementation:
15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnKeyEvent(ui::KeyEvent* event) {
15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentsViewAura::OnMouseEvent(ui::MouseEvent* event) {
15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!web_contents_->GetDelegate())
15662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return;
15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (event->type()) {
15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_PRESSED:
15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ActivateContents(web_contents_);
15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case ui::ET_MOUSE_MOVED:
15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetDelegate()->ContentsMouseEvent(
15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_,
15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          true);
15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebContentsViewAura, aura::client::DragDropDelegate implementation:
15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragEntered(const ui::DropTargetEvent& event) {
15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->DragInitialize(web_contents_);
15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset(new WebDropData());
15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrepareWebDropData(current_drop_data_.get(), event.data());
15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_rvh_for_drag_ = web_contents_->GetRenderViewHost();
15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragEnter(
15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *current_drop_data_.get(), event.location(), screen_pt, op,
16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_) {
16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnReceiveDragData(event.data());
16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragEnter();
16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnDragUpdated(const ui::DropTargetEvent& event) {
16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebKit::WebDragOperationsMask op = ConvertToWeb(event.source_operations());
16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point screen_pt =
16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint();
16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragOver(
16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event.location(), screen_pt, op,
16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragOver();
16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ConvertFromWeb(current_drag_op_);
16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebContentsViewAura::OnDragExited() {
16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDragLeave();
16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDragLeave();
16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int WebContentsViewAura::OnPerformDrop(const ui::DropTargetEvent& event) {
16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(current_rvh_for_drag_);
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (current_rvh_for_drag_ != web_contents_->GetRenderViewHost())
16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OnDragEntered(event);
16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->DragTargetDrop(
16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event.location(),
16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Screen::GetScreenFor(GetNativeView())->GetCursorScreenPoint(),
16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ConvertAuraEventFlagsToWebInputEventModifiers(event.flags()));
16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (drag_dest_delegate_)
16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    drag_dest_delegate_->OnDrop();
16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_drop_data_.reset();
16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return current_drag_op_;
16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
1654