summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-29 22:55:24 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-29 22:55:24 +0000
commit002ae4222e36f23ee1eb13e72d04e916571a36b6 (patch)
tree5819787f62c37d1842c4bbfd028bf406fb7bee9a /chrome
parent400bcf7e617fdea911fd73e506d1b2c55c437de9 (diff)
downloadchromium_src-002ae4222e36f23ee1eb13e72d04e916571a36b6.zip
chromium_src-002ae4222e36f23ee1eb13e72d04e916571a36b6.tar.gz
chromium_src-002ae4222e36f23ee1eb13e72d04e916571a36b6.tar.bz2
Mac: Add unit test that makes sure clicking accelerated views focuses the RWHVMac.
BUG=60318 TEST=none Review URL: http://codereview.chromium.org/5365006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@67605 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.h4
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac.mm58
-rw-r--r--chrome/browser/renderer_host/render_widget_host_view_mac_unittest.mm90
-rw-r--r--chrome/chrome_tests.gypi1
4 files changed, 125 insertions, 28 deletions
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.h b/chrome/browser/renderer_host/render_widget_host_view_mac.h
index e539f14..46ccd10 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.h
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.h
@@ -228,6 +228,10 @@ class RenderWidgetHostViewMac : public RenderWidgetHostView {
bool root);
virtual void DestroyFakePluginWindowHandle(gfx::PluginWindowHandle window);
+ // Exposed for testing.
+ AcceleratedPluginView* ViewForPluginWindowHandle(
+ gfx::PluginWindowHandle window);
+
// Helper to do the actual cleanup after a plugin handle has been destroyed.
// Required because DestroyFakePluginWindowHandle() isn't always called for
// all handles (it's e.g. not called on navigation, when the RWHVMac gets
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac.mm b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
index b0ef7e6..d37ad89 100644
--- a/chrome/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac.mm
@@ -607,6 +607,7 @@ void RenderWidgetHostViewMac::SetSize(const gfx::Size& size) {
// upper-left corner pinned. If the new size is valid, this is a popup whose
// superview is another RenderWidgetHostViewCocoa, but even if it's directly
// in a TabContentsViewCocoa, they're both BaseViews.
+ DCHECK([[cocoa_view_ superview] isKindOfClass:[BaseView class]]);
gfx::Rect rect =
[(BaseView*)[cocoa_view_ superview] flipNSRectToRect:[cocoa_view_ frame]];
rect.set_width(size.width());
@@ -630,11 +631,10 @@ void RenderWidgetHostViewMac::MovePluginWindows(
++iter) {
webkit_glue::WebPluginGeometry geom = *iter;
- PluginViewMap::iterator it = plugin_views_.find(geom.window);
- DCHECK(plugin_views_.end() != it);
- if (plugin_views_.end() == it) {
+ AcceleratedPluginView* view = ViewForPluginWindowHandle(geom.window);
+ DCHECK(view);
+ if (!view)
continue;
- }
if (geom.rects_valid) {
gfx::Rect rect = geom.window_rect;
@@ -645,15 +645,15 @@ void RenderWidgetHostViewMac::MovePluginWindows(
rect.set_height(geom.clip_rect.height());
}
NSRect new_rect([cocoa_view_ flipRectToNSRect:rect]);
- [it->second setFrame:new_rect];
- [it->second setNeedsDisplay:YES];
+ [view setFrame:new_rect];
+ [view setNeedsDisplay:YES];
}
plugin_container_manager_.SetPluginContainerGeometry(geom);
BOOL visible =
plugin_container_manager_.SurfaceShouldBeVisible(geom.window);
- [it->second setHidden:!visible];
+ [view setHidden:!visible];
}
}
@@ -951,6 +951,15 @@ void RenderWidgetHostViewMac::DeallocFakePluginWindowHandle(
plugin_container_manager_.DestroyFakePluginWindowHandle(window);
}
+AcceleratedPluginView* RenderWidgetHostViewMac::ViewForPluginWindowHandle(
+ gfx::PluginWindowHandle window) {
+ PluginViewMap::iterator it = plugin_views_.find(window);
+ DCHECK(plugin_views_.end() != it);
+ if (plugin_views_.end() == it)
+ return nil;
+ return it->second;
+}
+
void RenderWidgetHostViewMac::AcceleratedSurfaceSetIOSurface(
gfx::PluginWindowHandle window,
int32 width,
@@ -996,16 +1005,13 @@ void RenderWidgetHostViewMac::AcceleratedSurfaceBuffersSwapped(
int32 route_id,
uint64 swap_buffers_count) {
CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- PluginViewMap::iterator it = plugin_views_.find(window);
- DCHECK(plugin_views_.end() != it);
- if (plugin_views_.end() == it) {
+ AcceleratedPluginView* view = ViewForPluginWindowHandle(window);
+ DCHECK(view);
+ if (!view)
return;
- }
- DCHECK([it->second isKindOfClass:[AcceleratedPluginView class]]);
plugin_container_manager_.SetSurfaceWasPaintedTo(window, surface_id);
- AcceleratedPluginView* view =
- static_cast<AcceleratedPluginView*>(it->second);
+
// The surface is hidden until its first paint, to not show gargabe.
if (plugin_container_manager_.SurfaceShouldBeVisible(window))
[view setHidden:NO];
@@ -1027,15 +1033,12 @@ void RenderWidgetHostViewMac::UpdateRootGpuViewVisibility(
gfx::PluginWindowHandle root_handle =
plugin_container_manager_.root_container_handle();
if (root_handle != gfx::kNullPluginWindow) {
- PluginViewMap::iterator it = plugin_views_.find(root_handle);
- DCHECK(plugin_views_.end() != it);
- if (plugin_views_.end() == it) {
- return;
- }
+ AcceleratedPluginView* view = ViewForPluginWindowHandle(root_handle);
+ DCHECK(view);
bool visible =
plugin_container_manager_.SurfaceShouldBeVisible(root_handle);
- [[it->second window] disableScreenUpdatesUntilFlush];
- [it->second setHidden:!visible];
+ [[view window] disableScreenUpdatesUntilFlush];
+ [view setHidden:!visible];
}
}
@@ -1692,13 +1695,12 @@ void RenderWidgetHostViewMac::SetTextInputActive(bool active) {
gfx::PluginWindowHandle root_handle =
renderWidgetHostView_->plugin_container_manager_.root_container_handle();
if (root_handle != gfx::kNullPluginWindow) {
- RenderWidgetHostViewMac::PluginViewMap::iterator it =
- renderWidgetHostView_->plugin_views_.find(root_handle);
- DCHECK(it != renderWidgetHostView_->plugin_views_.end());
- if (it != renderWidgetHostView_->plugin_views_.end() &&
- ![it->second isHidden]) {
- NSRect frame = [it->second frame];
- frame.size = [it->second cachedSize];
+ AcceleratedPluginView* view =
+ renderWidgetHostView_->ViewForPluginWindowHandle(root_handle);
+ DCHECK(view);
+ if (view && ![view isHidden]) {
+ NSRect frame = [view frame];
+ frame.size = [view cachedSize];
gpuRect = [self flipNSRectToRect:frame];
}
}
diff --git a/chrome/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/chrome/browser/renderer_host/render_widget_host_view_mac_unittest.mm
new file mode 100644
index 0000000..de84d07
--- /dev/null
+++ b/chrome/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -0,0 +1,90 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/renderer_host/render_widget_host_view_mac.h"
+
+#include "chrome/browser/browser_thread.h"
+#import "chrome/browser/cocoa/cocoa_test_helper.h"
+#include "chrome/browser/renderer_host/test/test_render_view_host.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class RenderWidgetHostViewMacTest : public RenderViewHostTestHarness {
+ public:
+ RenderWidgetHostViewMacTest() {}
+
+ virtual void SetUp() {
+ RenderViewHostTestHarness::SetUp();
+
+ // Owned by its |native_view()|.
+ rwhv_mac_ = new RenderWidgetHostViewMac(rvh());
+
+ // Will be released when the superclass's RenderWidgetHost is destroyed.
+ rwhv_cocoa_ = [rwhv_mac_->native_view() retain];
+ }
+ protected:
+ RenderWidgetHostViewMac* rwhv_mac_;
+ RenderWidgetHostViewCocoa* rwhv_cocoa_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewMacTest);
+};
+
+TEST_F(RenderWidgetHostViewMacTest, Basic) {
+}
+
+// Regression test for http://crbug.com/60318
+TEST_F(RenderWidgetHostViewMacTest, FocusAcceleratedView) {
+ // The accelerated view methods want to be called on the UI thread.
+ scoped_ptr<BrowserThread> ui_thread_(
+ new BrowserThread(BrowserThread::UI, MessageLoop::current()));
+
+ int w = 400, h = 300;
+ // Create an accelerated view the size of the rhwvmac.
+ [rwhv_cocoa_ setFrame:NSMakeRect(0, 0, w, h)];
+ gfx::PluginWindowHandle accelerated_handle =
+ rwhv_mac_->AllocateFakePluginWindowHandle(/*opaque=*/false,
+ /*root=*/false);
+ rwhv_mac_->AcceleratedSurfaceSetIOSurface(accelerated_handle, w, h, 0);
+
+ // The accelerated view isn't shown until it has a valid rect and has been
+ // painted to.
+ rwhv_mac_->AcceleratedSurfaceBuffersSwapped(accelerated_handle, 0, 0, 0, 0);
+ webkit_glue::WebPluginGeometry geom;
+ gfx::Rect rect(0, 0, w, h);
+ geom.window = accelerated_handle;
+ geom.window_rect = rect;
+ geom.clip_rect = rect;
+ geom.visible = true;
+ geom.rects_valid = true;
+ rwhv_mac_->MovePluginWindows(
+ std::vector<webkit_glue::WebPluginGeometry>(1, geom));
+ EXPECT_FALSE([rwhv_cocoa_ isHidden]);
+ NSView* accelerated_view = static_cast<NSView*>(
+ rwhv_mac_->ViewForPluginWindowHandle(accelerated_handle));
+ EXPECT_FALSE([accelerated_view isHidden]);
+
+ // Take away first responder from the rwhvmac, then simulate the effect of a
+ // click on the accelerated view. The rwhvmac should be first responder
+ // again.
+ scoped_nsobject<NSWindow> window([[CocoaTestHelperWindow alloc] init]);
+ scoped_nsobject<NSView> other_view(
+ [[NSTextField alloc] initWithFrame:NSMakeRect(0, h, w, 40)]);
+ [[window contentView] addSubview:rwhv_cocoa_];
+ [[window contentView] addSubview:other_view.get()];
+
+ EXPECT_TRUE([rwhv_cocoa_ acceptsFirstResponder]);
+ [window makeFirstResponder:rwhv_cocoa_];
+ EXPECT_EQ(rwhv_cocoa_, [window firstResponder]);
+ EXPECT_FALSE([accelerated_view acceptsFirstResponder]);
+
+ EXPECT_TRUE([other_view acceptsFirstResponder]);
+ [window makeFirstResponder:other_view];
+ EXPECT_NE(rwhv_cocoa_, [window firstResponder]);
+
+ EXPECT_TRUE([accelerated_view acceptsFirstResponder]);
+ [window makeFirstResponder:accelerated_view];
+ EXPECT_EQ(rwhv_cocoa_, [window firstResponder]);
+
+ // Clean up.
+ rwhv_mac_->DestroyFakePluginWindowHandle(accelerated_handle);
+}
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi
index bb6f463..3bbbd63 100644
--- a/chrome/chrome_tests.gypi
+++ b/chrome/chrome_tests.gypi
@@ -1447,6 +1447,7 @@
'browser/renderer_host/gtk_im_context_wrapper_unittest.cc',
'browser/renderer_host/gtk_key_bindings_handler_unittest.cc',
'browser/renderer_host/render_widget_host_unittest.cc',
+ 'browser/renderer_host/render_widget_host_view_mac_unittest.mm',
'browser/renderer_host/resource_dispatcher_host_unittest.cc',
'browser/renderer_host/resource_queue_unittest.cc',
'browser/renderer_host/test/render_view_host_unittest.cc',