Changeset 145415 in webkit
- Timestamp:
- Mar 11, 2013 3:25:51 PM (11 years ago)
- Location:
- trunk/Source/WebKit/blackberry
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp
r140046 r145415 1 1 /* 2 * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.2 * Copyright (C) 2011, 2012, 2013 Research In Motion Limited. All rights reserved. 3 3 * 4 4 * This library is free software; you can redistribute it and/or … … 204 204 } 205 205 206 WebCore::IntRect InRegionScrollerPrivate::clipToRect(const WebCore::IntRect& clippingRect, InRegionScrollableArea* scrollable) 207 { 208 RenderLayer* layer = scrollable->layer(); 209 if (!layer) 210 return clippingRect; 211 212 if (layer->renderer()->isRenderView()) { // #document case 213 FrameView* view = toRenderView(layer->renderer())->frameView(); 214 ASSERT(view); 215 ASSERT(canScrollInnerFrame(view->frame())); 216 217 WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view)); 218 frameWindowRect.intersect(clippingRect); 219 return frameWindowRect; 220 } 221 222 RenderBox* box = layer->renderBox(); 223 ASSERT(box); 224 ASSERT(canScrollRenderBox(box)); 225 226 // We want the window rect in pixel viewport coordinates clipped to the clipping rect. 227 WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect()); 228 visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect); 229 visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect); 230 visibleWindowRect.intersect(clippingRect); 231 return visibleWindowRect; 232 } 233 206 234 void InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint& documentPoint) 207 235 { … … 217 245 if (!layer) 218 246 return; 247 219 248 do { 249 220 250 RenderObject* renderer = layer->renderer(); 221 251 222 if (renderer ->isRenderView()) {252 if (renderer && renderer->isRenderView()) { 223 253 if (RenderView* renderView = toRenderView(renderer)) { 224 254 FrameView* view = renderView->frameView(); … … 259 289 WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize()); 260 290 261 std::vector<Platform::ScrollViewBase*>::reverse_iterator rend = m_activeInRegionScrollableAreas.rend(); 262 for (std::vector<Platform::ScrollViewBase*>::reverse_iterator rit = m_activeInRegionScrollableAreas.rbegin(); rit != rend; ++rit) { 263 264 InRegionScrollableArea* curr = static_cast<InRegionScrollableArea*>(*rit); 265 RenderLayer* layer = curr->layer(); 266 if (!layer) 267 continue; 268 269 if (layer->renderer()->isRenderView()) { // #document case 270 FrameView* view = toRenderView(layer->renderer())->frameView(); 271 ASSERT(view); 272 ASSERT(canScrollInnerFrame(view->frame())); 273 274 WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view)); 275 frameWindowRect.intersect(recursiveClippingRect); 276 curr->setVisibleWindowRect(frameWindowRect); 277 recursiveClippingRect = frameWindowRect; 278 279 } else { // RenderBox-based elements case (scrollable boxes (div's, p's, textarea's, etc)). 280 281 RenderBox* box = layer->renderBox(); 282 ASSERT(box); 283 ASSERT(canScrollRenderBox(box)); 284 285 WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect()); 286 visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect); 287 visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect); 288 visibleWindowRect.intersect(recursiveClippingRect); 289 290 curr->setVisibleWindowRect(visibleWindowRect); 291 recursiveClippingRect = visibleWindowRect; 291 for (int i = m_activeInRegionScrollableAreas.size() - 1; i >= 0; --i) { 292 InRegionScrollableArea* scrollable = static_cast<InRegionScrollableArea*>(m_activeInRegionScrollableAreas[i]); 293 scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable)); 294 recursiveClippingRect = scrollable->visibleWindowRect(); 295 } 296 } 297 298 Platform::ScrollViewBase* InRegionScrollerPrivate::firstScrollableInRegionForNode(const Node* node) 299 { 300 if (!node || !node->renderer()) 301 return 0; 302 303 RenderLayer* layer = node->renderer()->enclosingLayer(); 304 if (!layer) 305 return 0; 306 do { 307 RenderObject* renderer = layer->renderer(); 308 309 if (renderer->isRenderView()) { 310 if (RenderView* renderView = toRenderView(renderer)) { 311 FrameView* view = renderView->frameView(); 312 if (!view) { 313 reset(); 314 return 0; 315 } 316 317 if (!renderView->compositor()->scrollLayer()) 318 continue; 319 320 if (canScrollInnerFrame(view->frame())) 321 return clipAndCreateInRegionScrollableArea(layer); 322 } 323 } else if (canScrollRenderBox(layer->renderBox())) 324 return clipAndCreateInRegionScrollableArea(layer); 325 326 // If we run into a fix positioned layer, set the last scrollable in-region object 327 // as not able to propagate scroll to its parent scrollable. 328 if (isNonRenderViewFixedPositionedContainer(layer) && m_activeInRegionScrollableAreas.size()) { 329 Platform::ScrollViewBase* end = m_activeInRegionScrollableAreas.back(); 330 end->setCanPropagateScrollingToEnclosingScrollable(false); 292 331 } 293 } 332 333 } while (layer = parentLayer(layer)); 334 return 0; 335 } 336 337 Platform::ScrollViewBase* InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea(RenderLayer* layer) 338 { 339 WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize()); 340 InRegionScrollableArea* scrollable = new InRegionScrollableArea(m_webPage, layer); 341 scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable)); 342 return scrollable; 294 343 } 295 344 -
trunk/Source/WebKit/blackberry/Api/InRegionScroller.h
r137908 r145415 32 32 class TouchEventHandler; 33 33 class WebPagePrivate; 34 class SelectionHandler; 34 35 35 36 class BLACKBERRY_EXPORT InRegionScroller { … … 45 46 friend class WebPagePrivate; 46 47 friend class TouchEventHandler; 48 friend class SelectionHandler; 47 49 InRegionScrollerPrivate *d; 48 50 DISABLE_COPY(InRegionScroller) -
trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h
r137532 r145415 54 54 void calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint&); 55 55 const std::vector<Platform::ScrollViewBase*>& activeInRegionScrollableAreas() const; 56 Platform::ScrollViewBase* firstScrollableInRegionForNode(const WebCore::Node*); 56 57 57 58 void clearDocumentData(const WebCore::Document*); … … 70 71 71 72 void adjustScrollDelta(const WebCore::IntPoint& maxOffset, const WebCore::IntPoint& currentOffset, WebCore::IntSize& delta) const; 73 Platform::ScrollViewBase* clipAndCreateInRegionScrollableArea(WebCore::RenderLayer*); 72 74 73 75 bool isValidScrollableLayerWebKitThread(WebCore::LayerWebKitThread*) const; 74 76 bool isValidScrollableNode(WebCore::Node*) const; 77 WebCore::IntRect clipToRect(const WebCore::IntRect&, InRegionScrollableArea*); 75 78 std::vector<Platform::ScrollViewBase*> m_activeInRegionScrollableAreas; 76 79 }; -
trunk/Source/WebKit/blackberry/ChangeLog
r145396 r145415 1 2013-03-11 Genevieve Mak <gmak@rim.com> 2 3 [BlackBerry] Add a method to find the ScrollView for a text selection. 4 https://bugs.webkit.org/show_bug.cgi?id=112061 5 6 Reviewed by Rob Buis. 7 8 Internally reviewed by Mike Fenton and Jakob Petsovits. 9 PR #278490 10 11 Refactor the code in InRegionScroller so that we can add a method to find 12 the InRegionScrollableArea for a text selection. 13 14 * Api/InRegionScroller.cpp: 15 (BlackBerry::WebKit::InRegionScrollerPrivate::clipToRect): 16 - Pull out recursive clipping code into its own function. 17 (WebKit): 18 (BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint): 19 (BlackBerry::WebKit::InRegionScrollerPrivate::firstScrollableInRegionForNode): 20 - This new method allows us to get just the first scrollable region instead of looking 21 for more nested ones. We may want to refactor in the future because some of the code is 22 very similar to calculateInRegionScrollableAreasForPoint. 23 (BlackBerry::WebKit::InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea): 24 - Add a convenience method for the previous function 25 * Api/InRegionScroller.h: 26 (WebKit): 27 * Api/InRegionScroller_p.h: 28 (InRegionScrollerPrivate): 29 1 30 2013-03-11 Genevieve Mak <gmak@rim.com> 2 31
Note: See TracChangeset
for help on using the changeset viewer.