CommandLineAPIModuleSource.js   [plain text]


/*
 * Copyright (C) 2007 Apple Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1.  Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 * 2.  Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 * 3.  Neither the name of Apple Inc. ("Apple") nor the names of
 *     its contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

//# sourceURL=__InjectedScript_CommandLineAPIModuleSource.js

(function (InjectedScriptHost, inspectedGlobalObject, injectedScriptId, injectedScript, {RemoteObject, CommandLineAPI}, CommandLineAPIHost) {

// FIXME: <https://webkit.org/b/152294> Web Inspector: Parse InjectedScriptSource as a built-in to get guaranteed non-user-overridden built-ins

injectedScript._inspectObject = function(object) {
    if (arguments.length === 0)
        return;

    let objectId = RemoteObject.create(object);
    let hints = {};

    switch (RemoteObject.describe(object)) {
    case "Database":
        var databaseId = CommandLineAPIHost.databaseId(object);
        if (databaseId)
            hints.databaseId = databaseId;
        break;
    case "Storage":
        var storageId = CommandLineAPIHost.storageId(object);
        if (storageId)
            hints.domStorageId = InjectedScriptHost.evaluate("(" + storageId + ")");
        break;
    }

    CommandLineAPIHost.inspect(objectId, hints);
};

CommandLineAPI.getters["0"] = function() {
    return CommandLineAPIHost.inspectedObject();
};

CommandLineAPI.methods["copy"] = function(object) {
    let string = null;

    let subtype = RemoteObject.subtype(object);
    if (subtype === "node")
        string = object.outerHTML;
    else if (subtype === "regexp")
        string = "" + object;
    else if (injectedScript.isPrimitiveValue(object))
        string = "" + object;
    else if (typeof object === "symbol")
        string = inspectedGlobalObject.String(object);
    else if (typeof object === "function")
        string = "" + object;
    else {
        try {
            string = inspectedGlobalObject.JSON.stringify(object, null, "  ");
        } catch {
            string = "" + object;
        }
    }

    CommandLineAPIHost.copyText(string);
};

CommandLineAPI.methods["getEventListeners"] = function(target) {
    return CommandLineAPIHost.getEventListeners(target);
};

function normalizeEventTypes(types) {
    if (types === undefined)
        types = ["mouse", "key", "touch", "control", "abort", "blur", "change", "devicemotion", "deviceorientation", "error", "focus", "load", "reset", "resize", "scroll", "search", "select", "submit", "unload"];
    else if (typeof types === "string")
        types = [types];

    let result = [];
    for (let i = 0; i < types.length; i++) {
        if (types[i] === "mouse")
            result.push("click", "dblclick", "mousedown", "mousemove", "mouseout", "mouseover", "mouseup", "mousewheel");
        else if (types[i] === "key")
            result.push("keydown", "keypress", "keyup", "textInput");
        else if (types[i] === "touch")
            result.push("touchcancel", "touchend", "touchmove", "touchstart");
        else if (types[i] === "control")
            result.push("blur", "change", "focus", "reset", "resize", "scroll", "select", "submit", "zoom");
        else
            result.push(types[i]);
    }
    return result;
}

function logEvent(event)
{
    inspectedGlobalObject.console.log(event.type, event);
}

CommandLineAPI.methods["monitorEvents"] = function(object, types) {
    if (!object || !object.addEventListener || !object.removeEventListener)
        return;
    types = normalizeEventTypes(types);
    for (let i = 0; i < types.length; ++i) {
        object.removeEventListener(types[i], logEvent, false);
        object.addEventListener(types[i], logEvent, false);
    }
};

CommandLineAPI.methods["unmonitorEvents"] = function(object, types) {
    if (!object || !object.addEventListener || !object.removeEventListener)
        return;
    types = normalizeEventTypes(types);
    for (let i = 0; i < types.length; ++i)
        object.removeEventListener(types[i], logEvent, false);
};

if (inspectedGlobalObject.document && inspectedGlobalObject.Node) {
    function canQuerySelectorOnNode(node) {
        return node && InjectedScriptHost.subtype(node) === "node" && (node.nodeType === inspectedGlobalObject.Node.ELEMENT_NODE || node.nodeType === inspectedGlobalObject.Node.DOCUMENT_NODE || node.nodeType === inspectedGlobalObject.Node.DOCUMENT_FRAGMENT_NODE);
    }

    CommandLineAPI.methods["$"] = function(selector, start) {
        if (canQuerySelectorOnNode(start))
            return start.querySelector(selector);

        let result = inspectedGlobalObject.document.querySelector(selector);
        if (result)
            return result;

        if (selector && selector[0] !== "#") {
            result = inspectedGlobalObject.document.getElementById(selector);
            if (result) {
                inspectedGlobalObject.console.warn("The console function $() has changed from $=getElementById(id) to $=querySelector(selector). You might try $(\"#%s\")", selector);
                return null;
            }
        }

        return result;
    };

    CommandLineAPI.methods["$$"] = function(selector, start) {
        if (canQuerySelectorOnNode(start))
            return inspectedGlobalObject.Array.from(start.querySelectorAll(selector));
        return inspectedGlobalObject.Array.from(inspectedGlobalObject.document.querySelectorAll(selector));
    };

    CommandLineAPI.methods["$x"] = function(xpath, context) {
        let doc = (context && context.ownerDocument) || inspectedGlobalObject.document;
        let result = doc.evaluate(xpath, context || doc, null, inspectedGlobalObject.XPathResult.ANY_TYPE, null);
        switch (result.resultType) {
        case inspectedGlobalObject.XPathResult.NUMBER_TYPE:
            return result.numberValue;
        case inspectedGlobalObject.XPathResult.STRING_TYPE:
            return result.stringValue;
        case inspectedGlobalObject.XPathResult.BOOLEAN_TYPE:
            return result.booleanValue;
        }

        let nodes = [];
        let node = null;
        while (node = result.iterateNext())
            nodes.push(node);
        return nodes;
    };
}

for (let name in CommandLineAPI.methods)
    CommandLineAPI.methods[name].toString = function() { return "function " + name + "() { [Command Line API] }"; };

})