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(¤t_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