⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elementstreeoutline.js

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 JS
📖 第 1 页 / 共 2 页
字号:
/* * Copyright (C) 2007, 2008 Apple Inc.  All rights reserved. * Copyright (C) 2008 Matt Lilek <webkit@mattlilek.com> * * 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 Computer, 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. */WebInspector.ElementsTreeOutline = function() {    this.element = document.createElement("ol");    this.element.addEventListener("mousedown", this._onmousedown.bind(this), false);    this.element.addEventListener("dblclick", this._ondblclick.bind(this), false);    this.element.addEventListener("mousemove", this._onmousemove.bind(this), false);    this.element.addEventListener("mouseout", this._onmouseout.bind(this), false);    TreeOutline.call(this, this.element);    this.includeRootDOMNode = true;    this.selectEnabled = false;    this.rootDOMNode = null;    this.focusedDOMNode = null;}WebInspector.ElementsTreeOutline.prototype = {    get rootDOMNode()    {        return this._rootDOMNode;    },    set rootDOMNode(x)    {        if (objectsAreSame(this._rootDOMNode, x))            return;        this._rootDOMNode = x;        this.update();    },    get focusedDOMNode()    {        return this._focusedDOMNode;    },    set focusedDOMNode(x)    {        if (objectsAreSame(this._focusedDOMNode, x)) {            this.revealAndSelectNode(x);            return;        }        this._focusedDOMNode = x;        this.revealAndSelectNode(x);        // The revealAndSelectNode() method might find a different element if there is inlined text,        // and the select() call would change the focusedDOMNode and reenter this setter. So to        // avoid calling focusedNodeChanged() twice, first check if _focusedDOMNode is the same        // node as the one passed in.        if (objectsAreSame(this._focusedDOMNode, x)) {            this.focusedNodeChanged();            if (x && !this.suppressSelectHighlight) {                InspectorController.highlightDOMNode(x);                if ("_restorePreviousHighlightNodeTimeout" in this)                    clearTimeout(this._restorePreviousHighlightNodeTimeout);                function restoreHighlightToHoveredNode()                {                    var hoveredNode = WebInspector.hoveredDOMNode;                    if (hoveredNode)                        InspectorController.highlightDOMNode(hoveredNode);                    else                        InspectorController.hideDOMNodeHighlight();                }                this._restorePreviousHighlightNodeTimeout = setTimeout(restoreHighlightToHoveredNode, 2000);            }        }    },    update: function()    {        this.removeChildren();        if (!this.rootDOMNode)            return;        var treeElement;        if (this.includeRootDOMNode) {            treeElement = new WebInspector.ElementsTreeElement(this.rootDOMNode);            treeElement.selectable = this.selectEnabled;            this.appendChild(treeElement);        } else {            // FIXME: this could use findTreeElement to reuse a tree element if it already exists            var node = (Preferences.ignoreWhitespace ? firstChildSkippingWhitespace.call(this.rootDOMNode) : this.rootDOMNode.firstChild);            while (node) {                treeElement = new WebInspector.ElementsTreeElement(node);                treeElement.selectable = this.selectEnabled;                this.appendChild(treeElement);                node = Preferences.ignoreWhitespace ? nextSiblingSkippingWhitespace.call(node) : node.nextSibling;            }        }        this.updateSelection();    },    updateSelection: function()    {        if (!this.selectedTreeElement)            return;        var element = this.treeOutline.selectedTreeElement;        element.updateSelection();    },    focusedNodeChanged: function(forceUpdate) {},    findTreeElement: function(node, isAncestor, getParent, equal)    {        if (typeof isAncestor === "undefined")            isAncestor = isAncestorIncludingParentFrames;        if (typeof getParent === "undefined")            getParent = parentNodeOrFrameElement;        if (typeof equal === "undefined")            equal = objectsAreSame;        var treeElement = TreeOutline.prototype.findTreeElement.call(this, node, isAncestor, getParent, equal);        if (!treeElement && node.nodeType === Node.TEXT_NODE) {            // The text node might have been inlined if it was short, so try to find the parent element.            treeElement = TreeOutline.prototype.findTreeElement.call(this, node.parentNode, isAncestor, getParent, equal);        }        return treeElement;    },    revealAndSelectNode: function(node)    {        if (!node)            return;        var treeElement = this.findTreeElement(node);        if (!treeElement)            return;        treeElement.reveal();        treeElement.select();    },    _treeElementFromEvent: function(event)    {        var root = this.element;        // We choose this X coordinate based on the knowledge that our list        // items extend nearly to the right edge of the outer <ol>.        var x = root.totalOffsetLeft + root.offsetWidth - 20;        var y = event.pageY;        // Our list items have 1-pixel cracks between them vertically. We avoid        // the cracks by checking slightly above and slightly below the mouse        // and seeing if we hit the same element each time.        var elementUnderMouse = this.treeElementFromPoint(x, y);        var elementAboveMouse = this.treeElementFromPoint(x, y - 2);        var element;        if (elementUnderMouse === elementAboveMouse)            element = elementUnderMouse;        else            element = this.treeElementFromPoint(x, y + 2);        return element;    },    _ondblclick: function(event)    {        var element = this._treeElementFromEvent(event);        if (!element || !element.ondblclick)            return;        element.ondblclick(element, event);    },    _onmousedown: function(event)    {        var element = this._treeElementFromEvent(event);        if (!element || element.isEventWithinDisclosureTriangle(event))            return;        element.select();    },    _onmousemove: function(event)    {        if (this._previousHoveredElement) {            this._previousHoveredElement.hovered = false;            delete this._previousHoveredElement;        }        var element = this._treeElementFromEvent(event);        if (element && !element.elementCloseTag) {            element.hovered = true;            this._previousHoveredElement = element;        }        WebInspector.hoveredDOMNode = (element && !element.elementCloseTag ? element.representedObject : null);    },    _onmouseout: function(event)    {        var nodeUnderMouse = document.elementFromPoint(event.pageX, event.pageY);        if (nodeUnderMouse.isDescendant(this.element))            return;        if (this._previousHoveredElement) {            this._previousHoveredElement.hovered = false;            delete this._previousHoveredElement;        }        WebInspector.hoveredDOMNode = null;    }}WebInspector.ElementsTreeOutline.prototype.__proto__ = TreeOutline.prototype;WebInspector.ElementsTreeElement = function(node){    var hasChildren = node.contentDocument || (Preferences.ignoreWhitespace ? (firstChildSkippingWhitespace.call(node) ? true : false) : node.hasChildNodes());    var titleInfo = nodeTitleInfo.call(node, hasChildren, WebInspector.linkifyURL);    if (titleInfo.hasChildren)         this.whitespaceIgnored = Preferences.ignoreWhitespace;    // The title will be updated in onattach.    TreeElement.call(this, "", node, titleInfo.hasChildren);}WebInspector.ElementsTreeElement.prototype = {    get highlighted()    {        return this._highlighted;    },    set highlighted(x)    {        if (this._highlighted === x)            return;        this._highlighted = x;        if (this.listItemElement) {            if (x)                this.listItemElement.addStyleClass("highlighted");            else                this.listItemElement.removeStyleClass("highlighted");        }    },    get hovered()    {        return this._hovered;    },    set hovered(x)    {        if (this._hovered === x)            return;        this._hovered = x;        if (this.listItemElement) {            if (x) {                this.updateSelection();                this.listItemElement.addStyleClass("hovered");            } else                this.listItemElement.removeStyleClass("hovered");        }    },    updateSelection: function()    {        var listItemElement = this.listItemElement;        if (!listItemElement)            return;        if (document.body.offsetWidth <= 0) {            // The stylesheet hasn't loaded yet or the window is closed,            // so we can't calculate what is need. Return early.            return;        }        if (!this.selectionElement) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -