summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authoryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-10 05:06:53 +0000
committeryzshen@chromium.org <yzshen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-10 05:06:53 +0000
commita16eb07e76aaae70e770292e2a46bbdc3769a31c (patch)
tree38aeeebb084ddeb090955d6c738f0cbd02eee79c /content
parentaf9ce3430b8305770485b77a9293c77223feafdf (diff)
downloadchromium_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.cc34
-rw-r--r--content/renderer/render_widget_fullscreen_pepper.h3
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);