Changeset 50574 in webkit


Ignore:
Timestamp:
Nov 5, 2009 12:13:29 PM (14 years ago)
Author:
pfeldman@chromium.org
Message:

2009-11-05 Pavel Feldman <pfeldman@chromium.org>

Reviewed by Timothy Hatcher.

REGRESSION: Web Inspector doesn't show CSS rules properly for iframes

https://bugs.webkit.org/show_bug.cgi?id=30884

Test: inspector/styles-iframe.html

  • inspector/front-end/DOMAgent.js: (WebInspector.DOMNode):
  • inspector/front-end/InjectedScript.js: (InjectedScript.getStyles): (InjectedScript.getComputedStyle): (InjectedScript.addStyleSelector):
  • inspector/front-end/TestController.js: (WebInspector.TestController.prototype.notifyDone): (WebInspector.TestController.prototype.runAfterPendingDispatches): (WebInspector.evaluateForTestInFrontend.invokeMethod): (WebInspector.evaluateForTestInFrontend):
Location:
trunk
Files:
4 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r50573 r50574  
     1i2009-11-05  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Timothy Hatcher.
     4
     5        REGRESSION: Web Inspector doesn't show CSS rules properly for iframes
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=30884
     8
     9        * inspector/console-dir.html:
     10        * inspector/console-dirxml.html:
     11        * inspector/console-format-collections-expected.txt:
     12        * inspector/console-format-collections.html:
     13        * inspector/console-format.html:
     14        * inspector/console-tests.html:
     15        * inspector/elements-panel-structure-expected.txt:
     16        * inspector/elements-panel-structure.html:
     17        * inspector/evaluate-in-frontend.js:
     18        ():
     19        (expandDOMSubtree.processChildren):
     20        (expandDOMSubtree):
     21        (dumpConsoleMessages):
     22        * inspector/resources/styles-iframe-data.html: Added.
     23        * inspector/styles-iframe-expected.txt: Added.
     24        * inspector/styles-iframe.html: Added.
     25        * platform/qt/Skipped:
     26
    1272009-11-05  Dimitri Glazkov  <dglazkov@chromium.org>
    228
  • trunk/LayoutTests/inspector/console-dir.html

    r49762 r50574  
    1313    {
    1414        for (var i = 0; i < result.length; ++i)
    15             output(result[i]);
     15            output(result[i].text);
    1616        notifyDone();
    1717    }
    18     evaluateInWebInspector("dumpMessages()", callback);
     18    evaluateInWebInspector("dumpConsoleMessages", callback);
    1919}
    2020
     
    2727</p>
    2828
    29 <div id="frontend-script" style="display:none">
    30 function dumpMessages()
    31 {
    32     var result = [];
    33     var messages = WebInspector.console.messages;
    34     for (var i = 0; i < messages.length; ++i)
    35         result.push(messages[i].toMessageElement().textContent.replace(/\u200b/g, ""));
    36     return result;
    37 }
    38 </div>
    39 
    4029<div id="output">
    4130</div>
  • trunk/LayoutTests/inspector/console-dirxml.html

    r49762 r50574  
    1111    {
    1212        for (var i = 0; i < result.length; ++i)
    13             output(result[i]);
     13            output(result[i].text);
    1414        notifyDone();
    1515    }
    16     evaluateInWebInspector("dumpMessages()", callback);
     16    evaluateInWebInspector("dumpConsoleMessages", callback);
    1717}
    1818
     
    2525</p>
    2626
    27 <div id="frontend-script" style="display:none">
    28 function dumpMessages()
    29 {
    30     var result = [];
    31     var messages = WebInspector.console.messages;
    32     for (var i = 0; i < messages.length; ++i)
    33         result.push(messages[i].toMessageElement().textContent.replace(/\u200b/g, ""));
    34     return result;
    35 }
    36 </div>
    37 
    3827<div id="output">
    3928</div>
  • trunk/LayoutTests/inspector/console-format-collections-expected.txt

    r50168 r50574  
    1010console-format-collections.html:18[<script src="evaluate-in-frontend.js">, <script>]
    1111console-format-collections.html:22[<option value="1">one</option>, <option value="2">two</option>]
    12 console-format-collections.html:26[<html>, <head>, <script src="evaluate-in-frontend.js">, <script>, <body onload="onload()">, <p> Tests that console nicely formats HTML Collections and NodeLists. </p>, <div style="display:none">, <form id="f">, <select id="sel" name="sel">, <option value="1">one</option>, <option value="2">two</option>, <input type="radio" name="x" value="x1">, <input type="radio" name="x" value="x2">, <div id="frontend-script" style="display:none">, <div id="output">]
     12console-format-collections.html:26[<html>, <head>, <script src="evaluate-in-frontend.js">, <script>, <body onload="onload()">, <p> Tests that console nicely formats HTML Collections and NodeLists. </p>, <div style="display:none">, <form id="f">, <select id="sel" name="sel">, <option value="1">one</option>, <option value="2">two</option>, <input type="radio" name="x" value="x1">, <input type="radio" name="x" value="x2">, <div id="output">]
    1313console-format-collections.html:30[<select id="sel" name="sel">, <input type="radio" name="x" value="x1">, <input type="radio" name="x" value="x2">]
    1414console-format-collections.html:34[<input type="radio" name="x" value="x1">, <input type="radio" name="x" value="x2">]
  • trunk/LayoutTests/inspector/console-format-collections.html

    r50199 r50574  
    3434    console.log(radioNodeList);
    3535
    36     evaluateInWebInspector("dumpMessages", function(result) {
     36    evaluateInWebInspector("dumpConsoleMessages", function(result) {
    3737        for (var i = 0; i < result.length; ++i)
    38             output(result[i]);
     38            output(result[i].text);
    3939        notifyDone();
    4040    });
     
    5959</div>
    6060
    61 <div id="frontend-script" style="display:none">
    62 function dumpMessages(testController)
    63 {
    64     testController.waitUntilDone();
    65     testController.runAfterPendingDispatches(function() {
    66         var result = [];
    67         var messages = WebInspector.console.messages;
    68         for (var i = 0; i < messages.length; ++i)
    69             result.push(messages[i].toMessageElement().textContent.replace(/\u200b/g, ""));
    70         testController.notifyDone(result);
    71     });
    72 }
    73 </div>
    74 
    7561<div id="output">
    7662</div>
  • trunk/LayoutTests/inspector/console-format.html

    r49762 r50574  
    1818    {
    1919        for (var i = 0; i < result.length; ++i)
    20             output(result[i]);
     20            output(result[i].text);
    2121        notifyDone();
    2222    }
    23     evaluateInWebInspector("dumpMessages", callback);
     23    evaluateInWebInspector("dumpConsoleMessages", callback);
    2424}
    2525
     
    3232</p>
    3333
    34 <div id="frontend-script" style="display:none">
    35 function dumpMessages(testController)
    36 {
    37     // Array formatting is deferred due to the async InjectedScriptAccess.getProperties call.
    38     // Queue message log dump in order to see proper result.
    39     testController.waitUntilDone();
    40     setTimeout(function() {
    41         var result = [];
    42         var messages = WebInspector.console.messages;
    43         for (var i = 0; i < messages.length; ++i)
    44             result.push(messages[i].toMessageElement().textContent);
    45         testController.notifyDone(result);
    46     }, 0);
    47 }
    48 </div>
    49 
    5034<div id="output">
    5135</div>
  • trunk/LayoutTests/inspector/console-tests.html

    r49762 r50574  
    2626        notifyDone();
    2727    }
    28     evaluateInWebInspector("dumpMessages()", callback);
     28    evaluateInWebInspector("dumpConsoleMessages", callback);
    2929}
    3030
     
    3737</p>
    3838
    39 <div id="frontend-script" style="display:none">
    40 function dumpMessages()
    41 {
    42     var result = [];
    43     var messages = WebInspector.console.messages;
    44     for (var i = 0; i < messages.length; ++i) {
    45         var element = messages[i].toMessageElement();
    46         result.push({ text: element.textContent.replace(/\u200b/g, ""), clazz: element.getAttribute("class")});
    47     }
    48     return result;
    49 }
    50 </div>
    51 
    5239<div id="output">
    5340</div>
  • trunk/LayoutTests/inspector/elements-panel-structure-expected.txt

    r49629 r50574  
    55<head>
    66<body onload="onload()">
     7<p>Tests that elements panel shows dom tree structure.
     8</p>
     9<div id="frontend-script" style="display:none">
     10<pre id="output">
     11</body>
    712</html>
  • trunk/LayoutTests/inspector/elements-panel-structure.html

    r49629 r50574  
    99    {
    1010        var output = document.getElementById("output");
    11         output.textContent = result.replace(/\u200b/g, "").replace(/\n/g, "").replace(/<p>.*<\/body>/g, "").replace(/</g, "\n<");
     11        output.textContent = result.replace(/\u200b/g, "").replace(/\n/g, "").replace(/</g, "\n<");
    1212        notifyDone();
    1313    }
    14     evaluateInWebInspector("WebInspector.panels.elements.treeOutline.element.textContent", callback);
     14    evaluateInWebInspector("dumpElements", callback);
    1515}
    1616
     
    2424
    2525<div id="frontend-script" style="display:none">
     26function dumpElements(testController)
     27{
     28    testController.waitUntilDone();
     29    expandDOMSubtree(WebInspector.domAgent.document);
     30    testController.runAfterPendingDispatches(function() {
     31        testController.notifyDone(WebInspector.panels.elements.treeOutline.element.textContent);
     32    });
     33}
    2634</div>
    2735
  • trunk/LayoutTests/inspector/evaluate-in-frontend.js

    r50168 r50574  
    2222    if (ignoreLoad)
    2323        return;
    24     var callId = lastCallId++;
    25     setTimeout(function() {
    26         if (window.layoutTestController)
    27             layoutTestController.evaluateInWebInspector(callId, document.getElementById("frontend-script").textContent);
    28         doit();
    29     }, 0);
     24
     25    var toInject = expandDOMSubtree.toString() + "\n" + dumpConsoleMessages.toString();
     26    if (document.getElementById("frontend-script"))
     27        toInject += "\n" + document.getElementById("frontend-script").textContent;
     28    evaluateInWebInspector(toInject, doit);
    3029
    3130    // Make sure web inspector window is closed before the test is interrupted.
     
    7372    }
    7473};
     74
     75// Injected utility functions.
     76
     77function expandDOMSubtree(node)
     78{
     79    function processChildren(children)
     80    {
     81       for (var i = 0; children && i < children.length; ++i)
     82           expandDOMSubtree(children[i]);
     83    }
     84    WebInspector.domAgent.getChildNodesAsync(node, processChildren);
     85}
     86
     87function dumpConsoleMessages()
     88{
     89    var result = [];
     90    var messages = WebInspector.console.messages;
     91    for (var i = 0; i < messages.length; ++i) {
     92        var element = messages[i].toMessageElement();
     93        result.push({ text: element.textContent.replace(/\u200b/g, ""), clazz: element.getAttribute("class")});
     94    }
     95    return result;
     96}
  • trunk/LayoutTests/platform/qt/Skipped

    r50511 r50574  
    119119inspector/css-syntax-highlight.html
    120120inspector/javascript-syntax-highlight.html
     121inspector/styles-iframe.html
    121122inspector/timeline-trivial.html
    122123inspector/uncaught-dom1-exception.html
  • trunk/WebCore/ChangeLog

    r50573 r50574  
     12009-11-05  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Timothy Hatcher.
     4
     5        REGRESSION: Web Inspector doesn't show CSS rules properly for iframes
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=30884
     8
     9        Test: inspector/styles-iframe.html
     10
     11        * inspector/front-end/DOMAgent.js:
     12        (WebInspector.DOMNode):
     13        * inspector/front-end/InjectedScript.js:
     14        (InjectedScript.getStyles):
     15        (InjectedScript.getComputedStyle):
     16        (InjectedScript.addStyleSelector):
     17        * inspector/front-end/TestController.js:
     18        (WebInspector.TestController.prototype.notifyDone):
     19        (WebInspector.TestController.prototype.runAfterPendingDispatches):
     20        (WebInspector.evaluateForTestInFrontend.invokeMethod):
     21        (WebInspector.evaluateForTestInFrontend):
     22
    1232009-11-05  Vitaly Repeshko  <vitalyr@chromium.org>
    224
  • trunk/WebCore/inspector/InspectorController.cpp

    r50515 r50574  
    771771        // resources are cleared so that it has a chance to unbind them.
    772772        resetScriptObjects();
     773
    773774#if ENABLE(DATABASE)
    774775        m_databaseResources.clear();
  • trunk/WebCore/inspector/front-end/DOMAgent.js

    r49263 r50574  
    6262
    6363    if (this.nodeType == Node.ELEMENT_NODE) {
    64         if (this.nodeName == "HTML")
     64        // HTML and BODY from internal iframes should not overwrite top-level ones.
     65        if (!this.ownerDocument.documentElement && this.nodeName === "HTML")
    6566            this.ownerDocument.documentElement = this;
    66         if (this.nodeName == "BODY")
     67        if (!this.ownerDocument.body && this.nodeName === "BODY")
    6768            this.ownerDocument.body = this;
    6869    }
  • trunk/WebCore/inspector/front-end/InjectedScript.js

    r50453 r50574  
    6060    if (!node)
    6161        return false;
    62     var matchedRules = InjectedScript._window().getMatchedCSSRules(node, "", authorOnly);
     62    var defaultView = node.ownerDocument.defaultView;
     63    var matchedRules = defaultView.getMatchedCSSRules(node, "", authorOnly);
    6364    var matchedCSSRules = [];
    6465    for (var i = 0; matchedRules && i < matchedRules.length; ++i)
     
    7374    var result = {};
    7475    result.inlineStyle = InjectedScript._serializeStyle(node.style, true);
    75     result.computedStyle = InjectedScript._serializeStyle(InjectedScript._window().getComputedStyle(node));
     76    result.computedStyle = InjectedScript._serializeStyle(defaultView.getComputedStyle(node));
    7677    result.matchedCSSRules = matchedCSSRules;
    7778    result.styleAttributes = styleAttributes;
     
    8485    if (!node)
    8586        return false;
    86     return InjectedScript._serializeStyle(InjectedScript._window().getComputedStyle(node));
     87    return InjectedScript._serializeStyle(node.ownerDocument.defaultView.getComputedStyle(node));
    8788}
    8889
     
    231232InjectedScript.addStyleSelector = function(newContent, selectedNodeId)
    232233{
    233     var stylesheet = InjectedScript.stylesheet;
     234    var selectedNode = InjectedScript._nodeForId(selectedNodeId);
     235    if (!selectedNode)
     236        return false;
     237    var ownerDocument = selectedNode.ownerDocument;
     238
     239    var stylesheet = ownerDocument.__stylesheet;
    234240    if (!stylesheet) {
    235         var inspectedDocument = InjectedScript._window().document;
    236         var head = inspectedDocument.getElementsByTagName("head")[0];
    237         var styleElement = inspectedDocument.createElement("style");
     241        var head = ownerDocument.getElementsByTagName("head")[0];
     242        var styleElement = ownerDocument.createElement("style");
    238243        styleElement.type = "text/css";
    239244        head.appendChild(styleElement);
    240         stylesheet = inspectedDocument.styleSheets[inspectedDocument.styleSheets.length - 1];
    241         InjectedScript.stylesheet = stylesheet;
     245        stylesheet = ownerDocument.styleSheets[ownerDocument.styleSheets.length - 1];
     246        ownerDocument.__stylesheet = stylesheet;
    242247    }
    243248
     
    249254    }
    250255
    251     var selectedNode = InjectedScript._nodeForId(selectedNodeId);
    252256    var rule = stylesheet.cssRules[stylesheet.cssRules.length - 1];
    253257    rule.__isViaInspector = true;
  • trunk/WebCore/inspector/front-end/TestController.js

    r50199 r50574  
    4343    notifyDone: function(result)
    4444    {
    45         var message = typeof result === "undefined" ? "<undefined>" : JSON.stringify(result);
     45        var message = typeof result === "undefined" ? "\"<undefined>\"" : JSON.stringify(result);
    4646        InspectorController.didEvaluateForTestInFrontend(this._callId, message);
    4747    },
     
    5353            return;
    5454        }
    55 
    5655        setTimeout(this.runAfterPendingDispatches.bind(this), 0, callback);
    5756    }
     
    6160{
    6261    var controller = new WebInspector.TestController(callId);
    63     try {
    64         var result;
    65         if (window[script] && typeof window[script] === "function")
    66             result = window[script].call(this, controller);
    67         else
    68             result = window.eval(script);
     62    function invokeMethod()
     63    {
     64        try {
     65            var result;
     66            if (window[script] && typeof window[script] === "function")
     67                result = window[script].call(WebInspector, controller);
     68            else
     69                result = window.eval(script);
    6970
    70         if (!controller._waitUntilDone)
    71             controller.notifyDone(result);
    72     } catch (e) {
    73         controller.notifyDone(e.toString());
     71            if (!controller._waitUntilDone)
     72                controller.notifyDone(result);
     73        } catch (e) {
     74            controller.notifyDone(e.toString());
     75        }
    7476    }
     77    controller.runAfterPendingDispatches(invokeMethod);
    7578}
Note: See TracChangeset for help on using the changeset viewer.