| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2009, 2010 Google Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Joseph Pecoraro | 3 * Copyright (C) 2009 Joseph Pecoraro |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
| 7 * met: | 7 * met: |
| 8 * | 8 * |
| 9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 WebInspector.DOMNode.PseudoElementNames = { | 113 WebInspector.DOMNode.PseudoElementNames = { |
| 114 Before: "before", | 114 Before: "before", |
| 115 After: "after" | 115 After: "after" |
| 116 } | 116 } |
| 117 | 117 |
| 118 WebInspector.DOMNode.ShadowRootTypes = { | 118 WebInspector.DOMNode.ShadowRootTypes = { |
| 119 UserAgent: "user-agent", | 119 UserAgent: "user-agent", |
| 120 Author: "author" | 120 Author: "author" |
| 121 } | 121 } |
| 122 | 122 |
| 123 /** | |
| 124 * @constructor | |
| 125 * @param {string} value | |
| 126 * @param {boolean} optimized | |
| 127 */ | |
| 128 WebInspector.DOMNode.XPathStep = function(value, optimized) | |
| 129 { | |
| 130 this.value = value; | |
| 131 this.optimized = optimized; | |
| 132 } | |
| 133 | |
| 134 WebInspector.DOMNode.XPathStep.prototype = { | |
| 135 toString: function() | |
| 136 { | |
| 137 return this.value; | |
| 138 } | |
| 139 } | |
| 140 | |
| 141 WebInspector.DOMNode.prototype = { | 123 WebInspector.DOMNode.prototype = { |
| 142 /** | 124 /** |
| 143 * @return {Array.<WebInspector.DOMNode>} | 125 * @return {Array.<WebInspector.DOMNode>} |
| 144 */ | 126 */ |
| 145 children: function() | 127 children: function() |
| 146 { | 128 { |
| 147 return this._children ? this._children.slice() : null; | 129 return this._children ? this._children.slice() : null; |
| 148 }, | 130 }, |
| 149 | 131 |
| 150 /** | 132 /** |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 421 { | 403 { |
| 422 function copy(error, text) | 404 function copy(error, text) |
| 423 { | 405 { |
| 424 if (!error) | 406 if (!error) |
| 425 InspectorFrontendHost.copyText(text); | 407 InspectorFrontendHost.copyText(text); |
| 426 } | 408 } |
| 427 DOMAgent.getOuterHTML(this.id, copy); | 409 DOMAgent.getOuterHTML(this.id, copy); |
| 428 }, | 410 }, |
| 429 | 411 |
| 430 /** | 412 /** |
| 431 * @param {boolean} optimized | |
| 432 */ | |
| 433 copyXPath: function(optimized) | |
| 434 { | |
| 435 InspectorFrontendHost.copyText(this.xPath(optimized)); | |
| 436 }, | |
| 437 | |
| 438 /** | |
| 439 * @param {string} objectGroupId | 413 * @param {string} objectGroupId |
| 440 * @param {function(?Protocol.Error)=} callback | 414 * @param {function(?Protocol.Error)=} callback |
| 441 */ | 415 */ |
| 442 eventListeners: function(objectGroupId, callback) | 416 eventListeners: function(objectGroupId, callback) |
| 443 { | 417 { |
| 444 DOMAgent.getEventListenersForNode(this.id, objectGroupId, callback); | 418 DOMAgent.getEventListenersForNode(this.id, objectGroupId, callback); |
| 445 }, | 419 }, |
| 446 | 420 |
| 447 /** | 421 /** |
| 448 * @return {string} | 422 * @return {string} |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 }, | 622 }, |
| 649 | 623 |
| 650 /** | 624 /** |
| 651 * @return {boolean} | 625 * @return {boolean} |
| 652 */ | 626 */ |
| 653 isXMLNode: function() | 627 isXMLNode: function() |
| 654 { | 628 { |
| 655 return !!this.ownerDocument && !!this.ownerDocument.xmlVersion; | 629 return !!this.ownerDocument && !!this.ownerDocument.xmlVersion; |
| 656 }, | 630 }, |
| 657 | 631 |
| 658 /** | |
| 659 * @param {boolean} optimized | |
| 660 * @return {string} | |
| 661 */ | |
| 662 xPath: function(optimized) | |
| 663 { | |
| 664 if (this._nodeType === Node.DOCUMENT_NODE) | |
| 665 return "/"; | |
| 666 | |
| 667 var steps = []; | |
| 668 var contextNode = this; | |
| 669 while (contextNode) { | |
| 670 var step = contextNode._xPathValue(optimized); | |
| 671 if (!step) | |
| 672 break; // Error - bail out early. | |
| 673 steps.push(step); | |
| 674 if (step.optimized) | |
| 675 break; | |
| 676 contextNode = contextNode.parentNode; | |
| 677 } | |
| 678 | |
| 679 steps.reverse(); | |
| 680 return (steps.length && steps[0].optimized ? "" : "/") + steps.join("/")
; | |
| 681 }, | |
| 682 | |
| 683 /** | |
| 684 * @param {boolean} optimized | |
| 685 * @return {WebInspector.DOMNode.XPathStep} | |
| 686 */ | |
| 687 _xPathValue: function(optimized) | |
| 688 { | |
| 689 var ownValue; | |
| 690 var ownIndex = this._xPathIndex(); | |
| 691 if (ownIndex === -1) | |
| 692 return null; // Error. | |
| 693 | |
| 694 switch (this._nodeType) { | |
| 695 case Node.ELEMENT_NODE: | |
| 696 if (optimized && this.getAttribute("id")) | |
| 697 return new WebInspector.DOMNode.XPathStep("//*[@id=\"" + this.ge
tAttribute("id") + "\"]", true); | |
| 698 ownValue = this._localName; | |
| 699 break; | |
| 700 case Node.ATTRIBUTE_NODE: | |
| 701 ownValue = "@" + this._nodeName; | |
| 702 break; | |
| 703 case Node.TEXT_NODE: | |
| 704 case Node.CDATA_SECTION_NODE: | |
| 705 ownValue = "text()"; | |
| 706 break; | |
| 707 case Node.PROCESSING_INSTRUCTION_NODE: | |
| 708 ownValue = "processing-instruction()"; | |
| 709 break; | |
| 710 case Node.COMMENT_NODE: | |
| 711 ownValue = "comment()"; | |
| 712 break; | |
| 713 case Node.DOCUMENT_NODE: | |
| 714 ownValue = ""; | |
| 715 break; | |
| 716 default: | |
| 717 ownValue = ""; | |
| 718 break; | |
| 719 } | |
| 720 | |
| 721 if (ownIndex > 0) | |
| 722 ownValue += "[" + ownIndex + "]"; | |
| 723 | |
| 724 return new WebInspector.DOMNode.XPathStep(ownValue, this._nodeType === N
ode.DOCUMENT_NODE); | |
| 725 }, | |
| 726 | |
| 727 /** | |
| 728 * @return {number} | |
| 729 */ | |
| 730 _xPathIndex: function() | |
| 731 { | |
| 732 // Returns -1 in case of error, 0 if no siblings matching the same expre
ssion, <XPath index among the same expression-matching sibling nodes> otherwise. | |
| 733 function areNodesSimilar(left, right) | |
| 734 { | |
| 735 if (left === right) | |
| 736 return true; | |
| 737 | |
| 738 if (left._nodeType === Node.ELEMENT_NODE && right._nodeType === Node
.ELEMENT_NODE) | |
| 739 return left._localName === right._localName; | |
| 740 | |
| 741 if (left._nodeType === right._nodeType) | |
| 742 return true; | |
| 743 | |
| 744 // XPath treats CDATA as text nodes. | |
| 745 var leftType = left._nodeType === Node.CDATA_SECTION_NODE ? Node.TEX
T_NODE : left._nodeType; | |
| 746 var rightType = right._nodeType === Node.CDATA_SECTION_NODE ? Node.T
EXT_NODE : right._nodeType; | |
| 747 return leftType === rightType; | |
| 748 } | |
| 749 | |
| 750 var siblings = this.parentNode ? this.parentNode._children : null; | |
| 751 if (!siblings) | |
| 752 return 0; // Root node - no siblings. | |
| 753 var hasSameNamedElements; | |
| 754 for (var i = 0; i < siblings.length; ++i) { | |
| 755 if (areNodesSimilar(this, siblings[i]) && siblings[i] !== this) { | |
| 756 hasSameNamedElements = true; | |
| 757 break; | |
| 758 } | |
| 759 } | |
| 760 if (!hasSameNamedElements) | |
| 761 return 0; | |
| 762 var ownIndex = 1; // XPath indices start with 1. | |
| 763 for (var i = 0; i < siblings.length; ++i) { | |
| 764 if (areNodesSimilar(this, siblings[i])) { | |
| 765 if (siblings[i] === this) | |
| 766 return ownIndex; | |
| 767 ++ownIndex; | |
| 768 } | |
| 769 } | |
| 770 return -1; // An error occurred: |this| not found in parent's children. | |
| 771 }, | |
| 772 | |
| 773 _updateChildUserPropertyCountsOnRemoval: function(parentNode) | 632 _updateChildUserPropertyCountsOnRemoval: function(parentNode) |
| 774 { | 633 { |
| 775 var result = {}; | 634 var result = {}; |
| 776 if (this._userProperties) { | 635 if (this._userProperties) { |
| 777 for (var name in this._userProperties) | 636 for (var name in this._userProperties) |
| 778 result[name] = (result[name] || 0) + 1; | 637 result[name] = (result[name] || 0) + 1; |
| 779 } | 638 } |
| 780 | 639 |
| 781 if (this._descendantUserPropertyCounters) { | 640 if (this._descendantUserPropertyCounters) { |
| 782 for (var name in this._descendantUserPropertyCounters) { | 641 for (var name in this._descendantUserPropertyCounters) { |
| (...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1723 setInspectModeEnabled: function(enabled, inspectShadowDOM, config, callback) | 1582 setInspectModeEnabled: function(enabled, inspectShadowDOM, config, callback) |
| 1724 { | 1583 { |
| 1725 DOMAgent.setInspectModeEnabled(enabled, inspectShadowDOM, config, callba
ck); | 1584 DOMAgent.setInspectModeEnabled(enabled, inspectShadowDOM, config, callba
ck); |
| 1726 } | 1585 } |
| 1727 } | 1586 } |
| 1728 | 1587 |
| 1729 /** | 1588 /** |
| 1730 * @type {?WebInspector.DOMAgent} | 1589 * @type {?WebInspector.DOMAgent} |
| 1731 */ | 1590 */ |
| 1732 WebInspector.domAgent = null; | 1591 WebInspector.domAgent = null; |
| OLD | NEW |