Index: ui/views/controls/native/native_view_host_aura.cc |
diff --git a/ui/views/controls/native/native_view_host_aura.cc b/ui/views/controls/native/native_view_host_aura.cc |
index f690f0574fae9569ff7a6eb73c9470770e691d34..ae9a6b90cbafe172f880680e7b178fb2745ddfe7 100644 |
--- a/ui/views/controls/native/native_view_host_aura.cc |
+++ b/ui/views/controls/native/native_view_host_aura.cc |
@@ -8,16 +8,62 @@ |
#include "ui/aura/client/aura_constants.h" |
#include "ui/aura/client/focus_client.h" |
#include "ui/aura/window.h" |
+#include "ui/aura/window_delegate.h" |
#include "ui/base/cursor/cursor.h" |
+#include "ui/base/hit_test.h" |
#include "ui/views/controls/native/native_view_host.h" |
#include "ui/views/view_constants_aura.h" |
#include "ui/views/widget/widget.h" |
namespace views { |
+class NativeViewHostAura::ClippingWindowDelegate : public aura::WindowDelegate { |
+ public: |
+ ClippingWindowDelegate() : native_view_(NULL) {} |
+ virtual ~ClippingWindowDelegate() {} |
+ |
+ void set_native_view(aura::Window* native_view) { |
+ native_view_ = native_view; |
+ } |
+ |
+ virtual gfx::Size GetMinimumSize() const OVERRIDE { return gfx::Size(); } |
+ virtual gfx::Size GetMaximumSize() const OVERRIDE { return gfx::Size(); } |
+ virtual void OnBoundsChanged(const gfx::Rect& old_bounds, |
+ const gfx::Rect& new_bounds) OVERRIDE {} |
+ virtual gfx::NativeCursor GetCursor(const gfx::Point& point) OVERRIDE { |
+ return gfx::kNullCursor; |
+ } |
+ virtual int GetNonClientComponent(const gfx::Point& point) const OVERRIDE { |
+ return HTCLIENT; |
+ } |
+ virtual bool ShouldDescendIntoChildForEventHandling( |
+ aura::Window* child, |
+ const gfx::Point& location) OVERRIDE { return true; } |
+ virtual bool CanFocus() OVERRIDE { |
+ // Ask the hosted native view's delegate because directly calling |
+ // aura::Window::CanFocus() will call back into this when checking whether |
+ // parents can focus. |
+ return native_view_ && native_view_->delegate() |
+ ? native_view_->delegate()->CanFocus() |
+ : true; |
+ } |
+ virtual void OnCaptureLost() OVERRIDE {} |
+ virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {} |
+ virtual void OnDeviceScaleFactorChanged(float device_scale_factor) OVERRIDE {} |
+ virtual void OnWindowDestroying(aura::Window* window) OVERRIDE {} |
+ virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {} |
+ virtual void OnWindowTargetVisibilityChanged(bool visible) OVERRIDE {} |
+ virtual bool HasHitTestMask() const OVERRIDE { return false; } |
+ virtual void GetHitTestMask(gfx::Path* mask) const OVERRIDE {} |
+ |
+ private: |
+ aura::Window* native_view_; |
+}; |
+ |
NativeViewHostAura::NativeViewHostAura(NativeViewHost* host) |
: host_(host), |
- clipping_window_(NULL) { |
+ clipping_window_delegate_(new ClippingWindowDelegate()), |
+ clipping_window_(clipping_window_delegate_.get()) { |
clipping_window_.Init(aura::WINDOW_LAYER_NOT_DRAWN); |
clipping_window_.set_owned_by_parent(false); |
clipping_window_.SetName("NativeViewHostAuraClip"); |
@@ -39,6 +85,7 @@ NativeViewHostAura::~NativeViewHostAura() { |
//////////////////////////////////////////////////////////////////////////////// |
// NativeViewHostAura, NativeViewHostWrapper implementation: |
void NativeViewHostAura::AttachNativeView() { |
+ clipping_window_delegate_->set_native_view(host_->native_view()); |
host_->native_view()->AddObserver(this); |
host_->native_view()->SetProperty(views::kHostViewKey, |
static_cast<View*>(host_)); |
@@ -46,6 +93,7 @@ void NativeViewHostAura::AttachNativeView() { |
} |
void NativeViewHostAura::NativeViewDetaching(bool destroyed) { |
+ clipping_window_delegate_->set_native_view(NULL); |
RemoveClippingWindow(); |
if (!destroyed) { |
host_->native_view()->RemoveObserver(this); |
@@ -132,6 +180,11 @@ gfx::NativeCursor NativeViewHostAura::GetCursor(int x, int y) { |
return gfx::kNullCursor; |
} |
+void NativeViewHostAura::OnWindowDestroying(aura::Window* window) { |
+ DCHECK(window == host_->native_view()); |
+ clipping_window_delegate_->set_native_view(NULL); |
+} |
+ |
void NativeViewHostAura::OnWindowDestroyed(aura::Window* window) { |
DCHECK(window == host_->native_view()); |
host_->NativeViewDestroyed(); |