Skip to content

Commit

Permalink
Browser Plugin: fix aura crash on reloading browser plugin crash.
Browse files Browse the repository at this point in the history
Remove calling RenderWidgetHostViewAura::WasShown/WasHidden, make it RWHost::WasShown/WasHidden as it used to be before. The platform_view_ doesn't physically render in a window, calling WasShown/WasHidden on them leads to crash as GetCompositor() returns NULL in RenderWidgetHostViewAura::WasShown().


BUG=174709
TEST=Tested on gtk+aura+win7+mac: with browser app, reloading page after clicking on terminate button + resizing app.

Review URL: https://chromiumcodereview.appspot.com/12207046

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@181576 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
lazyboy@chromium.org committed Feb 9, 2013
1 parent 853b32f commit d00e126
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 5 deletions.
17 changes: 12 additions & 5 deletions content/browser/renderer_host/render_widget_host_view_guest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ RenderWidgetHostViewGuest::RenderWidgetHostViewGuest(
: host_(RenderWidgetHostImpl::From(widget_host)),
guest_(guest),
enable_compositing_(enable_compositing),
is_hidden_(false),
platform_view_(static_cast<RenderWidgetHostViewPort*>(platform_view)) {
host_->SetView(this);
}
Expand All @@ -38,11 +39,17 @@ RenderWidgetHost* RenderWidgetHostViewGuest::GetRenderWidgetHost() const {
}

void RenderWidgetHostViewGuest::WasShown() {
platform_view_->WasShown();
if (!is_hidden_)
return;
is_hidden_ = false;
host_->WasShown();
}

void RenderWidgetHostViewGuest::WasHidden() {
platform_view_->WasHidden();
if (is_hidden_)
return;
is_hidden_ = true;
host_->WasHidden();
}

void RenderWidgetHostViewGuest::SetSize(const gfx::Size& size) {
Expand All @@ -58,15 +65,15 @@ gfx::GLSurfaceHandle RenderWidgetHostViewGuest::GetCompositingSurface() {
}

void RenderWidgetHostViewGuest::Show() {
platform_view_->Show();
WasShown();
}

void RenderWidgetHostViewGuest::Hide() {
platform_view_->Hide();
WasHidden();
}

bool RenderWidgetHostViewGuest::IsShowing() {
return platform_view_->IsShowing();
return !is_hidden_;
}

gfx::Rect RenderWidgetHostViewGuest::GetViewBounds() const {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,7 @@ class CONTENT_EXPORT RenderWidgetHostViewGuest

BrowserPluginGuest *guest_;
bool enable_compositing_;
bool is_hidden_;
// The platform view for this RenderWidgetHostView.
// RenderWidgetHostViewGuest mostly only cares about stuff related to
// compositing, the rest are directly forwared to this |platform_view_|.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
// Copyright (c) 2013 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 "content/browser/renderer_host/render_widget_host_view_guest.h"

#include "base/basictypes.h"
#include "base/message_loop.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/renderer_host/test_render_view_host.h"
#include "content/common/view_messages.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 "testing/gtest/include/gtest/gtest.h"

namespace content {
namespace {
class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
public:
MockRenderWidgetHostDelegate() {}
virtual ~MockRenderWidgetHostDelegate() {}
};

class RenderWidgetHostViewGuestTest : public testing::Test {
public:
RenderWidgetHostViewGuestTest() {}

virtual void SetUp() {
browser_context_.reset(new TestBrowserContext);
MockRenderProcessHost* process_host =
new MockRenderProcessHost(browser_context_.get());
widget_host_ = new RenderWidgetHostImpl(
&delegate_, process_host, MSG_ROUTING_NONE);
test_platform_view_.reset(new TestRenderWidgetHostView(widget_host_));
view_ = static_cast<RenderWidgetHostViewGuest*>(
new RenderWidgetHostViewGuest(
widget_host_, NULL, false, test_platform_view_.get()));
}

virtual void TearDown() {
if (view_)
view_->Destroy();
delete widget_host_;

browser_context_.reset();

message_loop_.DeleteSoon(FROM_HERE, browser_context_.release());
message_loop_.RunUntilIdle();
}

protected:
MessageLoopForUI message_loop_;
scoped_ptr<BrowserContext> browser_context_;
MockRenderWidgetHostDelegate delegate_;

// Tests should set these to NULL if they've already triggered their
// destruction.
RenderWidgetHostImpl* widget_host_;
RenderWidgetHostViewGuest* view_;

scoped_ptr<TestRenderWidgetHostView> test_platform_view_;

private:
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewGuestTest);
};

} // namespace

TEST_F(RenderWidgetHostViewGuestTest, VisibilityTest) {
view_->Show();
ASSERT_TRUE(view_->IsShowing());

view_->Hide();
ASSERT_FALSE(view_->IsShowing());

view_->WasShown();
ASSERT_TRUE(view_->IsShowing());

view_->WasHidden();
ASSERT_FALSE(view_->IsShowing());
}

} // namespace content
1 change: 1 addition & 0 deletions content/content_tests.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@
'browser/renderer_host/render_view_host_unittest.cc',
'browser/renderer_host/render_widget_host_unittest.cc',
'browser/renderer_host/render_widget_host_view_aura_unittest.cc',
'browser/renderer_host/render_widget_host_view_guest_unittest.cc',
'browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm',
'browser/renderer_host/render_widget_host_view_mac_unittest.mm',
'browser/renderer_host/text_input_client_mac_unittest.mm',
Expand Down

0 comments on commit d00e126

Please sign in to comment.