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