Commit a240fd6b authored by jam@chromium.org's avatar jam@chromium.org

Pepper and WebKit API change to support a plugin knowing if a scrollbar is an overlay one.

BUG=90530
Review URL: http://codereview.chromium.org/7538006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@96244 0039d316-1c4b-4281-b951-d872f2087c98
parent f1c2c71f
......@@ -23,11 +23,12 @@ PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_ScrollBy_Dev, 4);
#define PPB_SCROLLBAR_DEV_INTERFACE_0_3 "PPB_Scrollbar(Dev);0.3"
#define PPB_SCROLLBAR_DEV_INTERFACE_0_4 "PPB_Scrollbar(Dev);0.4"
#define PPB_SCROLLBAR_DEV_INTERFACE PPB_SCROLLBAR_DEV_INTERFACE_0_4
#define PPB_SCROLLBAR_DEV_INTERFACE_0_5 "PPB_Scrollbar(Dev);0.5"
#define PPB_SCROLLBAR_DEV_INTERFACE PPB_SCROLLBAR_DEV_INTERFACE_0_5
// The interface for a scrollbar. A scrollbar is a widget, so the functions
// in PPB_Widget can also be used with scrollbar objects.
struct PPB_Scrollbar_0_4_Dev {
struct PPB_Scrollbar_0_5_Dev {
// Create a new scrollbar. Returns 0 if the instance is invalid.
PP_Resource (*Create)(PP_Instance instance,
PP_Bool vertical);
......@@ -39,6 +40,9 @@ struct PPB_Scrollbar_0_4_Dev {
// Gets the thickness of a scrollbar.
uint32_t (*GetThickness)(PP_Resource resource);
// Returns PP_TRUE if the system scrollbar style is an overlap scrollbar.
PP_Bool (*IsOverlay)(PP_Resource scrollbar);
// Get/set the value of the scrollbar.
uint32_t (*GetValue)(PP_Resource scrollbar);
......@@ -64,6 +68,25 @@ struct PPB_Scrollbar_0_4_Dev {
int32_t multiplier);
};
// Old version without IsOverlay.
struct PPB_Scrollbar_0_4_Dev {
PP_Resource (*Create)(PP_Instance instance,
PP_Bool vertical);
PP_Bool (*IsScrollbar)(PP_Resource resource);
uint32_t (*GetThickness)(PP_Resource resource);
uint32_t (*GetValue)(PP_Resource scrollbar);
void (*SetValue)(PP_Resource scrollbar,
uint32_t value);
void (*SetDocumentSize)(PP_Resource scrollbar,
uint32_t size);
void (*SetTickMarks)(PP_Resource scrollbar,
const struct PP_Rect* tick_marks,
uint32_t count);
void (*ScrollBy)(PP_Resource scrollbar,
PP_ScrollBy_Dev unit,
int32_t multiplier);
};
// Old version with no resource argument to GetThickness.
struct PPB_Scrollbar_0_3_Dev {
PP_Resource (*Create)(PP_Instance instance,
......@@ -83,7 +106,6 @@ struct PPB_Scrollbar_0_3_Dev {
int32_t multiplier);
};
typedef struct PPB_Scrollbar_0_4_Dev PPB_Scrollbar_Dev;
typedef struct PPB_Scrollbar_0_5_Dev PPB_Scrollbar_Dev;
#endif /* PPAPI_C_DEV_PPB_SCROLLBAR_DEV_H_ */
......@@ -5,18 +5,26 @@
#ifndef PPAPI_C_DEV_PPP_SCROLLBAR_DEV_H_
#define PPAPI_C_DEV_PPP_SCROLLBAR_DEV_H_
#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
// Interface for the plugin to implement when using a scrollbar widget.
#define PPP_SCROLLBAR_DEV_INTERFACE "PPP_Scrollbar(Dev);0.2"
#define PPP_SCROLLBAR_DEV_INTERFACE_0_2 "PPP_Scrollbar(Dev);0.2"
#define PPP_SCROLLBAR_DEV_INTERFACE_0_3 "PPP_Scrollbar(Dev);0.3"
#define PPP_SCROLLBAR_DEV_INTERFACE PPP_SCROLLBAR_DEV_INTERFACE_0_3
struct PPP_Scrollbar_Dev {
// Informs the instance that the scrollbar's value has changed.
void (*ValueChanged)(PP_Instance instance,
PP_Resource scrollbar,
uint32_t value);
// Informs the instance that the user has changed the system scrollbar style.
void (*OverlayChanged)(PP_Instance instance,
PP_Resource scrollbar,
PP_Bool overlay);
};
#endif /* PPAPI_C_DEV_PPP_SCROLLBAR_DEV_H_ */
......
......@@ -41,6 +41,13 @@ uint32_t Scrollbar_Dev::GetThickness() {
return get_interface<PPB_Scrollbar_Dev>()->GetThickness(pp_resource());
}
bool Scrollbar_Dev::IsOverlay() {
if (!has_interface<PPB_Scrollbar_Dev>())
return false;
return
PP_ToBool(get_interface<PPB_Scrollbar_Dev>()->IsOverlay(pp_resource()));
}
uint32_t Scrollbar_Dev::GetValue() {
if (!has_interface<PPB_Scrollbar_Dev>())
return 0;
......
......@@ -26,6 +26,7 @@ class Scrollbar_Dev : public Widget_Dev {
// PPB_Scrollbar methods:
uint32_t GetThickness();
bool IsOverlay();
uint32_t GetValue();
void SetValue(uint32_t value);
void SetDocumentSize(uint32_t size);
......
......@@ -51,8 +51,20 @@ void Scrollbar_ValueChanged(PP_Instance instance,
Scrollbar_Dev(scrollbar_id), value);
}
void Scrollbar_OverlayChanged(PP_Instance instance,
PP_Resource scrollbar_id,
PP_Bool overlay) {
void* object =
pp::Instance::GetPerInstanceObject(instance, kPPPScrollbarInterface);
if (!object)
return;
return static_cast<WidgetClient_Dev*>(object)->ScrollbarOverlayChanged(
Scrollbar_Dev(scrollbar_id), PP_ToBool(overlay));
}
static PPP_Scrollbar_Dev scrollbar_interface = {
&Scrollbar_ValueChanged,
&Scrollbar_OverlayChanged,
};
} // namespace
......
......@@ -35,6 +35,13 @@ class WidgetClient_Dev {
virtual void ScrollbarValueChanged(Scrollbar_Dev scrollbar,
uint32_t value) = 0;
/**
* Notification that the given scrollbar's overlay type has changed. This is
* the implementation for PPP_Scrollbar_Dev.
*/
virtual void ScrollbarOverlayChanged(Scrollbar_Dev scrollbar,
bool type) = 0;
private:
Instance* associated_instance_;
};
......
......@@ -31,7 +31,6 @@ class Resource;
class Surface3D_Dev;
class URLLoader;
class Var;
class Widget_Dev;
class Instance {
public:
......
......@@ -60,3 +60,7 @@ void TestScrollbar::ScrollbarValueChanged(pp::Scrollbar_Dev scrollbar,
if (scrollbar == scrollbar_)
scrollbar_value_changed_ = true;
}
void TestScrollbar::ScrollbarOverlayChanged(pp::Scrollbar_Dev scrollbar,
bool type) {
}
......@@ -26,6 +26,8 @@ class TestScrollbar : public TestCase,
const pp::Rect& dirty_rect);
virtual void ScrollbarValueChanged(pp::Scrollbar_Dev scrollbar,
uint32_t value);
virtual void ScrollbarOverlayChanged(pp::Scrollbar_Dev scrollbar,
bool type);
pp::Scrollbar_Dev scrollbar_;
bool scrollbar_value_changed_;
......
......@@ -15,6 +15,7 @@ class PPB_Scrollbar_API {
virtual ~PPB_Scrollbar_API() {}
virtual uint32_t GetThickness() = 0;
virtual bool IsOverlay() = 0;
virtual uint32_t GetValue() = 0;
virtual void SetValue(uint32_t value) = 0;
virtual void SetDocumentSize(uint32_t size) = 0;
......
......@@ -33,6 +33,13 @@ uint32_t GetThickness(PP_Resource scrollbar) {
return enter.object()->GetThickness();
}
PP_Bool IsOverlay(PP_Resource scrollbar) {
EnterScrollbar enter(scrollbar, true);
if (enter.failed())
return PP_FALSE;
return PP_FromBool(enter.object()->IsOverlay());
}
uint32_t GetValue(PP_Resource scrollbar) {
EnterScrollbar enter(scrollbar, true);
if (enter.failed())
......@@ -66,10 +73,11 @@ void ScrollBy(PP_Resource scrollbar, PP_ScrollBy_Dev unit, int32_t multiplier) {
enter.object()->ScrollBy(unit, multiplier);
}
const PPB_Scrollbar_0_4_Dev g_ppb_scrollbar_thunk = {
const PPB_Scrollbar_0_5_Dev g_ppb_scrollbar_thunk = {
&Create,
&IsScrollbar,
&GetThickness,
&IsOverlay,
&GetValue,
&SetValue,
&SetDocumentSize,
......@@ -79,7 +87,7 @@ const PPB_Scrollbar_0_4_Dev g_ppb_scrollbar_thunk = {
} // namespace
const PPB_Scrollbar_0_4_Dev* GetPPB_Scrollbar_Thunk() {
const PPB_Scrollbar_0_5_Dev* GetPPB_Scrollbar_Thunk() {
return &g_ppb_scrollbar_thunk;
}
......
......@@ -40,7 +40,7 @@ struct PPB_LayerCompositor_Dev;
struct PPB_Messaging;
struct PPB_MouseInputEvent;
struct PPB_QueryPolicy_Dev;
struct PPB_Scrollbar_0_4_Dev;
struct PPB_Scrollbar_0_5_Dev;
struct PPB_Surface3D_Dev;
struct PPB_Transport_Dev;
struct PPB_URLLoader;
......@@ -95,7 +95,7 @@ const PPB_LayerCompositor_Dev* GetPPB_LayerCompositor_Thunk();
const PPB_QueryPolicy_Dev* GetPPB_QueryPolicy_Thunk();
const PPB_Messaging* GetPPB_Messaging_Thunk();
const PPB_MouseInputEvent* GetPPB_MouseInputEvent_Thunk();
const PPB_Scrollbar_0_4_Dev* GetPPB_Scrollbar_Thunk();
const PPB_Scrollbar_0_5_Dev* GetPPB_Scrollbar_Thunk();
const PPB_Surface3D_Dev* GetPPB_Surface3D_Thunk();
const PPB_Transport_Dev* GetPPB_Transport_Thunk();
const PPB_URLLoader* GetPPB_URLLoader_Thunk();
......
......@@ -303,9 +303,11 @@ const void* GetInterface(const char* name) {
if (strcmp(name, PPB_QUERY_POLICY_DEV_INTERFACE_0_1) == 0)
return ::ppapi::thunk::GetPPB_QueryPolicy_Thunk();
if (strcmp(name, PPB_SCROLLBAR_DEV_INTERFACE_0_4) == 0)
return ::ppapi::thunk::GetPPB_Scrollbar_Thunk();
return PPB_Scrollbar_Impl::Get0_4Interface();
if (strcmp(name, PPB_SCROLLBAR_DEV_INTERFACE_0_3) == 0)
return PPB_Scrollbar_Impl::Get0_3Interface();
if (strcmp(name, PPB_SCROLLBAR_DEV_INTERFACE_0_5) == 0)
return ::ppapi::thunk::GetPPB_Scrollbar_Thunk();
if (strcmp(name, PPB_UMA_PRIVATE_INTERFACE) == 0)
return PPB_UMA_Private_Impl::GetInterface();
if (strcmp(name, PPB_URLLOADER_INTERFACE_1_0) == 0)
......
......@@ -48,10 +48,14 @@ PP_Bool IsScrollbar(PP_Resource resource) {
return ::ppapi::thunk::GetPPB_Scrollbar_Thunk()->IsScrollbar(resource);
}
uint32_t GetThickness() {
uint32_t GetThickness3() {
return WebScrollbar::defaultThickness();
}
uint32_t GetThickness4(PP_Resource resource) {
return ::ppapi::thunk::GetPPB_Scrollbar_Thunk()->GetThickness(resource);
}
uint32_t GetValue(PP_Resource resource) {
return ::ppapi::thunk::GetPPB_Scrollbar_Thunk()->GetValue(resource);
}
......@@ -82,7 +86,18 @@ void ScrollBy(PP_Resource resource, PP_ScrollBy_Dev unit, int32_t multiplier) {
const PPB_Scrollbar_0_3_Dev ppb_scrollbar_0_3 = {
&Create,
&IsScrollbar,
&GetThickness,
&GetThickness3,
&GetValue,
&SetValue,
&SetDocumentSize,
&SetTickMarks,
&ScrollBy
};
const PPB_Scrollbar_0_4_Dev ppb_scrollbar_0_4 = {
&Create,
&IsScrollbar,
&GetThickness4,
&GetValue,
&SetValue,
&SetDocumentSize,
......@@ -92,16 +107,35 @@ const PPB_Scrollbar_0_3_Dev ppb_scrollbar_0_3 = {
} // namespace
PPB_Scrollbar_Impl::PPB_Scrollbar_Impl(PluginInstance* instance, bool vertical)
// static
PP_Resource PPB_Scrollbar_Impl::Create(PluginInstance* instance,
bool vertical) {
scoped_refptr<PPB_Scrollbar_Impl> scrollbar(
new PPB_Scrollbar_Impl(instance));
scrollbar->Init(vertical);
return scrollbar->GetReference();
}
PPB_Scrollbar_Impl::PPB_Scrollbar_Impl(PluginInstance* instance)
: PPB_Widget_Impl(instance) {
scrollbar_.reset(WebScrollbar::create(
static_cast<WebKit::WebScrollbarClient*>(this),
vertical ? WebScrollbar::Vertical : WebScrollbar::Horizontal));
}
PPB_Scrollbar_Impl::~PPB_Scrollbar_Impl() {
}
void PPB_Scrollbar_Impl::Init(bool vertical) {
#if defined(WEBSCROLLBAR_SUPPORTS_OVERLAY)
scrollbar_.reset(WebScrollbar::createForPlugin(
vertical ? WebScrollbar::Vertical : WebScrollbar::Horizontal,
instance()->container(),
static_cast<WebKit::WebScrollbarClient*>(this)));
#else
scrollbar_.reset(WebScrollbar::create(
static_cast<WebKit::WebScrollbarClient*>(this),
vertical ? WebScrollbar::Vertical : WebScrollbar::Horizontal));
#endif
}
PPB_Scrollbar_API* PPB_Scrollbar_Impl::AsPPB_Scrollbar_API() {
return this;
}
......@@ -111,10 +145,24 @@ const PPB_Scrollbar_0_3_Dev* PPB_Scrollbar_Impl::Get0_3Interface() {
return &ppb_scrollbar_0_3;
}
// static
const PPB_Scrollbar_0_4_Dev* PPB_Scrollbar_Impl::Get0_4Interface() {
return &ppb_scrollbar_0_4;
}
uint32_t PPB_Scrollbar_Impl::GetThickness() {
return WebScrollbar::defaultThickness();
}
bool PPB_Scrollbar_Impl::IsOverlay() {
// TODO(jam): take this out once WebKit is rolled.
#if defined(WEBSCROLLBAR_SUPPORTS_OVERLAY)
return scrollbar_->isOverlay();
#else
return false;
#endif
}
uint32_t PPB_Scrollbar_Impl::GetValue() {
return scrollbar_->value();
}
......@@ -197,13 +245,32 @@ void PPB_Scrollbar_Impl::valueChanged(WebKit::WebScrollbar* scrollbar) {
const PPP_Scrollbar_Dev* ppp_scrollbar =
static_cast<const PPP_Scrollbar_Dev*>(instance()->module()->
GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE));
if (!ppp_scrollbar)
return;
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));
if (!ppp_scrollbar)
return;
}
ScopedResourceId resource(this);
ppp_scrollbar->ValueChanged(
instance()->pp_instance(), resource.id, scrollbar_->value());
}
void PPB_Scrollbar_Impl::overlayChanged(WebScrollbar* scrollbar) {
const PPP_Scrollbar_Dev* ppp_scrollbar =
static_cast<const PPP_Scrollbar_Dev*>(instance()->module()->
GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE));
if (!ppp_scrollbar)
return;
ScopedResourceId resource(this);
ppp_scrollbar->OverlayChanged(
instance()->pp_instance(), resource.id,
PP_FromBool(IsOverlay()));
}
void PPB_Scrollbar_Impl::invalidateScrollbarRect(
WebKit::WebScrollbar* scrollbar,
const WebKit::WebRect& rect) {
......
......@@ -22,7 +22,9 @@ class PPB_Scrollbar_Impl : public PPB_Widget_Impl,
public ::ppapi::thunk::PPB_Scrollbar_API,
public WebKit::WebScrollbarClient {
public:
PPB_Scrollbar_Impl(PluginInstance* instance, bool vertical);
static PP_Resource Create(PluginInstance* instance,
bool vertical);
virtual ~PPB_Scrollbar_Impl();
// ResourceObjectBase override.
......@@ -33,8 +35,14 @@ class PPB_Scrollbar_Impl : public PPB_Widget_Impl,
// version of this API.
static const PPB_Scrollbar_0_3_Dev* Get0_3Interface();
// Returns a pointer to the interface implementing PPB_Scrollbar_0_4 that is
// exposed to the plugin. New code should use the thunk system for the new
// version of this API.
static const PPB_Scrollbar_0_4_Dev* Get0_4Interface();
// PPB_Scrollbar_API implementation.
virtual uint32_t GetThickness() OVERRIDE;
virtual bool IsOverlay() OVERRIDE;
virtual uint32_t GetValue() OVERRIDE;
virtual void SetValue(uint32_t value) OVERRIDE;
virtual void SetDocumentSize(uint32_t size) OVERRIDE;
......@@ -42,6 +50,9 @@ class PPB_Scrollbar_Impl : public PPB_Widget_Impl,
virtual void ScrollBy(PP_ScrollBy_Dev unit, int32_t multiplier) OVERRIDE;
private:
PPB_Scrollbar_Impl(PluginInstance* instance);
void Init(bool vertical);
// PPB_Widget private implementation.
virtual PP_Bool PaintInternal(const gfx::Rect& rect,
PPB_ImageData_Impl* image) OVERRIDE;
......@@ -51,6 +62,8 @@ class PPB_Scrollbar_Impl : public PPB_Widget_Impl,
// WebKit::WebScrollbarClient implementation.
virtual void valueChanged(WebKit::WebScrollbar* scrollbar) OVERRIDE;
// TODO(jam): add OVERRIDE once WebKit is rolled
virtual void overlayChanged(WebKit::WebScrollbar* scrollbar);
virtual void invalidateScrollbarRect(WebKit::WebScrollbar* scrollbar,
const WebKit::WebRect& rect) OVERRIDE;
virtual void getTickmarks(
......
......@@ -261,7 +261,7 @@ PP_Resource ResourceCreationImpl::CreateMouseInputEvent(
PP_Resource ResourceCreationImpl::CreateScrollbar(PP_Instance instance,
PP_Bool vertical) {
return ReturnResource(new PPB_Scrollbar_Impl(instance_, PP_ToBool(vertical)));
return PPB_Scrollbar_Impl::Create(instance_, PP_ToBool(vertical));
}
PP_Resource ResourceCreationImpl::CreateSurface3D(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment