diff options
author | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-10 05:06:53 +0000 |
---|---|---|
committer | yzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-10 05:06:53 +0000 |
commit | a16eb07e76aaae70e770292e2a46bbdc3769a31c (patch) | |
tree | 38aeeebb084ddeb090955d6c738f0cbd02eee79c /content | |
parent | af9ce3430b8305770485b77a9293c77223feafdf (diff) | |
download | chromium_src-a16eb07e76aaae70e770292e2a46bbdc3769a31c.zip chromium_src-a16eb07e76aaae70e770292e2a46bbdc3769a31c.tar.gz chromium_src-a16eb07e76aaae70e770292e2a46bbdc3769a31c.tar.bz2 |
Fix the bug that closing a tab which owns a fullscreen Flash widget causes crash.
BUG=NONE
TEST=1. goes to http://www.vimeo.com/hd
2. play any video and enter fullscreen mode.
3. right click to open Flash context menu.
4. choose Global Settings..., which causes the browser window to be brought to the foreground.
5. close the tab of http://www.vimeo.com/hd
6. the settings page should not crash.
Review URL: http://codereview.chromium.org/8198013
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104693 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.cc | 34 | ||||
-rw-r--r-- | content/renderer/render_widget_fullscreen_pepper.h | 3 |
2 files changed, 25 insertions, 12 deletions
diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc index da41497..c8c3b77 100644 --- a/content/renderer/render_widget_fullscreen_pepper.cc +++ b/content/renderer/render_widget_fullscreen_pepper.cc @@ -36,10 +36,8 @@ namespace { // WebWidget that simply wraps the pepper plugin. class PepperWidget : public WebWidget { public: - PepperWidget(webkit::ppapi::PluginInstance* plugin, - RenderWidgetFullscreenPepper* widget) - : plugin_(plugin), - widget_(widget) { + explicit PepperWidget(RenderWidgetFullscreenPepper* widget) + : widget_(widget) { } virtual ~PepperWidget() {} @@ -57,9 +55,12 @@ class PepperWidget : public WebWidget { } virtual void resize(const WebSize& size) { + if (!widget_->plugin()) + return; + size_ = size; WebRect plugin_rect(0, 0, size_.width, size_.height); - plugin_->ViewChanged(plugin_rect, plugin_rect); + widget_->plugin()->ViewChanged(plugin_rect, plugin_rect); widget_->Invalidate(); } @@ -73,15 +74,21 @@ class PepperWidget : public WebWidget { } virtual void paint(WebCanvas* canvas, const WebRect& rect) { + if (!widget_->plugin()) + return; + WebRect plugin_rect(0, 0, size_.width, size_.height); - plugin_->Paint(canvas, plugin_rect, rect); + widget_->plugin()->Paint(canvas, plugin_rect, rect); } virtual void composite(bool finish) { + if (!widget_->plugin()) + return; + RendererGLContext* context = widget_->context(); DCHECK(context); gpu::gles2::GLES2Implementation* gl = context->GetImplementation(); - unsigned int texture = plugin_->GetBackingTextureId(); + unsigned int texture = widget_->plugin()->GetBackingTextureId(); gl->BindTexture(GL_TEXTURE_2D, texture); gl->DrawArrays(GL_TRIANGLES, 0, 3); widget_->SwapBuffers(); @@ -92,10 +99,13 @@ class PepperWidget : public WebWidget { } virtual bool handleInputEvent(const WebInputEvent& event) { + if (!widget_->plugin()) + return false; + // This cursor info is ignored, we always set the cursor directly from // RenderWidgetFullscreenPepper::DidChangeCursor. WebCursorInfo cursor; - bool result = plugin_->HandleInputEvent(event, &cursor); + bool result = widget_->plugin()->HandleInputEvent(event, &cursor); // For normal web pages, WebViewImpl does input event translations and // generates context menu events. Since we don't have a WebView, we need to @@ -124,7 +134,7 @@ class PepperWidget : public WebWidget { if (send_context_menu_event) { WebMouseEvent context_menu_event(mouse_event); context_menu_event.type = WebInputEvent::ContextMenu; - plugin_->HandleInputEvent(context_menu_event, &cursor); + widget_->plugin()->HandleInputEvent(context_menu_event, &cursor); } } return result; @@ -179,11 +189,11 @@ class PepperWidget : public WebWidget { } virtual bool isAcceleratedCompositingActive() const { - return widget_->context() && (plugin_->GetBackingTextureId() != 0); + return widget_->context() && widget_->plugin() && + (widget_->plugin()->GetBackingTextureId() != 0); } private: - scoped_refptr<webkit::ppapi::PluginInstance> plugin_; RenderWidgetFullscreenPepper* widget_; WebSize size_; @@ -322,7 +332,7 @@ void RenderWidgetFullscreenPepper::OnResize(const gfx::Size& size, } WebWidget* RenderWidgetFullscreenPepper::CreateWebWidget() { - return new PepperWidget(plugin_, this); + return new PepperWidget(this); } bool RenderWidgetFullscreenPepper::SupportsAsynchronousSwapBuffers() { diff --git a/content/renderer/render_widget_fullscreen_pepper.h b/content/renderer/render_widget_fullscreen_pepper.h index fdae363..eaddecf 100644 --- a/content/renderer/render_widget_fullscreen_pepper.h +++ b/content/renderer/render_widget_fullscreen_pepper.h @@ -41,6 +41,9 @@ class RenderWidgetFullscreenPepper : public RenderWidgetFullscreen, RendererGLContext* context() const { return context_; } void SwapBuffers(); + // Could be NULL when this widget is closing. + webkit::ppapi::PluginInstance* plugin() const { return plugin_; } + protected: RenderWidgetFullscreenPepper(webkit::ppapi::PluginInstance* plugin, const GURL& active_url); |