15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_scrollbar_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
10bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/common.h"
11bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/event_conversion.h"
122385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include "content/renderer/pepper/host_globals.h"
1358e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
14bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/plugin_module.h"
15bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch#include "content/renderer/pepper/ppb_image_data_impl.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/dev/ppp_scrollbar_dev.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/thunk.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCanvas.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h"
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputEvent.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebPluginScrollbar.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ppapi::thunk::PPB_Scrollbar_API;
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputEvent;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebScrollbar;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebPluginScrollbar;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3558e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochnamespace content {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
38a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPP_Resource PPB_Scrollbar_Impl::Create(PP_Instance instance, bool vertical) {
39a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  scoped_refptr<PPB_Scrollbar_Impl> scrollbar(new PPB_Scrollbar_Impl(instance));
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar->Init(vertical);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return scrollbar->GetReference();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PPB_Scrollbar_Impl::PPB_Scrollbar_Impl(PP_Instance instance)
45a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    : PPB_Widget_Impl(instance), weak_ptr_factory_(this) {}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPPB_Scrollbar_Impl::~PPB_Scrollbar_Impl() {}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::Init(bool vertical) {
5058e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch  PepperPluginInstanceImpl* plugin_instance =
512385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      HostGlobals::Get()->GetInstance(pp_instance());
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_instance)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar_.reset(WebPluginScrollbar::createForPlugin(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      vertical ? WebScrollbar::Vertical : WebScrollbar::Horizontal,
562385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      plugin_instance->container(),
57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      static_cast<blink::WebPluginScrollbarClient*>(this)));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPPB_Scrollbar_API* PPB_Scrollbar_Impl::AsPPB_Scrollbar_API() { return this; }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
62a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid PPB_Scrollbar_Impl::InstanceWasDeleted() { scrollbar_.reset(); }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32_t PPB_Scrollbar_Impl::GetThickness() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WebPluginScrollbar::defaultThickness();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
68a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool PPB_Scrollbar_Impl::IsOverlay() { return scrollbar_->isOverlay(); }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochuint32_t PPB_Scrollbar_Impl::GetValue() { return scrollbar_->value(); }
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::SetValue(uint32_t value) {
73b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (scrollbar_)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollbar_->setValue(value);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::SetDocumentSize(uint32_t size) {
78b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (scrollbar_)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scrollbar_->setDocumentSize(size);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::SetTickMarks(const PP_Rect* tick_marks,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      uint32_t count) {
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!scrollbar_)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tickmarks_.resize(count);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (uint32 i = 0; i < count; ++i) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tickmarks_[i] = WebRect(tick_marks[i].point.x,
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tick_marks[i].point.y,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            tick_marks[i].size.width,
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                            tick_marks[i].size.height);
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Rect rect = location();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Invalidate(&rect);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::ScrollBy(PP_ScrollBy_Dev unit, int32_t multiplier) {
99b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!scrollbar_)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
102a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  WebScrollbar::ScrollDirection direction = multiplier >= 0
103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                ? WebScrollbar::ScrollForward
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch                                                : WebScrollbar::ScrollBackward;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float fmultiplier = 1.0;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebScrollbar::ScrollGranularity granularity;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unit == PP_SCROLLBY_LINE) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    granularity = WebScrollbar::ScrollByLine;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (unit == PP_SCROLLBY_PAGE) {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    granularity = WebScrollbar::ScrollByPage;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (unit == PP_SCROLLBY_DOCUMENT) {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    granularity = WebScrollbar::ScrollByDocument;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    granularity = WebScrollbar::ScrollByPixel;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fmultiplier = static_cast<float>(multiplier);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fmultiplier < 0)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fmultiplier *= -1;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar_->scroll(direction, granularity, fmultiplier);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPB_Scrollbar_Impl::PaintInternal(const gfx::Rect& rect,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PPB_ImageData_Impl* image) {
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ImageDataAutoMapper mapper(image);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  skia::PlatformCanvas* canvas = image->GetPlatformCanvas();
127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!canvas || !scrollbar_)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->save();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->scale(scale(), scale());
13190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  scrollbar_->paint(canvas, rect);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  canvas->restore();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::GetVersion() == base::win::VERSION_XP)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    skia::MakeOpaque(canvas, rect.x(), rect.y(), rect.width(), rect.height());
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_TRUE;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PP_Bool PPB_Scrollbar_Impl::HandleEventInternal(
143ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const ppapi::InputEventData& data) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<WebInputEvent> web_input_event(CreateWebInputEvent(data));
145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!web_input_event.get() || !scrollbar_)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return PP_FALSE;
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PP_FromBool(scrollbar_->handleInputEvent(*web_input_event.get()));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::SetLocationInternal(const PP_Rect* location) {
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (!scrollbar_)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scrollbar_->setLocation(WebRect(location->point.x,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  location->point.y,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  location->size.width,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  location->size.height));
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void PPB_Scrollbar_Impl::valueChanged(blink::WebPluginScrollbar* scrollbar) {
1612385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  PluginModule* plugin_module =
1622385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      HostGlobals::Get()->GetInstance(pp_instance())->module();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_module)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPP_Scrollbar_Dev* ppp_scrollbar =
167a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      static_cast<const PPP_Scrollbar_Dev*>(
168a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          plugin_module->GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ppp_scrollbar) {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Try the old version. This is ok because the old interface is a subset of
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the new one, and ValueChanged didn't change.
172a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch    ppp_scrollbar = static_cast<const PPP_Scrollbar_Dev*>(
173a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch        plugin_module->GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE_0_2));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!ppp_scrollbar)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
177a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ppp_scrollbar->ValueChanged(
178a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      pp_instance(), pp_resource(), scrollbar_->value());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::overlayChanged(WebPluginScrollbar* scrollbar) {
1822385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch  PluginModule* plugin_module =
1832385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch      HostGlobals::Get()->GetInstance(pp_instance())->module();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!plugin_module)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const PPP_Scrollbar_Dev* ppp_scrollbar =
188a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      static_cast<const PPP_Scrollbar_Dev*>(
189a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          plugin_module->GetPluginInterface(PPP_SCROLLBAR_DEV_INTERFACE));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!ppp_scrollbar)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
192a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  ppp_scrollbar->OverlayChanged(
193a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      pp_instance(), pp_resource(), PP_FromBool(IsOverlay()));
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::invalidateScrollbarRect(
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebPluginScrollbar* scrollbar,
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const blink::WebRect& rect) {
199a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  gfx::Rect gfx_rect(rect.x, rect.y, rect.width, rect.height);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dirty_.Union(gfx_rect);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can't call into the client to tell them about the invalidate right away,
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // since the PPB_Scrollbar_Impl code is still in the middle of updating its
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // internal state.
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note: we use a WeakPtrFactory here so that a lingering callback can not
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // modify the lifetime of this object. Otherwise, blink::WebPluginScrollbar
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // could outlive blink::WebPluginContainer, which is against its contract.
207b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop::current()->PostTask(
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&PPB_Scrollbar_Impl::NotifyInvalidate,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 weak_ptr_factory_.GetWeakPtr()));
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::getTickmarks(
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebPluginScrollbar* scrollbar,
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebVector<blink::WebRect>* tick_marks) const {
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (tickmarks_.empty()) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebRect* rects = NULL;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tick_marks->assign(rects, 0);
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    tick_marks->assign(&tickmarks_[0], tickmarks_.size());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PPB_Scrollbar_Impl::NotifyInvalidate() {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (dirty_.IsEmpty())
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Rect pp_rect;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_rect.point.x = dirty_.x();
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_rect.point.y = dirty_.y();
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_rect.size.width = dirty_.width();
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp_rect.size.height = dirty_.height();
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dirty_ = gfx::Rect();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Invalidate(&pp_rect);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdoch}  // namespace content
237