summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 10:34:29 +0000
committertkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-12-07 10:34:29 +0000
commita635f9476f3efa8fc0690da8067dc41194822263 (patch)
tree82f08913c7d3b4a5354106f1f2f45d32e78cbaa8
parentf6b397243dc9e167e75740b34e3c29c7826feee7 (diff)
downloadchromium_src-a635f9476f3efa8fc0690da8067dc41194822263.zip
chromium_src-a635f9476f3efa8fc0690da8067dc41194822263.tar.gz
chromium_src-a635f9476f3efa8fc0690da8067dc41194822263.tar.bz2
RenderWidget::Create returns NULL if RenderWidget::DoInit fails.
RenderThread::Get()->Send() fails if the tab is about to be closed and the IPC channel was shut down. BUG=158457 Review URL: https://chromiumcodereview.appspot.com/11473015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@171758 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/renderer/render_widget.cc22
-rw-r--r--content/renderer/render_widget.h4
-rw-r--r--content/renderer/render_widget_fullscreen.cc4
-rw-r--r--content/renderer/render_widget_fullscreen.h2
4 files changed, 18 insertions, 14 deletions
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 8eb8698..fdf034b 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -141,8 +141,10 @@ RenderWidget* RenderWidget::Create(int32 opener_id,
DCHECK(opener_id != MSG_ROUTING_NONE);
scoped_refptr<RenderWidget> widget(
new RenderWidget(popup_type, screen_info, false));
- widget->Init(opener_id); // adds reference
- return widget;
+ if (widget->Init(opener_id)) { // adds reference on success.
+ return widget;
+ }
+ return NULL;
}
// static
@@ -163,14 +165,14 @@ WebWidget* RenderWidget::CreateWebWidget(RenderWidget* render_widget) {
return NULL;
}
-void RenderWidget::Init(int32 opener_id) {
- DoInit(opener_id,
- RenderWidget::CreateWebWidget(this),
- new ViewHostMsg_CreateWidget(opener_id, popup_type_,
- &routing_id_, &surface_id_));
+bool RenderWidget::Init(int32 opener_id) {
+ return DoInit(opener_id,
+ RenderWidget::CreateWebWidget(this),
+ new ViewHostMsg_CreateWidget(opener_id, popup_type_,
+ &routing_id_, &surface_id_));
}
-void RenderWidget::DoInit(int32 opener_id,
+bool RenderWidget::DoInit(int32 opener_id,
WebWidget* web_widget,
IPC::SyncMessage* create_widget_message) {
DCHECK(!webwidget_);
@@ -186,8 +188,10 @@ void RenderWidget::DoInit(int32 opener_id,
// Take a reference on behalf of the RenderThread. This will be balanced
// when we receive ViewMsg_Close.
AddRef();
+ return true;
} else {
- DCHECK(false);
+ // The above Send can fail when the tab is closing.
+ return false;
}
}
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index b194ca5..e274806 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -205,10 +205,10 @@ class CONTENT_EXPORT RenderWidget
// Initializes this view with the given opener. CompleteInit must be called
// later.
- void Init(int32 opener_id);
+ bool Init(int32 opener_id);
// Called by Init and subclasses to perform initialization.
- void DoInit(int32 opener_id,
+ bool DoInit(int32 opener_id,
WebKit::WebWidget* web_widget,
IPC::SyncMessage* create_widget_message);
diff --git a/content/renderer/render_widget_fullscreen.cc b/content/renderer/render_widget_fullscreen.cc
index 3094035..c45e2a8 100644
--- a/content/renderer/render_widget_fullscreen.cc
+++ b/content/renderer/render_widget_fullscreen.cc
@@ -35,10 +35,10 @@ WebWidget* RenderWidgetFullscreen::CreateWebWidget() {
return RenderWidget::CreateWebWidget(this);
}
-void RenderWidgetFullscreen::Init(int32 opener_id) {
+bool RenderWidgetFullscreen::Init(int32 opener_id) {
DCHECK(!webwidget_);
- RenderWidget::DoInit(
+ return RenderWidget::DoInit(
opener_id,
CreateWebWidget(),
new ViewHostMsg_CreateFullscreenWidget(
diff --git a/content/renderer/render_widget_fullscreen.h b/content/renderer/render_widget_fullscreen.h
index 5570cf8..dfd1582 100644
--- a/content/renderer/render_widget_fullscreen.h
+++ b/content/renderer/render_widget_fullscreen.h
@@ -22,7 +22,7 @@ class RenderWidgetFullscreen : public RenderWidget {
virtual WebKit::WebWidget* CreateWebWidget();
- void Init(int32 opener_id);
+ bool Init(int32 opener_id);
};
} // namespace content