Changeset 31257 in webkit
- Timestamp:
- Mar 24, 2008 3:51:26 PM (16 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r31251 r31257 1 2008-03-24 David Hyatt <hyatt@apple.com> 2 3 Fix for bug 18009. Make sure the IE offset/client/scroll*** extensions respect full page zoom. 4 5 Reviewed by Beth 6 7 * dom/Element.cpp: 8 (WebCore::localZoomForRenderer): 9 (WebCore::adjustForLocalZoom): 10 (WebCore::adjustForAbsoluteZoom): 11 (WebCore::Element::offsetLeft): 12 (WebCore::Element::offsetTop): 13 (WebCore::Element::offsetWidth): 14 (WebCore::Element::offsetHeight): 15 (WebCore::Element::clientLeft): 16 (WebCore::Element::clientTop): 17 (WebCore::Element::clientWidth): 18 (WebCore::Element::clientHeight): 19 (WebCore::Element::scrollLeft): 20 (WebCore::Element::scrollTop): 21 (WebCore::Element::setScrollLeft): 22 (WebCore::Element::setScrollTop): 23 (WebCore::Element::scrollWidth): 24 (WebCore::Element::scrollHeight): 25 * rendering/RenderBox.cpp: 26 (WebCore::RenderBox::setStyle): 27 * rendering/RenderObject.cpp: 28 (WebCore::RenderObject::offsetParent): 29 * rendering/RenderObject.h: 30 1 31 2008-03-24 Brady Eidson <beidson@apple.com> 2 32 -
trunk/WebCore/dom/Element.cpp
r31231 r31257 281 281 } 282 282 283 static float localZoomForRenderer(RenderObject* renderer) 284 { 285 // FIXME: This does the wrong thing if two opposing zooms are in effect and canceled each 286 // other out, but the alternative is that we'd have to crawl up the whole render tree every 287 // time (or store an additional bit in the RenderStyle to indicate that a zoom was specified). 288 float zoomFactor = 1.0f; 289 if (renderer->style()->effectiveZoom() != 1.0f) { 290 // Need to find the nearest enclosing RenderObject that set up 291 // a differing zoom, and then we divide our result by it to eliminate the zoom. 292 RenderObject* prev = renderer; 293 for (RenderObject* curr = prev->parent(); curr; curr = curr->parent()) { 294 if (curr->style()->effectiveZoom() != prev->style()->effectiveZoom()) { 295 zoomFactor = prev->style()->zoom(); 296 break; 297 } 298 prev = curr; 299 } 300 if (prev->isRenderView()) 301 zoomFactor = prev->style()->zoom(); 302 } 303 return zoomFactor; 304 } 305 306 static int adjustForLocalZoom(int value, RenderObject* renderer) 307 { 308 float zoomFactor = localZoomForRenderer(renderer); 309 if (zoomFactor == 1.0f) 310 return value; 311 return value / zoomFactor; 312 } 313 314 static int adjustForAbsoluteZoom(int value, RenderObject* renderer) 315 { 316 float zoomFactor = renderer->style()->effectiveZoom(); 317 if (zoomFactor == 1.0f) 318 return value; 319 return value / zoomFactor; 320 } 321 283 322 int Element::offsetLeft() 284 323 { 285 324 document()->updateLayoutIgnorePendingStylesheets(); 286 325 if (RenderObject* rend = renderer()) 287 return rend->offsetLeft();326 return adjustForLocalZoom(rend->offsetLeft(), rend); 288 327 return 0; 289 328 } … … 293 332 document()->updateLayoutIgnorePendingStylesheets(); 294 333 if (RenderObject* rend = renderer()) 295 return rend->offsetTop();334 return adjustForLocalZoom(rend->offsetTop(), rend); 296 335 return 0; 297 336 } … … 301 340 document()->updateLayoutIgnorePendingStylesheets(); 302 341 if (RenderObject* rend = renderer()) 303 return rend->offsetWidth();342 return adjustForAbsoluteZoom(rend->offsetWidth(), rend); 304 343 return 0; 305 344 } … … 309 348 document()->updateLayoutIgnorePendingStylesheets(); 310 349 if (RenderObject* rend = renderer()) 311 return rend->offsetHeight();350 return adjustForAbsoluteZoom(rend->offsetHeight(), rend); 312 351 return 0; 313 352 } … … 327 366 328 367 if (RenderObject* rend = renderer()) 329 return rend->clientLeft();368 return adjustForAbsoluteZoom(rend->clientLeft(), rend); 330 369 return 0; 331 370 } … … 336 375 337 376 if (RenderObject* rend = renderer()) 338 return rend->clientTop();377 return adjustForAbsoluteZoom(rend->clientTop(), rend); 339 378 return 0; 340 379 } … … 355 394 356 395 if (RenderObject* rend = renderer()) 357 return rend->clientWidth();396 return adjustForAbsoluteZoom(rend->clientWidth(), rend); 358 397 return 0; 359 398 } … … 374 413 375 414 if (RenderObject* rend = renderer()) 376 return rend->clientHeight();415 return adjustForAbsoluteZoom(rend->clientHeight(), rend); 377 416 return 0; 378 417 } … … 382 421 document()->updateLayoutIgnorePendingStylesheets(); 383 422 if (RenderObject* rend = renderer()) 384 return rend->scrollLeft();423 return adjustForAbsoluteZoom(rend->scrollLeft(), rend); 385 424 return 0; 386 425 } … … 390 429 document()->updateLayoutIgnorePendingStylesheets(); 391 430 if (RenderObject* rend = renderer()) 392 return rend->scrollTop();431 return adjustForAbsoluteZoom(rend->scrollTop(), rend); 393 432 return 0; 394 433 } … … 398 437 document()->updateLayoutIgnorePendingStylesheets(); 399 438 if (RenderObject *rend = renderer()) 400 rend->setScrollLeft(newLeft );439 rend->setScrollLeft(newLeft * rend->style()->effectiveZoom()); 401 440 } 402 441 … … 405 444 document()->updateLayoutIgnorePendingStylesheets(); 406 445 if (RenderObject *rend = renderer()) 407 rend->setScrollTop(newTop );446 rend->setScrollTop(newTop * rend->style()->effectiveZoom()); 408 447 } 409 448 … … 412 451 document()->updateLayoutIgnorePendingStylesheets(); 413 452 if (RenderObject* rend = renderer()) 414 return rend->scrollWidth();453 return adjustForAbsoluteZoom(rend->scrollWidth(), rend); 415 454 return 0; 416 455 } … … 420 459 document()->updateLayoutIgnorePendingStylesheets(); 421 460 if (RenderObject* rend = renderer()) 422 return rend->scrollHeight();461 return adjustForAbsoluteZoom(rend->scrollHeight(), rend); 423 462 return 0; 424 463 } -
trunk/WebCore/rendering/RenderBox.cpp
r31200 r31257 137 137 if (wasFloating && isFloating()) 138 138 setChildNeedsLayout(true); 139 } 140 141 // If our zoom factor changes and we have a defined scrollLeft/Top, we need to adjust that value into the 142 // new zoomed coordinate space. 143 if (hasOverflowClip() && oldStyle && style() && oldStyle->effectiveZoom() != style()->effectiveZoom()) { 144 int left = scrollLeft(); 145 if (left) { 146 left = (left / oldStyle->effectiveZoom()) * style()->effectiveZoom(); 147 setScrollLeft(left); 148 } 149 int top = scrollTop(); 150 if (top) { 151 top = (top / oldStyle->effectiveZoom()) * style()->effectiveZoom(); 152 setScrollTop(top); 153 } 139 154 } 140 155 -
trunk/WebCore/rendering/RenderObject.cpp
r31155 r31257 557 557 558 558 bool skipTables = isPositioned() || isRelPositioned(); 559 float currZoom = style()->effectiveZoom(); 559 560 RenderObject* curr = parent(); 560 561 while (curr && (!curr->element() || … … 563 564 curr->element()->hasTagName(tdTag) || curr->element()->hasTagName(thTag))) 564 565 break; 566 float newZoom = curr->style()->effectiveZoom(); 567 if (currZoom != newZoom) 568 break; 569 currZoom = newZoom; 565 570 curr = curr->parent(); 566 571 } -
trunk/WebCore/rendering/RenderObject.h
r31200 r31257 603 603 604 604 // IE extensions. Used to calculate offsetWidth/Height. Overridden by inlines (RenderFlow) 605 // to return the remaining width on a given line (and the height of a single line). -dwh605 // to return the remaining width on a given line (and the height of a single line). 606 606 virtual int offsetWidth() const { return width(); } 607 607 virtual int offsetHeight() const { return height() + borderTopExtra() + borderBottomExtra(); }
Note: See TracChangeset
for help on using the changeset viewer.