This source file includes following definitions.
- ConvertPointToScreen
- ConvertPointFromScreen
- ConvertHostPointToScreen
- SetBounds
- destroyed
- OnWindowDestroyed
- callback_
- ShouldCaptureFrame
- CallbackMethod
- has_resize_lock_
- ShouldCreateResizeLock
- CreateResizeLock
- RequestCopyOfOutput
- RunOnCompositingDidCommit
- SetUpEnvironment
- TearDownEnvironment
- SetUp
- TearDown
- TearDown
- OnWindowResized
- OnWindowAddedToLayout
- OnWillRemoveWindowFromLayout
- OnWindowRemovedFromLayout
- OnChildWindowVisibilityChanged
- SetChildBounds
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- MakeGLFrame
- MakeSoftwareFrame
- MakeDelegatedFrame
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- result_
- CallbackMethod
- TEST_F
#include "content/browser/renderer_host/render_widget_host_view_aura.h"
#include "base/basictypes.h"
#include "base/memory/shared_memory.h"
#include "base/message_loop/message_loop.h"
#include "base/run_loop.h"
#include "base/strings/utf_string_conversions.h"
#include "cc/output/compositor_frame.h"
#include "cc/output/compositor_frame_metadata.h"
#include "cc/output/copy_output_request.h"
#include "cc/output/gl_frame_data.h"
#include "content/browser/browser_thread_impl.h"
#include "content/browser/compositor/owned_mailbox.h"
#include "content/browser/compositor/resize_lock.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/common/gpu/gpu_messages.h"
#include "content/common/input_messages.h"
#include "content/common/view_messages.h"
#include "content/port/browser/render_widget_host_view_frame_subscriber.h"
#include "content/public/browser/render_widget_host_view.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_context.h"
#include "ipc/ipc_test_sink.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/client/screen_position_client.h"
#include "ui/aura/client/window_tree_client.h"
#include "ui/aura/env.h"
#include "ui/aura/layout_manager.h"
#include "ui/aura/test/aura_test_helper.h"
#include "ui/aura/test/event_generator.h"
#include "ui/aura/test/test_cursor_client.h"
#include "ui/aura/test/test_screen.h"
#include "ui/aura/test/test_window_delegate.h"
#include "ui/aura/window.h"
#include "ui/aura/window_event_dispatcher.h"
#include "ui/aura/window_observer.h"
#include "ui/base/ui_base_types.h"
#include "ui/compositor/compositor.h"
#include "ui/compositor/test/draw_waiter_for_test.h"
#include "ui/compositor/test/in_process_context_factory.h"
#include "ui/events/event.h"
#include "ui/events/event_utils.h"
using testing::_;
namespace content {
namespace {
class TestScreenPositionClient
: public aura::client::ScreenPositionClient {
public:
TestScreenPositionClient() {}
virtual ~TestScreenPositionClient() {}
virtual void ConvertPointToScreen(const aura::Window* window,
gfx::Point* point) OVERRIDE {
point->Offset(-1, -1);
}
virtual void ConvertPointFromScreen(const aura::Window* window,
gfx::Point* point) OVERRIDE {
point->Offset(1, 1);
}
virtual void ConvertHostPointToScreen(aura::Window* window,
gfx::Point* point) OVERRIDE {
ConvertPointToScreen(window, point);
}
virtual void SetBounds(aura::Window* window,
const gfx::Rect& bounds,
const gfx::Display& display) OVERRIDE {
}
};
class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
public:
MockRenderWidgetHostDelegate() {}
virtual ~MockRenderWidgetHostDelegate() {}
};
class TestWindowObserver : public aura::WindowObserver {
public:
explicit TestWindowObserver(aura::Window* window_to_observe)
: window_(window_to_observe) {
window_->AddObserver(this);
}
virtual ~TestWindowObserver() {
if (window_)
window_->RemoveObserver(this);
}
bool destroyed() const { return destroyed_; }
virtual void OnWindowDestroyed(aura::Window* window) OVERRIDE {
CHECK_EQ(window, window_);
destroyed_ = true;
window_ = NULL;
}
private:
aura::Window* window_;
bool destroyed_;
DISALLOW_COPY_AND_ASSIGN(TestWindowObserver);
};
class FakeFrameSubscriber : public RenderWidgetHostViewFrameSubscriber {
public:
FakeFrameSubscriber(gfx::Size size, base::Callback<void(bool)> callback)
: size_(size), callback_(callback) {}
virtual bool ShouldCaptureFrame(base::TimeTicks present_time,
scoped_refptr<media::VideoFrame>* storage,
DeliverFrameCallback* callback) OVERRIDE {
*storage = media::VideoFrame::CreateFrame(media::VideoFrame::YV12,
size_,
gfx::Rect(size_),
size_,
base::TimeDelta());
*callback = base::Bind(&FakeFrameSubscriber::CallbackMethod, callback_);
return true;
}
static void CallbackMethod(base::Callback<void(bool)> callback,
base::TimeTicks timestamp,
bool success) {
callback.Run(success);
}
private:
gfx::Size size_;
base::Callback<void(bool)> callback_;
};
class FakeRenderWidgetHostViewAura : public RenderWidgetHostViewAura {
public:
FakeRenderWidgetHostViewAura(RenderWidgetHost* widget)
: RenderWidgetHostViewAura(widget), has_resize_lock_(false) {}
virtual ~FakeRenderWidgetHostViewAura() {}
virtual bool ShouldCreateResizeLock() OVERRIDE {
gfx::Size desired_size = window()->bounds().size();
return desired_size != current_frame_size();
}
virtual scoped_ptr<ResizeLock> CreateResizeLock(bool defer_compositor_lock)
OVERRIDE {
gfx::Size desired_size = window()->bounds().size();
return scoped_ptr<ResizeLock>(
new FakeResizeLock(desired_size, defer_compositor_lock));
}
virtual void RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request)
OVERRIDE {
last_copy_request_ = request.Pass();
if (last_copy_request_->has_texture_mailbox()) {
GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
GLuint texture = gl_helper->ConsumeMailboxToTexture(
last_copy_request_->texture_mailbox().mailbox(),
last_copy_request_->texture_mailbox().sync_point());
gl_helper->ResizeTexture(texture, window()->bounds().size());
gl_helper->DeleteTexture(texture);
}
}
void RunOnCompositingDidCommit() {
OnCompositingDidCommit(window()->GetHost()->compositor());
}
class FakeResizeLock : public ResizeLock {
public:
FakeResizeLock(const gfx::Size new_size, bool defer_compositor_lock)
: ResizeLock(new_size, defer_compositor_lock) {}
};
bool has_resize_lock_;
gfx::Size last_frame_size_;
scoped_ptr<cc::CopyOutputRequest> last_copy_request_;
};
class RenderWidgetHostViewAuraTest : public testing::Test {
public:
RenderWidgetHostViewAuraTest()
: browser_thread_for_ui_(BrowserThread::UI, &message_loop_) {}
void SetUpEnvironment() {
ImageTransportFactory::InitializeForUnitTests(
scoped_ptr<ui::ContextFactory>(new ui::InProcessContextFactory));
aura_test_helper_.reset(new aura::test::AuraTestHelper(&message_loop_));
aura_test_helper_->SetUp();
browser_context_.reset(new TestBrowserContext);
process_host_ = new MockRenderProcessHost(browser_context_.get());
sink_ = &process_host_->sink();
parent_host_ = new RenderWidgetHostImpl(
&delegate_, process_host_, MSG_ROUTING_NONE, false);
parent_view_ = static_cast<RenderWidgetHostViewAura*>(
RenderWidgetHostView::CreateViewForWidget(parent_host_));
parent_view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(parent_view_->GetNativeView(),
aura_test_helper_->root_window(),
gfx::Rect());
widget_host_ = new RenderWidgetHostImpl(
&delegate_, process_host_, MSG_ROUTING_NONE, false);
widget_host_->Init();
widget_host_->OnMessageReceived(
ViewHostMsg_DidActivateAcceleratedCompositing(0, true));
view_ = new FakeRenderWidgetHostViewAura(widget_host_);
}
void TearDownEnvironment() {
sink_ = NULL;
process_host_ = NULL;
if (view_)
view_->Destroy();
delete widget_host_;
parent_view_->Destroy();
delete parent_host_;
browser_context_.reset();
aura_test_helper_->TearDown();
message_loop_.DeleteSoon(FROM_HERE, browser_context_.release());
message_loop_.RunUntilIdle();
ImageTransportFactory::Terminate();
}
virtual void SetUp() { SetUpEnvironment(); }
virtual void TearDown() { TearDownEnvironment(); }
protected:
base::MessageLoopForUI message_loop_;
BrowserThreadImpl browser_thread_for_ui_;
scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
scoped_ptr<BrowserContext> browser_context_;
MockRenderWidgetHostDelegate delegate_;
MockRenderProcessHost* process_host_;
RenderWidgetHostImpl* parent_host_;
RenderWidgetHostViewAura* parent_view_;
RenderWidgetHostImpl* widget_host_;
FakeRenderWidgetHostViewAura* view_;
IPC::TestSink* sink_;
private:
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraTest);
};
class RenderWidgetHostViewAuraShutdownTest
: public RenderWidgetHostViewAuraTest {
public:
RenderWidgetHostViewAuraShutdownTest() {}
virtual void TearDown() OVERRIDE {
}
private:
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraShutdownTest);
};
class FullscreenLayoutManager : public aura::LayoutManager {
public:
explicit FullscreenLayoutManager(aura::Window* owner)
: owner_(owner) {}
virtual ~FullscreenLayoutManager() {}
virtual void OnWindowResized() OVERRIDE {
aura::Window::Windows::const_iterator i;
for (i = owner_->children().begin(); i != owner_->children().end(); ++i) {
(*i)->SetBounds(gfx::Rect());
}
}
virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE {
child->SetBounds(gfx::Rect());
}
virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {
}
virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE {
}
virtual void OnChildWindowVisibilityChanged(aura::Window* child,
bool visible) OVERRIDE {
}
virtual void SetChildBounds(aura::Window* child,
const gfx::Rect& requested_bounds) OVERRIDE {
SetChildBoundsDirect(child, gfx::Rect(owner_->bounds().size()));
}
private:
aura::Window* owner_;
DISALLOW_COPY_AND_ASSIGN(FullscreenLayoutManager);
};
class MockWindowObserver : public aura::WindowObserver {
public:
MOCK_METHOD2(OnWindowPaintScheduled, void(aura::Window*, const gfx::Rect&));
};
}
TEST_F(RenderWidgetHostViewAuraTest, FocusFullscreen) {
view_->InitAsFullscreen(parent_view_);
aura::Window* window = view_->GetNativeView();
ASSERT_TRUE(window != NULL);
EXPECT_EQ(ui::SHOW_STATE_FULLSCREEN,
window->GetProperty(aura::client::kShowStateKey));
EXPECT_TRUE(window->HasFocus());
EXPECT_TRUE(view_->ShouldActivate());
}
TEST_F(RenderWidgetHostViewAuraTest, PositionChildPopup) {
TestScreenPositionClient screen_position_client;
aura::Window* window = parent_view_->GetNativeView();
aura::Window* root = window->GetRootWindow();
aura::client::SetScreenPositionClient(root, &screen_position_client);
parent_view_->SetBounds(gfx::Rect(10, 10, 800, 600));
gfx::Rect bounds_in_screen = parent_view_->GetViewBounds();
int horiz = bounds_in_screen.width() / 4;
int vert = bounds_in_screen.height() / 4;
bounds_in_screen.Inset(horiz, vert);
view_->InitAsPopup(parent_view_, bounds_in_screen);
gfx::Rect final_bounds_in_screen = view_->GetViewBounds();
EXPECT_EQ(final_bounds_in_screen.ToString(), bounds_in_screen.ToString());
bounds_in_screen = gfx::Rect(60, 60, 100, 100);
view_->SetBounds(bounds_in_screen);
final_bounds_in_screen = view_->GetViewBounds();
EXPECT_EQ(final_bounds_in_screen.ToString(), bounds_in_screen.ToString());
gfx::Point original_origin = window->bounds().origin();
view_->SetSize(gfx::Size(120, 120));
gfx::Point new_origin = window->bounds().origin();
EXPECT_EQ(original_origin.ToString(), new_origin.ToString());
aura::client::SetScreenPositionClient(root, NULL);
}
TEST_F(RenderWidgetHostViewAuraTest, DestroyFullscreenOnBlur) {
view_->InitAsFullscreen(parent_view_);
aura::Window* window = view_->GetNativeView();
ASSERT_TRUE(window != NULL);
ASSERT_TRUE(window->HasFocus());
TestWindowObserver observer(window);
aura::test::TestWindowDelegate delegate;
scoped_ptr<aura::Window> sibling(new aura::Window(&delegate));
sibling->Init(aura::WINDOW_LAYER_TEXTURED);
sibling->Show();
window->parent()->AddChild(sibling.get());
sibling->Focus();
ASSERT_TRUE(sibling->HasFocus());
ASSERT_TRUE(observer.destroyed());
widget_host_ = NULL;
view_ = NULL;
}
TEST_F(RenderWidgetHostViewAuraTest, DestroyPopupClickOutsidePopup) {
parent_view_->SetBounds(gfx::Rect(10, 10, 400, 400));
parent_view_->Focus();
EXPECT_TRUE(parent_view_->HasFocus());
view_->InitAsPopup(parent_view_, gfx::Rect(10, 10, 100, 100));
aura::Window* window = view_->GetNativeView();
ASSERT_TRUE(window != NULL);
gfx::Point click_point;
EXPECT_FALSE(window->GetBoundsInRootWindow().Contains(click_point));
aura::Window* parent_window = parent_view_->GetNativeView();
EXPECT_FALSE(parent_window->GetBoundsInRootWindow().Contains(click_point));
TestWindowObserver observer(window);
aura::test::EventGenerator generator(window->GetRootWindow(), click_point);
generator.ClickLeftButton();
ASSERT_TRUE(parent_view_->HasFocus());
ASSERT_TRUE(observer.destroyed());
widget_host_ = NULL;
view_ = NULL;
}
TEST_F(RenderWidgetHostViewAuraTest, DestroyPopupTapOutsidePopup) {
parent_view_->SetBounds(gfx::Rect(10, 10, 400, 400));
parent_view_->Focus();
EXPECT_TRUE(parent_view_->HasFocus());
view_->InitAsPopup(parent_view_, gfx::Rect(10, 10, 100, 100));
aura::Window* window = view_->GetNativeView();
ASSERT_TRUE(window != NULL);
gfx::Point tap_point;
EXPECT_FALSE(window->GetBoundsInRootWindow().Contains(tap_point));
aura::Window* parent_window = parent_view_->GetNativeView();
EXPECT_FALSE(parent_window->GetBoundsInRootWindow().Contains(tap_point));
TestWindowObserver observer(window);
aura::test::EventGenerator generator(window->GetRootWindow(), tap_point);
generator.GestureTapAt(tap_point);
ASSERT_TRUE(parent_view_->HasFocus());
ASSERT_TRUE(observer.destroyed());
widget_host_ = NULL;
view_ = NULL;
}
TEST_F(RenderWidgetHostViewAuraTest, SetCompositionText) {
view_->InitAsChild(NULL);
view_->Show();
ui::CompositionText composition_text;
composition_text.text = base::ASCIIToUTF16("|a|b");
composition_text.underlines.push_back(
ui::CompositionUnderline(0, 3, 0xff000000, true));
composition_text.underlines.push_back(
ui::CompositionUnderline(3, 4, 0xff000000, false));
const ui::CompositionUnderlines& underlines = composition_text.underlines;
composition_text.selection = gfx::Range(4);
sink_->ClearMessages();
view_->SetCompositionText(composition_text);
EXPECT_TRUE(view_->has_composition_text_);
{
const IPC::Message* msg =
sink_->GetFirstMessageMatching(ViewMsg_ImeSetComposition::ID);
ASSERT_TRUE(msg != NULL);
ViewMsg_ImeSetComposition::Param params;
ViewMsg_ImeSetComposition::Read(msg, ¶ms);
EXPECT_EQ(composition_text.text, params.a);
ASSERT_EQ(underlines.size(), params.b.size());
for (size_t i = 0; i < underlines.size(); ++i) {
EXPECT_EQ(underlines[i].start_offset, params.b[i].startOffset);
EXPECT_EQ(underlines[i].end_offset, params.b[i].endOffset);
EXPECT_EQ(underlines[i].color, params.b[i].color);
EXPECT_EQ(underlines[i].thick, params.b[i].thick);
}
EXPECT_EQ(4, params.c) << "Should be the same to the caret pos";
EXPECT_EQ(4, params.d) << "Should be the same to the caret pos";
}
view_->ImeCancelComposition();
EXPECT_FALSE(view_->has_composition_text_);
}
TEST_F(RenderWidgetHostViewAuraTest, TouchEventState) {
view_->InitAsChild(NULL);
view_->Show();
widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false));
EXPECT_FALSE(widget_host_->ShouldForwardTouchEvent());
ui::TouchEvent press(ui::ET_TOUCH_PRESSED,
gfx::Point(30, 30),
0,
ui::EventTimeForNow());
ui::TouchEvent move(ui::ET_TOUCH_MOVED,
gfx::Point(20, 20),
0,
ui::EventTimeForNow());
ui::TouchEvent release(ui::ET_TOUCH_RELEASED,
gfx::Point(20, 20),
0,
ui::EventTimeForNow());
view_->OnTouchEvent(&press);
EXPECT_FALSE(press.handled());
EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StatePressed,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&move);
EXPECT_FALSE(move.handled());
EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StateMoved,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&release);
EXPECT_FALSE(release.handled());
EXPECT_EQ(blink::WebInputEvent::TouchEnd, view_->touch_event_.type);
EXPECT_EQ(0U, view_->touch_event_.touchesLength);
widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
EXPECT_TRUE(widget_host_->ShouldForwardTouchEvent());
view_->OnTouchEvent(&press);
EXPECT_TRUE(press.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StatePressed,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&move);
EXPECT_TRUE(move.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StateMoved,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&release);
EXPECT_TRUE(release.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchEnd, view_->touch_event_.type);
EXPECT_EQ(0U, view_->touch_event_.touchesLength);
view_->OnTouchEvent(&press);
EXPECT_TRUE(press.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StatePressed,
view_->touch_event_.touches[0].state);
widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, false));
EXPECT_FALSE(widget_host_->ShouldForwardTouchEvent());
ui::TouchEvent move2(ui::ET_TOUCH_MOVED, gfx::Point(20, 20), 0,
base::Time::NowFromSystemTime() - base::Time());
view_->OnTouchEvent(&move2);
EXPECT_FALSE(move2.handled());
EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StateMoved,
view_->touch_event_.touches[0].state);
ui::TouchEvent release2(ui::ET_TOUCH_RELEASED, gfx::Point(20, 20), 0,
base::Time::NowFromSystemTime() - base::Time());
view_->OnTouchEvent(&release2);
EXPECT_FALSE(release2.handled());
EXPECT_EQ(blink::WebInputEvent::TouchEnd, view_->touch_event_.type);
EXPECT_EQ(0U, view_->touch_event_.touchesLength);
}
TEST_F(RenderWidgetHostViewAuraTest, TouchEventSyncAsync) {
view_->InitAsChild(NULL);
view_->Show();
widget_host_->OnMessageReceived(ViewHostMsg_HasTouchEventHandlers(0, true));
EXPECT_TRUE(widget_host_->ShouldForwardTouchEvent());
ui::TouchEvent press(ui::ET_TOUCH_PRESSED,
gfx::Point(30, 30),
0,
ui::EventTimeForNow());
ui::TouchEvent move(ui::ET_TOUCH_MOVED,
gfx::Point(20, 20),
0,
ui::EventTimeForNow());
ui::TouchEvent release(ui::ET_TOUCH_RELEASED,
gfx::Point(20, 20),
0,
ui::EventTimeForNow());
view_->OnTouchEvent(&press);
EXPECT_TRUE(press.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchStart, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StatePressed,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&move);
EXPECT_TRUE(move.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StateMoved,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&move);
EXPECT_TRUE(move.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchMove, view_->touch_event_.type);
EXPECT_EQ(1U, view_->touch_event_.touchesLength);
EXPECT_EQ(blink::WebTouchPoint::StateMoved,
view_->touch_event_.touches[0].state);
view_->OnTouchEvent(&release);
EXPECT_TRUE(release.stopped_propagation());
EXPECT_EQ(blink::WebInputEvent::TouchEnd, view_->touch_event_.type);
EXPECT_EQ(0U, view_->touch_event_.touchesLength);
}
TEST_F(RenderWidgetHostViewAuraTest, PhysicalBackingSizeWithScale) {
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
sink_->ClearMessages();
view_->SetSize(gfx::Size(100, 100));
EXPECT_EQ("100x100", view_->GetPhysicalBackingSize().ToString());
EXPECT_EQ(1u, sink_->message_count());
EXPECT_EQ(ViewMsg_Resize::ID, sink_->GetMessageAt(0)->type());
{
const IPC::Message* msg = sink_->GetMessageAt(0);
EXPECT_EQ(ViewMsg_Resize::ID, msg->type());
ViewMsg_Resize::Param params;
ViewMsg_Resize::Read(msg, ¶ms);
EXPECT_EQ("100x100", params.a.new_size.ToString());
EXPECT_EQ("100x100",
params.a.physical_backing_size.ToString());
}
widget_host_->ResetSizeAndRepaintPendingFlags();
sink_->ClearMessages();
aura_test_helper_->test_screen()->SetDeviceScaleFactor(2.0f);
EXPECT_EQ("200x200", view_->GetPhysicalBackingSize().ToString());
EXPECT_EQ(1u, sink_->message_count());
{
const IPC::Message* msg = sink_->GetMessageAt(0);
EXPECT_EQ(ViewMsg_Resize::ID, msg->type());
ViewMsg_Resize::Param params;
ViewMsg_Resize::Read(msg, ¶ms);
EXPECT_EQ(2.0f, params.a.screen_info.deviceScaleFactor);
EXPECT_EQ("100x100", params.a.new_size.ToString());
EXPECT_EQ("200x200",
params.a.physical_backing_size.ToString());
}
widget_host_->ResetSizeAndRepaintPendingFlags();
sink_->ClearMessages();
aura_test_helper_->test_screen()->SetDeviceScaleFactor(1.0f);
EXPECT_EQ(1u, sink_->message_count());
EXPECT_EQ("100x100", view_->GetPhysicalBackingSize().ToString());
{
const IPC::Message* msg = sink_->GetMessageAt(0);
EXPECT_EQ(ViewMsg_Resize::ID, msg->type());
ViewMsg_Resize::Param params;
ViewMsg_Resize::Read(msg, ¶ms);
EXPECT_EQ(1.0f, params.a.screen_info.deviceScaleFactor);
EXPECT_EQ("100x100", params.a.new_size.ToString());
EXPECT_EQ("100x100",
params.a.physical_backing_size.ToString());
}
}
TEST_F(RenderWidgetHostViewAuraTest, CursorVisibilityChange) {
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(gfx::Size(100, 100));
aura::test::TestCursorClient cursor_client(
parent_view_->GetNativeView()->GetRootWindow());
cursor_client.AddObserver(view_);
view_->WasShown();
sink_->ClearMessages();
cursor_client.ShowCursor();
EXPECT_EQ(1u, sink_->message_count());
EXPECT_TRUE(sink_->GetUniqueMessageMatching(
InputMsg_CursorVisibilityChange::ID));
sink_->ClearMessages();
cursor_client.ShowCursor();
EXPECT_EQ(0u, sink_->message_count());
sink_->ClearMessages();
cursor_client.HideCursor();
EXPECT_EQ(1u, sink_->message_count());
EXPECT_TRUE(sink_->GetUniqueMessageMatching(
InputMsg_CursorVisibilityChange::ID));
sink_->ClearMessages();
cursor_client.HideCursor();
EXPECT_EQ(0u, sink_->message_count());
view_->WasHidden();
sink_->ClearMessages();
cursor_client.ShowCursor();
EXPECT_EQ(0u, sink_->message_count());
cursor_client.HideCursor();
EXPECT_EQ(0u, sink_->message_count());
sink_->ClearMessages();
view_->WasShown();
EXPECT_FALSE(sink_->GetUniqueMessageMatching(
InputMsg_CursorVisibilityChange::ID));
sink_->ClearMessages();
cursor_client.HideCursor();
EXPECT_EQ(0u, sink_->message_count());
sink_->ClearMessages();
cursor_client.ShowCursor();
EXPECT_EQ(1u, sink_->message_count());
EXPECT_TRUE(sink_->GetUniqueMessageMatching(
InputMsg_CursorVisibilityChange::ID));
view_->WasHidden();
sink_->ClearMessages();
cursor_client.HideCursor();
EXPECT_EQ(0u, sink_->message_count());
sink_->ClearMessages();
view_->WasShown();
EXPECT_TRUE(sink_->GetUniqueMessageMatching(
InputMsg_CursorVisibilityChange::ID));
cursor_client.RemoveObserver(view_);
}
TEST_F(RenderWidgetHostViewAuraTest, UpdateCursorIfOverSelf) {
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetBounds(gfx::Rect(60, 60, 100, 100));
view_->Show();
aura::test::TestCursorClient cursor_client(
parent_view_->GetNativeView()->GetRootWindow());
cursor_client.reset_calls_to_set_cursor();
aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(110, 110));
view_->UpdateCursorIfOverSelf();
EXPECT_EQ(1, cursor_client.calls_to_set_cursor());
cursor_client.reset_calls_to_set_cursor();
aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(80, 65));
view_->UpdateCursorIfOverSelf();
EXPECT_EQ(1, cursor_client.calls_to_set_cursor());
cursor_client.reset_calls_to_set_cursor();
aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(159, 159));
view_->UpdateCursorIfOverSelf();
EXPECT_EQ(1, cursor_client.calls_to_set_cursor());
cursor_client.reset_calls_to_set_cursor();
aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(67, 59));
view_->UpdateCursorIfOverSelf();
EXPECT_EQ(0, cursor_client.calls_to_set_cursor());
cursor_client.reset_calls_to_set_cursor();
aura::Env::GetInstance()->set_last_mouse_location(gfx::Point(161, 161));
view_->UpdateCursorIfOverSelf();
EXPECT_EQ(0, cursor_client.calls_to_set_cursor());
}
scoped_ptr<cc::CompositorFrame> MakeGLFrame(float scale_factor,
gfx::Size size,
gfx::Rect damage,
OwnedMailbox* owned_mailbox) {
scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
frame->metadata.device_scale_factor = scale_factor;
frame->gl_frame_data.reset(new cc::GLFrameData);
DCHECK(owned_mailbox->sync_point());
frame->gl_frame_data->sync_point = owned_mailbox->sync_point();
memcpy(frame->gl_frame_data->mailbox.name,
owned_mailbox->mailbox().name,
sizeof(frame->gl_frame_data->mailbox.name));
frame->gl_frame_data->size = size;
frame->gl_frame_data->sub_buffer_rect = damage;
return frame.Pass();
}
scoped_ptr<cc::CompositorFrame> MakeSoftwareFrame(float scale_factor,
gfx::Size size,
gfx::Rect damage) {
scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
frame->metadata.device_scale_factor = scale_factor;
frame->software_frame_data.reset(new cc::SoftwareFrameData);
frame->software_frame_data->id = 1;
frame->software_frame_data->size = size;
frame->software_frame_data->damage_rect = damage;
base::SharedMemory shm;
shm.CreateAndMapAnonymous(size.GetArea() * 4);
shm.GiveToProcess(base::GetCurrentProcessHandle(),
&frame->software_frame_data->handle);
return frame.Pass();
}
scoped_ptr<cc::CompositorFrame> MakeDelegatedFrame(float scale_factor,
gfx::Size size,
gfx::Rect damage) {
scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame);
frame->metadata.device_scale_factor = scale_factor;
frame->delegated_frame_data.reset(new cc::DelegatedFrameData);
scoped_ptr<cc::RenderPass> pass = cc::RenderPass::Create();
pass->SetNew(cc::RenderPass::Id(1, 1),
gfx::Rect(size),
gfx::RectF(damage),
gfx::Transform());
frame->delegated_frame_data->render_pass_list.push_back(pass.Pass());
return frame.Pass();
}
TEST_F(RenderWidgetHostViewAuraTest, FullscreenResize) {
aura::Window* root_window = aura_test_helper_->root_window();
root_window->SetLayoutManager(new FullscreenLayoutManager(root_window));
view_->InitAsFullscreen(parent_view_);
view_->WasShown();
widget_host_->ResetSizeAndRepaintPendingFlags();
sink_->ClearMessages();
GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
scoped_refptr<OwnedMailbox> owned_mailbox = new OwnedMailbox(gl_helper);
gl_helper->ResizeTexture(owned_mailbox->texture_id(), gfx::Size(1, 1));
owned_mailbox->UpdateSyncPoint(gl_helper->InsertSyncPoint());
view_->GetRenderWidgetHost()->WasResized();
{
const IPC::Message* msg = sink_->GetMessageAt(0);
EXPECT_EQ(ViewMsg_Resize::ID, msg->type());
ViewMsg_Resize::Param params;
ViewMsg_Resize::Read(msg, ¶ms);
EXPECT_EQ("0,0 800x600",
gfx::Rect(params.a.screen_info.availableRect).ToString());
EXPECT_EQ("800x600", params.a.new_size.ToString());
view_->OnSwapCompositorFrame(0,
MakeGLFrame(1.f,
params.a.new_size,
gfx::Rect(params.a.new_size),
owned_mailbox.get()));
ui::DrawWaiterForTest::WaitForCommit(
root_window->GetHost()->compositor());
}
widget_host_->ResetSizeAndRepaintPendingFlags();
sink_->ClearMessages();
aura_test_helper_->test_screen()->SetUIScale(0.5);
EXPECT_EQ(1u, sink_->message_count());
{
const IPC::Message* msg = sink_->GetMessageAt(0);
EXPECT_EQ(ViewMsg_Resize::ID, msg->type());
ViewMsg_Resize::Param params;
ViewMsg_Resize::Read(msg, ¶ms);
EXPECT_EQ("0,0 1600x1200",
gfx::Rect(params.a.screen_info.availableRect).ToString());
EXPECT_EQ("1600x1200", params.a.new_size.ToString());
view_->OnSwapCompositorFrame(0,
MakeGLFrame(1.f,
params.a.new_size,
gfx::Rect(params.a.new_size),
owned_mailbox.get()));
ui::DrawWaiterForTest::WaitForCommit(
root_window->GetHost()->compositor());
}
}
TEST_F(RenderWidgetHostViewAuraTest, SwapNotifiesWindow) {
gfx::Size view_size(100, 100);
gfx::Rect view_rect(view_size);
GLHelper* gl_helper = ImageTransportFactory::GetInstance()->GetGLHelper();
scoped_refptr<OwnedMailbox> owned_mailbox = new OwnedMailbox(gl_helper);
gl_helper->ResizeTexture(owned_mailbox->texture_id(), gfx::Size(400, 400));
owned_mailbox->UpdateSyncPoint(gl_helper->InsertSyncPoint());
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(view_size);
view_->WasShown();
MockWindowObserver observer;
view_->window_->AddObserver(&observer);
GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params params;
params.surface_id = widget_host_->surface_id();
params.route_id = widget_host_->GetRoutingID();
memcpy(params.mailbox.name,
owned_mailbox->mailbox().name,
sizeof(params.mailbox.name));
params.size = view_size;
params.scale_factor = 1.f;
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->AcceleratedSurfaceBuffersSwapped(params, 0);
testing::Mock::VerifyAndClearExpectations(&observer);
params.size = gfx::Size(200, 200);
params.scale_factor = 2.f;
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->AcceleratedSurfaceBuffersSwapped(params, 0);
testing::Mock::VerifyAndClearExpectations(&observer);
GpuHostMsg_AcceleratedSurfacePostSubBuffer_Params post_params;
post_params.surface_id = widget_host_->surface_id();
post_params.route_id = widget_host_->GetRoutingID();
memcpy(post_params.mailbox.name,
owned_mailbox->mailbox().name,
sizeof(params.mailbox.name));
post_params.surface_size = gfx::Size(200, 200);
post_params.surface_scale_factor = 2.f;
post_params.x = 40;
post_params.y = 40;
post_params.width = 80;
post_params.height = 80;
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_,
gfx::Rect(19, 39, 42, 42)));
view_->AcceleratedSurfacePostSubBuffer(post_params, 0);
testing::Mock::VerifyAndClearExpectations(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
0, MakeGLFrame(1.f, view_size, view_rect, owned_mailbox.get()));
testing::Mock::VerifyAndClearExpectations(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_,
gfx::Rect(4, 89, 7, 7)));
view_->OnSwapCompositorFrame(
0,
MakeGLFrame(1.f, view_size, gfx::Rect(5, 5, 5, 5), owned_mailbox.get()));
testing::Mock::VerifyAndClearExpectations(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, view_size, view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_,
gfx::Rect(5, 5, 5, 5)));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, view_size, gfx::Rect(5, 5, 5, 5)));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->window_->RemoveObserver(&observer);
}
TEST_F(RenderWidgetHostViewAuraTest, SkippedDelegatedFrames) {
gfx::Rect view_rect(100, 100);
gfx::Size frame_size = view_rect.size();
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(view_rect.size());
MockWindowObserver observer;
view_->window_->AddObserver(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
gfx::Rect partial_view_rect(30, 30, 20, 20);
EXPECT_CALL(observer,
OnWindowPaintScheduled(view_->window_, partial_view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, partial_view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
view_rect = gfx::Rect(150, 150);
view_->SetSize(view_rect.size());
view_->MaybeCreateResizeLock();
gfx::Rect dropped_damage_rect_1(10, 20, 30, 40);
EXPECT_CALL(observer, OnWindowPaintScheduled(_, _)).Times(0);
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_1));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
gfx::Rect dropped_damage_rect_2(40, 50, 10, 20);
EXPECT_CALL(observer, OnWindowPaintScheduled(_, _)).Times(0);
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, dropped_damage_rect_2));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
frame_size = view_rect.size();
gfx::Rect new_damage_rect(5, 6, 10, 10);
EXPECT_CALL(observer,
OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, new_damage_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
EXPECT_CALL(observer,
OnWindowPaintScheduled(view_->window_, partial_view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, partial_view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
view_->window_->RemoveObserver(&observer);
}
TEST_F(RenderWidgetHostViewAuraTest, OutputSurfaceIdChange) {
gfx::Rect view_rect(100, 100);
gfx::Size frame_size = view_rect.size();
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(view_rect.size());
MockWindowObserver observer;
view_->window_->AddObserver(&observer);
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
0, MakeDelegatedFrame(1.f, frame_size, view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
view_->OnSwapCompositorFrame(
2, MakeDelegatedFrame(1.f, gfx::Size(), gfx::Rect()));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
EXPECT_CALL(observer, OnWindowPaintScheduled(view_->window_, view_rect));
view_->OnSwapCompositorFrame(3,
MakeDelegatedFrame(1.f, frame_size, view_rect));
testing::Mock::VerifyAndClearExpectations(&observer);
view_->RunOnCompositingDidCommit();
view_->window_->RemoveObserver(&observer);
}
TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFrames) {
size_t max_renderer_frames =
RendererFrameManager::GetInstance()->max_number_of_saved_frames();
ASSERT_LE(2u, max_renderer_frames);
size_t renderer_count = max_renderer_frames + 1;
gfx::Rect view_rect(100, 100);
gfx::Size frame_size = view_rect.size();
scoped_ptr<RenderWidgetHostImpl * []> hosts(
new RenderWidgetHostImpl* [renderer_count]);
scoped_ptr<FakeRenderWidgetHostViewAura * []> views(
new FakeRenderWidgetHostViewAura* [renderer_count]);
for (size_t i = 0; i < renderer_count; ++i) {
hosts[i] = new RenderWidgetHostImpl(
&delegate_, process_host_, MSG_ROUTING_NONE, false);
hosts[i]->Init();
hosts[i]->OnMessageReceived(
ViewHostMsg_DidActivateAcceleratedCompositing(0, true));
views[i] = new FakeRenderWidgetHostViewAura(hosts[i]);
views[i]->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
views[i]->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
views[i]->SetSize(view_rect.size());
}
for (size_t i = 0; i < renderer_count; ++i) {
views[i]->WasShown();
views[i]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[i]->frame_provider_);
views[i]->WasHidden();
}
EXPECT_FALSE(views[0]->frame_provider_);
for (size_t i = 1; i < renderer_count; ++i)
EXPECT_TRUE(views[i]->frame_provider_);
views[0]->WasShown();
EXPECT_FALSE(views[0]->frame_provider_);
EXPECT_TRUE(views[1]->frame_provider_);
views[0]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[0]->frame_provider_);
EXPECT_FALSE(views[1]->frame_provider_);
views[0]->WasHidden();
views[1]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[0]->frame_provider_);
EXPECT_TRUE(views[1]->frame_provider_);
EXPECT_FALSE(views[2]->frame_provider_);
for (size_t i = 3; i < renderer_count; ++i)
EXPECT_TRUE(views[i]->frame_provider_);
for (size_t i = 1; i < renderer_count; ++i) {
views[i]->WasShown();
views[i]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[i]->frame_provider_);
}
EXPECT_FALSE(views[0]->frame_provider_);
views[0]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_FALSE(views[0]->frame_provider_);
views[0]->WasShown();
views[0]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
for (size_t i = 0; i < renderer_count; ++i)
EXPECT_TRUE(views[i]->frame_provider_);
views[0]->WasHidden();
EXPECT_FALSE(views[0]->frame_provider_);
for (size_t i = 0; i < renderer_count; ++i) {
views[i]->Destroy();
delete hosts[i];
}
}
TEST_F(RenderWidgetHostViewAuraTest, DiscardDelegatedFramesWithLocking) {
size_t max_renderer_frames =
RendererFrameManager::GetInstance()->max_number_of_saved_frames();
ASSERT_LE(2u, max_renderer_frames);
size_t renderer_count = max_renderer_frames + 1;
gfx::Rect view_rect(100, 100);
gfx::Size frame_size = view_rect.size();
scoped_ptr<RenderWidgetHostImpl * []> hosts(
new RenderWidgetHostImpl* [renderer_count]);
scoped_ptr<FakeRenderWidgetHostViewAura * []> views(
new FakeRenderWidgetHostViewAura* [renderer_count]);
for (size_t i = 0; i < renderer_count; ++i) {
hosts[i] = new RenderWidgetHostImpl(
&delegate_, process_host_, MSG_ROUTING_NONE, false);
hosts[i]->Init();
hosts[i]->OnMessageReceived(
ViewHostMsg_DidActivateAcceleratedCompositing(0, true));
views[i] = new FakeRenderWidgetHostViewAura(hosts[i]);
views[i]->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
views[i]->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
views[i]->SetSize(view_rect.size());
}
for (size_t i = 0; i < renderer_count; ++i) {
views[i]->WasShown();
views[i]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[i]->frame_provider_);
}
views[0]->WasHidden();
EXPECT_FALSE(views[0]->frame_provider_);
views[0]->WasShown();
views[0]->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, view_rect));
EXPECT_TRUE(views[0]->frame_provider_);
views[0]->LockResources();
views[0]->WasHidden();
EXPECT_TRUE(views[0]->frame_provider_);
views[0]->UnlockResources();
EXPECT_FALSE(views[0]->frame_provider_);
for (size_t i = 0; i < renderer_count; ++i) {
views[i]->Destroy();
delete hosts[i];
}
}
TEST_F(RenderWidgetHostViewAuraTest, SoftwareDPIChange) {
gfx::Rect view_rect(100, 100);
gfx::Size frame_size(100, 100);
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(view_rect.size());
view_->WasShown();
view_->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, frame_size, gfx::Rect(frame_size)));
scoped_refptr<cc::DelegatedFrameProvider> frame_provider =
view_->frame_provider_;
view_->OnSwapCompositorFrame(
1, MakeDelegatedFrame(2.f, frame_size, gfx::Rect(frame_size)));
EXPECT_NE(frame_provider.get(), view_->frame_provider_.get());
}
class RenderWidgetHostViewAuraCopyRequestTest
: public RenderWidgetHostViewAuraShutdownTest {
public:
RenderWidgetHostViewAuraCopyRequestTest()
: callback_count_(0), result_(false) {}
void CallbackMethod(const base::Closure& quit_closure, bool result) {
result_ = result;
callback_count_++;
quit_closure.Run();
}
int callback_count_;
bool result_;
private:
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAuraCopyRequestTest);
};
TEST_F(RenderWidgetHostViewAuraCopyRequestTest, DestroyedAfterCopyRequest) {
base::RunLoop run_loop;
gfx::Rect view_rect(100, 100);
scoped_ptr<cc::CopyOutputRequest> request;
view_->InitAsChild(NULL);
aura::client::ParentWindowWithContext(
view_->GetNativeView(),
parent_view_->GetNativeView()->GetRootWindow(),
gfx::Rect());
view_->SetSize(view_rect.size());
view_->WasShown();
scoped_ptr<FakeFrameSubscriber> frame_subscriber(new FakeFrameSubscriber(
view_rect.size(),
base::Bind(&RenderWidgetHostViewAuraCopyRequestTest::CallbackMethod,
base::Unretained(this),
run_loop.QuitClosure())));
EXPECT_EQ(0, callback_count_);
EXPECT_FALSE(view_->last_copy_request_);
view_->BeginFrameSubscription(
frame_subscriber.PassAs<RenderWidgetHostViewFrameSubscriber>());
view_->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect)));
EXPECT_EQ(0, callback_count_);
EXPECT_TRUE(view_->last_copy_request_);
EXPECT_TRUE(view_->last_copy_request_->has_texture_mailbox());
request = view_->last_copy_request_.Pass();
EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size());
request->SendTextureResult(view_rect.size(),
request->texture_mailbox(),
scoped_ptr<cc::SingleReleaseCallback>());
run_loop.Run();
EXPECT_EQ(0u, view_->active_frame_subscriber_textures_.size());
EXPECT_EQ(1, callback_count_);
EXPECT_TRUE(result_);
view_->OnSwapCompositorFrame(
1, MakeDelegatedFrame(1.f, view_rect.size(), gfx::Rect(view_rect)));
EXPECT_EQ(1, callback_count_);
request = view_->last_copy_request_.Pass();
EXPECT_EQ(1u, view_->active_frame_subscriber_textures_.size());
TearDownEnvironment();
request->SendTextureResult(view_rect.size(),
request->texture_mailbox(),
scoped_ptr<cc::SingleReleaseCallback>());
EXPECT_EQ(2, callback_count_);
EXPECT_FALSE(result_);
}
}