Index: webkit/plugins/ppapi/ppb_scrollbar_impl.cc |
diff --git a/webkit/plugins/ppapi/ppb_scrollbar_impl.cc b/webkit/plugins/ppapi/ppb_scrollbar_impl.cc |
index 3407ba77735d8f15dca9d7d5e72a0f677d3620b3..8d33358e3262d133d0d731992835282fd7cdff8a 100644 |
--- a/webkit/plugins/ppapi/ppb_scrollbar_impl.cc |
+++ b/webkit/plugins/ppapi/ppb_scrollbar_impl.cc |
@@ -18,6 +18,7 @@ |
#include "webkit/plugins/ppapi/plugin_module.h" |
#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
#include "webkit/plugins/ppapi/ppb_image_data_impl.h" |
+#include "webkit/plugins/ppapi/resource_helper.h" |
#include "webkit/glue/webkit_glue.h" |
#if defined(OS_WIN) |
@@ -108,7 +109,7 @@ const PPB_Scrollbar_0_4_Dev ppb_scrollbar_0_4 = { |
} // namespace |
// static |
-PP_Resource PPB_Scrollbar_Impl::Create(PluginInstance* instance, |
+PP_Resource PPB_Scrollbar_Impl::Create(PP_Instance instance, |
bool vertical) { |
scoped_refptr<PPB_Scrollbar_Impl> scrollbar( |
new PPB_Scrollbar_Impl(instance)); |
@@ -116,7 +117,7 @@ PP_Resource PPB_Scrollbar_Impl::Create(PluginInstance* instance, |
return scrollbar->GetReference(); |
} |
-PPB_Scrollbar_Impl::PPB_Scrollbar_Impl(PluginInstance* instance) |
+PPB_Scrollbar_Impl::PPB_Scrollbar_Impl(PP_Instance instance) |
: PPB_Widget_Impl(instance), |
ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { |
} |
@@ -125,9 +126,12 @@ PPB_Scrollbar_Impl::~PPB_Scrollbar_Impl() { |
} |
void PPB_Scrollbar_Impl::Init(bool vertical) { |
+ PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(this); |
+ if (!plugin_instance) |
+ return; |
scrollbar_.reset(WebScrollbar::createForPlugin( |
vertical ? WebScrollbar::Vertical : WebScrollbar::Horizontal, |
- instance()->container(), |
+ ResourceHelper::GetPluginInstance(this)->container(), |
static_cast<WebKit::WebScrollbarClient*>(this))); |
} |
@@ -135,6 +139,11 @@ PPB_Scrollbar_API* PPB_Scrollbar_Impl::AsPPB_Scrollbar_API() { |
return this; |
} |
+void PPB_Scrollbar_Impl::InstanceWasDeleted() { |
+ Resource::LastPluginRefWasDeleted(); |
+ scrollbar_.reset(); |
+} |
+ |
// static |
const PPB_Scrollbar_0_3_Dev* PPB_Scrollbar_Impl::Get0_3Interface() { |
return &ppb_scrollbar_0_3; |
@@ -158,15 +167,19 @@ uint32_t PPB_Scrollbar_Impl::GetValue() { |
} |
void PPB_Scrollbar_Impl::SetValue(uint32_t value) { |
- scrollbar_->setValue(value); |
+ if (scrollbar_.get()) |
+ scrollbar_->setValue(value); |
} |
void PPB_Scrollbar_Impl::SetDocumentSize(uint32_t size) { |
- scrollbar_->setDocumentSize(size); |
+ if (scrollbar_.get()) |
+ scrollbar_->setDocumentSize(size); |
} |
void PPB_Scrollbar_Impl::SetTickMarks(const PP_Rect* tick_marks, |
uint32_t count) { |
+ if (!scrollbar_.get()) |
+ return; |
tickmarks_.resize(count); |
for (uint32 i = 0; i < count; ++i) { |
tickmarks_[i] = WebRect(tick_marks[i].point.x, |
@@ -179,6 +192,9 @@ void PPB_Scrollbar_Impl::SetTickMarks(const PP_Rect* tick_marks, |
} |
void PPB_Scrollbar_Impl::ScrollBy(PP_ScrollBy_Dev unit, int32_t multiplier) { |
+ if (!scrollbar_.get()) |
+ return; |
+ |
WebScrollbar::ScrollDirection direction = multiplier >= 0 ? |
WebScrollbar::ScrollForward : WebScrollbar::ScrollBackward; |
float fmultiplier = 1.0; |
@@ -203,7 +219,7 @@ PP_Bool PPB_Scrollbar_Impl::PaintInternal(const gfx::Rect& rect, |
PPB_ImageData_Impl* image) { |
ImageDataAutoMapper mapper(image); |
skia::PlatformCanvas* canvas = image->mapped_canvas(); |
- if (!canvas) |
+ if (!canvas || !scrollbar_.get()) |
return PP_FALSE; |
scrollbar_->paint(webkit_glue::ToWebCanvas(canvas), rect); |
@@ -218,13 +234,15 @@ PP_Bool PPB_Scrollbar_Impl::PaintInternal(const gfx::Rect& rect, |
PP_Bool PPB_Scrollbar_Impl::HandleEventInternal( |
const ::ppapi::InputEventData& data) { |
scoped_ptr<WebInputEvent> web_input_event(CreateWebInputEvent(data)); |
- if (!web_input_event.get()) |
+ if (!web_input_event.get() || !scrollbar_.get()) |
return PP_FALSE; |
return PP_FromBool(scrollbar_->handleInputEvent(*web_input_event.get())); |
} |
void PPB_Scrollbar_Impl::SetLocationInternal(const PP_Rect* location) { |
+ if (!scrollbar_.get()) |
+ return; |
scrollbar_->setLocation(WebRect(location->point.x, |
location->point.y, |
location->size.width, |
@@ -232,33 +250,38 @@ void PPB_Scrollbar_Impl::SetLocationInternal(const PP_Rect* location) { |
} |
void PPB_Scrollbar_Impl::valueChanged(WebKit::WebScrollbar* scrollbar) { |
+ PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
+ if (!plugin_module) |
+ return; |
+ |
const PPP_Scrollbar_Dev* ppp_scrollbar = |
- static_cast<const PPP_Scrollbar_Dev*>(instance()->module()-> |
- GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE)); |
+ static_cast<const PPP_Scrollbar_Dev*>(plugin_module->GetPluginInterface( |
+ PPP_SCROLLBAR_DEV_INTERFACE)); |
if (!ppp_scrollbar) { |
// Try the old version. This is ok because the old interface is a subset of |
// the new one, and ValueChanged didn't change. |
ppp_scrollbar = |
- static_cast<const PPP_Scrollbar_Dev*>(instance()->module()-> |
- GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE_0_2)); |
+ static_cast<const PPP_Scrollbar_Dev*>(plugin_module->GetPluginInterface( |
+ PPP_SCROLLBAR_DEV_INTERFACE_0_2)); |
if (!ppp_scrollbar) |
return; |
} |
- ScopedResourceId resource(this); |
- ppp_scrollbar->ValueChanged( |
- instance()->pp_instance(), resource.id, scrollbar_->value()); |
+ ppp_scrollbar->ValueChanged(pp_instance(), pp_resource(), |
+ scrollbar_->value()); |
} |
void PPB_Scrollbar_Impl::overlayChanged(WebScrollbar* scrollbar) { |
+ PluginModule* plugin_module = ResourceHelper::GetPluginModule(this); |
+ if (!plugin_module) |
+ return; |
+ |
const PPP_Scrollbar_Dev* ppp_scrollbar = |
- static_cast<const PPP_Scrollbar_Dev*>(instance()->module()-> |
- GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE)); |
+ static_cast<const PPP_Scrollbar_Dev*>(plugin_module->GetPluginInterface( |
+ PPP_SCROLLBAR_DEV_INTERFACE)); |
if (!ppp_scrollbar) |
return; |
- ScopedResourceId resource(this); |
- ppp_scrollbar->OverlayChanged( |
- instance()->pp_instance(), resource.id, |
- PP_FromBool(IsOverlay())); |
+ ppp_scrollbar->OverlayChanged(pp_instance(), pp_resource(), |
+ PP_FromBool(IsOverlay())); |
} |
void PPB_Scrollbar_Impl::invalidateScrollbarRect( |