Changeset 230622 in webkit


Ignore:
Timestamp:
Apr 12, 2018 10:27:52 PM (6 years ago)
Author:
Alan Bujtas
Message:

[LayoutReloaded] Add support for incremental layout
https://bugs.webkit.org/show_bug.cgi?id=184578

Reviewed by Antti Koivisto.

  • LayoutReloaded/Layout.js:

(layout):

  • LayoutReloaded/LayoutState.js:

(LayoutState.prototype.rootContainer):
(LayoutState.prototype.setNeedsLayoutById):

  • LayoutReloaded/Utils.js:

(Utils.layoutTreeDump):

  • LayoutReloaded/test/TestHarness.js:

(verifyLayout):
(runLayout):
(verifyLayoutTreeDump): Deleted.

  • LayoutReloaded/test/index.html:
  • LayoutReloaded/test/simple-incremental-layout-with-static-content.html: Added.
Location:
trunk/Tools
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r230621 r230622  
     12018-04-12  Zalan Bujtas  <zalan@apple.com>
     2
     3        [LayoutReloaded] Add support for incremental layout
     4        https://bugs.webkit.org/show_bug.cgi?id=184578
     5
     6        Reviewed by Antti Koivisto.
     7
     8        * LayoutReloaded/Layout.js:
     9        (layout):
     10        * LayoutReloaded/LayoutState.js:
     11        (LayoutState.prototype.rootContainer):
     12        (LayoutState.prototype.setNeedsLayoutById):
     13        * LayoutReloaded/Utils.js:
     14        (Utils.layoutTreeDump):
     15        * LayoutReloaded/test/TestHarness.js:
     16        (verifyLayout):
     17        (runLayout):
     18        (verifyLayoutTreeDump): Deleted.
     19        * LayoutReloaded/test/index.html:
     20        * LayoutReloaded/test/simple-incremental-layout-with-static-content.html: Added.
     21
    1222018-04-12  Zalan Bujtas  <zalan@apple.com>
    223
  • trunk/Tools/LayoutReloaded/Layout.js

    r230621 r230622  
    2424 */
    2525
    26 function layout(window, viewportSize) {
    27     let treeBuilder = new TreeBuilder();
    28     let initialContainingBlock = treeBuilder.createTree(window.document, window.renderTreeStructure);
    29     let displayBox = new Display.Box();
    30     displayBox.setSize(viewportSize);
    31     let layoutState = new LayoutState(initialContainingBlock, displayBox);
    32     layoutState.formattingContext(initialContainingBlock).layout();
    33     return Utils.layoutTreeDump(initialContainingBlock, layoutState);
     26function layout(window, viewportSize, layoutState) {
     27    let rootContainer = null;
     28    if (layoutState)
     29        rootContainer = layoutState.rootContainer();
     30    else {
     31        // This is top level layout (initial containing block, etc).
     32        let treeBuilder = new TreeBuilder();
     33        rootContainer = treeBuilder.createTree(window.document, window.renderTreeStructure);
     34        let displayBox = new Display.Box();
     35        displayBox.setSize(viewportSize);
     36        layoutState = new LayoutState(rootContainer, displayBox);
     37    }
     38    layoutState.formattingContext(rootContainer).layout();
     39    return layoutState;
    3440}
  • trunk/Tools/LayoutReloaded/LayoutState.js

    r230621 r230622  
    3737    }
    3838
     39    rootContainer() {
     40        return this.m_rootContainer;
     41    }
     42
    3943    establishedFormattingState(formattingRoot) {
    4044        ASSERT(formattingRoot.establishesFormattingContext());
     
    5660        ASSERT_NOT_REACHED();
    5761        return null;
     62    }
     63
     64    // This is for testing only.
     65    setNeedsLayoutById(layoutBoxId) {
    5866    }
    5967
  • trunk/Tools/LayoutReloaded/Utils.js

    r230621 r230622  
    550550
    551551    // "RenderView at (0,0) size 1317x366\n HTML RenderBlock at (0,0) size 1317x116\n  BODY RenderBody at (8,8) size 1301x100\n   DIV RenderBlock at (0,0) size 100x100\n";
    552     static layoutTreeDump(initialContainingBlock, layoutState) {
    553         return this._dumpBox(layoutState, initialContainingBlock, 1) + this._dumpTree(layoutState, initialContainingBlock, 2);
     552    static layoutTreeDump(layoutState) {
     553        return this._dumpBox(layoutState, layoutState.rootContainer(), 1) + this._dumpTree(layoutState, layoutState.rootContainer(), 2);
    554554    }
    555555
  • trunk/Tools/LayoutReloaded/test/TestHarness.js

    r229473 r230622  
    2424 */
    2525
    26 function verifyLayoutTreeDump(renderTreeDump, layoutTreeDump)
     26function verifyLayout(renderTreeDump)
    2727{
     28    let layoutTreeDump = Utils.layoutTreeDump(layoutState);
    2829    console.log("WebKit:\n" + renderTreeDump + renderTreeDump.length);
    2930    console.log("Reloaded:\n" + layoutTreeDump + layoutTreeDump.length);
     
    3334}
    3435
    35 function runLayout(testWindow) {
     36function runLayout(testWindow, layoutState) {
    3637    testWindow.document.body.offsetHeight;
    3738    let viewportSize = new LayoutSize(parseFloat(testWindow.innerWidth), parseFloat(testWindow.innerHeight));
    38     let layoutTreeDump = layout(testWindow, viewportSize);
    39     return verifyLayoutTreeDump(testWindow.simplifiedRenderTree, layoutTreeDump);
     39    return layout(testWindow, viewportSize, layoutState);
    4040}
  • trunk/Tools/LayoutReloaded/test/index.html

    r230484 r230622  
    99<script>
    1010let testFiles = [
     11    "simple-incremental-layout-with-static-content.html",
    1112    "relative-simple.html",
    1213    "relative-bottom.html",
     
    117118addJS("../FormattingContext/InlineFormatting/Line.js");
    118119
    119 let failedTests = [];
    120 
    121 function printResult(files, currentTestIndex) {
    122     let resultContent = currentTestIndex != null ? ("Testing..." + currentTestIndex + " out of " + files.length) : ("Number of tests: " + files.length) ;
    123     resultContent += "<br><br>Passed: " + ((currentTestIndex != null ? currentTestIndex : files.length) - failedTests.length) + "<br>Failed: " + failedTests.length;
     120let failedTests = new Array();
     121
     122let isRunningAsyncTest = false;
     123let tests;
     124let currentTestIndex = 0;
     125let subTests = 0;
     126let layoutState = null;
     127
     128function collectRenderersWithNeedsLayout() {
     129    // TODO: implement it in WebKit.
     130    return null;
     131}
     132
     133function runAndVerifyLayout(window) {
     134    layoutState = runLayout(window, layoutState);
     135    return verifyLayout(window.simplifiedRenderTree);
     136}
     137
     138class TestRunner {
     139    waitUntilDone() {
     140        isRunningAsyncTest = true;
     141    }
     142
     143    notifyDone() {
     144        let testFrame = document.getElementById("testFrame");
     145        let passed = runAndVerifyLayout(testFrame.contentWindow);
     146        finishAndMoveToNextTest(passed);
     147    }
     148
     149    forceLayout() {
     150        let testFrame = document.getElementById("testFrame");
     151        let needsLayoutRenderers = collectRenderersWithNeedsLayout(); //testFrame.contentWindow.collectRenderersWithNeedsLayout();
     152        testFrame.contentWindow.document.body.offsetWidth;
     153        if (layoutState) {
     154            for (let rendererId of needsLayoutRenderers)
     155                layoutState.setNeedsLayoutById(rendererId);
     156        }
     157        let passed = runAndVerifyLayout(testFrame.contentWindow);
     158        ++subTests;
     159        if (!passed && failedTests.indexOf(currentTestIndex) == -1)
     160            failedTests.push(currentTestIndex);
     161        printIntermediateResult();
     162    }
     163
     164}
     165
     166function printFinalResult() {
     167    let resultContent = "Number of tests: " + tests.length;
     168    resultContent += "<br><br>Passed: " + (tests.length - failedTests.length) + "<br>Failed: " + failedTests.length;
    124169    if (failedTests.length > 0) {
    125170        resultContent += "<br><br>Failed cases:"
    126171        failedTests.forEach(function(item) {
    127             resultContent += "<br><a href=\"" + files[item] + "\">" + files[item] + "</a>";
     172            resultContent += "<br><a href=\"" + tests[item] + "\">" + tests[item] + "</a>";
    128173        });
    129174    }
     
    131176}
    132177
    133 function runTest(files, currentTestIndex) {
    134     printResult(files, currentTestIndex);
     178function printIntermediateResult() {
     179    let resultContent = "Testing..." + currentTestIndex + (subTests > 0 ? "(" + subTests + ")" : "") + " out of " + tests.length;
     180    resultContent += "<br><br>Passed: " + (currentTestIndex - failedTests.length) + "<br>Failed: " + failedTests.length;
     181    if (failedTests.length > 0) {
     182        resultContent += "<br><br>Failed cases:"
     183        failedTests.forEach(function(item) {
     184            resultContent += "<br><a href=\"" + tests[item] + "\">" + tests[item] + "</a>";
     185        });
     186    }
     187    result.innerHTML = resultContent;
     188}
     189
     190function finishAndMoveToNextTest(passed) {
     191    let testFrame = document.getElementById("testFrame");
     192    testFrame.remove();
     193    initialContainingBlock = null;
     194    layoutState = null;
     195    subTests = 0;
     196    isRunningAsyncTest = false;
     197    if (!passed)
     198        failedTests.push(currentTestIndex);
     199    setTimeout(function() {
     200        if (currentTestIndex < tests.length - 1) {
     201            printIntermediateResult();
     202            ++currentTestIndex;
     203            runTest(tests);
     204            return;
     205        }
     206        printFinalResult();
     207    }, 0);
     208}
     209
     210function runTest() {
    135211    let iframe = document.createElement("iframe");
    136     iframe.src = files[currentTestIndex];
     212    iframe.src = tests[currentTestIndex];
    137213    iframe.id = "testFrame";
    138214    iframe.width = window.innerWidth;
    139215    iframe.height = window.innerHeight;
    140216    iframe.onload = function() {
     217        if (isRunningAsyncTest)
     218            return;
    141219        let testFrame = document.getElementById("testFrame");
    142         let passed = runLayout(testFrame.contentWindow);
    143         testFrame.remove();
    144         if (!passed)
    145             failedTests.push(currentTestIndex);
    146         setTimeout(function() {
    147             if (currentTestIndex < files.length - 1)
    148                 runTest(files, ++currentTestIndex);
    149             else
    150                 printResult(files);
    151         }, 0);
     220        let passed = runAndVerifyLayout(testFrame.contentWindow);
     221        finishAndMoveToNextTest(passed, tests);
    152222    };
    153223    document.body.appendChild(iframe);
     224    iframe.contentWindow.testRunner = new TestRunner();
    154225}
    155226
    156227function runTests() {
    157     runTest(debugThis.length ? debugThis : testFiles, 0);
     228    tests = debugThis.length ? debugThis : testFiles;
     229    runTest();
    158230}
    159231</script>
Note: See TracChangeset for help on using the changeset viewer.