Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1005)

Unified Diff: third_party/WebKit/Source/WebKit/chromium/src/WebScrollbarImpl.cpp

Issue 7538006: Pepper and WebKit API change to support a plugin knowing if a scrollbar is an overlay one. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Make scrollbars appear when chrome becomes active Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/WebKit/chromium/src/WebScrollbarImpl.cpp
===================================================================
--- third_party/WebKit/Source/WebKit/chromium/src/WebScrollbarImpl.cpp (revision 92488)
+++ third_party/WebKit/Source/WebKit/chromium/src/WebScrollbarImpl.cpp (working copy)
@@ -34,12 +34,15 @@
#include "GraphicsContext.h"
#include "KeyboardCodes.h"
#include "painting/GraphicsContextBuilder.h"
+#include "ScrollAnimator.h"
#include "Scrollbar.h"
+#include "ScrollbarGroup.h"
#include "ScrollbarTheme.h"
#include "ScrollTypes.h"
#include "WebCanvas.h"
#include "WebInputEvent.h"
#include "WebInputEventConversion.h"
+#include "WebPluginContainerImpl.h"
#include "WebRect.h"
#include "WebScrollbarClient.h"
#include "WebVector.h"
@@ -50,9 +53,12 @@
namespace WebKit {
-WebScrollbar* WebScrollbar::create(WebScrollbarClient* client, Orientation orientation)
+WebScrollbar* WebScrollbar::create(Orientation orientation,
+ WebPluginContainer* pluginContainer,
+ WebScrollbarClient* client)
{
- return new WebScrollbarImpl(client, orientation);
+ WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(pluginContainer);
+ return new WebScrollbarImpl(orientation, plugin->scrollbarGroup(), client);
}
int WebScrollbar::defaultThickness()
@@ -60,20 +66,64 @@
return ScrollbarTheme::nativeTheme()->scrollbarThickness();
}
-WebScrollbarImpl::WebScrollbarImpl(WebScrollbarClient* client, Orientation orientation)
- : m_client(client)
+WebScrollbarImpl::WebScrollbarImpl(Orientation orientation,
+ ScrollbarGroup* group,
+ WebScrollbarClient* client)
+ : m_group(group)
+ , m_client(client)
, m_scrollOffset(0)
{
m_scrollbar = Scrollbar::createNativeScrollbar(
- static_cast<ScrollableArea*>(this),
+ static_cast<ScrollableArea*>(m_group),
static_cast<ScrollbarOrientation>(orientation),
RegularScrollbar);
+ m_group->scrollbarCreated(this);
}
WebScrollbarImpl::~WebScrollbarImpl()
{
+ m_group->scrollbarDestroyed(this);
}
+void WebScrollbarImpl::setScrollOffset(int scrollOffset)
+{
+ m_scrollOffset = scrollOffset;
+ m_client->valueChanged(this);
+}
+
+void WebScrollbarImpl::invalidateScrollbarRect(const IntRect& rect)
+{
+ WebRect webrect(rect);
+ webrect.x += m_scrollbar->x();
+ webrect.y += m_scrollbar->y();
+ m_client->invalidateScrollbarRect(this, webrect);
+}
+
+void WebScrollbarImpl::getTickmarks(Vector<IntRect>& tickmarks) const
+{
+ WebVector<WebRect> ticks;
+ m_client->getTickmarks(const_cast<WebScrollbarImpl*>(this), &ticks);
+ tickmarks.resize(ticks.size());
+ for (size_t i = 0; i < ticks.size(); ++i)
+ tickmarks[i] = ticks[i];
+}
+
+IntPoint WebScrollbarImpl::convertFromContainingViewToScrollbar(const IntPoint& parentPoint) const
+{
+ IntPoint offset(parentPoint.x() - m_scrollbar->x(), parentPoint.y() - m_scrollbar->y());
+ return m_scrollbar->Widget::convertFromContainingView(offset);
+}
+
+void WebScrollbarImpl::scrollbarStyleChanged()
+{
+ m_client->overlayChanged(this);
+}
+
+bool WebScrollbarImpl::isOverlay()
+{
+ return m_scrollbar->isOverlayScrollbar();
+}
+
void WebScrollbarImpl::setLocation(const WebRect& rect)
{
IntRect oldRect = m_scrollbar->frameRect();
@@ -95,7 +145,7 @@
void WebScrollbarImpl::setValue(int position)
{
- ScrollableArea::scrollToOffsetWithoutAnimation(m_scrollbar->orientation(), static_cast<float>(position));
+ m_group->scrollToOffsetWithoutAnimation(m_scrollbar->orientation(), static_cast<float>(position));
}
void WebScrollbarImpl::setDocumentSize(int size)
@@ -114,7 +164,7 @@
else
dir = horizontal ? ScrollLeft : ScrollUp;
- WebCore::ScrollableArea::scroll(dir, static_cast<WebCore::ScrollGranularity>(granularity), multiplier);
+ m_group->scroll(dir, static_cast<WebCore::ScrollGranularity>(granularity), multiplier);
}
void WebScrollbarImpl::paint(WebCanvas* canvas, const WebRect& rect)
@@ -182,40 +232,27 @@
return m_scrollbar->mouseMoved(PlatformMouseEventBuilder(m_scrollbar.get(), mousemove));
}
- if (m_scrollbar->hoveredPart() != NoPart)
+ if (m_scrollbar->hoveredPart() != NoPart && !m_scrollbar->isOverlayScrollbar())
m_scrollbar->mouseExited();
return false;
}
bool WebScrollbarImpl::onMouseLeave(const WebInputEvent& event)
{
- if (m_scrollbar->hoveredPart() == NoPart)
- return false;
+ if (m_scrollbar->hoveredPart() != NoPart)
+ m_scrollbar->mouseExited();
- return m_scrollbar->mouseExited();
+ return false;
}
bool WebScrollbarImpl::onMouseWheel(const WebInputEvent& event)
{
- // Same logic as in Scrollview.cpp. If we can move at all, we'll accept the event.
WebMouseWheelEvent mousewheel = *static_cast<const WebMouseWheelEvent*>(&event);
- int maxScrollDelta = m_scrollbar->maximum() - m_scrollbar->value();
- float delta = m_scrollbar->orientation() == HorizontalScrollbar ? mousewheel.deltaX : mousewheel.deltaY;
- if ((delta < 0 && maxScrollDelta > 0) || (delta > 0 && m_scrollbar->value() > 0)) {
- if (mousewheel.scrollByPage) {
- ASSERT(m_scrollbar->orientation() == VerticalScrollbar);
- bool negative = delta < 0;
- delta = max(max(static_cast<float>(m_scrollbar->visibleSize()) * Scrollbar::minFractionToStepWhenPaging(), static_cast<float>(m_scrollbar->visibleSize() - Scrollbar::maxOverlapBetweenPages())), 1.0f);
- if (negative)
- delta *= -1;
- }
- ScrollableArea::scroll((m_scrollbar->orientation() == HorizontalScrollbar) ? WebCore::ScrollLeft : WebCore::ScrollUp, WebCore::ScrollByPixel, delta);
- return true;
- }
+ PlatformWheelEventBuilder platformEvent(m_scrollbar.get(), mousewheel);
+ m_group->handleWheelEvent(platformEvent);
+ return platformEvent.isAccepted();
+}
- return false;
- }
-
bool WebScrollbarImpl::onKeyDown(const WebInputEvent& event)
{
WebKeyboardEvent keyboard = *static_cast<const WebKeyboardEvent*>(&event);
@@ -248,100 +285,9 @@
WebCore::ScrollGranularity scrollGranularity;
if (WebViewImpl::mapKeyCodeForScroll(keyCode, &scrollDirection, &scrollGranularity)) {
// Will return false if scroll direction wasn't compatible with this scrollbar.
- return ScrollableArea::scroll(scrollDirection, scrollGranularity);
+ return m_group->scroll(scrollDirection, scrollGranularity);
}
return false;
}
-int WebScrollbarImpl::scrollSize(WebCore::ScrollbarOrientation orientation) const
-{
- return (orientation == m_scrollbar->orientation()) ? (m_scrollbar->totalSize() - m_scrollbar->visibleSize()) : 0;
-}
-
-int WebScrollbarImpl::scrollPosition(Scrollbar*) const
-{
- return m_scrollOffset;
-}
-
-void WebScrollbarImpl::setScrollOffset(const IntPoint& offset)
-{
- if (m_scrollbar->orientation() == HorizontalScrollbar)
- m_scrollOffset = offset.x();
- else
- m_scrollOffset = offset.y();
-
- m_client->valueChanged(this);
-}
-
-void WebScrollbarImpl::invalidateScrollbarRect(Scrollbar*, const IntRect& rect)
-{
- WebRect webrect(rect);
- webrect.x += m_scrollbar->x();
- webrect.y += m_scrollbar->y();
- m_client->invalidateScrollbarRect(this, webrect);
-}
-
-void WebScrollbarImpl::invalidateScrollCornerRect(const IntRect&)
-{
-}
-
-bool WebScrollbarImpl::isActive() const
-{
- return true;
-}
-
-ScrollableArea* WebScrollbarImpl::enclosingScrollableArea() const
-{
- // FIXME: Return a parent scrollable area that can be scrolled.
- return 0;
-}
-
-bool WebScrollbarImpl::isScrollCornerVisible() const
-{
- return false;
-}
-
-void WebScrollbarImpl::getTickmarks(Vector<IntRect>& tickmarks) const
-{
- WebVector<WebRect> ticks;
- m_client->getTickmarks(const_cast<WebScrollbarImpl*>(this), &ticks);
- tickmarks.resize(ticks.size());
- for (size_t i = 0; i < ticks.size(); ++i)
- tickmarks[i] = ticks[i];
-}
-
-Scrollbar* WebScrollbarImpl::horizontalScrollbar() const
-{
- return m_scrollbar->orientation() == HorizontalScrollbar ? m_scrollbar.get() : 0;
-}
-
-Scrollbar* WebScrollbarImpl::verticalScrollbar() const
-{
- return m_scrollbar->orientation() == VerticalScrollbar ? m_scrollbar.get() : 0;
-}
-
-int WebScrollbarImpl::visibleHeight() const
-{
- return m_scrollbar->height();
-}
-
-int WebScrollbarImpl::visibleWidth() const
-{
- return m_scrollbar->width();
-}
-
-IntSize WebScrollbarImpl::contentsSize() const
-{
- // This isn't technically correct, since we don't have the contentSize. However it's good enough
- // to make the ScrollAnimator code happy.
- int thickness = defaultThickness();
- int length = m_scrollbar->totalSize();
- return m_scrollbar->orientation() == VerticalScrollbar ? IntSize(thickness, length) : IntSize(length, thickness);
-}
-
-IntSize WebScrollbarImpl::overhangAmount() const
-{
- return IntSize();
-}
-
} // namespace WebKit

Powered by Google App Engine
This is Rietveld 408576698