diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-29 22:55:24 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-11-29 22:55:24 +0000 |
commit | 002ae4222e36f23ee1eb13e72d04e916571a36b6 (patch) | |
tree | 5819787f62c37d1842c4bbfd028bf406fb7bee9a /chrome | |
parent | 400bcf7e617fdea911fd73e506d1b2c55c437de9 (diff) | |
download | chromium_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')
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', |