⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 245509 in webkit


Ignore:
Timestamp:
May 19, 2019, 8:15:30 PM (7 years ago)
Author:
Brent Fulgham
Message:

Wait to get frame until after layout has been run
https://bugs.webkit.org/show_bug.cgi?id=197999
<rdar://problem/50800345>

Reviewed by Alex Christensen.

Source/WebCore:

The current frame can change when layout runs, so don't bother retrieving
the frame until the final layout pass is complete.

Test: fast/dom/window-inner-width-crash.html

  • page/DOMWindow.cpp:

(WebCore::DOMWindow::innerHeight const): Move frame access past the
layout operation.
(WebCore::DOMWindow::innerWidth const): Ditto.
(WebCore::DOMWindow::scrollX const): Ditto.
(WebCore::DOMWindow::scrollY const): Ditto.

LayoutTests:

  • fast/dom/window-inner-width-crash-expected.txt: Added.
  • fast/dom/window-inner-width-crash.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r245507 r245509  
     12019-05-19  Brent Fulgham  <bfulgham@apple.com>
     2
     3        Wait to get frame until after layout has been run
     4        https://bugs.webkit.org/show_bug.cgi?id=197999
     5        <rdar://problem/50800345>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * fast/dom/window-inner-width-crash-expected.txt: Added.
     10        * fast/dom/window-inner-width-crash.html: Added.
     11
    1122019-05-19  Antoine Quint  <graouts@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r245508 r245509  
     12019-05-19  Brent Fulgham  <bfulgham@apple.com>
     2
     3        Wait to get frame until after layout has been run
     4        https://bugs.webkit.org/show_bug.cgi?id=197999
     5        <rdar://problem/50800345>
     6
     7        Reviewed by Alex Christensen.
     8
     9        The current frame can change when layout runs, so don't bother retrieving
     10        the frame until the final layout pass is complete.
     11
     12        Test: fast/dom/window-inner-width-crash.html
     13
     14        * page/DOMWindow.cpp:
     15        (WebCore::DOMWindow::innerHeight const): Move frame access past the
     16        layout operation.
     17        (WebCore::DOMWindow::innerWidth const): Ditto.
     18        (WebCore::DOMWindow::scrollX const): Ditto.
     19        (WebCore::DOMWindow::scrollY const): Ditto.
     20
    1212019-05-19  Brent Fulgham  <bfulgham@apple.com>
    222
  • trunk/Source/WebCore/page/DOMWindow.cpp

    r244695 r245509  
    12301230int DOMWindow::innerHeight() const
    12311231{
    1232     auto* frame = this->frame();
    1233     if (!frame)
    1234         return 0;
    1235 
     1232    if (!frame())
     1233        return 0;
     1234   
    12361235    // Force enough layout in the parent document to ensure that the FrameView has been resized.
    12371236    if (auto* frameElement = this->frameElement())
    12381237        frameElement->document().updateLayoutIfDimensionsOutOfDate(*frameElement, HeightDimensionsCheck);
    12391238
     1239    auto* frame = this->frame();
     1240    if (!frame)
     1241        return 0;
     1242   
    12401243    FrameView* view = frame->view();
    12411244    if (!view)
     
    12471250int DOMWindow::innerWidth() const
    12481251{
    1249     auto* frame = this->frame();
    1250     if (!frame)
     1252    if (!frame())
    12511253        return 0;
    12521254
     
    12551257        frameElement->document().updateLayoutIfDimensionsOutOfDate(*frameElement, WidthDimensionsCheck);
    12561258
     1259    auto* frame = this->frame();
     1260    if (!frame)
     1261        return 0;
     1262
    12571263    FrameView* view = frame->view();
    12581264    if (!view)
     
    13041310    frame->document()->updateLayoutIgnorePendingStylesheets();
    13051311
    1306     return view->mapFromLayoutToCSSUnits(view->contentsScrollPosition().x());
     1312    // Layout may have affected the current frame:
     1313    auto* frameAfterLayout = this->frame();
     1314    if (!frameAfterLayout)
     1315        return 0;
     1316   
     1317    FrameView* viewAfterLayout = frameAfterLayout->view();
     1318    if (!viewAfterLayout)
     1319        return 0;
     1320
     1321    return viewAfterLayout->mapFromLayoutToCSSUnits(viewAfterLayout->contentsScrollPosition().x());
    13071322}
    13081323
     
    13231338    frame->document()->updateLayoutIgnorePendingStylesheets();
    13241339
    1325     return view->mapFromLayoutToCSSUnits(view->contentsScrollPosition().y());
     1340    // Layout may have affected the current frame:
     1341    auto* frameAfterLayout = this->frame();
     1342    if (!frameAfterLayout)
     1343        return 0;
     1344   
     1345    FrameView* viewAfterLayout = frameAfterLayout->view();
     1346    if (!viewAfterLayout)
     1347        return 0;
     1348   
     1349    return viewAfterLayout->mapFromLayoutToCSSUnits(viewAfterLayout->contentsScrollPosition().y());
    13261350}
    13271351
Note: See TracChangeset for help on using the changeset viewer.