/node_modules/node-inspector/front-end/devtools.js
JavaScript | 18673 lines | 15945 code | 2253 blank | 475 comment | 1502 complexity | a4c4924773b2b5e2f953e62c60f1ad5e MD5 | raw file
Possible License(s): MIT, Apache-2.0, BSD-3-Clause
- String.prototype.hasSubstring = function(string, caseInsensitive)
- {
- if (!caseInsensitive)
- return this.indexOf(string) !== -1;
- return this.match(new RegExp(string.escapeForRegExp(), "i"));
- }
- String.prototype.findAll = function(string)
- {
- var matches = [];
- var i = this.indexOf(string);
- while (i !== -1) {
- matches.push(i);
- i = this.indexOf(string, i + string.length);
- }
- return matches;
- }
- String.prototype.lineEndings = function()
- {
- if (!this._lineEndings) {
- this._lineEndings = this.findAll("\n");
- this._lineEndings.push(this.length);
- }
- return this._lineEndings;
- }
- String.prototype.escapeCharacters = function(chars)
- {
- var foundChar = false;
- for (var i = 0; i < chars.length; ++i) {
- if (this.indexOf(chars.charAt(i)) !== -1) {
- foundChar = true;
- break;
- }
- }
- if (!foundChar)
- return this;
- var result = "";
- for (var i = 0; i < this.length; ++i) {
- if (chars.indexOf(this.charAt(i)) !== -1)
- result += "\\";
- result += this.charAt(i);
- }
- return result;
- }
- String.prototype.escapeForRegExp = function()
- {
- return this.escapeCharacters("^[]{}()\\.$*+?|");
- }
- String.prototype.escapeHTML = function()
- {
- return this.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
- }
- String.prototype.collapseWhitespace = function()
- {
- return this.replace(/[\s\xA0]+/g, " ");
- }
- String.prototype.trimMiddle = function(maxLength)
- {
- if (this.length <= maxLength)
- return this;
- var leftHalf = maxLength >> 1;
- var rightHalf = maxLength - leftHalf - 1;
- return this.substr(0, leftHalf) + "\u2026" + this.substr(this.length - rightHalf, rightHalf);
- }
- String.prototype.trimEnd = function(maxLength)
- {
- if (this.length <= maxLength)
- return this;
- return this.substr(0, maxLength - 1) + "\u2026";
- }
- String.prototype.trimURL = function(baseURLDomain)
- {
- var result = this.replace(/^(https|http|file):\/\//i, "");
- if (baseURLDomain)
- result = result.replace(new RegExp("^" + baseURLDomain.escapeForRegExp(), "i"), "");
- return result;
- }
- String.prototype.removeURLFragment = function()
- {
- var fragmentIndex = this.indexOf("#");
- if (fragmentIndex == -1)
- fragmentIndex = this.length;
- return this.substring(0, fragmentIndex);
- }
- String.prototype.startsWith = function(substring)
- {
- return !this.lastIndexOf(substring, 0);
- }
- String.prototype.endsWith = function(substring)
- {
- return this.indexOf(substring, this.length - substring.length) !== -1;
- }
- Number.constrain = function(num, min, max)
- {
- if (num < min)
- num = min;
- else if (num > max)
- num = max;
- return num;
- }
- Date.prototype.toISO8601Compact = function()
- {
- function leadZero(x)
- {
- return x > 9 ? '' + x : '0' + x
- }
- return this.getFullYear() +
- leadZero(this.getMonth() + 1) +
- leadZero(this.getDate()) + 'T' +
- leadZero(this.getHours()) +
- leadZero(this.getMinutes()) +
- leadZero(this.getSeconds());
- }
- Object.defineProperty(Array.prototype, "remove",
- {
- value: function(value, onlyFirst)
- {
- if (onlyFirst) {
- var index = this.indexOf(value);
- if (index !== -1)
- this.splice(index, 1);
- return;
- }
- var length = this.length;
- for (var i = 0; i < length; ++i) {
- if (this[i] === value)
- this.splice(i, 1);
- }
- }
- });
- Object.defineProperty(Array.prototype, "keySet",
- {
- value: function()
- {
- var keys = {};
- for (var i = 0; i < this.length; ++i)
- keys[this[i]] = true;
- return keys;
- }
- });
- Object.defineProperty(Array.prototype, "upperBound",
- {
- value: function(value)
- {
- var first = 0;
- var count = this.length;
- while (count > 0) {
- var step = count >> 1;
- var middle = first + step;
- if (value >= this[middle]) {
- first = middle + 1;
- count -= step + 1;
- } else
- count = step;
- }
- return first;
- }
- });
- Object.defineProperty(Uint32Array.prototype, "sort", {
- value: Array.prototype.sort
- });
- (function() {
- var partition = {
- value: function(comparator, left, right, pivotIndex)
- {
- function swap(array, i1, i2)
- {
- var temp = array[i1];
- array[i1] = array[i2];
- array[i2] = temp;
- }
- var pivotValue = this[pivotIndex];
- swap(this, right, pivotIndex);
- var storeIndex = left;
- for (var i = left; i < right; ++i) {
- if (comparator(this[i], pivotValue) < 0) {
- swap(this, storeIndex, i);
- ++storeIndex;
- }
- }
- swap(this, right, storeIndex);
- return storeIndex;
- }
- };
- Object.defineProperty(Array.prototype, "partition", partition);
- Object.defineProperty(Uint32Array.prototype, "partition", partition);
- var sortRange = {
- value: function(comparator, leftBound, rightBound, k)
- {
- function quickSortFirstK(array, comparator, left, right, k)
- {
- if (right <= left)
- return;
- var pivotIndex = Math.floor(Math.random() * (right - left)) + left;
- var pivotNewIndex = array.partition(comparator, left, right, pivotIndex);
- quickSortFirstK(array, comparator, left, pivotNewIndex - 1, k);
- if (pivotNewIndex < left + k - 1)
- quickSortFirstK(array, comparator, pivotNewIndex + 1, right, k);
- }
- if (leftBound === 0 && rightBound === (this.length - 1) && k === this.length)
- this.sort(comparator);
- else
- quickSortFirstK(this, comparator, leftBound, rightBound, k);
- return this;
- }
- }
- Object.defineProperty(Array.prototype, "sortRange", sortRange);
- Object.defineProperty(Uint32Array.prototype, "sortRange", sortRange);
- })();
- Object.defineProperty(Array.prototype, "qselect",
- {
- value: function(k, comparator)
- {
- if (k < 0 || k >= this.length)
- return;
- if (!comparator)
- comparator = function(a, b) { return a - b; }
- var low = 0;
- var high = this.length - 1;
- for (;;) {
- var pivotPosition = this.partition(comparator, low, high, Math.floor((high + low) / 2));
- if (pivotPosition === k)
- return this[k];
- else if (pivotPosition > k)
- high = pivotPosition - 1;
- else
- low = pivotPosition + 1;
- }
- }
- });
- function binarySearch(object, array, comparator)
- {
- var first = 0;
- var last = array.length - 1;
- while (first <= last) {
- var mid = (first + last) >> 1;
- var c = comparator(object, array[mid]);
- if (c > 0)
- first = mid + 1;
- else if (c < 0)
- last = mid - 1;
- else
- return mid;
- }
- return -(first + 1);
- }
- Object.defineProperty(Array.prototype, "binaryIndexOf",
- {
- value: function(value, comparator)
- {
- var result = binarySearch(value, this, comparator);
- return result >= 0 ? result : -1;
- }
- });
- function insertionIndexForObjectInListSortedByFunction(anObject, aList, aFunction)
- {
- var index = binarySearch(anObject, aList, aFunction);
- if (index < 0)
- return -index - 1;
- else {
- while (index > 0 && aFunction(anObject, aList[index - 1]) === 0)
- index--;
- return index;
- }
- }
- Array.diff = function(left, right)
- {
- var o = left;
- var n = right;
- var ns = {};
- var os = {};
- for (var i = 0; i < n.length; i++) {
- if (ns[n[i]] == null)
- ns[n[i]] = { rows: [], o: null };
- ns[n[i]].rows.push(i);
- }
- for (var i = 0; i < o.length; i++) {
- if (os[o[i]] == null)
- os[o[i]] = { rows: [], n: null };
- os[o[i]].rows.push(i);
- }
- for (var i in ns) {
- if (ns[i].rows.length == 1 && typeof(os[i]) != "undefined" && os[i].rows.length == 1) {
- n[ns[i].rows[0]] = { text: n[ns[i].rows[0]], row: os[i].rows[0] };
- o[os[i].rows[0]] = { text: o[os[i].rows[0]], row: ns[i].rows[0] };
- }
- }
- for (var i = 0; i < n.length - 1; i++) {
- if (n[i].text != null && n[i + 1].text == null && n[i].row + 1 < o.length && o[n[i].row + 1].text == null && n[i + 1] == o[n[i].row + 1]) {
- n[i + 1] = { text: n[i + 1], row: n[i].row + 1 };
- o[n[i].row + 1] = { text: o[n[i].row + 1], row: i + 1 };
- }
- }
- for (var i = n.length - 1; i > 0; i--) {
- if (n[i].text != null && n[i - 1].text == null && n[i].row > 0 && o[n[i].row - 1].text == null &&
- n[i - 1] == o[n[i].row - 1]) {
- n[i - 1] = { text: n[i - 1], row: n[i].row - 1 };
- o[n[i].row - 1] = { text: o[n[i].row - 1], row: i - 1 };
- }
- }
- return { left: o, right: n };
- }
- Array.convert = function(list)
- {
- return Array.prototype.slice.call(list);
- }
- String.sprintf = function(format, var_arg)
- {
- return String.vsprintf(format, Array.prototype.slice.call(arguments, 1));
- }
- String.tokenizeFormatString = function(format, formatters)
- {
- var tokens = [];
- var substitutionIndex = 0;
- function addStringToken(str)
- {
- tokens.push({ type: "string", value: str });
- }
- function addSpecifierToken(specifier, precision, substitutionIndex)
- {
- tokens.push({ type: "specifier", specifier: specifier, precision: precision, substitutionIndex: substitutionIndex });
- }
- function isDigit(c)
- {
- return !!/[0-9]/.exec(c);
- }
- var index = 0;
- for (var precentIndex = format.indexOf("%", index); precentIndex !== -1; precentIndex = format.indexOf("%", index)) {
- addStringToken(format.substring(index, precentIndex));
- index = precentIndex + 1;
- if (isDigit(format[index])) {
- var number = parseInt(format.substring(index), 10);
- while (isDigit(format[index]))
- ++index;
- if (number > 0 && format[index] === "$") {
- substitutionIndex = (number - 1);
- ++index;
- }
- }
- var precision = -1;
- if (format[index] === ".") {
- ++index;
- precision = parseInt(format.substring(index), 10);
- if (isNaN(precision))
- precision = 0;
- while (isDigit(format[index]))
- ++index;
- }
- if (!(format[index] in formatters)) {
- addStringToken(format.substring(precentIndex, index + 1));
- ++index;
- continue;
- }
- addSpecifierToken(format[index], precision, substitutionIndex);
- ++substitutionIndex;
- ++index;
- }
- addStringToken(format.substring(index));
- return tokens;
- }
- String.standardFormatters = {
- d: function(substitution)
- {
- return !isNaN(substitution) ? substitution : 0;
- },
- f: function(substitution, token)
- {
- if (substitution && token.precision > -1)
- substitution = substitution.toFixed(token.precision);
- return !isNaN(substitution) ? substitution : (token.precision > -1 ? Number(0).toFixed(token.precision) : 0);
- },
- s: function(substitution)
- {
- return substitution;
- }
- }
- String.vsprintf = function(format, substitutions)
- {
- return String.format(format, substitutions, String.standardFormatters, "", function(a, b) { return a + b; }).formattedResult;
- }
- String.format = function(format, substitutions, formatters, initialValue, append)
- {
- if (!format || !substitutions || !substitutions.length)
- return { formattedResult: append(initialValue, format), unusedSubstitutions: substitutions };
- function prettyFunctionName()
- {
- return "String.format(\"" + format + "\", \"" + substitutions.join("\", \"") + "\")";
- }
- function warn(msg)
- {
- console.warn(prettyFunctionName() + ": " + msg);
- }
- function error(msg)
- {
- console.error(prettyFunctionName() + ": " + msg);
- }
- var result = initialValue;
- var tokens = String.tokenizeFormatString(format, formatters);
- var usedSubstitutionIndexes = {};
- for (var i = 0; i < tokens.length; ++i) {
- var token = tokens[i];
- if (token.type === "string") {
- result = append(result, token.value);
- continue;
- }
- if (token.type !== "specifier") {
- error("Unknown token type \"" + token.type + "\" found.");
- continue;
- }
- if (token.substitutionIndex >= substitutions.length) {
- error("not enough substitution arguments. Had " + substitutions.length + " but needed " + (token.substitutionIndex + 1) + ", so substitution was skipped.");
- result = append(result, "%" + (token.precision > -1 ? token.precision : "") + token.specifier);
- continue;
- }
- usedSubstitutionIndexes[token.substitutionIndex] = true;
- if (!(token.specifier in formatters)) {
- warn("unsupported format character \u201C" + token.specifier + "\u201D. Treating as a string.");
- result = append(result, substitutions[token.substitutionIndex]);
- continue;
- }
- result = append(result, formatters[token.specifier](substitutions[token.substitutionIndex], token));
- }
- var unusedSubstitutions = [];
- for (var i = 0; i < substitutions.length; ++i) {
- if (i in usedSubstitutionIndexes)
- continue;
- unusedSubstitutions.push(substitutions[i]);
- }
- return { formattedResult: result, unusedSubstitutions: unusedSubstitutions };
- }
- function createSearchRegex(query, caseSensitive, isRegex)
- {
- var regexFlags = caseSensitive ? "g" : "gi";
- var regexObject;
- if (isRegex) {
- try {
- regexObject = new RegExp(query, regexFlags);
- } catch (e) {
- }
- }
- if (!regexObject)
- regexObject = createPlainTextSearchRegex(query, regexFlags);
- return regexObject;
- }
- function createPlainTextSearchRegex(query, flags)
- {
- var regexSpecialCharacters = "[](){}+-*.,?\\^$|";
- var regex = "";
- for (var i = 0; i < query.length; ++i) {
- var c = query.charAt(i);
- if (regexSpecialCharacters.indexOf(c) != -1)
- regex += "\\";
- regex += c;
- }
- return new RegExp(regex, flags || "");
- }
- function countRegexMatches(regex, content)
- {
- var text = content;
- var result = 0;
- var match;
- while (text && (match = regex.exec(text))) {
- if (match[0].length > 0)
- ++result;
- text = text.substring(match.index + 1);
- }
- return result;
- }
- function numberToStringWithSpacesPadding(value, symbolsCount)
- {
- var numberString = value.toString();
- var paddingLength = Math.max(0, symbolsCount - numberString.length);
- var paddingString = Array(paddingLength + 1).join("\u00a0");
- return paddingString + numberString;
- }
- function TextDiff()
- {
- this.added = [];
- this.removed = [];
- this.changed = [];
- }
- TextDiff.compute = function(baseContent, newContent)
- {
- var oldLines = baseContent.split(/\r?\n/);
- var newLines = newContent.split(/\r?\n/);
- var diff = Array.diff(oldLines, newLines);
- var diffData = new TextDiff();
- var offset = 0;
- var right = diff.right;
- for (var i = 0; i < right.length; ++i) {
- if (typeof right[i] === "string") {
- if (right.length > i + 1 && right[i + 1].row === i + 1 - offset)
- diffData.changed.push(i);
- else {
- diffData.added.push(i);
- offset++;
- }
- } else
- offset = i - right[i].row;
- }
- return diffData;
- }
- var Map = function()
- {
- this._map = {};
- }
- Map._lastObjectIdentifier = 0;
- Map.prototype = {
- put: function(key, value)
- {
- var objectIdentifier = key.__identifier;
- if (!objectIdentifier) {
- objectIdentifier = ++Map._lastObjectIdentifier;
- key.__identifier = objectIdentifier;
- }
- this._map[objectIdentifier] = value;
- },
- remove: function(key)
- {
- var result = this._map[key.__identifier];
- delete this._map[key.__identifier];
- return result;
- },
- values: function()
- {
- var result = [];
- for (var objectIdentifier in this._map)
- result.push(this._map[objectIdentifier]);
- return result;
- },
- get: function(key)
- {
- return this._map[key.__identifier];
- },
- clear: function()
- {
- this._map = {};
- }
- }
- Node.prototype.rangeOfWord = function(offset, stopCharacters, stayWithinNode, direction)
- {
- var startNode;
- var startOffset = 0;
- var endNode;
- var endOffset = 0;
- if (!stayWithinNode)
- stayWithinNode = this;
- if (!direction || direction === "backward" || direction === "both") {
- var node = this;
- while (node) {
- if (node === stayWithinNode) {
- if (!startNode)
- startNode = stayWithinNode;
- break;
- }
- if (node.nodeType === Node.TEXT_NODE) {
- var start = (node === this ? (offset - 1) : (node.nodeValue.length - 1));
- for (var i = start; i >= 0; --i) {
- if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
- startNode = node;
- startOffset = i + 1;
- break;
- }
- }
- }
- if (startNode)
- break;
- node = node.traversePreviousNode(stayWithinNode);
- }
- if (!startNode) {
- startNode = stayWithinNode;
- startOffset = 0;
- }
- } else {
- startNode = this;
- startOffset = offset;
- }
- if (!direction || direction === "forward" || direction === "both") {
- node = this;
- while (node) {
- if (node === stayWithinNode) {
- if (!endNode)
- endNode = stayWithinNode;
- break;
- }
- if (node.nodeType === Node.TEXT_NODE) {
- var start = (node === this ? offset : 0);
- for (var i = start; i < node.nodeValue.length; ++i) {
- if (stopCharacters.indexOf(node.nodeValue[i]) !== -1) {
- endNode = node;
- endOffset = i;
- break;
- }
- }
- }
- if (endNode)
- break;
- node = node.traverseNextNode(stayWithinNode);
- }
- if (!endNode) {
- endNode = stayWithinNode;
- endOffset = stayWithinNode.nodeType === Node.TEXT_NODE ? stayWithinNode.nodeValue.length : stayWithinNode.childNodes.length;
- }
- } else {
- endNode = this;
- endOffset = offset;
- }
- var result = this.ownerDocument.createRange();
- result.setStart(startNode, startOffset);
- result.setEnd(endNode, endOffset);
- return result;
- }
- Node.prototype.traverseNextTextNode = function(stayWithin)
- {
- var node = this.traverseNextNode(stayWithin);
- if (!node)
- return;
- while (node && node.nodeType !== Node.TEXT_NODE)
- node = node.traverseNextNode(stayWithin);
- return node;
- }
- Node.prototype.rangeBoundaryForOffset = function(offset)
- {
- var node = this.traverseNextTextNode(this);
- while (node && offset > node.nodeValue.length) {
- offset -= node.nodeValue.length;
- node = node.traverseNextTextNode(this);
- }
- if (!node)
- return { container: this, offset: 0 };
- return { container: node, offset: offset };
- }
- Element.prototype.removeStyleClass = function(className)
- {
- this.classList.remove(className);
- }
- Element.prototype.removeMatchingStyleClasses = function(classNameRegex)
- {
- var regex = new RegExp("(^|\\s+)" + classNameRegex + "($|\\s+)");
- if (regex.test(this.className))
- this.className = this.className.replace(regex, " ");
- }
- Element.prototype.addStyleClass = function(className)
- {
- this.classList.add(className);
- }
- Element.prototype.hasStyleClass = function(className)
- {
- return this.classList.contains(className);
- }
- Element.prototype.positionAt = function(x, y)
- {
- this.style.left = x + "px";
- this.style.top = y + "px";
- }
- Element.prototype.pruneEmptyTextNodes = function()
- {
- var sibling = this.firstChild;
- while (sibling) {
- var nextSibling = sibling.nextSibling;
- if (sibling.nodeType === this.TEXT_NODE && sibling.nodeValue === "")
- this.removeChild(sibling);
- sibling = nextSibling;
- }
- }
- Element.prototype.isScrolledToBottom = function()
- {
- return this.scrollTop + this.clientHeight === this.scrollHeight;
- }
- Node.prototype.enclosingNodeOrSelfWithNodeNameInArray = function(nameArray)
- {
- for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
- for (var i = 0; i < nameArray.length; ++i)
- if (node.nodeName.toLowerCase() === nameArray[i].toLowerCase())
- return node;
- return null;
- }
- Node.prototype.enclosingNodeOrSelfWithNodeName = function(nodeName)
- {
- return this.enclosingNodeOrSelfWithNodeNameInArray([nodeName]);
- }
- Node.prototype.enclosingNodeOrSelfWithClass = function(className)
- {
- for (var node = this; node && node !== this.ownerDocument; node = node.parentNode)
- if (node.nodeType === Node.ELEMENT_NODE && node.hasStyleClass(className))
- return node;
- return null;
- }
- Node.prototype.enclosingNodeWithClass = function(className)
- {
- if (!this.parentNode)
- return null;
- return this.parentNode.enclosingNodeOrSelfWithClass(className);
- }
- Element.prototype.query = function(query)
- {
- return this.ownerDocument.evaluate(query, this, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
- }
- Element.prototype.removeChildren = function()
- {
- if (this.firstChild)
- this.textContent = "";
- }
- Element.prototype.isInsertionCaretInside = function()
- {
- var selection = window.getSelection();
- if (!selection.rangeCount || !selection.isCollapsed)
- return false;
- var selectionRange = selection.getRangeAt(0);
- return selectionRange.startContainer.isSelfOrDescendant(this);
- }
- Element.prototype.createChild = function(elementName, className)
- {
- var element = this.ownerDocument.createElement(elementName);
- if (className)
- element.className = className;
- this.appendChild(element);
- return element;
- }
- DocumentFragment.prototype.createChild = Element.prototype.createChild;
- Element.prototype.totalOffsetLeft = function()
- {
- return this.totalOffset().left;
- }
- Element.prototype.totalOffsetTop = function()
- {
- return this.totalOffset().top;
- }
- Element.prototype.totalOffset = function()
- {
- var totalLeft = 0;
- var totalTop = 0;
- for (var element = this; element; element = element.offsetParent) {
- totalLeft += element.offsetLeft;
- totalTop += element.offsetTop;
- if (this !== element) {
- totalLeft += element.clientLeft - element.scrollLeft;
- totalTop += element.clientTop - element.scrollTop;
- }
- }
- return { left: totalLeft, top: totalTop };
- }
- Element.prototype.scrollOffset = function()
- {
- var curLeft = 0;
- var curTop = 0;
- for (var element = this; element; element = element.scrollParent) {
- curLeft += element.scrollLeft;
- curTop += element.scrollTop;
- }
- return { left: curLeft, top: curTop };
- }
- function AnchorBox(x, y, width, height)
- {
- this.x = x || 0;
- this.y = y || 0;
- this.width = width || 0;
- this.height = height || 0;
- }
- Element.prototype.offsetRelativeToWindow = function(targetWindow)
- {
- var elementOffset = new AnchorBox();
- var curElement = this;
- var curWindow = this.ownerDocument.defaultView;
- while (curWindow && curElement) {
- elementOffset.x += curElement.totalOffsetLeft();
- elementOffset.y += curElement.totalOffsetTop();
- if (curWindow === targetWindow)
- break;
- curElement = curWindow.frameElement;
- curWindow = curWindow.parent;
- }
- return elementOffset;
- }
- Element.prototype.boxInWindow = function(targetWindow)
- {
- targetWindow = targetWindow || this.ownerDocument.defaultView;
- var anchorBox = this.offsetRelativeToWindow(window);
- anchorBox.width = Math.min(this.offsetWidth, window.innerWidth - anchorBox.x);
- anchorBox.height = Math.min(this.offsetHeight, window.innerHeight - anchorBox.y);
- return anchorBox;
- }
- Element.prototype.setTextAndTitle = function(text)
- {
- this.textContent = text;
- this.title = text;
- }
- KeyboardEvent.prototype.__defineGetter__("data", function()
- {
- switch (this.type) {
- case "keypress":
- if (!this.ctrlKey && !this.metaKey)
- return String.fromCharCode(this.charCode);
- else
- return "";
- case "keydown":
- case "keyup":
- if (!this.ctrlKey && !this.metaKey && !this.altKey)
- return String.fromCharCode(this.which);
- else
- return "";
- }
- });
- Event.prototype.consume = function(preventDefault)
- {
- this.stopImmediatePropagation();
- if (preventDefault)
- this.preventDefault();
- this.handled = true;
- }
- Text.prototype.select = function(start, end)
- {
- start = start || 0;
- end = end || this.textContent.length;
- if (start < 0)
- start = end + start;
- var selection = this.ownerDocument.defaultView.getSelection();
- selection.removeAllRanges();
- var range = this.ownerDocument.createRange();
- range.setStart(this, start);
- range.setEnd(this, end);
- selection.addRange(range);
- return this;
- }
- Element.prototype.selectionLeftOffset = function()
- {
- var selection = window.getSelection();
- if (!selection.containsNode(this, true))
- return null;
- var leftOffset = selection.anchorOffset;
- var node = selection.anchorNode;
- while (node !== this) {
- while (node.previousSibling) {
- node = node.previousSibling;
- leftOffset += node.textContent.length;
- }
- node = node.parentNode;
- }
- return leftOffset;
- }
- Node.prototype.isAncestor = function(node)
- {
- if (!node)
- return false;
- var currentNode = node.parentNode;
- while (currentNode) {
- if (this === currentNode)
- return true;
- currentNode = currentNode.parentNode;
- }
- return false;
- }
- Node.prototype.isDescendant = function(descendant)
- {
- return !!descendant && descendant.isAncestor(this);
- }
- Node.prototype.isSelfOrAncestor = function(node)
- {
- return !!node && (node === this || this.isAncestor(node));
- }
- Node.prototype.isSelfOrDescendant = function(node)
- {
- return !!node && (node === this || this.isDescendant(node));
- }
- Node.prototype.traverseNextNode = function(stayWithin)
- {
- var node = this.firstChild;
- if (node)
- return node;
- if (stayWithin && this === stayWithin)
- return null;
- node = this.nextSibling;
- if (node)
- return node;
- node = this;
- while (node && !node.nextSibling && (!stayWithin || !node.parentNode || node.parentNode !== stayWithin))
- node = node.parentNode;
- if (!node)
- return null;
- return node.nextSibling;
- }
- Node.prototype.traversePreviousNode = function(stayWithin)
- {
- if (stayWithin && this === stayWithin)
- return null;
- var node = this.previousSibling;
- while (node && node.lastChild)
- node = node.lastChild;
- if (node)
- return node;
- return this.parentNode;
- }
- HTMLTextAreaElement.prototype.moveCursorToEnd = function()
- {
- var length = this.value.length;
- this.setSelectionRange(length, length);
- }
- function isEnterKey(event) {
- return event.keyCode !== 229 && event.keyIdentifier === "Enter";
- }
- function consumeEvent(e)
- {
- e.consume();
- }
- function TreeOutline(listNode, nonFocusable)
- {
- this.children = [];
- this.selectedTreeElement = null;
- this._childrenListNode = listNode;
- this.childrenListElement = this._childrenListNode;
- this._childrenListNode.removeChildren();
- this.expandTreeElementsWhenArrowing = false;
- this.root = true;
- this.hasChildren = false;
- this.expanded = true;
- this.selected = false;
- this.treeOutline = this;
- this.comparator = null;
- this.searchable = false;
- this.searchInputElement = null;
- this.setFocusable(!nonFocusable);
- this._childrenListNode.addEventListener("keydown", this._treeKeyDown.bind(this), true);
- this._childrenListNode.addEventListener("keypress", this._treeKeyPress.bind(this), true);
- this._treeElementsMap = new Map();
- this._expandedStateMap = new Map();
- }
- TreeOutline.prototype.setFocusable = function(focusable)
- {
- if (focusable)
- this._childrenListNode.setAttribute("tabIndex", 0);
- else
- this._childrenListNode.removeAttribute("tabIndex");
- }
- TreeOutline.prototype.appendChild = function(child)
- {
- var insertionIndex;
- if (this.treeOutline.comparator)
- insertionIndex = insertionIndexForObjectInListSortedByFunction(child, this.children, this.treeOutline.comparator);
- else
- insertionIndex = this.children.length;
- this.insertChild(child, insertionIndex);
- }
- TreeOutline.prototype.insertChild = function(child, index)
- {
- if (!child)
- throw("child can't be undefined or null");
- var previousChild = (index > 0 ? this.children[index - 1] : null);
- if (previousChild) {
- previousChild.nextSibling = child;
- child.previousSibling = previousChild;
- } else {
- child.previousSibling = null;
- }
- var nextChild = this.children[index];
- if (nextChild) {
- nextChild.previousSibling = child;
- child.nextSibling = nextChild;
- } else {
- child.nextSibling = null;
- }
- this.children.splice(index, 0, child);
- this.hasChildren = true;
- child.parent = this;
- child.treeOutline = this.treeOutline;
- child.treeOutline._rememberTreeElement(child);
- var current = child.children[0];
- while (current) {
- current.treeOutline = this.treeOutline;
- current.treeOutline._rememberTreeElement(current);
- current = current.traverseNextTreeElement(false, child, true);
- }
- if (child.hasChildren && typeof(child.treeOutline._expandedStateMap.get(child.representedObject)) !== "undefined")
- child.expanded = child.treeOutline._expandedStateMap.get(child.representedObject);
- if (!this._childrenListNode) {
- this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
- this._childrenListNode.parentTreeElement = this;
- this._childrenListNode.classList.add("children");
- if (this.hidden)
- this._childrenListNode.classList.add("hidden");
- }
- child._attach();
- if (this.treeOutline.onadd)
- this.treeOutline.onadd(child);
- }
- TreeOutline.prototype.removeChildAtIndex = function(childIndex)
- {
- if (childIndex < 0 || childIndex >= this.children.length)
- throw("childIndex out of range");
- var child = this.children[childIndex];
- this.children.splice(childIndex, 1);
- var parent = child.parent;
- if (child.deselect()) {
- if (child.previousSibling)
- child.previousSibling.select();
- else if (child.nextSibling)
- child.nextSibling.select();
- else
- parent.select();
- }
- if (child.previousSibling)
- child.previousSibling.nextSibling = child.nextSibling;
- if (child.nextSibling)
- child.nextSibling.previousSibling = child.previousSibling;
- if (child.treeOutline) {
- child.treeOutline._forgetTreeElement(child);
- child.treeOutline._forgetChildrenRecursive(child);
- }
- child._detach();
- child.treeOutline = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
- }
- TreeOutline.prototype.removeChild = function(child)
- {
- if (!child)
- throw("child can't be undefined or null");
- var childIndex = this.children.indexOf(child);
- if (childIndex === -1)
- throw("child not found in this node's children");
- this.removeChildAtIndex.call(this, childIndex);
- }
- TreeOutline.prototype.removeChildren = function()
- {
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- child.deselect();
- if (child.treeOutline) {
- child.treeOutline._forgetTreeElement(child);
- child.treeOutline._forgetChildrenRecursive(child);
- }
- child._detach();
- child.treeOutline = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
- }
- this.children = [];
- }
- TreeOutline.prototype._rememberTreeElement = function(element)
- {
- if (!this._treeElementsMap.get(element.representedObject))
- this._treeElementsMap.put(element.representedObject, []);
- var elements = this._treeElementsMap.get(element.representedObject);
- if (elements.indexOf(element) !== -1)
- return;
- elements.push(element);
- }
- TreeOutline.prototype._forgetTreeElement = function(element)
- {
- if (this._treeElementsMap.get(element.representedObject))
- this._treeElementsMap.get(element.representedObject).remove(element, true);
- }
- TreeOutline.prototype._forgetChildrenRecursive = function(parentElement)
- {
- var child = parentElement.children[0];
- while (child) {
- this._forgetTreeElement(child);
- child = child.traverseNextTreeElement(false, parentElement, true);
- }
- }
- TreeOutline.prototype.getCachedTreeElement = function(representedObject)
- {
- if (!representedObject)
- return null;
- var elements = this._treeElementsMap.get(representedObject);
- if (elements && elements.length)
- return elements[0];
- return null;
- }
- TreeOutline.prototype.findTreeElement = function(representedObject, isAncestor, getParent)
- {
- if (!representedObject)
- return null;
- var cachedElement = this.getCachedTreeElement(representedObject);
- if (cachedElement)
- return cachedElement;
- var item;
- var found = false;
- for (var i = 0; i < this.children.length; ++i) {
- item = this.children[i];
- if (item.representedObject === representedObject || isAncestor(item.representedObject, representedObject)) {
- found = true;
- break;
- }
- }
- if (!found)
- return null;
- var ancestors = [];
- var currentObject = representedObject;
- while (currentObject) {
- ancestors.unshift(currentObject);
- if (currentObject === item.representedObject)
- break;
- currentObject = getParent(currentObject);
- }
- for (var i = 0; i < ancestors.length; ++i) {
- if (ancestors[i] === representedObject)
- continue;
- item = this.findTreeElement(ancestors[i], isAncestor, getParent);
- if (item)
- item.onpopulate();
- }
- return this.getCachedTreeElement(representedObject);
- }
- TreeOutline.prototype._treeElementDidChange = function(treeElement)
- {
- if (treeElement.treeOutline !== this)
- return;
- if (this.onchange)
- this.onchange(treeElement);
- }
- TreeOutline.prototype.treeElementFromPoint = function(x, y)
- {
- var node = this._childrenListNode.ownerDocument.elementFromPoint(x, y);
- if (!node)
- return null;
- var listNode = node.enclosingNodeOrSelfWithNodeNameInArray(["ol", "li"]);
- if (listNode)
- return listNode.parentTreeElement || listNode.treeElement;
- return null;
- }
- TreeOutline.prototype._treeKeyPress = function(event)
- {
- if (!this.searchable || WebInspector.isBeingEdited(this._childrenListNode))
- return;
- var searchText = String.fromCharCode(event.charCode);
- if (searchText.trim() !== searchText)
- return;
- this._startSearch(searchText);
- event.consume(true);
- }
- TreeOutline.prototype._treeKeyDown = function(event)
- {
- if (event.target !== this._childrenListNode)
- return;
- if (!this.selectedTreeElement || event.shiftKey || event.metaKey || event.ctrlKey)
- return;
- var handled = false;
- var nextSelectedElement;
- if (event.keyIdentifier === "Up" && !event.altKey) {
- nextSelectedElement = this.selectedTreeElement.traversePreviousTreeElement(true);
- while (nextSelectedElement && !nextSelectedElement.selectable)
- nextSelectedElement = nextSelectedElement.traversePreviousTreeElement(!this.expandTreeElementsWhenArrowing);
- handled = nextSelectedElement ? true : false;
- } else if (event.keyIdentifier === "Down" && !event.altKey) {
- nextSelectedElement = this.selectedTreeElement.traverseNextTreeElement(true);
- while (nextSelectedElement && !nextSelectedElement.selectable)
- nextSelectedElement = nextSelectedElement.traverseNextTreeElement(!this.expandTreeElementsWhenArrowing);
- handled = nextSelectedElement ? true : false;
- } else if (event.keyIdentifier === "Left") {
- if (this.selectedTreeElement.expanded) {
- if (event.altKey)
- this.selectedTreeElement.collapseRecursively();
- else
- this.selectedTreeElement.collapse();
- handled = true;
- } else if (this.selectedTreeElement.parent && !this.selectedTreeElement.parent.root) {
- handled = true;
- if (this.selectedTreeElement.parent.selectable) {
- nextSelectedElement = this.selectedTreeElement.parent;
- while (nextSelectedElement && !nextSelectedElement.selectable)
- nextSelectedElement = nextSelectedElement.parent;
- handled = nextSelectedElement ? true : false;
- } else if (this.selectedTreeElement.parent)
- this.selectedTreeElement.parent.collapse();
- }
- } else if (event.keyIdentifier === "Right") {
- if (!this.selectedTreeElement.revealed()) {
- this.selectedTreeElement.reveal();
- handled = true;
- } else if (this.selectedTreeElement.hasChildren) {
- handled = true;
- if (this.selectedTreeElement.expanded) {
- nextSelectedElement = this.selectedTreeElement.children[0];
- while (nextSelectedElement && !nextSelectedElement.selectable)
- nextSelectedElement = nextSelectedElement.nextSibling;
- handled = nextSelectedElement ? true : false;
- } else {
- if (event.altKey)
- this.selectedTreeElement.expandRecursively();
- else
- this.selectedTreeElement.expand();
- }
- }
- } else if (event.keyCode === 8 || event.keyCode === 46 ) {
- if (this.selectedTreeElement.ondelete)
- handled = this.selectedTreeElement.ondelete();
- } else if (isEnterKey(event)) {
- if (this.selectedTreeElement.onenter)
- handled = this.selectedTreeElement.onenter();
- } else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Space.code) {
- if (this.selectedTreeElement.onspace)
- handled = this.selectedTreeElement.onspace();
- }
- if (nextSelectedElement) {
- nextSelectedElement.reveal();
- nextSelectedElement.select(false, true);
- }
- if (handled)
- event.consume(true);
- }
- TreeOutline.prototype.expand = function()
- {
- }
- TreeOutline.prototype.collapse = function()
- {
- }
- TreeOutline.prototype.revealed = function()
- {
- return true;
- }
- TreeOutline.prototype.reveal = function()
- {
- }
- TreeOutline.prototype.select = function()
- {
- }
- TreeOutline.prototype.revealAndSelect = function(omitFocus)
- {
- }
- TreeOutline.prototype._startSearch = function(searchText)
- {
- if (!this.searchInputElement || !this.searchable)
- return;
- this._searching = true;
- if (this.searchStarted)
- this.searchStarted();
- this.searchInputElement.value = searchText;
- function focusSearchInput()
- {
- this.searchInputElement.focus();
- }
- window.setTimeout(focusSearchInput.bind(this), 0);
- this._searchTextChanged();
- this._boundSearchTextChanged = this._searchTextChanged.bind(this);
- this.searchInputElement.addEventListener("paste", this._boundSearchTextChanged);
- this.searchInputElement.addEventListener("cut", this._boundSearchTextChanged);
- this.searchInputElement.addEventListener("keypress", this._boundSearchTextChanged);
- this._boundSearchInputKeyDown = this._searchInputKeyDown.bind(this);
- this.searchInputElement.addEventListener("keydown", this._boundSearchInputKeyDown);
- this._boundSearchInputBlur = this._searchInputBlur.bind(this);
- this.searchInputElement.addEventListener("blur", this._boundSearchInputBlur);
- }
- TreeOutline.prototype._searchTextChanged = function()
- {
- function updateSearch()
- {
- var nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.selectedTreeElement, false);
- if (!nextSelectedElement)
- nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.children[0], false);
- this._showSearchMatchElement(nextSelectedElement);
- }
- window.setTimeout(updateSearch.bind(this), 0);
- }
- TreeOutline.prototype._showSearchMatchElement = function(treeElement)
- {
- this._currentSearchMatchElement = treeElement;
- if (treeElement) {
- this._childrenListNode.classList.add("search-match-found");
- this._childrenListNode.classList.remove("search-match-not-found");
- treeElement.revealAndSelect(true);
- } else {
- this._childrenListNode.classList.remove("search-match-found");
- this._childrenListNode.classList.add("search-match-not-found");
- }
- }
- TreeOutline.prototype._searchInputKeyDown = function(event)
- {
- if (event.shiftKey || event.metaKey || event.ctrlKey || event.altKey)
- return;
- var handled = false;
- var nextSelectedElement;
- if (event.keyIdentifier === "Down") {
- nextSelectedElement = this._nextSearchMatch(this.searchInputElement.value, this.selectedTreeElement, true);
- handled = true;
- } else if (event.keyIdentifier === "Up") {
- nextSelectedElement = this._previousSearchMatch(this.searchInputElement.value, this.selectedTreeElement);
- handled = true;
- } else if (event.keyCode === 27 ) {
- this._searchFinished();
- handled = true;
- } else if (isEnterKey(event)) {
- var lastSearchMatchElement = this._currentSearchMatchElement;
- this._searchFinished();
- if (lastSearchMatchElement && lastSearchMatchElement.onenter)
- lastSearchMatchElement.onenter();
- handled = true;
- }
- if (nextSelectedElement)
- this._showSearchMatchElement(nextSelectedElement);
- if (handled)
- event.consume(true);
- else
- window.setTimeout(this._boundSearchTextChanged, 0);
- }
- TreeOutline.prototype._nextSearchMatch = function(searchText, startTreeElement, skipStartTreeElement)
- {
- var currentTreeElement = startTreeElement;
- var skipCurrentTreeElement = skipStartTreeElement;
- while (currentTreeElement && (skipCurrentTreeElement || !currentTreeElement.matchesSearchText || !currentTreeElement.matchesSearchText(searchText))) {
- currentTreeElement = currentTreeElement.traverseNextTreeElement(true, null, true);
- skipCurrentTreeElement = false;
- }
- return currentTreeElement;
- }
- TreeOutline.prototype._previousSearchMatch = function(searchText, startTreeElement)
- {
- var currentTreeElement = startTreeElement;
- var skipCurrentTreeElement = true;
- while (currentTreeElement && (skipCurrentTreeElement || !currentTreeElement.matchesSearchText || !currentTreeElement.matchesSearchText(searchText))) {
- currentTreeElement = currentTreeElement.traversePreviousTreeElement(true, true);
- skipCurrentTreeElement = false;
- }
- return currentTreeElement;
- }
- TreeOutline.prototype._searchInputBlur = function(event)
- {
- this._searchFinished();
- }
- TreeOutline.prototype._searchFinished = function()
- {
- if (!this._searching)
- return;
- delete this._searching;
- this._childrenListNode.classList.remove("search-match-found");
- this._childrenListNode.classList.remove("search-match-not-found");
- delete this._currentSearchMatchElement;
- this.searchInputElement.value = "";
- this.searchInputElement.removeEventListener("paste", this._boundSearchTextChanged);
- this.searchInputElement.removeEventListener("cut", this._boundSearchTextChanged);
- delete this._boundSearchTextChanged;
- this.searchInputElement.removeEventListener("keydown", this._boundSearchInputKeyDown);
- delete this._boundSearchInputKeyDown;
- this.searchInputElement.removeEventListener("blur", this._boundSearchInputBlur);
- delete this._boundSearchInputBlur;
- if (this.searchFinished)
- this.searchFinished();
- this.treeOutline._childrenListNode.focus();
- }
- TreeOutline.prototype.stopSearch = function()
- {
- this._searchFinished();
- }
- function TreeElement(title, representedObject, hasChildren)
- {
- this._title = title;
- this.representedObject = (representedObject || {});
- this._hidden = false;
- this._selectable = true;
- this.expanded = false;
- this.selected = false;
- this.hasChildren = hasChildren;
- this.children = [];
- this.treeOutline = null;
- this.parent = null;
- this.previousSibling = null;
- this.nextSibling = null;
- this._listItemNode = null;
- }
- TreeElement.prototype = {
- arrowToggleWidth: 10,
- get selectable() {
- if (this._hidden)
- return false;
- return this._selectable;
- },
- set selectable(x) {
- this._selectable = x;
- },
- get listItemElement() {
- return this._listItemNode;
- },
- get childrenListElement() {
- return this._childrenListNode;
- },
- get title() {
- return this._title;
- },
- set title(x) {
- this._title = x;
- this._setListItemNodeContent();
- this.didChange();
- },
- get tooltip() {
- return this._tooltip;
- },
- set tooltip(x) {
- this._tooltip = x;
- if (this._listItemNode)
- this._listItemNode.title = x ? x : "";
- this.didChange();
- },
- get hasChildren() {
- return this._hasChildren;
- },
- set hasChildren(x) {
- if (this._hasChildren === x)
- return;
- this._hasChildren = x;
- if (!this._listItemNode)
- return;
- if (x)
- this._listItemNode.classList.add("parent");
- else {
- this._listItemNode.classList.remove("parent");
- this.collapse();
- }
- this.didChange();
- },
- get hidden() {
- return this._hidden;
- },
- set hidden(x) {
- if (this._hidden === x)
- return;
- this._hidden = x;
- if (x) {
- if (this._listItemNode)
- this._listItemNode.classList.add("hidden");
- if (this._childrenListNode)
- this._childrenListNode.classList.add("hidden");
- } else {
- if (this._listItemNode)
- this._listItemNode.classList.remove("hidden");
- if (this._childrenListNode)
- this._childrenListNode.classList.remove("hidden");
- }
- },
- get shouldRefreshChildren() {
- return this._shouldRefreshChildren;
- },
- set shouldRefreshChildren(x) {
- this._shouldRefreshChildren = x;
- if (x && this.expanded)
- this.expand();
- },
- _fireDidChange: function()
- {
- delete this._didChangeTimeoutIdentifier;
- if (this.treeOutline)
- this.treeOutline._treeElementDidChange(this);
- },
- didChange: function()
- {
- if (!this.treeOutline)
- return;
- if (!this._didChangeTimeoutIdentifier)
- this._didChangeTimeoutIdentifier = setTimeout(this._fireDidChange.bind(this), 0);
- },
- _setListItemNodeContent: function()
- {
- if (!this._listItemNode)
- return;
- if (typeof this._title === "string")
- this._listItemNode.textContent = this._title;
- else {
- this._listItemNode.removeChildren();
- if (this._title)
- this._listItemNode.appendChild(this._title);
- }
- }
- }
- TreeElement.prototype.appendChild = TreeOutline.prototype.appendChild;
- TreeElement.prototype.insertChild = TreeOutline.prototype.insertChild;
- TreeElement.prototype.removeChild = TreeOutline.prototype.removeChild;
- TreeElement.prototype.removeChildAtIndex = TreeOutline.prototype.removeChildAtIndex;
- TreeElement.prototype.removeChildren = TreeOutline.prototype.removeChildren;
- TreeElement.prototype._attach = function()
- {
- if (!this._listItemNode || this.parent._shouldRefreshChildren) {
- if (this._listItemNode && this._listItemNode.parentNode)
- this._listItemNode.parentNode.removeChild(this._listItemNode);
- this._listItemNode = this.treeOutline._childrenListNode.ownerDocument.createElement("li");
- this._listItemNode.treeElement = this;
- this._setListItemNodeContent();
- this._listItemNode.title = this._tooltip ? this._tooltip : "";
- if (this.hidden)
- this._listItemNode.classList.add("hidden");
- if (this.hasChildren)
- this._listItemNode.classList.add("parent");
- if (this.expanded)
- this._listItemNode.classList.add("expanded");
- if (this.selected)
- this._listItemNode.classList.add("selected");
- this._listItemNode.addEventListener("mousedown", TreeElement.treeElementMouseDown, false);
- this._listItemNode.addEventListener("click", TreeElement.treeElementToggled, false);
- this._listItemNode.addEventListener("dblclick", TreeElement.treeElementDoubleClicked, false);
- if (this.onattach)
- this.onattach(this);
- }
- var nextSibling = null;
- if (this.nextSibling && this.nextSibling._listItemNode && this.nextSibling._listItemNode.parentNode === this.parent._childrenListNode)
- nextSibling = this.nextSibling._listItemNode;
- this.parent._childrenListNode.insertBefore(this._listItemNode, nextSibling);
- if (this._childrenListNode)
- this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
- if (this.selected)
- this.select();
- if (this.expanded)
- this.expand();
- }
- TreeElement.prototype._detach = function()
- {
- if (this._listItemNode && this._listItemNode.parentNode)
- this._listItemNode.parentNode.removeChild(this._listItemNode);
- if (this._childrenListNode && this._childrenListNode.parentNode)
- this._childrenListNode.parentNode.removeChild(this._childrenListNode);
- }
- TreeElement.treeElementMouseDown = function(event)
- {
- var element = event.currentTarget;
- if (!element || !element.treeElement || !element.treeElement.selectable)
- return;
- if (element.treeElement.isEventWithinDisclosureTriangle(event))
- return;
- element.treeElement.selectOnMouseDown(event);
- }
- TreeElement.treeElementToggled = function(event)
- {
- var element = event.currentTarget;
- if (!element || !element.treeElement)
- return;
- var toggleOnClick = element.treeElement.toggleOnClick && !element.treeElement.selectable;
- var isInTriangle = element.treeElement.isEventWithinDisclosureTriangle(event);
- if (!toggleOnClick && !isInTriangle)
- return;
- if (element.treeElement.expanded) {
- if (event.altKey)
- element.treeElement.collapseRecursively();
- else
- element.treeElement.collapse();
- } else {
- if (event.altKey)
- element.treeElement.expandRecursively();
- else
- element.treeElement.expand();
- }
- event.consume();
- }
- TreeElement.treeElementDoubleClicked = function(event)
- {
- var element = event.currentTarget;
- if (!element || !element.treeElement)
- return;
- if (element.treeElement.ondblclick) {
- var handled = element.treeElement.ondblclick.call(element.treeElement, event);
- if (handled)
- return;
- } else if (element.treeElement.hasChildren && !element.treeElement.expanded)
- element.treeElement.expand();
- }
- TreeElement.prototype.collapse = function()
- {
- if (this._listItemNode)
- this._listItemNode.classList.remove("expanded");
- if (this._childrenListNode)
- this._childrenListNode.classList.remove("expanded");
- this.expanded = false;
- if (this.treeOutline)
- this.treeOutline._expandedStateMap.put(this.representedObject, false);
- if (this.oncollapse)
- this.oncollapse(this);
- }
- TreeElement.prototype.collapseRecursively = function()
- {
- var item = this;
- while (item) {
- if (item.expanded)
- item.collapse();
- item = item.traverseNextTreeElement(false, this, true);
- }
- }
- TreeElement.prototype.expand = function()
- {
- if (!this.hasChildren || (this.expanded && !this._shouldRefreshChildren && this._childrenListNode))
- return;
- this.expanded = true;
- if (this.treeOutline)
- this.treeOutline._expandedStateMap.put(this.representedObject, true);
- if (this.treeOutline && (!this._childrenListNode || this._shouldRefreshChildren)) {
- if (this._childrenListNode && this._childrenListNode.parentNode)
- this._childrenListNode.parentNode.removeChild(this._childrenListNode);
- this._childrenListNode = this.treeOutline._childrenListNode.ownerDocument.createElement("ol");
- this._childrenListNode.parentTreeElement = this;
- this._childrenListNode.classList.add("children");
- if (this.hidden)
- this._childrenListNode.classList.add("hidden");
- this.onpopulate();
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._attach();
- delete this._shouldRefreshChildren;
- }
- if (this._listItemNode) {
- this._listItemNode.classList.add("expanded");
- if (this._childrenListNode && this._childrenListNode.parentNode != this._listItemNode.parentNode)
- this.parent._childrenListNode.insertBefore(this._childrenListNode, this._listItemNode.nextSibling);
- }
- if (this._childrenListNode)
- this._childrenListNode.classList.add("expanded");
- if (this.onexpand)
- this.onexpand(this);
- }
- TreeElement.prototype.expandRecursively = function(maxDepth)
- {
- var item = this;
- var info = {};
- var depth = 0;
- if (typeof maxDepth === "undefined" || typeof maxDepth === "null")
- maxDepth = 3;
- while (item) {
- if (depth < maxDepth)
- item.expand();
- item = item.traverseNextTreeElement(false, this, (depth >= maxDepth), info);
- depth += info.depthChange;
- }
- }
- TreeElement.prototype.hasAncestor = function(ancestor) {
- if (!ancestor)
- return false;
- var currentNode = this.parent;
- while (currentNode) {
- if (ancestor === currentNode)
- return true;
- currentNode = currentNode.parent;
- }
- return false;
- }
- TreeElement.prototype.reveal = function()
- {
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor.root) {
- if (!currentAncestor.expanded)
- currentAncestor.expand();
- currentAncestor = currentAncestor.parent;
- }
- if (this.onreveal)
- this.onreveal(this);
- }
- TreeElement.prototype.revealed = function()
- {
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor.root) {
- if (!currentAncestor.expanded)
- return false;
- currentAncestor = currentAncestor.parent;
- }
- return true;
- }
- TreeElement.prototype.selectOnMouseDown = function(event)
- {
- if (this.select(false, true))
- event.consume(true);
- }
- TreeElement.prototype.select = function(omitFocus, selectedByUser)
- {
- if (!this.treeOutline || !this.selectable || this.selected)
- return false;
- if (this.treeOutline.selectedTreeElement)
- this.treeOutline.selectedTreeElement.deselect();
- this.selected = true;
- if(!omitFocus)
- this.treeOutline._childrenListNode.focus();
- if (!this.treeOutline)
- return false;
- this.treeOutline.selectedTreeElement = this;
- if (this._listItemNode)
- this._listItemNode.classList.add("selected");
- if (this.onselect)
- return this.onselect(this, selectedByUser);
- return false;
- }
- TreeElement.prototype.revealAndSelect = function(omitFocus)
- {
- this.reveal();
- this.select(omitFocus);
- }
- TreeElement.prototype.deselect = function(supressOnDeselect)
- {
- if (!this.treeOutline || this.treeOutline.selectedTreeElement !== this || !this.selected)
- return false;
- this.selected = false;
- this.treeOutline.selectedTreeElement = null;
- if (this._listItemNode)
- this._listItemNode.classList.remove("selected");
- if (this.ondeselect && !supressOnDeselect)
- this.ondeselect(this);
- return true;
- }
- TreeElement.prototype.onpopulate = function()
- {
- }
- TreeElement.prototype.traverseNextTreeElement = function(skipUnrevealed, stayWithin, dontPopulate, info)
- {
- if (!dontPopulate && this.hasChildren)
- this.onpopulate();
- if (info)
- info.depthChange = 0;
- var element = skipUnrevealed ? (this.revealed() ? this.children[0] : null) : this.children[0];
- if (element && (!skipUnrevealed || (skipUnrevealed && this.expanded))) {
- if (info)
- info.depthChange = 1;
- return element;
- }
- if (this === stayWithin)
- return null;
- element = skipUnrevealed ? (this.revealed() ? this.nextSibling : null) : this.nextSibling;
- if (element)
- return element;
- element = this;
- while (element && !element.root && !(skipUnrevealed ? (element.revealed() ? element.nextSibling : null) : element.nextSibling) && element.parent !== stayWithin) {
- if (info)
- info.depthChange -= 1;
- element = element.parent;
- }
- if (!element)
- return null;
- return (skipUnrevealed ? (element.revealed() ? element.nextSibling : null) : element.nextSibling);
- }
- TreeElement.prototype.traversePreviousTreeElement = function(skipUnrevealed, dontPopulate)
- {
- var element = skipUnrevealed ? (this.revealed() ? this.previousSibling : null) : this.previousSibling;
- if (!dontPopulate && element && element.hasChildren)
- element.onpopulate();
- while (element && (skipUnrevealed ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1])) {
- if (!dontPopulate && element.hasChildren)
- element.onpopulate();
- element = (skipUnrevealed ? (element.revealed() && element.expanded ? element.children[element.children.length - 1] : null) : element.children[element.children.length - 1]);
- }
- if (element)
- return element;
- if (!this.parent || this.parent.root)
- return null;
- return this.parent;
- }
- TreeElement.prototype.isEventWithinDisclosureTriangle = function(event)
- {
- var computedLeftPadding = window.getComputedStyle(this._listItemNode).getPropertyCSSValue("padding-left").getFloatValue(CSSPrimitiveValue.CSS_PX);
- var left = this._listItemNode.totalOffsetLeft() + computedLeftPadding;
- return event.pageX >= left && event.pageX <= left + this.arrowToggleWidth && this.hasChildren;
- }
- var WebInspector = {
- _createPanels: function()
- {
- this.panels = {};
- WebInspector.inspectorView = new WebInspector.InspectorView();
- var parentElement = document.getElementById("main");
- WebInspector.inspectorView.show(parentElement);
- WebInspector.inspectorView.addEventListener(WebInspector.InspectorView.Events.PanelSelected, this._panelSelected, this);
- if (WebInspector.WorkerManager.isWorkerFrontend()) {
- this.panels.scripts = new WebInspector.ScriptsPanel();
- this.panels.timeline = new WebInspector.TimelinePanel();
- this.panels.profiles = new WebInspector.ProfilesPanel();
- this.panels.console = new WebInspector.ConsolePanel();
- return;
- }
- var hiddenPanels = (InspectorFrontendHost.hiddenPanels() || "").split(',');
- if (hiddenPanels.indexOf("elements") === -1)
- this.panels.elements = new WebInspector.ElementsPanel();
- if (hiddenPanels.indexOf("resources") === -1)
- this.panels.resources = new WebInspector.ResourcesPanel();
- if (hiddenPanels.indexOf("network") === -1)
- this.panels.network = new WebInspector.NetworkPanel();
- if (hiddenPanels.indexOf("scripts") === -1)
- this.panels.scripts = new WebInspector.ScriptsPanel();
- if (hiddenPanels.indexOf("timeline") === -1)
- this.panels.timeline = new WebInspector.TimelinePanel();
- if (hiddenPanels.indexOf("profiles") === -1)
- this.panels.profiles = new WebInspector.ProfilesPanel();
- if (hiddenPanels.indexOf("audits") === -1)
- this.panels.audits = new WebInspector.AuditsPanel();
- if (hiddenPanels.indexOf("console") === -1)
- this.panels.console = new WebInspector.ConsolePanel();
- },
- _panelSelected: function()
- {
- this._toggleConsoleButton.disabled = WebInspector.inspectorView.currentPanel() === WebInspector.panels.console;
- },
- _createGlobalStatusBarItems: function()
- {
- this._dockToggleButton = new WebInspector.StatusBarButton(this._dockButtonTitle(), "dock-status-bar-item");
- this._dockToggleButton.addEventListener("click", this._toggleAttach.bind(this), false);
- this._dockToggleButton.toggled = !this.attached;
- WebInspector.updateDockToggleButton();
- var anchoredStatusBar = document.getElementById("anchored-status-bar-items");
- anchoredStatusBar.appendChild(this._dockToggleButton.element);
- this._toggleConsoleButton = new WebInspector.StatusBarButton(WebInspector.UIString("Show console."), "console-status-bar-item");
- this._toggleConsoleButton.addEventListener("click", this._toggleConsoleButtonClicked.bind(this), false);
- anchoredStatusBar.appendChild(this._toggleConsoleButton.element);
- if (this.panels.elements)
- anchoredStatusBar.appendChild(this.panels.elements.nodeSearchButton.element);
- anchoredStatusBar.appendChild(this.settingsController.statusBarItem);
- },
- _dockButtonTitle: function()
- {
- return this.attached ? WebInspector.UIString("Undock into separate window.") : WebInspector.UIString("Dock to main window.");
- },
- _toggleAttach: function()
- {
- if (!this._attached) {
- InspectorFrontendHost.requestAttachWindow();
- WebInspector.userMetrics.WindowDocked.record();
- } else {
- InspectorFrontendHost.requestDetachWindow();
- WebInspector.userMetrics.WindowUndocked.record();
- }
- },
- _toggleConsoleButtonClicked: function()
- {
- if (this._toggleConsoleButton.disabled)
- return;
- this._toggleConsoleButton.toggled = !this._toggleConsoleButton.toggled;
- var animationType = window.event && window.event.shiftKey ? WebInspector.Drawer.AnimationType.Slow : WebInspector.Drawer.AnimationType.Normal;
- if (this._toggleConsoleButton.toggled) {
- this._toggleConsoleButton.title = WebInspector.UIString("Hide console.");
- this.drawer.show(this.consoleView, animationType);
- this._consoleWasShown = true;
- } else {
- this._toggleConsoleButton.title = WebInspector.UIString("Show console.");
- this.drawer.hide(animationType);
- delete this._consoleWasShown;
- }
- },
- closeDrawerView: function()
- {
- if (!this._consoleWasShown)
- this.drawer.hide(WebInspector.Drawer.AnimationType.Immediately);
- else
- this._toggleConsoleButtonClicked();
- },
- showViewInDrawer: function(view)
- {
- this._toggleConsoleButton.title = WebInspector.UIString("Hide console.");
- this._toggleConsoleButton.toggled = false;
- this.drawer.show(view, WebInspector.Drawer.AnimationType.Immediately);
- },
- get attached()
- {
- return this._attached;
- },
- set attached(x)
- {
- if (this._attached === x)
- return;
- this._attached = x;
- if (this._dockToggleButton) {
- this._dockToggleButton.title = this._dockButtonTitle();
- this._dockToggleButton.toggled = !x;
- }
- if (x)
- document.body.removeStyleClass("detached");
- else
- document.body.addStyleClass("detached");
- this._setCompactMode(x && !WebInspector.settings.dockToRight.get());
- },
- isCompactMode: function()
- {
- return this.attached && !WebInspector.settings.dockToRight.get();
- },
- _setCompactMode: function(x)
- {
- var body = document.body;
- if (x)
- body.addStyleClass("compact");
- else
- body.removeStyleClass("compact");
- if (WebInspector.toolbar)
- WebInspector.toolbar.compact = x;
- if (WebInspector.searchController)
- WebInspector.searchController.updateSearchLabel();
- if (WebInspector.drawer)
- WebInspector.drawer.resize();
- },
- _updateErrorAndWarningCounts: function()
- {
- var errorWarningElement = document.getElementById("error-warning-count");
- if (!errorWarningElement)
- return;
- var errors = WebInspector.console.errors;
- var warnings = WebInspector.console.warnings;
- if (!errors && !warnings) {
- errorWarningElement.addStyleClass("hidden");
- return;
- }
- errorWarningElement.removeStyleClass("hidden");
- errorWarningElement.removeChildren();
- if (errors) {
- var errorImageElement = document.createElement("img");
- errorImageElement.id = "error-count-img";
- errorWarningElement.appendChild(errorImageElement);
- var errorElement = document.createElement("span");
- errorElement.id = "error-count";
- errorElement.textContent = errors;
- errorWarningElement.appendChild(errorElement);
- }
- if (warnings) {
- var warningsImageElement = document.createElement("img");
- warningsImageElement.id = "warning-count-img";
- errorWarningElement.appendChild(warningsImageElement);
- var warningsElement = document.createElement("span");
- warningsElement.id = "warning-count";
- warningsElement.textContent = warnings;
- errorWarningElement.appendChild(warningsElement);
- }
- if (errors) {
- if (warnings) {
- if (errors == 1) {
- if (warnings == 1)
- errorWarningElement.title = WebInspector.UIString("%d error, %d warning", errors, warnings);
- else
- errorWarningElement.title = WebInspector.UIString("%d error, %d warnings", errors, warnings);
- } else if (warnings == 1)
- errorWarningElement.title = WebInspector.UIString("%d errors, %d warning", errors, warnings);
- else
- errorWarningElement.title = WebInspector.UIString("%d errors, %d warnings", errors, warnings);
- } else if (errors == 1)
- errorWarningElement.title = WebInspector.UIString("%d error", errors);
- else
- errorWarningElement.title = WebInspector.UIString("%d errors", errors);
- } else if (warnings == 1)
- errorWarningElement.title = WebInspector.UIString("%d warning", warnings);
- else if (warnings)
- errorWarningElement.title = WebInspector.UIString("%d warnings", warnings);
- else
- errorWarningElement.title = null;
- },
- networkRequestById: function(requestId)
- {
- return this.panels.network.requestById(requestId);
- },
- get inspectedPageDomain()
- {
- var parsedURL = WebInspector.inspectedPageURL && WebInspector.inspectedPageURL.asParsedURL();
- return parsedURL ? parsedURL.host : "";
- },
- _initializeCapability: function(name, callback, error, result)
- {
- Capabilities[name] = result;
- if (callback)
- callback();
- },
- _zoomIn: function()
- {
- ++this._zoomLevel;
- this._requestZoom();
- },
- _zoomOut: function()
- {
- --this._zoomLevel;
- this._requestZoom();
- },
- _resetZoom: function()
- {
- this._zoomLevel = 0;
- this._requestZoom();
- },
- _requestZoom: function()
- {
- WebInspector.settings.zoomLevel.set(this._zoomLevel);
- InspectorFrontendHost.setZoomFactor(Math.pow(1.2, this._zoomLevel));
- }
- }
- WebInspector.Events = {
- InspectorClosing: "InspectorClosing"
- }
- {(function parseQueryParameters()
- {
- WebInspector.queryParamsObject = {};
- var queryParams = window.location.search;
- if (!queryParams)
- return;
- var params = queryParams.substring(1).split("&");
- for (var i = 0; i < params.length; ++i) {
- var pair = params[i].split("=");
- WebInspector.queryParamsObject[pair[0]] = pair[1];
- }
- })();}
- WebInspector.loaded = function()
- {
- InspectorBackend.loadFromJSONIfNeeded();
- var ws;
- if ("ws" in WebInspector.queryParamsObject)
- ws = "ws://" + WebInspector.queryParamsObject.ws;
- else if ("page" in WebInspector.queryParamsObject) {
- var page = WebInspector.queryParamsObject.page;
- var host = "host" in WebInspector.queryParamsObject ? WebInspector.queryParamsObject.host : window.location.host;
- ws = "ws://" + host + "/devtools/page/" + page;
- }
- if (ws) {
- WebInspector.socket = new WebSocket(ws);
- WebInspector.socket.onmessage = function(message) { InspectorBackend.dispatch(message.data); }
- WebInspector.socket.onerror = function(error) { console.error(error); }
- WebInspector.socket.onopen = function() {
- InspectorFrontendHost.sendMessageToBackend = WebInspector.socket.send.bind(WebInspector.socket);
- WebInspector.doLoadedDone();
- }
- return;
- }
- WebInspector.doLoadedDone();
- }
- WebInspector.doLoadedDone = function()
- {
- WebInspector.installPortStyles();
- if (WebInspector.socket)
- document.body.addStyleClass("remote");
- if (WebInspector.queryParamsObject.toolbarColor && WebInspector.queryParamsObject.textColor)
- WebInspector.setToolbarColors(WebInspector.queryParamsObject.toolbarColor, WebInspector.queryParamsObject.textColor);
- InspectorFrontendHost.loaded();
- WebInspector.WorkerManager.loaded();
- DebuggerAgent.causesRecompilation(WebInspector._initializeCapability.bind(WebInspector, "debuggerCausesRecompilation", null));
- DebuggerAgent.supportsNativeBreakpoints(WebInspector._initializeCapability.bind(WebInspector, "nativeInstrumentationEnabled", null));
- ProfilerAgent.causesRecompilation(WebInspector._initializeCapability.bind(WebInspector, "profilerCausesRecompilation", null));
- ProfilerAgent.isSampling(WebInspector._initializeCapability.bind(WebInspector, "samplingCPUProfiler", null));
- ProfilerAgent.hasHeapProfiler(WebInspector._initializeCapability.bind(WebInspector, "heapProfilerPresent", null));
- TimelineAgent.supportsFrameInstrumentation(WebInspector._initializeCapability.bind(WebInspector, "timelineSupportsFrameInstrumentation", null));
- PageAgent.canOverrideDeviceMetrics(WebInspector._initializeCapability.bind(WebInspector, "canOverrideDeviceMetrics", WebInspector._doLoadedDoneWithCapabilities.bind(WebInspector)));
- }
- WebInspector._doLoadedDoneWithCapabilities = function()
- {
- WebInspector.shortcutsScreen = new WebInspector.ShortcutsScreen();
- this._registerShortcuts();
- WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));
- WebInspector.shortcutsScreen.section(WebInspector.UIString("Elements Panel"));
- this.console = new WebInspector.ConsoleModel();
- this.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._updateErrorAndWarningCounts, this);
- this.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._updateErrorAndWarningCounts, this);
- this.console.addEventListener(WebInspector.ConsoleModel.Events.RepeatCountUpdated, this._updateErrorAndWarningCounts, this);
- this.debuggerModel = new WebInspector.DebuggerModel();
- this.scriptSnippetModel = new WebInspector.ScriptSnippetModel();
- this.breakpointManager = new WebInspector.BreakpointManager(WebInspector.settings.breakpoints, this.debuggerModel);
- this.drawer = new WebInspector.Drawer();
- this.consoleView = new WebInspector.ConsoleView(WebInspector.WorkerManager.isWorkerFrontend());
- this.networkManager = new WebInspector.NetworkManager();
- this.resourceTreeModel = new WebInspector.ResourceTreeModel(this.networkManager);
- this.networkLog = new WebInspector.NetworkLog();
- this.domAgent = new WebInspector.DOMAgent();
- this.javaScriptContextManager = new WebInspector.JavaScriptContextManager(this.resourceTreeModel, this.consoleView);
- InspectorBackend.registerInspectorDispatcher(this);
- this.cssModel = new WebInspector.CSSStyleModel();
- this.timelineManager = new WebInspector.TimelineManager();
- this.userAgentSupport = new WebInspector.UserAgentSupport();
- InspectorBackend.registerDatabaseDispatcher(new WebInspector.DatabaseDispatcher());
- InspectorBackend.registerDOMStorageDispatcher(new WebInspector.DOMStorageDispatcher());
- this.searchController = new WebInspector.SearchController();
- this.advancedSearchController = new WebInspector.AdvancedSearchController();
- this.settingsController = new WebInspector.SettingsController();
- if (Capabilities.nativeInstrumentationEnabled)
- this.domBreakpointsSidebarPane = new WebInspector.DOMBreakpointsSidebarPane();
- this._zoomLevel = WebInspector.settings.zoomLevel.get();
- if (this._zoomLevel)
- this._requestZoom();
- WebInspector.CSSCompletions.requestCSSNameCompletions();
- this._createPanels();
- this._createGlobalStatusBarItems();
- this.toolbar = new WebInspector.Toolbar();
- WebInspector._installDockToRight();
- for (var panelName in this.panels)
- this.addPanel(this.panels[panelName]);
- this.addMainEventListeners(document);
- window.addEventListener("resize", this.windowResize.bind(this), true);
- var errorWarningCount = document.getElementById("error-warning-count");
- errorWarningCount.addEventListener("click", this.showConsole.bind(this), false);
- this._updateErrorAndWarningCounts();
- var autoselectPanel = WebInspector.UIString("a panel chosen automatically");
- var openAnchorLocationSetting = WebInspector.settings.createSetting("openLinkHandler", autoselectPanel);
- this.openAnchorLocationRegistry = new WebInspector.HandlerRegistry(openAnchorLocationSetting);
- this.openAnchorLocationRegistry.registerHandler(autoselectPanel, function() { return false; });
- this.extensionServer.initExtensions();
- this.console.enableAgent();
- function showInitialPanel()
- {
- if (!WebInspector.inspectorView.currentPanel())
- WebInspector.showPanel(WebInspector.settings.lastActivePanel.get());
- }
- InspectorAgent.enable(showInitialPanel);
- DatabaseAgent.enable();
- DOMStorageAgent.enable();
- if (WebInspector.settings.showPaintRects.get())
- PageAgent.setShowPaintRects(true);
- if (WebInspector.settings.javaScriptDisabled.get())
- PageAgent.setScriptExecutionDisabled(true);
- this.domAgent._emulateTouchEventsChanged();
- WebInspector.WorkerManager.loadCompleted();
- InspectorFrontendAPI.loadCompleted();
- }
- WebInspector._installDockToRight = function()
- {
- WebInspector.settings.dockToRight.set(WebInspector.queryParamsObject.dockSide === "right");
- if (WebInspector.settings.dockToRight.get())
- document.body.addStyleClass("dock-to-right");
- if (WebInspector.attached)
- WebInspector._setCompactMode(!WebInspector.settings.dockToRight.get());
- WebInspector.settings.dockToRight.addChangeListener(listener.bind(this));
- function listener(event)
- {
- var value = WebInspector.settings.dockToRight.get();
- if (value) {
- InspectorFrontendHost.requestSetDockSide("right");
- document.body.addStyleClass("dock-to-right");
- } else {
- InspectorFrontendHost.requestSetDockSide("bottom");
- document.body.removeStyleClass("dock-to-right");
- }
- if (WebInspector.attached)
- WebInspector._setCompactMode(!value);
- }
- }
- WebInspector.addPanel = function(panel)
- {
- WebInspector.inspectorView.addPanel(panel);
- }
- var windowLoaded = function()
- {
- var localizedStringsURL = InspectorFrontendHost.localizedStringsURL();
- if (localizedStringsURL) {
- var localizedStringsScriptElement = document.createElement("script");
- localizedStringsScriptElement.addEventListener("load", WebInspector.loaded.bind(WebInspector), false);
- localizedStringsScriptElement.type = "text/javascript";
- localizedStringsScriptElement.src = localizedStringsURL;
- document.head.appendChild(localizedStringsScriptElement);
- } else
- WebInspector.loaded();
- WebInspector.setAttachedWindow(WebInspector.queryParamsObject.docked === "true");
- window.removeEventListener("DOMContentLoaded", windowLoaded, false);
- delete windowLoaded;
- };
- window.addEventListener("DOMContentLoaded", windowLoaded, false);
- var messagesToDispatch = [];
- WebInspector.dispatchQueueIsEmpty = function() {
- return messagesToDispatch.length == 0;
- }
- WebInspector.dispatch = function(message) {
- messagesToDispatch.push(message);
- setTimeout(function() {
- InspectorBackend.dispatch(messagesToDispatch.shift());
- }, 0);
- }
- WebInspector.dispatchMessageFromBackend = function(messageObject)
- {
- WebInspector.dispatch(messageObject);
- }
- WebInspector.windowResize = function(event)
- {
- WebInspector.inspectorView.doResize();
- WebInspector.drawer.resize();
- WebInspector.toolbar.resize();
- }
- WebInspector.setAttachedWindow = function(attached)
- {
- this.attached = attached;
- WebInspector.updateDockToggleButton();
- }
- WebInspector.setDockingUnavailable = function(unavailable)
- {
- this._isDockingUnavailable = unavailable;
- WebInspector.updateDockToggleButton();
- }
- WebInspector.updateDockToggleButton = function()
- {
- if (!this._dockToggleButton)
- return;
- this._dockToggleButton.disabled = this.attached ? false : this._isDockingUnavailable;
- }
- WebInspector.close = function(event)
- {
- if (this._isClosing)
- return;
- this._isClosing = true;
- this.notifications.dispatchEventToListeners(WebInspector.Events.InspectorClosing);
- InspectorFrontendHost.closeWindow();
- }
- WebInspector.documentClick = function(event)
- {
- var anchor = event.target.enclosingNodeOrSelfWithNodeName("a");
- if (!anchor || anchor.target === "_blank")
- return;
- event.consume(true);
- function followLink()
- {
- if (WebInspector.isBeingEdited(event.target) || WebInspector._showAnchorLocation(anchor))
- return;
- const profileMatch = WebInspector.ProfileType.URLRegExp.exec(anchor.href);
- if (profileMatch) {
- WebInspector.showProfileForURL(anchor.href);
- return;
- }
- var parsedURL = anchor.href.asParsedURL();
- if (parsedURL && parsedURL.scheme === "webkit-link-action") {
- if (parsedURL.host === "show-panel") {
- var panel = parsedURL.path.substring(1);
- if (WebInspector.panels[panel])
- WebInspector.showPanel(panel);
- }
- return;
- }
- WebInspector.showPanel("resources");
- }
- if (WebInspector.followLinkTimeout)
- clearTimeout(WebInspector.followLinkTimeout);
- if (anchor.preventFollowOnDoubleClick) {
- if (event.detail === 1)
- WebInspector.followLinkTimeout = setTimeout(followLink, 333);
- return;
- }
- followLink();
- }
- WebInspector.openResource = function(resourceURL, inResourcesPanel)
- {
- var resource = WebInspector.resourceForURL(resourceURL);
- if (inResourcesPanel && resource) {
- WebInspector.showPanel("resources");
- WebInspector.panels.resources.showResource(resource);
- } else
- InspectorFrontendHost.openInNewTab(resourceURL);
- }
- WebInspector.openRequestInNetworkPanel = function(request)
- {
- WebInspector.showPanel("network");
- WebInspector.panels.network.revealAndHighlightRequest(request);
- }
- WebInspector._registerShortcuts = function()
- {
- var shortcut = WebInspector.KeyboardShortcut;
- var section = WebInspector.shortcutsScreen.section(WebInspector.UIString("All Panels"));
- var keys = [
- shortcut.shortcutToString("]", shortcut.Modifiers.CtrlOrMeta),
- shortcut.shortcutToString("[", shortcut.Modifiers.CtrlOrMeta)
- ];
- section.addRelatedKeys(keys, WebInspector.UIString("Go to the panel to the left/right"));
- var keys = [
- shortcut.shortcutToString("[", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Alt),
- shortcut.shortcutToString("]", shortcut.Modifiers.CtrlOrMeta | shortcut.Modifiers.Alt)
- ];
- section.addRelatedKeys(keys, WebInspector.UIString("Go back/forward in panel history"));
- section.addKey(shortcut.shortcutToString(shortcut.Keys.Esc), WebInspector.UIString("Toggle console"));
- section.addKey(shortcut.shortcutToString("f", shortcut.Modifiers.CtrlOrMeta), WebInspector.UIString("Search"));
- var advancedSearchShortcut = WebInspector.AdvancedSearchController.createShortcut();
- section.addKey(advancedSearchShortcut.name, WebInspector.UIString("Search across all sources"));
- if (WebInspector.isMac()) {
- keys = [
- shortcut.shortcutToString("g", shortcut.Modifiers.Meta),
- shortcut.shortcutToString("g", shortcut.Modifiers.Meta | shortcut.Modifiers.Shift)
- ];
- section.addRelatedKeys(keys, WebInspector.UIString("Find next/previous"));
- }
- var goToShortcut = WebInspector.GoToLineDialog.createShortcut();
- section.addKey(goToShortcut.name, WebInspector.UIString("Go to line"));
- }
- WebInspector.documentKeyDown = function(event)
- {
- const helpKey = WebInspector.isMac() ? "U+003F" : "U+00BF";
- if (event.keyIdentifier === "F1" ||
- (event.keyIdentifier === helpKey && event.shiftKey && (!WebInspector.isBeingEdited(event.target) || event.metaKey))) {
- WebInspector.shortcutsScreen.showModal();
- event.consume(true);
- return;
- }
- if (WebInspector.currentFocusElement() && WebInspector.currentFocusElement().handleKeyEvent) {
- WebInspector.currentFocusElement().handleKeyEvent(event);
- if (event.handled) {
- event.consume(true);
- return;
- }
- }
- if (WebInspector.inspectorView.currentPanel()) {
- WebInspector.inspectorView.currentPanel().handleShortcut(event);
- if (event.handled) {
- event.consume(true);
- return;
- }
- }
- WebInspector.searchController.handleShortcut(event);
- WebInspector.advancedSearchController.handleShortcut(event);
- if (event.handled) {
- event.consume(true);
- return;
- }
- var isMac = WebInspector.isMac();
- switch (event.keyIdentifier) {
- case "U+0052":
- if ((event.metaKey && isMac) || (event.ctrlKey && !isMac)) {
- PageAgent.reload(event.shiftKey);
- event.consume(true);
- }
- break;
- case "F5":
- if (!isMac) {
- PageAgent.reload(event.ctrlKey || event.shiftKey);
- event.consume(true);
- }
- break;
- }
- var isValidZoomShortcut = WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event) &&
- !event.shiftKey &&
- !event.altKey &&
- !InspectorFrontendHost.isStub;
- switch (event.keyCode) {
- case 107:
- case 187:
- if (isValidZoomShortcut) {
- WebInspector._zoomIn();
- event.consume(true);
- }
- break;
- case 109:
- case 189:
- if (isValidZoomShortcut) {
- WebInspector._zoomOut();
- event.consume(true);
- }
- break;
- case 48:
- if (isValidZoomShortcut) {
- WebInspector._resetZoom();
- event.consume(true);
- }
- break;
- }
- }
- WebInspector.postDocumentKeyDown = function(event)
- {
- if (event.handled)
- return;
- if (event.keyIdentifier === "U+001B") {
- if (!this._toggleConsoleButton.toggled && WebInspector.drawer.visible)
- this.closeDrawerView();
- else
- this._toggleConsoleButtonClicked();
- }
- }
- WebInspector.documentCanCopy = function(event)
- {
- if (WebInspector.inspectorView.currentPanel() && WebInspector.inspectorView.currentPanel().handleCopyEvent)
- event.preventDefault();
- }
- WebInspector.documentCopy = function(event)
- {
- if (WebInspector.inspectorView.currentPanel() && WebInspector.inspectorView.currentPanel().handleCopyEvent)
- WebInspector.inspectorView.currentPanel().handleCopyEvent(event);
- WebInspector.documentCopyEventFired(event);
- }
- WebInspector.documentCopyEventFired = function(event)
- {
- }
- WebInspector.contextMenuEventFired = function(event)
- {
- if (event.handled || event.target.hasStyleClass("popup-glasspane"))
- event.preventDefault();
- }
- WebInspector.toggleSearchingForNode = function()
- {
- if (this.panels.elements) {
- this.showPanel("elements");
- this.panels.elements.toggleSearchingForNode();
- }
- }
- WebInspector.showConsole = function()
- {
- if (WebInspector._toggleConsoleButton && !WebInspector._toggleConsoleButton.toggled)
- WebInspector._toggleConsoleButtonClicked();
- }
- WebInspector.showPanel = function(panel)
- {
- if (!(panel in this.panels)) {
- if (WebInspector.WorkerManager.isWorkerFrontend())
- panel = "scripts";
- else
- panel = "elements";
- }
- WebInspector.inspectorView.setCurrentPanel(this.panels[panel]);
- }
- WebInspector.bringToFront = function()
- {
- InspectorFrontendHost.bringToFront();
- }
- WebInspector.didCreateWorker = function()
- {
- var workersPane = WebInspector.panels.scripts.sidebarPanes.workers;
- if (workersPane)
- workersPane.addWorker.apply(workersPane, arguments);
- }
- WebInspector.didDestroyWorker = function()
- {
- var workersPane = WebInspector.panels.scripts.sidebarPanes.workers;
- if (workersPane)
- workersPane.removeWorker.apply(workersPane, arguments);
- }
- WebInspector.log = function(message, messageLevel, showConsole)
- {
- var self = this;
- function isLogAvailable()
- {
- return WebInspector.ConsoleMessage && WebInspector.RemoteObject && self.console;
- }
- function flushQueue()
- {
- var queued = WebInspector.log.queued;
- if (!queued)
- return;
- for (var i = 0; i < queued.length; ++i)
- logMessage(queued[i]);
- delete WebInspector.log.queued;
- }
- function flushQueueIfAvailable()
- {
- if (!isLogAvailable())
- return;
- clearInterval(WebInspector.log.interval);
- delete WebInspector.log.interval;
- flushQueue();
- }
- function logMessage(message)
- {
- var msg = WebInspector.ConsoleMessage.create(
- WebInspector.ConsoleMessage.MessageSource.Other,
- messageLevel || WebInspector.ConsoleMessage.MessageLevel.Debug,
- message);
- self.console.addMessage(msg);
- if (showConsole)
- WebInspector.showConsole();
- }
- if (!isLogAvailable()) {
- if (!WebInspector.log.queued)
- WebInspector.log.queued = [];
- WebInspector.log.queued.push(message);
- if (!WebInspector.log.interval)
- WebInspector.log.interval = setInterval(flushQueueIfAvailable, 1000);
- return;
- }
- flushQueue();
- logMessage(message);
- }
- WebInspector.inspect = function(payload, hints)
- {
- var object = WebInspector.RemoteObject.fromPayload(payload);
- if (object.subtype === "node") {
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.elements);
- object.pushNodeToFrontend(WebInspector.updateFocusedNode.bind(WebInspector), object.release.bind(object));
- return;
- }
- if (hints.databaseId) {
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.resources);
- WebInspector.panels.resources.selectDatabase(hints.databaseId);
- } else if (hints.domStorageId) {
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.resources);
- WebInspector.panels.resources.selectDOMStorage(hints.domStorageId);
- }
- object.release();
- }
- WebInspector.updateFocusedNode = function(nodeId)
- {
- this.panels.elements.revealAndSelectNode(nodeId);
- }
- WebInspector.populateResourceContextMenu = function(contextMenu, url, preferredLineNumber)
- {
- var registry = WebInspector.openAnchorLocationRegistry;
- for (var i = 1; i < registry.handlerNames.length; ++i) {
- var handler = registry.handlerNames[i];
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Open using %s" : "Open Using %s", handler),
- registry.dispatchToHandler.bind(registry, handler, { url: url, preferredLineNumber: preferredLineNumber }));
- }
- }
- WebInspector._showAnchorLocation = function(anchor)
- {
- if (WebInspector.openAnchorLocationRegistry.dispatch({ url: anchor.href, lineNumber: anchor.lineNumber}))
- return true;
- var preferedPanel = this.panels[anchor.preferredPanel || "resources"];
- if (WebInspector._showAnchorLocationInPanel(anchor, preferedPanel))
- return true;
- if (preferedPanel !== this.panels.resources && WebInspector._showAnchorLocationInPanel(anchor, this.panels.resources))
- return true;
- return false;
- }
- WebInspector._showAnchorLocationInPanel = function(anchor, panel)
- {
- if (!panel || !panel.canShowAnchorLocation(anchor))
- return false;
- if (anchor.hasStyleClass("webkit-html-external-link")) {
- anchor.removeStyleClass("webkit-html-external-link");
- anchor.addStyleClass("webkit-html-resource-link");
- }
- this.showPanelForAnchorNavigation(panel);
- panel.showAnchorLocation(anchor);
- return true;
- }
- WebInspector.showPanelForAnchorNavigation = function(panel)
- {
- WebInspector.searchController.disableSearchUntilExplicitAction();
- WebInspector.inspectorView.setCurrentPanel(panel);
- }
- WebInspector.showProfileForURL = function(url)
- {
- WebInspector.showPanel("profiles");
- WebInspector.panels.profiles.showProfileForURL(url);
- }
- WebInspector.evaluateInConsole = function(expression, showResultOnly)
- {
- this.showConsole();
- this.consoleView.evaluateUsingTextPrompt(expression, showResultOnly);
- }
- WebInspector.addMainEventListeners = function(doc)
- {
- doc.addEventListener("keydown", this.documentKeyDown.bind(this), true);
- doc.addEventListener("keydown", this.postDocumentKeyDown.bind(this), false);
- doc.addEventListener("beforecopy", this.documentCanCopy.bind(this), true);
- doc.addEventListener("copy", this.documentCopy.bind(this), true);
- doc.addEventListener("contextmenu", this.contextMenuEventFired.bind(this), true);
- doc.addEventListener("click", this.documentClick.bind(this), true);
- }
- WebInspector.frontendReused = function()
- {
- this.resourceTreeModel.frontendReused();
- }
- WebInspector._toolbarItemClicked = function(event)
- {
- var toolbarItem = event.currentTarget;
- WebInspector.inspectorView.setCurrentPanel(toolbarItem.panel);
- }
- WebInspector.elementDragStart = function(element, dividerDrag, elementDragEnd, event, cursor)
- {
- if (WebInspector._elementDraggingEventListener || WebInspector._elementEndDraggingEventListener)
- WebInspector.elementDragEnd(event);
- if (element) {
- if (WebInspector._elementDraggingGlassPane)
- WebInspector._elementDraggingGlassPane.parentElement.removeChild(WebInspector._elementDraggingGlassPane);
- var glassPane = document.createElement("div");
- glassPane.style.cssText = "position:absolute;top:0;bottom:0;left:0;right:0;opacity:0;z-index:1";
- glassPane.id = "glass-pane-for-drag";
- element.ownerDocument.body.appendChild(glassPane);
- WebInspector._elementDraggingGlassPane = glassPane;
- }
- WebInspector._elementDraggingEventListener = dividerDrag;
- WebInspector._elementEndDraggingEventListener = elementDragEnd;
- var targetDocument = event.target.ownerDocument;
- targetDocument.addEventListener("mousemove", dividerDrag, true);
- targetDocument.addEventListener("mouseup", elementDragEnd, true);
- targetDocument.body.style.cursor = cursor;
- event.preventDefault();
- }
- WebInspector.elementDragEnd = function(event)
- {
- var targetDocument = event.target.ownerDocument;
- targetDocument.removeEventListener("mousemove", WebInspector._elementDraggingEventListener, true);
- targetDocument.removeEventListener("mouseup", WebInspector._elementEndDraggingEventListener, true);
- targetDocument.body.style.removeProperty("cursor");
- if (WebInspector._elementDraggingGlassPane)
- WebInspector._elementDraggingGlassPane.parentElement.removeChild(WebInspector._elementDraggingGlassPane);
- delete WebInspector._elementDraggingGlassPane;
- delete WebInspector._elementDraggingEventListener;
- delete WebInspector._elementEndDraggingEventListener;
- event.preventDefault();
- }
- WebInspector.animateStyle = function(animations, duration, callback)
- {
- var interval;
- var complete = 0;
- var hasCompleted = false;
- const intervalDuration = (1000 / 30);
- const animationsLength = animations.length;
- const propertyUnit = {opacity: ""};
- const defaultUnit = "px";
- function cubicInOut(t, b, c, d)
- {
- if ((t/=d/2) < 1) return c/2*t*t*t + b;
- return c/2*((t-=2)*t*t + 2) + b;
- }
- for (var i = 0; i < animationsLength; ++i) {
- var animation = animations[i];
- var element = null, start = null, end = null, key = null;
- for (key in animation) {
- if (key === "element")
- element = animation[key];
- else if (key === "start")
- start = animation[key];
- else if (key === "end")
- end = animation[key];
- }
- if (!element || !end)
- continue;
- if (!start) {
- var computedStyle = element.ownerDocument.defaultView.getComputedStyle(element);
- start = {};
- for (key in end)
- start[key] = parseInt(computedStyle.getPropertyValue(key), 10);
- animation.start = start;
- } else
- for (key in start)
- element.style.setProperty(key, start[key] + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
- }
- function animateLoop()
- {
- if (hasCompleted)
- return;
- complete += intervalDuration;
- var next = complete + intervalDuration;
- for (var i = 0; i < animationsLength; ++i) {
- var animation = animations[i];
- var element = animation.element;
- var start = animation.start;
- var end = animation.end;
- if (!element || !end)
- continue;
- var style = element.style;
- for (key in end) {
- var endValue = end[key];
- if (next < duration) {
- var startValue = start[key];
- var newValue = cubicInOut(complete, startValue, endValue - startValue, duration);
- style.setProperty(key, newValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
- } else
- style.setProperty(key, endValue + (key in propertyUnit ? propertyUnit[key] : defaultUnit));
- }
- }
- if (complete >= duration) {
- hasCompleted = true;
- clearInterval(interval);
- if (callback)
- callback();
- }
- }
- function forceComplete()
- {
- if (hasCompleted)
- return;
- complete = duration;
- animateLoop();
- }
- function cancel()
- {
- hasCompleted = true;
- clearInterval(interval);
- }
- interval = setInterval(animateLoop, intervalDuration);
- return {
- cancel: cancel,
- forceComplete: forceComplete
- };
- }
- WebInspector.isBeingEdited = function(element)
- {
- if (element.hasStyleClass("text-prompt") || element.nodeName === "INPUT")
- return true;
- if (!WebInspector.__editingCount)
- return false;
- while (element) {
- if (element.__editing)
- return true;
- element = element.parentElement;
- }
- return false;
- }
- WebInspector.markBeingEdited = function(element, value)
- {
- if (value) {
- if (element.__editing)
- return false;
- element.__editing = true;
- WebInspector.__editingCount = (WebInspector.__editingCount || 0) + 1;
- } else {
- if (!element.__editing)
- return false;
- delete element.__editing;
- --WebInspector.__editingCount;
- }
- return true;
- }
- WebInspector.EditingConfig = function(commitHandler, cancelHandler, context)
- {
- this.commitHandler = commitHandler;
- this.cancelHandler = cancelHandler
- this.context = context;
- this.pasteHandler;
- this.multiline;
- this.customFinishHandler;
- }
- WebInspector.EditingConfig.prototype = {
- setPasteHandler: function(pasteHandler)
- {
- this.pasteHandler = pasteHandler;
- },
- setMultiline: function(multiline)
- {
- this.multiline = multiline;
- },
- setCustomFinishHandler: function(customFinishHandler)
- {
- this.customFinishHandler = customFinishHandler;
- }
- }
- WebInspector.startEditing = function(element, config)
- {
- if (!WebInspector.markBeingEdited(element, true))
- return null;
- config = config || new WebInspector.EditingConfig(function() {}, function() {});
- var committedCallback = config.commitHandler;
- var cancelledCallback = config.cancelHandler;
- var pasteCallback = config.pasteHandler;
- var context = config.context;
- var oldText = getContent(element);
- var moveDirection = "";
- element.addStyleClass("editing");
- var oldTabIndex = element.getAttribute("tabIndex");
- if (typeof oldTabIndex !== "number" || oldTabIndex < 0)
- element.tabIndex = 0;
- function blurEventListener() {
- editingCommitted.call(element);
- }
- function getContent(element) {
- if (element.tagName === "INPUT" && element.type === "text")
- return element.value;
- else
- return element.textContent;
- }
- function cleanUpAfterEditing()
- {
- WebInspector.markBeingEdited(element, false);
- this.removeStyleClass("editing");
- if (typeof oldTabIndex !== "number")
- element.removeAttribute("tabIndex");
- else
- this.tabIndex = oldTabIndex;
- this.scrollTop = 0;
- this.scrollLeft = 0;
- element.removeEventListener("blur", blurEventListener, false);
- element.removeEventListener("keydown", keyDownEventListener, true);
- if (pasteCallback)
- element.removeEventListener("paste", pasteEventListener, true);
- WebInspector.restoreFocusFromElement(element);
- }
- function editingCancelled()
- {
- if (this.tagName === "INPUT" && this.type === "text")
- this.value = oldText;
- else
- this.textContent = oldText;
- cleanUpAfterEditing.call(this);
- cancelledCallback(this, context);
- }
- function editingCommitted()
- {
- cleanUpAfterEditing.call(this);
- committedCallback(this, getContent(this), oldText, context, moveDirection);
- }
- function defaultFinishHandler(event)
- {
- var isMetaOrCtrl = WebInspector.isMac() ?
- event.metaKey && !event.shiftKey && !event.ctrlKey && !event.altKey :
- event.ctrlKey && !event.shiftKey && !event.metaKey && !event.altKey;
- if (isEnterKey(event) && (event.isMetaOrCtrlForTest || !config.multiline || isMetaOrCtrl))
- return "commit";
- else if (event.keyCode === WebInspector.KeyboardShortcut.Keys.Esc.code || event.keyIdentifier === "U+001B")
- return "cancel";
- else if (event.keyIdentifier === "U+0009")
- return "move-" + (event.shiftKey ? "backward" : "forward");
- }
- function handleEditingResult(result, event)
- {
- if (result === "commit") {
- editingCommitted.call(element);
- event.consume(true);
- } else if (result === "cancel") {
- editingCancelled.call(element);
- event.consume(true);
- } else if (result && result.startsWith("move-")) {
- moveDirection = result.substring(5);
- if (event.keyIdentifier !== "U+0009")
- blurEventListener();
- }
- }
- function pasteEventListener(event)
- {
- var result = pasteCallback(event);
- handleEditingResult(result, event);
- }
- function keyDownEventListener(event)
- {
- var handler = config.customFinishHandler || defaultFinishHandler;
- var result = handler(event);
- handleEditingResult(result, event);
- }
- element.addEventListener("blur", blurEventListener, false);
- element.addEventListener("keydown", keyDownEventListener, true);
- if (pasteCallback)
- element.addEventListener("paste", pasteEventListener, true);
- WebInspector.setCurrentFocusElement(element);
- return {
- cancel: editingCancelled.bind(element),
- commit: editingCommitted.bind(element)
- };
- }
- Number.secondsToString = function(seconds, higherResolution)
- {
- if (seconds === 0)
- return "0";
- var ms = seconds * 1000;
- if (higherResolution && ms < 1000)
- return WebInspector.UIString("%.3fms", ms);
- else if (ms < 1000)
- return WebInspector.UIString("%.0fms", ms);
- if (seconds < 60)
- return WebInspector.UIString("%.2fs", seconds);
- var minutes = seconds / 60;
- if (minutes < 60)
- return WebInspector.UIString("%.1fmin", minutes);
- var hours = minutes / 60;
- if (hours < 24)
- return WebInspector.UIString("%.1fhrs", hours);
- var days = hours / 24;
- return WebInspector.UIString("%.1f days", days);
- }
- Number.bytesToString = function(bytes, higherResolution)
- {
- if (typeof higherResolution === "undefined")
- higherResolution = true;
- if (bytes < 1024)
- return WebInspector.UIString("%.0fB", bytes);
- var kilobytes = bytes / 1024;
- if (higherResolution && kilobytes < 1024)
- return WebInspector.UIString("%.2fKB", kilobytes);
- else if (kilobytes < 1024)
- return WebInspector.UIString("%.0fKB", kilobytes);
- var megabytes = kilobytes / 1024;
- if (higherResolution)
- return WebInspector.UIString("%.2fMB", megabytes);
- else
- return WebInspector.UIString("%.0fMB", megabytes);
- }
- Number.withThousandsSeparator = function(num)
- {
- var str = num + "";
- var re = /(\d+)(\d{3})/;
- while (str.match(re))
- str = str.replace(re, "$1\u2009$2");
- return str;
- }
- WebInspector._missingLocalizedStrings = {};
- WebInspector.UIString = function(string, vararg)
- {
- if (Preferences.localizeUI) {
- if (window.localizedStrings && string in window.localizedStrings)
- string = window.localizedStrings[string];
- else {
- if (!(string in WebInspector._missingLocalizedStrings)) {
- console.warn("Localized string \"" + string + "\" not found.");
- WebInspector._missingLocalizedStrings[string] = true;
- }
- if (Preferences.showMissingLocalizedStrings)
- string += " (not localized)";
- }
- }
- return String.vsprintf(string, Array.prototype.slice.call(arguments, 1));
- }
- WebInspector.useLowerCaseMenuTitles = function()
- {
- return WebInspector.platform() === "windows" && Preferences.useLowerCaseMenuTitlesOnWindows;
- }
- WebInspector.formatLocalized = function(format, substitutions, formatters, initialValue, append)
- {
- return String.format(WebInspector.UIString(format), substitutions, formatters, initialValue, append);
- }
- WebInspector.openLinkExternallyLabel = function()
- {
- return WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Open link in new tab" : "Open Link in New Tab");
- }
- WebInspector.openInNetworkPanelLabel = function()
- {
- return WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Open in network panel" : "Open in Network Panel");
- }
- WebInspector.copyLinkAddressLabel = function()
- {
- return WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Copy link address" : "Copy Link Address");
- }
- WebInspector.platform = function()
- {
- if (!WebInspector._platform)
- WebInspector._platform = InspectorFrontendHost.platform();
- return WebInspector._platform;
- }
- WebInspector.isMac = function()
- {
- if (typeof WebInspector._isMac === "undefined")
- WebInspector._isMac = WebInspector.platform() === "mac";
- return WebInspector._isMac;
- }
- WebInspector.PlatformFlavor = {
- WindowsVista: "windows-vista",
- MacTiger: "mac-tiger",
- MacLeopard: "mac-leopard",
- MacSnowLeopard: "mac-snowleopard"
- }
- WebInspector.platformFlavor = function()
- {
- function detectFlavor()
- {
- const userAgent = navigator.userAgent;
- if (WebInspector.platform() === "windows") {
- var match = userAgent.match(/Windows NT (\d+)\.(?:\d+)/);
- if (match && match[1] >= 6)
- return WebInspector.PlatformFlavor.WindowsVista;
- return null;
- } else if (WebInspector.platform() === "mac") {
- var match = userAgent.match(/Mac OS X\s*(?:(\d+)_(\d+))?/);
- if (!match || match[1] != 10)
- return WebInspector.PlatformFlavor.MacSnowLeopard;
- switch (Number(match[2])) {
- case 4:
- return WebInspector.PlatformFlavor.MacTiger;
- case 5:
- return WebInspector.PlatformFlavor.MacLeopard;
- case 6:
- default:
- return WebInspector.PlatformFlavor.MacSnowLeopard;
- }
- }
- }
- if (!WebInspector._platformFlavor)
- WebInspector._platformFlavor = detectFlavor();
- return WebInspector._platformFlavor;
- }
- WebInspector.port = function()
- {
- if (!WebInspector._port)
- WebInspector._port = InspectorFrontendHost.port();
- return WebInspector._port;
- }
- WebInspector.installPortStyles = function()
- {
- var platform = WebInspector.platform();
- document.body.addStyleClass("platform-" + platform);
- var flavor = WebInspector.platformFlavor();
- if (flavor)
- document.body.addStyleClass("platform-" + flavor);
- var port = WebInspector.port();
- document.body.addStyleClass("port-" + port);
- }
- WebInspector._windowFocused = function(event)
- {
- if (event.target.document.nodeType === Node.DOCUMENT_NODE)
- document.body.removeStyleClass("inactive");
- }
- WebInspector._windowBlurred = function(event)
- {
- if (event.target.document.nodeType === Node.DOCUMENT_NODE)
- document.body.addStyleClass("inactive");
- }
- WebInspector.previousFocusElement = function()
- {
- return WebInspector._previousFocusElement;
- }
- WebInspector.currentFocusElement = function()
- {
- return WebInspector._currentFocusElement;
- }
- WebInspector._focusChanged = function(event)
- {
- WebInspector.setCurrentFocusElement(event.target);
- }
- WebInspector._textInputTypes = ["text", "search", "tel", "url", "email", "password"].keySet();
- WebInspector._isTextEditingElement = function(element)
- {
- if (element instanceof HTMLInputElement)
- return element.type in WebInspector._textInputTypes;
- if (element instanceof HTMLTextAreaElement)
- return true;
- return false;
- }
- WebInspector.setCurrentFocusElement = function(x)
- {
- if (WebInspector._currentFocusElement !== x)
- WebInspector._previousFocusElement = WebInspector._currentFocusElement;
- WebInspector._currentFocusElement = x;
- if (WebInspector._currentFocusElement) {
- WebInspector._currentFocusElement.focus();
- var selection = window.getSelection();
- if (!WebInspector._isTextEditingElement(WebInspector._currentFocusElement) && selection.isCollapsed && !WebInspector._currentFocusElement.isInsertionCaretInside()) {
- var selectionRange = WebInspector._currentFocusElement.ownerDocument.createRange();
- selectionRange.setStart(WebInspector._currentFocusElement, 0);
- selectionRange.setEnd(WebInspector._currentFocusElement, 0);
- selection.removeAllRanges();
- selection.addRange(selectionRange);
- }
- } else if (WebInspector._previousFocusElement)
- WebInspector._previousFocusElement.blur();
- }
- WebInspector.restoreFocusFromElement = function(element)
- {
- if (element && element.isSelfOrAncestor(WebInspector.currentFocusElement()))
- WebInspector.setCurrentFocusElement(WebInspector.previousFocusElement());
- }
- WebInspector.setToolbarColors = function(backgroundColor, color)
- {
- if (!WebInspector._themeStyleElement) {
- WebInspector._themeStyleElement = document.createElement("style");
- document.head.appendChild(WebInspector._themeStyleElement);
- }
- WebInspector._themeStyleElement.textContent =
- "#toolbar {\
- background-image: none !important;\
- background-color: " + backgroundColor + " !important;\
- }\
- \
- .toolbar-label {\
- color: " + color + " !important;\
- text-shadow: none;\
- }";
- }
- WebInspector.resetToolbarColors = function()
- {
- if (WebInspector._themeStyleElement)
- WebInspector._themeStyleElement.textContent = "";
- }
- WebInspector.highlightSearchResult = function(element, offset, length, domChanges)
- {
- var result = WebInspector.highlightSearchResults(element, [{offset: offset, length: length }], domChanges);
- return result.length ? result[0] : null;
- }
- WebInspector.highlightSearchResults = function(element, resultRanges, changes)
- {
- return WebInspector.highlightRangesWithStyleClass(element, resultRanges, "webkit-search-result", changes);
- }
- WebInspector.highlightRangesWithStyleClass = function(element, resultRanges, styleClass, changes)
- {
- changes = changes || [];
- var highlightNodes = [];
- var lineText = element.textContent;
- var ownerDocument = element.ownerDocument;
- var textNodeSnapshot = ownerDocument.evaluate(".//text()", element, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
- var snapshotLength = textNodeSnapshot.snapshotLength;
- if (snapshotLength === 0)
- return highlightNodes;
- var nodeRanges = [];
- var rangeEndOffset = 0;
- for (var i = 0; i < snapshotLength; ++i) {
- var range = {};
- range.offset = rangeEndOffset;
- range.length = textNodeSnapshot.snapshotItem(i).textContent.length;
- rangeEndOffset = range.offset + range.length;
- nodeRanges.push(range);
- }
- var startIndex = 0;
- for (var i = 0; i < resultRanges.length; ++i) {
- var startOffset = resultRanges[i].offset;
- var endOffset = startOffset + resultRanges[i].length;
- while (startIndex < snapshotLength && nodeRanges[startIndex].offset + nodeRanges[startIndex].length <= startOffset)
- startIndex++;
- var endIndex = startIndex;
- while (endIndex < snapshotLength && nodeRanges[endIndex].offset + nodeRanges[endIndex].length < endOffset)
- endIndex++;
- if (endIndex === snapshotLength)
- break;
- var highlightNode = ownerDocument.createElement("span");
- highlightNode.className = styleClass;
- highlightNode.textContent = lineText.substring(startOffset, endOffset);
- var lastTextNode = textNodeSnapshot.snapshotItem(endIndex);
- var lastText = lastTextNode.textContent;
- lastTextNode.textContent = lastText.substring(endOffset - nodeRanges[endIndex].offset);
- changes.push({ node: lastTextNode, type: "changed", oldText: lastText, newText: lastTextNode.textContent });
- if (startIndex === endIndex) {
- lastTextNode.parentElement.insertBefore(highlightNode, lastTextNode);
- changes.push({ node: highlightNode, type: "added", nextSibling: lastTextNode, parent: lastTextNode.parentElement });
- highlightNodes.push(highlightNode);
- var prefixNode = ownerDocument.createTextNode(lastText.substring(0, startOffset - nodeRanges[startIndex].offset));
- lastTextNode.parentElement.insertBefore(prefixNode, highlightNode);
- changes.push({ node: prefixNode, type: "added", nextSibling: highlightNode, parent: lastTextNode.parentElement });
- } else {
- var firstTextNode = textNodeSnapshot.snapshotItem(startIndex);
- var firstText = firstTextNode.textContent;
- var anchorElement = firstTextNode.nextSibling;
- firstTextNode.parentElement.insertBefore(highlightNode, anchorElement);
- changes.push({ node: highlightNode, type: "added", nextSibling: anchorElement, parent: firstTextNode.parentElement });
- highlightNodes.push(highlightNode);
- firstTextNode.textContent = firstText.substring(0, startOffset - nodeRanges[startIndex].offset);
- changes.push({ node: firstTextNode, type: "changed", oldText: firstText, newText: firstTextNode.textContent });
- for (var j = startIndex + 1; j < endIndex; j++) {
- var textNode = textNodeSnapshot.snapshotItem(j);
- var text = textNode.textContent;
- textNode.textContent = "";
- changes.push({ node: textNode, type: "changed", oldText: text, newText: textNode.textContent });
- }
- }
- startIndex = endIndex;
- nodeRanges[startIndex].offset = endOffset;
- nodeRanges[startIndex].length = lastTextNode.textContent.length;
- }
- return highlightNodes;
- }
- WebInspector.applyDomChanges = function(domChanges)
- {
- for (var i = 0, size = domChanges.length; i < size; ++i) {
- var entry = domChanges[i];
- switch (entry.type) {
- case "added":
- entry.parent.insertBefore(entry.node, entry.nextSibling);
- break;
- case "changed":
- entry.node.textContent = entry.newText;
- break;
- }
- }
- }
- WebInspector.revertDomChanges = function(domChanges)
- {
- for (var i = domChanges.length - 1; i >= 0; --i) {
- var entry = domChanges[i];
- switch (entry.type) {
- case "added":
- if (entry.node.parentElement)
- entry.node.parentElement.removeChild(entry.node);
- break;
- case "changed":
- entry.node.textContent = entry.oldText;
- break;
- }
- }
- }
- WebInspector.populateHrefContextMenu = function(contextMenu, contextNode, event)
- {
- var anchorElement = event.target.enclosingNodeOrSelfWithClass("webkit-html-resource-link") || event.target.enclosingNodeOrSelfWithClass("webkit-html-external-link");
- if (!anchorElement)
- return false;
- var resourceURL = WebInspector.resourceURLForRelatedNode(contextNode, anchorElement.href);
- if (!resourceURL)
- return false;
- contextMenu.appendItem(WebInspector.openLinkExternallyLabel(), WebInspector.openResource.bind(WebInspector, resourceURL, false));
- if (WebInspector.resourceForURL(resourceURL))
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Open link in Resources panel" : "Open Link in Resources Panel"), WebInspector.openResource.bind(null, resourceURL, true));
- contextMenu.appendItem(WebInspector.copyLinkAddressLabel(), InspectorFrontendHost.copyText.bind(InspectorFrontendHost, resourceURL));
- return true;
- }
- ;(function() {
- function windowLoaded()
- {
- window.addEventListener("focus", WebInspector._windowFocused, false);
- window.addEventListener("blur", WebInspector._windowBlurred, false);
- document.addEventListener("focus", WebInspector._focusChanged.bind(this), true);
- window.removeEventListener("DOMContentLoaded", windowLoaded, false);
- }
- window.addEventListener("DOMContentLoaded", windowLoaded, false);
- })();
- function InspectorBackendClass()
- {
- this._lastCallbackId = 1;
- this._pendingResponsesCount = 0;
- this._callbacks = {};
- this._domainDispatchers = {};
- this._eventArgs = {};
- this._replyArgs = {};
- this.dumpInspectorTimeStats = false;
- this.dumpInspectorProtocolMessages = false;
- this._initialized = false;
- }
- InspectorBackendClass.prototype = {
- _wrap: function(callback, method)
- {
- var callbackId = this._lastCallbackId++;
- if (!callback)
- callback = function() {};
- this._callbacks[callbackId] = callback;
- callback.methodName = method;
- if (this.dumpInspectorTimeStats)
- callback.sendRequestTime = Date.now();
- return callbackId;
- },
- registerCommand: function(method, signature, replyArgs)
- {
- var domainAndMethod = method.split(".");
- var agentName = domainAndMethod[0] + "Agent";
- if (!window[agentName])
- window[agentName] = {};
- window[agentName][domainAndMethod[1]] = this._sendMessageToBackend.bind(this, method, signature);
- window[agentName][domainAndMethod[1]]["invoke"] = this._invoke.bind(this, method, signature);
- this._replyArgs[method] = replyArgs;
- this._initialized = true;
- },
- registerEvent: function(eventName, params)
- {
- this._eventArgs[eventName] = params;
- this._initialized = true;
- },
- _invoke: function(method, signature, args, callback)
- {
- this._wrapCallbackAndSendMessageObject(method, args, callback);
- },
- _sendMessageToBackend: function(method, signature, vararg)
- {
- var args = Array.prototype.slice.call(arguments, 2);
- var callback = (args.length && typeof args[args.length - 1] === "function") ? args.pop() : null;
- var params = {};
- var hasParams = false;
- for (var i = 0; i < signature.length; ++i) {
- var param = signature[i];
- var paramName = param["name"];
- var typeName = param["type"];
- var optionalFlag = param["optional"];
- if (!args.length && !optionalFlag) {
- console.error("Protocol Error: Invalid number of arguments for method '" + method + "' call. It must have the following arguments '" + JSON.stringify(signature) + "'.");
- return;
- }
- var value = args.shift();
- if (optionalFlag && typeof value === "undefined") {
- continue;
- }
- if (typeof value !== typeName) {
- console.error("Protocol Error: Invalid type of argument '" + paramName + "' for method '" + method + "' call. It must be '" + typeName + "' but it is '" + typeof value + "'.");
- return;
- }
- params[paramName] = value;
- hasParams = true;
- }
- if (args.length === 1 && !callback) {
- if (typeof args[0] !== "undefined") {
- console.error("Protocol Error: Optional callback argument for method '" + method + "' call must be a function but its type is '" + typeof args[0] + "'.");
- return;
- }
- }
- this._wrapCallbackAndSendMessageObject(method, hasParams ? params : null, callback);
- },
- _wrapCallbackAndSendMessageObject: function(method, params, callback)
- {
- var messageObject = {};
- messageObject.method = method;
- if (params)
- messageObject.params = params;
- messageObject.id = this._wrap(callback, method);
- if (this.dumpInspectorProtocolMessages)
- console.log("frontend: " + JSON.stringify(messageObject));
- ++this._pendingResponsesCount;
- this.sendMessageObjectToBackend(messageObject);
- },
- sendMessageObjectToBackend: function(messageObject)
- {
- var message = JSON.stringify(messageObject);
- InspectorFrontendHost.sendMessageToBackend(message);
- },
- registerDomainDispatcher: function(domain, dispatcher)
- {
- this._domainDispatchers[domain] = dispatcher;
- },
- dispatch: function(message)
- {
- if (this.dumpInspectorProtocolMessages)
- console.log("backend: " + ((typeof message === "string") ? message : JSON.stringify(message)));
- var messageObject = (typeof message === "string") ? JSON.parse(message) : message;
- if ("id" in messageObject) {
- if (messageObject.error) {
- if (messageObject.error.code !== -32000)
- this.reportProtocolError(messageObject);
- }
- var callback = this._callbacks[messageObject.id];
- if (callback) {
- var argumentsArray = [];
- if (messageObject.result) {
- var paramNames = this._replyArgs[callback.methodName];
- if (paramNames) {
- for (var i = 0; i < paramNames.length; ++i)
- argumentsArray.push(messageObject.result[paramNames[i]]);
- }
- }
- var processingStartTime;
- if (this.dumpInspectorTimeStats && callback.methodName)
- processingStartTime = Date.now();
- argumentsArray.unshift(messageObject.error ? messageObject.error.message : null);
- callback.apply(null, argumentsArray);
- --this._pendingResponsesCount;
- delete this._callbacks[messageObject.id];
- if (this.dumpInspectorTimeStats && callback.methodName)
- console.log("time-stats: " + callback.methodName + " = " + (processingStartTime - callback.sendRequestTime) + " + " + (Date.now() - processingStartTime));
- }
- if (this._scripts && !this._pendingResponsesCount)
- this.runAfterPendingDispatches();
- return;
- } else {
- var method = messageObject.method.split(".");
- var domainName = method[0];
- var functionName = method[1];
- if (!(domainName in this._domainDispatchers)) {
- console.error("Protocol Error: the message is for non-existing domain '" + domainName + "'");
- return;
- }
- var dispatcher = this._domainDispatchers[domainName];
- if (!(functionName in dispatcher)) {
- console.error("Protocol Error: Attempted to dispatch an unimplemented method '" + messageObject.method + "'");
- return;
- }
- if (!this._eventArgs[messageObject.method]) {
- console.error("Protocol Error: Attempted to dispatch an unspecified method '" + messageObject.method + "'");
- return;
- }
- var params = [];
- if (messageObject.params) {
- var paramNames = this._eventArgs[messageObject.method];
- for (var i = 0; i < paramNames.length; ++i)
- params.push(messageObject.params[paramNames[i]]);
- }
- var processingStartTime;
- if (this.dumpInspectorTimeStats)
- processingStartTime = Date.now();
- dispatcher[functionName].apply(dispatcher, params);
- if (this.dumpInspectorTimeStats)
- console.log("time-stats: " + messageObject.method + " = " + (Date.now() - processingStartTime));
- }
- },
- reportProtocolError: function(messageObject)
- {
- console.error("Request with id = " + messageObject.id + " failed. " + messageObject.error);
- },
- runAfterPendingDispatches: function(script)
- {
- if (!this._scripts)
- this._scripts = [];
- if (script)
- this._scripts.push(script);
- if (!this._pendingResponsesCount) {
- var scripts = this._scripts;
- this._scripts = []
- for (var id = 0; id < scripts.length; ++id)
- scripts[id].call(this);
- }
- },
- loadFromJSONIfNeeded: function()
- {
- if (this._initialized)
- return;
- var xhr = new XMLHttpRequest();
- xhr.open("GET", "../Inspector.json", false);
- xhr.send(null);
- var schema = JSON.parse(xhr.responseText);
- var jsTypes = { integer: "number", array: "object" };
- var rawTypes = {};
- var domains = schema["domains"];
- for (var i = 0; i < domains.length; ++i) {
- var domain = domains[i];
- for (var j = 0; domain.types && j < domain.types.length; ++j) {
- var type = domain.types[j];
- rawTypes[domain.domain + "." + type.id] = jsTypes[type.type] || type.type;
- }
- }
- var result = [];
- for (var i = 0; i < domains.length; ++i) {
- var domain = domains[i];
- var commands = domain["commands"] || [];
- for (var j = 0; j < commands.length; ++j) {
- var command = commands[j];
- var parameters = command["parameters"];
- var paramsText = [];
- for (var k = 0; parameters && k < parameters.length; ++k) {
- var parameter = parameters[k];
- var type;
- if (parameter.type)
- type = jsTypes[parameter.type] || parameter.type;
- else {
- var ref = parameter["$ref"];
- if (ref.indexOf(".") !== -1)
- type = rawTypes[ref];
- else
- type = rawTypes[domain.domain + "." + ref];
- }
- var text = "{\"name\": \"" + parameter.name + "\", \"type\": \"" + type + "\", \"optional\": " + (parameter.optional ? "true" : "false") + "}";
- paramsText.push(text);
- }
- var returnsText = [];
- var returns = command["returns"] || [];
- for (var k = 0; k < returns.length; ++k) {
- var parameter = returns[k];
- returnsText.push("\"" + parameter.name + "\"");
- }
- result.push("InspectorBackend.registerCommand(\"" + domain.domain + "." + command.name + "\", [" + paramsText.join(", ") + "], [" + returnsText.join(", ") + "]);");
- }
- for (var j = 0; domain.events && j < domain.events.length; ++j) {
- var event = domain.events[j];
- var paramsText = [];
- for (var k = 0; event.parameters && k < event.parameters.length; ++k) {
- var parameter = event.parameters[k];
- paramsText.push("\"" + parameter.name + "\"");
- }
- result.push("InspectorBackend.registerEvent(\"" + domain.domain + "." + event.name + "\", [" + paramsText.join(", ") + "]);");
- }
- result.push("InspectorBackend.register" + domain.domain + "Dispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, \"" + domain.domain + "\");");
- }
- eval(result.join("\n"));
- }
- }
- InspectorBackend = new InspectorBackendClass();
- InspectorBackend.registerInspectorDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Inspector");
- InspectorBackend.registerEvent("Inspector.evaluateForTestInFrontend", ["testCallId", "script"]);
- InspectorBackend.registerEvent("Inspector.inspect", ["object", "hints"]);
- InspectorBackend.registerEvent("Inspector.didCreateWorker", ["id", "url", "isShared"]);
- InspectorBackend.registerEvent("Inspector.didDestroyWorker", ["id"]);
- InspectorBackend.registerCommand("Inspector.enable", [], []);
- InspectorBackend.registerCommand("Inspector.disable", [], []);
- InspectorBackend.registerMemoryDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Memory");
- InspectorBackend.registerCommand("Memory.getDOMNodeCount", [], ["domGroups", "strings"]);
- InspectorBackend.registerPageDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Page");
- InspectorBackend.registerEvent("Page.domContentEventFired", ["timestamp"]);
- InspectorBackend.registerEvent("Page.loadEventFired", ["timestamp"]);
- InspectorBackend.registerEvent("Page.frameNavigated", ["frame"]);
- InspectorBackend.registerEvent("Page.frameDetached", ["frameId"]);
- InspectorBackend.registerCommand("Page.enable", [], []);
- InspectorBackend.registerCommand("Page.disable", [], []);
- InspectorBackend.registerCommand("Page.addScriptToEvaluateOnLoad", [{"name": "scriptSource", "type": "string", "optional": false}], ["identifier"]);
- InspectorBackend.registerCommand("Page.removeScriptToEvaluateOnLoad", [{"name": "identifier", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Page.reload", [{"name": "ignoreCache", "type": "boolean", "optional": true}, {"name": "scriptToEvaluateOnLoad", "type": "string", "optional": true}], []);
- InspectorBackend.registerCommand("Page.navigate", [{"name": "url", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Page.getCookies", [], ["cookies", "cookiesString"]);
- InspectorBackend.registerCommand("Page.deleteCookie", [{"name": "cookieName", "type": "string", "optional": false}, {"name": "domain", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Page.getResourceTree", [], ["frameTree"]);
- InspectorBackend.registerCommand("Page.getResourceContent", [{"name": "frameId", "type": "string", "optional": false}, {"name": "url", "type": "string", "optional": false}], ["content", "base64Encoded"]);
- InspectorBackend.registerCommand("Page.searchInResource", [{"name": "frameId", "type": "string", "optional": false}, {"name": "url", "type": "string", "optional": false}, {"name": "query", "type": "string", "optional": false}, {"name": "caseSensitive", "type": "boolean", "optional": true}, {"name": "isRegex", "type": "boolean", "optional": true}], ["result"]);
- InspectorBackend.registerCommand("Page.searchInResources", [{"name": "text", "type": "string", "optional": false}, {"name": "caseSensitive", "type": "boolean", "optional": true}, {"name": "isRegex", "type": "boolean", "optional": true}], ["result"]);
- InspectorBackend.registerCommand("Page.setDocumentContent", [{"name": "frameId", "type": "string", "optional": false}, {"name": "html", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Page.canOverrideDeviceMetrics", [], ["result"]);
- InspectorBackend.registerCommand("Page.setDeviceMetricsOverride", [{"name": "width", "type": "number", "optional": false}, {"name": "height", "type": "number", "optional": false}, {"name": "fontScaleFactor", "type": "number", "optional": false}, {"name": "fitWindow", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Page.setShowPaintRects", [{"name": "result", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Page.getScriptExecutionStatus", [], ["result"]);
- InspectorBackend.registerCommand("Page.setScriptExecutionDisabled", [{"name": "value", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerRuntimeDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Runtime");
- InspectorBackend.registerEvent("Runtime.isolatedContextCreated", ["context"]);
- InspectorBackend.registerCommand("Runtime.evaluate", [{"name": "expression", "type": "string", "optional": false}, {"name": "objectGroup", "type": "string", "optional": true}, {"name": "includeCommandLineAPI", "type": "boolean", "optional": true}, {"name": "doNotPauseOnExceptionsAndMuteConsole", "type": "boolean", "optional": true}, {"name": "contextId", "type": "number", "optional": true}, {"name": "returnByValue", "type": "boolean", "optional": true}], ["result", "wasThrown"]);
- InspectorBackend.registerCommand("Runtime.callFunctionOn", [{"name": "objectId", "type": "string", "optional": false}, {"name": "functionDeclaration", "type": "string", "optional": false}, {"name": "arguments", "type": "object", "optional": true}, {"name": "doNotPauseOnExceptionsAndMuteConsole", "type": "boolean", "optional": true}, {"name": "returnByValue", "type": "boolean", "optional": true}], ["result", "wasThrown"]);
- InspectorBackend.registerCommand("Runtime.getProperties", [{"name": "objectId", "type": "string", "optional": false}, {"name": "ownProperties", "type": "boolean", "optional": true}], ["result"]);
- InspectorBackend.registerCommand("Runtime.releaseObject", [{"name": "objectId", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Runtime.releaseObjectGroup", [{"name": "objectGroup", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Runtime.run", [], []);
- InspectorBackend.registerCommand("Runtime.setReportExecutionContextCreation", [{"name": "enabled", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerConsoleDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Console");
- InspectorBackend.registerEvent("Console.messageAdded", ["message"]);
- InspectorBackend.registerEvent("Console.messageRepeatCountUpdated", ["count"]);
- InspectorBackend.registerEvent("Console.messagesCleared", []);
- InspectorBackend.registerCommand("Console.enable", [], []);
- InspectorBackend.registerCommand("Console.disable", [], []);
- InspectorBackend.registerCommand("Console.clearMessages", [], []);
- InspectorBackend.registerCommand("Console.setMonitoringXHREnabled", [{"name": "enabled", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Console.addInspectedNode", [{"name": "nodeId", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("Console.addInspectedHeapObject", [{"name": "heapObjectId", "type": "number", "optional": false}], []);
- InspectorBackend.registerNetworkDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Network");
- InspectorBackend.registerEvent("Network.requestWillBeSent", ["requestId", "frameId", "loaderId", "documentURL", "request", "timestamp", "initiator", "redirectResponse"]);
- InspectorBackend.registerEvent("Network.requestServedFromCache", ["requestId"]);
- InspectorBackend.registerEvent("Network.responseReceived", ["requestId", "frameId", "loaderId", "timestamp", "type", "response"]);
- InspectorBackend.registerEvent("Network.dataReceived", ["requestId", "timestamp", "dataLength", "encodedDataLength"]);
- InspectorBackend.registerEvent("Network.loadingFinished", ["requestId", "timestamp"]);
- InspectorBackend.registerEvent("Network.loadingFailed", ["requestId", "timestamp", "errorText", "canceled"]);
- InspectorBackend.registerEvent("Network.requestServedFromMemoryCache", ["requestId", "frameId", "loaderId", "documentURL", "timestamp", "initiator", "resource"]);
- InspectorBackend.registerEvent("Network.webSocketWillSendHandshakeRequest", ["requestId", "timestamp", "request"]);
- InspectorBackend.registerEvent("Network.webSocketHandshakeResponseReceived", ["requestId", "timestamp", "response"]);
- InspectorBackend.registerEvent("Network.webSocketCreated", ["requestId", "url"]);
- InspectorBackend.registerEvent("Network.webSocketClosed", ["requestId", "timestamp"]);
- InspectorBackend.registerEvent("Network.webSocketFrameReceived", ["requestId", "timestamp", "response"]);
- InspectorBackend.registerEvent("Network.webSocketFrameError", ["requestId", "timestamp", "errorMessage"]);
- InspectorBackend.registerEvent("Network.webSocketFrameSent", ["requestId", "timestamp", "response"]);
- InspectorBackend.registerCommand("Network.enable", [], []);
- InspectorBackend.registerCommand("Network.disable", [], []);
- InspectorBackend.registerCommand("Network.setUserAgentOverride", [{"name": "userAgent", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Network.setExtraHTTPHeaders", [{"name": "headers", "type": "object", "optional": false}], []);
- InspectorBackend.registerCommand("Network.getResponseBody", [{"name": "requestId", "type": "string", "optional": false}], ["body", "base64Encoded"]);
- InspectorBackend.registerCommand("Network.canClearBrowserCache", [], ["result"]);
- InspectorBackend.registerCommand("Network.clearBrowserCache", [], []);
- InspectorBackend.registerCommand("Network.canClearBrowserCookies", [], ["result"]);
- InspectorBackend.registerCommand("Network.clearBrowserCookies", [], []);
- InspectorBackend.registerCommand("Network.setCacheDisabled", [{"name": "cacheDisabled", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerDatabaseDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Database");
- InspectorBackend.registerEvent("Database.addDatabase", ["database"]);
- InspectorBackend.registerEvent("Database.sqlTransactionSucceeded", ["transactionId", "columnNames", "values"]);
- InspectorBackend.registerEvent("Database.sqlTransactionFailed", ["transactionId", "sqlError"]);
- InspectorBackend.registerCommand("Database.enable", [], []);
- InspectorBackend.registerCommand("Database.disable", [], []);
- InspectorBackend.registerCommand("Database.getDatabaseTableNames", [{"name": "databaseId", "type": "string", "optional": false}], ["tableNames"]);
- InspectorBackend.registerCommand("Database.executeSQL", [{"name": "databaseId", "type": "string", "optional": false}, {"name": "query", "type": "string", "optional": false}], ["success", "transactionId"]);
- InspectorBackend.registerIndexedDBDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "IndexedDB");
- InspectorBackend.registerEvent("IndexedDB.databaseNamesLoaded", ["requestId", "securityOriginWithDatabaseNames"]);
- InspectorBackend.registerEvent("IndexedDB.databaseLoaded", ["requestId", "databaseWithObjectStores"]);
- InspectorBackend.registerEvent("IndexedDB.objectStoreDataLoaded", ["requestId", "objectStoreDataEntries", "hasMore"]);
- InspectorBackend.registerEvent("IndexedDB.indexDataLoaded", ["requestId", "indexDataEntries", "hasMore"]);
- InspectorBackend.registerCommand("IndexedDB.enable", [], []);
- InspectorBackend.registerCommand("IndexedDB.disable", [], []);
- InspectorBackend.registerCommand("IndexedDB.requestDatabaseNamesForFrame", [{"name": "requestId", "type": "number", "optional": false}, {"name": "frameId", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("IndexedDB.requestDatabase", [{"name": "requestId", "type": "number", "optional": false}, {"name": "frameId", "type": "string", "optional": false}, {"name": "databaseName", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("IndexedDB.requestData", [{"name": "requestId", "type": "number", "optional": false}, {"name": "frameId", "type": "string", "optional": false}, {"name": "databaseName", "type": "string", "optional": false}, {"name": "objectStoreName", "type": "string", "optional": false}, {"name": "indexName", "type": "string", "optional": false}, {"name": "skipCount", "type": "number", "optional": false}, {"name": "pageSize", "type": "number", "optional": false}, {"name": "keyRange", "type": "object", "optional": true}], []);
- InspectorBackend.registerDOMStorageDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "DOMStorage");
- InspectorBackend.registerEvent("DOMStorage.addDOMStorage", ["storage"]);
- InspectorBackend.registerEvent("DOMStorage.updateDOMStorage", ["storageId"]);
- InspectorBackend.registerCommand("DOMStorage.enable", [], []);
- InspectorBackend.registerCommand("DOMStorage.disable", [], []);
- InspectorBackend.registerCommand("DOMStorage.getDOMStorageEntries", [{"name": "storageId", "type": "string", "optional": false}], ["entries"]);
- InspectorBackend.registerCommand("DOMStorage.setDOMStorageItem", [{"name": "storageId", "type": "string", "optional": false}, {"name": "key", "type": "string", "optional": false}, {"name": "value", "type": "string", "optional": false}], ["success"]);
- InspectorBackend.registerCommand("DOMStorage.removeDOMStorageItem", [{"name": "storageId", "type": "string", "optional": false}, {"name": "key", "type": "string", "optional": false}], ["success"]);
- InspectorBackend.registerApplicationCacheDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "ApplicationCache");
- InspectorBackend.registerEvent("ApplicationCache.applicationCacheStatusUpdated", ["frameId", "manifestURL", "status"]);
- InspectorBackend.registerEvent("ApplicationCache.networkStateUpdated", ["isNowOnline"]);
- InspectorBackend.registerCommand("ApplicationCache.getFramesWithManifests", [], ["frameIds"]);
- InspectorBackend.registerCommand("ApplicationCache.enable", [], []);
- InspectorBackend.registerCommand("ApplicationCache.getManifestForFrame", [{"name": "frameId", "type": "string", "optional": false}], ["manifestURL"]);
- InspectorBackend.registerCommand("ApplicationCache.getApplicationCacheForFrame", [{"name": "frameId", "type": "string", "optional": false}], ["applicationCache"]);
- InspectorBackend.registerFileSystemDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "FileSystem");
- InspectorBackend.registerCommand("FileSystem.enable", [], []);
- InspectorBackend.registerCommand("FileSystem.disable", [], []);
- InspectorBackend.registerDOMDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "DOM");
- InspectorBackend.registerEvent("DOM.documentUpdated", []);
- InspectorBackend.registerEvent("DOM.setChildNodes", ["parentId", "nodes"]);
- InspectorBackend.registerEvent("DOM.attributeModified", ["nodeId", "name", "value"]);
- InspectorBackend.registerEvent("DOM.attributeRemoved", ["nodeId", "name"]);
- InspectorBackend.registerEvent("DOM.inlineStyleInvalidated", ["nodeIds"]);
- InspectorBackend.registerEvent("DOM.characterDataModified", ["nodeId", "characterData"]);
- InspectorBackend.registerEvent("DOM.childNodeCountUpdated", ["nodeId", "childNodeCount"]);
- InspectorBackend.registerEvent("DOM.childNodeInserted", ["parentNodeId", "previousNodeId", "node"]);
- InspectorBackend.registerEvent("DOM.childNodeRemoved", ["parentNodeId", "nodeId"]);
- InspectorBackend.registerEvent("DOM.shadowRootPushed", ["hostId", "root"]);
- InspectorBackend.registerEvent("DOM.shadowRootPopped", ["hostId", "rootId"]);
- InspectorBackend.registerCommand("DOM.getDocument", [], ["root"]);
- InspectorBackend.registerCommand("DOM.requestChildNodes", [{"name": "nodeId", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.querySelector", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "selector", "type": "string", "optional": false}], ["nodeId"]);
- InspectorBackend.registerCommand("DOM.querySelectorAll", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "selector", "type": "string", "optional": false}], ["nodeIds"]);
- InspectorBackend.registerCommand("DOM.setNodeName", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "name", "type": "string", "optional": false}], ["nodeId"]);
- InspectorBackend.registerCommand("DOM.setNodeValue", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "value", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.removeNode", [{"name": "nodeId", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.setAttributeValue", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "name", "type": "string", "optional": false}, {"name": "value", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.setAttributesAsText", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "text", "type": "string", "optional": false}, {"name": "name", "type": "string", "optional": true}], []);
- InspectorBackend.registerCommand("DOM.removeAttribute", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "name", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.getEventListenersForNode", [{"name": "nodeId", "type": "number", "optional": false}], ["listeners"]);
- InspectorBackend.registerCommand("DOM.getOuterHTML", [{"name": "nodeId", "type": "number", "optional": false}], ["outerHTML"]);
- InspectorBackend.registerCommand("DOM.setOuterHTML", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "outerHTML", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.performSearch", [{"name": "query", "type": "string", "optional": false}], ["searchId", "resultCount"]);
- InspectorBackend.registerCommand("DOM.getSearchResults", [{"name": "searchId", "type": "string", "optional": false}, {"name": "fromIndex", "type": "number", "optional": false}, {"name": "toIndex", "type": "number", "optional": false}], ["nodeIds"]);
- InspectorBackend.registerCommand("DOM.discardSearchResults", [{"name": "searchId", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.requestNode", [{"name": "objectId", "type": "string", "optional": false}], ["nodeId"]);
- InspectorBackend.registerCommand("DOM.setInspectModeEnabled", [{"name": "enabled", "type": "boolean", "optional": false}, {"name": "highlightConfig", "type": "object", "optional": true}], []);
- InspectorBackend.registerCommand("DOM.highlightRect", [{"name": "x", "type": "number", "optional": false}, {"name": "y", "type": "number", "optional": false}, {"name": "width", "type": "number", "optional": false}, {"name": "height", "type": "number", "optional": false}, {"name": "color", "type": "object", "optional": true}, {"name": "outlineColor", "type": "object", "optional": true}], []);
- InspectorBackend.registerCommand("DOM.highlightNode", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "highlightConfig", "type": "object", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.hideHighlight", [], []);
- InspectorBackend.registerCommand("DOM.highlightFrame", [{"name": "frameId", "type": "string", "optional": false}, {"name": "contentColor", "type": "object", "optional": true}, {"name": "contentOutlineColor", "type": "object", "optional": true}], []);
- InspectorBackend.registerCommand("DOM.pushNodeByPathToFrontend", [{"name": "path", "type": "string", "optional": false}], ["nodeId"]);
- InspectorBackend.registerCommand("DOM.resolveNode", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "objectGroup", "type": "string", "optional": true}], ["object"]);
- InspectorBackend.registerCommand("DOM.getAttributes", [{"name": "nodeId", "type": "number", "optional": false}], ["attributes"]);
- InspectorBackend.registerCommand("DOM.moveTo", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "targetNodeId", "type": "number", "optional": false}, {"name": "insertBeforeNodeId", "type": "number", "optional": true}], ["nodeId"]);
- InspectorBackend.registerCommand("DOM.setTouchEmulationEnabled", [{"name": "enabled", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("DOM.undo", [], []);
- InspectorBackend.registerCommand("DOM.redo", [], []);
- InspectorBackend.registerCommand("DOM.markUndoableState", [], []);
- InspectorBackend.registerCSSDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "CSS");
- InspectorBackend.registerEvent("CSS.mediaQueryResultChanged", []);
- InspectorBackend.registerEvent("CSS.styleSheetChanged", ["styleSheetId"]);
- InspectorBackend.registerCommand("CSS.enable", [], []);
- InspectorBackend.registerCommand("CSS.disable", [], []);
- InspectorBackend.registerCommand("CSS.getMatchedStylesForNode", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "forcedPseudoClasses", "type": "object", "optional": true}, {"name": "includePseudo", "type": "boolean", "optional": true}, {"name": "includeInherited", "type": "boolean", "optional": true}], ["matchedCSSRules", "pseudoElements", "inherited"]);
- InspectorBackend.registerCommand("CSS.getInlineStylesForNode", [{"name": "nodeId", "type": "number", "optional": false}], ["inlineStyle", "attributesStyle"]);
- InspectorBackend.registerCommand("CSS.getComputedStyleForNode", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "forcedPseudoClasses", "type": "object", "optional": true}], ["computedStyle"]);
- InspectorBackend.registerCommand("CSS.getAllStyleSheets", [], ["headers"]);
- InspectorBackend.registerCommand("CSS.getStyleSheet", [{"name": "styleSheetId", "type": "string", "optional": false}], ["styleSheet"]);
- InspectorBackend.registerCommand("CSS.getStyleSheetText", [{"name": "styleSheetId", "type": "string", "optional": false}], ["text"]);
- InspectorBackend.registerCommand("CSS.setStyleSheetText", [{"name": "styleSheetId", "type": "string", "optional": false}, {"name": "text", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("CSS.setPropertyText", [{"name": "styleId", "type": "object", "optional": false}, {"name": "propertyIndex", "type": "number", "optional": false}, {"name": "text", "type": "string", "optional": false}, {"name": "overwrite", "type": "boolean", "optional": false}], ["style"]);
- InspectorBackend.registerCommand("CSS.toggleProperty", [{"name": "styleId", "type": "object", "optional": false}, {"name": "propertyIndex", "type": "number", "optional": false}, {"name": "disable", "type": "boolean", "optional": false}], ["style"]);
- InspectorBackend.registerCommand("CSS.setRuleSelector", [{"name": "ruleId", "type": "object", "optional": false}, {"name": "selector", "type": "string", "optional": false}], ["rule"]);
- InspectorBackend.registerCommand("CSS.addRule", [{"name": "contextNodeId", "type": "number", "optional": false}, {"name": "selector", "type": "string", "optional": false}], ["rule"]);
- InspectorBackend.registerCommand("CSS.getSupportedCSSProperties", [], ["cssProperties"]);
- InspectorBackend.registerCommand("CSS.startSelectorProfiler", [], []);
- InspectorBackend.registerCommand("CSS.stopSelectorProfiler", [], ["profile"]);
- InspectorBackend.registerTimelineDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Timeline");
- InspectorBackend.registerEvent("Timeline.eventRecorded", ["record"]);
- InspectorBackend.registerCommand("Timeline.start", [{"name": "maxCallStackDepth", "type": "number", "optional": true}], []);
- InspectorBackend.registerCommand("Timeline.stop", [], []);
- InspectorBackend.registerCommand("Timeline.setIncludeMemoryDetails", [{"name": "enabled", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Timeline.supportsFrameInstrumentation", [], ["result"]);
- InspectorBackend.registerDebuggerDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Debugger");
- InspectorBackend.registerEvent("Debugger.globalObjectCleared", []);
- InspectorBackend.registerEvent("Debugger.scriptParsed", ["scriptId", "url", "startLine", "startColumn", "endLine", "endColumn", "isContentScript", "sourceMapURL"]);
- InspectorBackend.registerEvent("Debugger.scriptFailedToParse", ["url", "scriptSource", "startLine", "errorLine", "errorMessage"]);
- InspectorBackend.registerEvent("Debugger.breakpointResolved", ["breakpointId", "location"]);
- InspectorBackend.registerEvent("Debugger.paused", ["callFrames", "reason", "data"]);
- InspectorBackend.registerEvent("Debugger.resumed", []);
- InspectorBackend.registerCommand("Debugger.causesRecompilation", [], ["result"]);
- InspectorBackend.registerCommand("Debugger.supportsNativeBreakpoints", [], ["result"]);
- InspectorBackend.registerCommand("Debugger.enable", [], []);
- InspectorBackend.registerCommand("Debugger.disable", [], []);
- InspectorBackend.registerCommand("Debugger.setBreakpointsActive", [{"name": "active", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Debugger.setBreakpointByUrl", [{"name": "lineNumber", "type": "number", "optional": false}, {"name": "url", "type": "string", "optional": true}, {"name": "urlRegex", "type": "string", "optional": true}, {"name": "columnNumber", "type": "number", "optional": true}, {"name": "condition", "type": "string", "optional": true}], ["breakpointId", "locations"]);
- InspectorBackend.registerCommand("Debugger.setBreakpoint", [{"name": "location", "type": "object", "optional": false}, {"name": "condition", "type": "string", "optional": true}], ["breakpointId", "actualLocation"]);
- InspectorBackend.registerCommand("Debugger.removeBreakpoint", [{"name": "breakpointId", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Debugger.continueToLocation", [{"name": "location", "type": "object", "optional": false}], []);
- InspectorBackend.registerCommand("Debugger.stepOver", [], []);
- InspectorBackend.registerCommand("Debugger.stepInto", [], []);
- InspectorBackend.registerCommand("Debugger.stepOut", [], []);
- InspectorBackend.registerCommand("Debugger.pause", [], []);
- InspectorBackend.registerCommand("Debugger.resume", [], []);
- InspectorBackend.registerCommand("Debugger.searchInContent", [{"name": "scriptId", "type": "string", "optional": false}, {"name": "query", "type": "string", "optional": false}, {"name": "caseSensitive", "type": "boolean", "optional": true}, {"name": "isRegex", "type": "boolean", "optional": true}], ["result"]);
- InspectorBackend.registerCommand("Debugger.canSetScriptSource", [], ["result"]);
- InspectorBackend.registerCommand("Debugger.setScriptSource", [{"name": "scriptId", "type": "string", "optional": false}, {"name": "scriptSource", "type": "string", "optional": false}, {"name": "preview", "type": "boolean", "optional": true}], ["callFrames", "result"]);
- InspectorBackend.registerCommand("Debugger.getScriptSource", [{"name": "scriptId", "type": "string", "optional": false}], ["scriptSource"]);
- InspectorBackend.registerCommand("Debugger.getFunctionDetails", [{"name": "functionId", "type": "string", "optional": false}], ["details"]);
- InspectorBackend.registerCommand("Debugger.setPauseOnExceptions", [{"name": "state", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("Debugger.evaluateOnCallFrame", [{"name": "callFrameId", "type": "string", "optional": false}, {"name": "expression", "type": "string", "optional": false}, {"name": "objectGroup", "type": "string", "optional": true}, {"name": "includeCommandLineAPI", "type": "boolean", "optional": true}, {"name": "doNotPauseOnExceptionsAndMuteConsole", "type": "boolean", "optional": true}, {"name": "returnByValue", "type": "boolean", "optional": true}], ["result", "wasThrown"]);
- InspectorBackend.registerCommand("DOMDebugger.setDOMBreakpoint", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "type", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.removeDOMBreakpoint", [{"name": "nodeId", "type": "number", "optional": false}, {"name": "type", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.setEventListenerBreakpoint", [{"name": "eventName", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.removeEventListenerBreakpoint", [{"name": "eventName", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.setInstrumentationBreakpoint", [{"name": "eventName", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.removeInstrumentationBreakpoint", [{"name": "eventName", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.setXHRBreakpoint", [{"name": "url", "type": "string", "optional": false}], []);
- InspectorBackend.registerCommand("DOMDebugger.removeXHRBreakpoint", [{"name": "url", "type": "string", "optional": false}], []);
- InspectorBackend.registerProfilerDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Profiler");
- InspectorBackend.registerEvent("Profiler.addProfileHeader", ["header"]);
- InspectorBackend.registerEvent("Profiler.addHeapSnapshotChunk", ["uid", "chunk"]);
- InspectorBackend.registerEvent("Profiler.finishHeapSnapshot", ["uid"]);
- InspectorBackend.registerEvent("Profiler.setRecordingProfile", ["isProfiling"]);
- InspectorBackend.registerEvent("Profiler.resetProfiles", []);
- InspectorBackend.registerEvent("Profiler.reportHeapSnapshotProgress", ["done", "total"]);
- InspectorBackend.registerCommand("Profiler.causesRecompilation", [], ["result"]);
- InspectorBackend.registerCommand("Profiler.isSampling", [], ["result"]);
- InspectorBackend.registerCommand("Profiler.hasHeapProfiler", [], ["result"]);
- InspectorBackend.registerCommand("Profiler.enable", [], []);
- InspectorBackend.registerCommand("Profiler.disable", [], []);
- InspectorBackend.registerCommand("Profiler.start", [], []);
- InspectorBackend.registerCommand("Profiler.stop", [], []);
- InspectorBackend.registerCommand("Profiler.getProfileHeaders", [], ["headers"]);
- InspectorBackend.registerCommand("Profiler.getProfile", [{"name": "type", "type": "string", "optional": false}, {"name": "uid", "type": "number", "optional": false}], ["profile"]);
- InspectorBackend.registerCommand("Profiler.removeProfile", [{"name": "type", "type": "string", "optional": false}, {"name": "uid", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("Profiler.clearProfiles", [], []);
- InspectorBackend.registerCommand("Profiler.takeHeapSnapshot", [], []);
- InspectorBackend.registerCommand("Profiler.collectGarbage", [], []);
- InspectorBackend.registerCommand("Profiler.getObjectByHeapObjectId", [{"name": "objectId", "type": "string", "optional": false}, {"name": "objectGroup", "type": "string", "optional": true}], ["result"]);
- InspectorBackend.registerCommand("Profiler.getHeapObjectId", [{"name": "objectId", "type": "string", "optional": false}], ["heapSnapshotObjectId"]);
- InspectorBackend.registerWorkerDispatcher = InspectorBackend.registerDomainDispatcher.bind(InspectorBackend, "Worker");
- InspectorBackend.registerEvent("Worker.workerCreated", ["workerId", "url", "inspectorConnected"]);
- InspectorBackend.registerEvent("Worker.workerTerminated", ["workerId"]);
- InspectorBackend.registerEvent("Worker.dispatchMessageFromWorker", ["workerId", "message"]);
- InspectorBackend.registerEvent("Worker.disconnectedFromWorker", []);
- InspectorBackend.registerCommand("Worker.setWorkerInspectionEnabled", [{"name": "value", "type": "boolean", "optional": false}], []);
- InspectorBackend.registerCommand("Worker.sendMessageToWorker", [{"name": "workerId", "type": "number", "optional": false}, {"name": "message", "type": "object", "optional": false}], []);
- InspectorBackend.registerCommand("Worker.connectToWorker", [{"name": "workerId", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("Worker.disconnectFromWorker", [{"name": "workerId", "type": "number", "optional": false}], []);
- InspectorBackend.registerCommand("Worker.setAutoconnectToWorkers", [{"name": "value", "type": "boolean", "optional": false}], []);
- if (!window.InspectorExtensionRegistry) {
- WebInspector.InspectorExtensionRegistryStub = function()
- {
- }
- WebInspector.InspectorExtensionRegistryStub.prototype = {
- getExtensionsAsync: function()
- {
- }
- }
- var InspectorExtensionRegistry = new WebInspector.InspectorExtensionRegistryStub();
- }
- InspectorFrontendAPI = {
- _pendingCommands: [],
- isDebuggingEnabled: function()
- {
- return WebInspector.panels.scripts.debuggingEnabled;
- },
- setDebuggingEnabled: function(enabled)
- {
- if (enabled) {
- WebInspector.panels.scripts.enableDebugging();
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.scripts);
- } else
- WebInspector.panels.scripts.disableDebugging();
- },
- isTimelineProfilingEnabled: function()
- {
- return WebInspector.panels.timeline.timelineProfilingEnabled;
- },
- setTimelineProfilingEnabled: function(enabled)
- {
- WebInspector.panels.timeline.setTimelineProfilingEnabled(enabled);
- },
- isProfilingJavaScript: function()
- {
- return WebInspector.CPUProfileType.instance && WebInspector.CPUProfileType.instance.isRecordingProfile();
- },
- startProfilingJavaScript: function()
- {
- WebInspector.panels.profiles.enableProfiler();
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.profiles);
- if (WebInspector.CPUProfileType.instance)
- WebInspector.CPUProfileType.instance.startRecordingProfile();
- },
- stopProfilingJavaScript: function()
- {
- if (WebInspector.CPUProfileType.instance)
- WebInspector.CPUProfileType.instance.stopRecordingProfile();
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.profiles);
- },
- setAttachedWindow: function(attached)
- {
- WebInspector.attached = attached;
- },
- showConsole: function()
- {
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.console);
- },
- showMainResourceForFrame: function(frameId)
- {
- },
- showResources: function()
- {
- WebInspector.inspectorView.setCurrentPanel(WebInspector.panels.resources);
- },
- setDockingUnavailable: function(unavailable)
- {
- WebInspector.setDockingUnavailable(unavailable);
- },
- enterInspectElementMode: function()
- {
- WebInspector.toggleSearchingForNode();
- },
- savedURL: function(url)
- {
- WebInspector.fileManager.savedURL(url);
- },
- appendedToURL: function(url)
- {
- WebInspector.fileManager.appendedToURL(url);
- },
- setToolbarColors: function(backgroundColor, color)
- {
- WebInspector.setToolbarColors(backgroundColor, color);
- },
- dispatch: function(signature)
- {
- if (WebInspector.panels) {
- var methodName = signature.shift();
- return InspectorFrontendAPI[methodName].apply(InspectorFrontendAPI, signature);
- }
- InspectorFrontendAPI._pendingCommands.push(signature);
- },
- loadCompleted: function()
- {
- for (var i = 0; i < InspectorFrontendAPI._pendingCommands.length; ++i)
- InspectorFrontendAPI.dispatch(InspectorFrontendAPI._pendingCommands[i]);
- InspectorFrontendAPI._pendingCommands = [];
- }
- }
- WebInspector.Object = function() {
- }
- WebInspector.Object.prototype = {
- addEventListener: function(eventType, listener, thisObject)
- {
- console.assert(listener);
- if (!this._listeners)
- this._listeners = {};
- if (!this._listeners[eventType])
- this._listeners[eventType] = [];
- this._listeners[eventType].push({ thisObject: thisObject, listener: listener });
- },
- removeEventListener: function(eventType, listener, thisObject)
- {
- console.assert(listener);
- if (!this._listeners || !this._listeners[eventType])
- return;
- var listeners = this._listeners[eventType];
- for (var i = 0; i < listeners.length; ++i) {
- if (listener && listeners[i].listener === listener && listeners[i].thisObject === thisObject)
- listeners.splice(i, 1);
- else if (!listener && thisObject && listeners[i].thisObject === thisObject)
- listeners.splice(i, 1);
- }
- if (!listeners.length)
- delete this._listeners[eventType];
- },
- removeAllListeners: function()
- {
- delete this._listeners;
- },
- hasEventListeners: function(eventType)
- {
- if (!this._listeners || !this._listeners[eventType])
- return false;
- return true;
- },
- dispatchEventToListeners: function(eventType, eventData)
- {
- if (!this._listeners || !this._listeners[eventType])
- return false;
- var event = new WebInspector.Event(this, eventType, eventData);
- var listeners = this._listeners[eventType].slice(0);
- for (var i = 0; i < listeners.length; ++i) {
- listeners[i].listener.call(listeners[i].thisObject, event);
- if (event._stoppedPropagation)
- break;
- }
- return event.defaultPrevented;
- }
- }
- WebInspector.Event = function(target, type, data)
- {
- this.target = target;
- this.type = type;
- this.data = data;
- this.defaultPrevented = false;
- this._stoppedPropagation = false;
- }
- WebInspector.Event.prototype = {
- stopPropagation: function()
- {
- this._stoppedPropagation = true;
- },
- preventDefault: function()
- {
- this.defaultPrevented = true;
- },
- consume: function(preventDefault)
- {
- this.stopPropagation();
- if (preventDefault)
- this.preventDefault();
- }
- }
- WebInspector.notifications = new WebInspector.Object();
- var Preferences = {
- maxInlineTextChildLength: 80,
- minConsoleHeight: 75,
- minSidebarWidth: 100,
- minElementsSidebarWidth: 200,
- minScriptsSidebarWidth: 200,
- styleRulesExpandedState: {},
- showMissingLocalizedStrings: false,
- useLowerCaseMenuTitlesOnWindows: false,
- sharedWorkersDebugNote: undefined,
- localizeUI: true,
- exposeDisableCache: false,
- exposeWorkersInspection: false,
- applicationTitle: "Web Inspector - %s",
- showHeapSnapshotObjectsHiddenProperties: false,
- showDockToRight: false
- }
- var Capabilities = {
- samplingCPUProfiler: false,
- debuggerCausesRecompilation: true,
- profilerCausesRecompilation: true,
- nativeInstrumentationEnabled: false,
- heapProfilerPresent: false,
- canOverrideDeviceMetrics: false,
- timelineSupportsFrameInstrumentation: false,
- }
- WebInspector.Settings = function()
- {
- this._eventSupport = new WebInspector.Object();
- this.colorFormat = this.createSetting("colorFormat", "hex");
- this.consoleHistory = this.createSetting("consoleHistory", []);
- this.debuggerEnabled = this.createSetting("debuggerEnabled", false);
- this.domWordWrap = this.createSetting("domWordWrap", true);
- this.profilerEnabled = this.createSetting("profilerEnabled", false);
- this.eventListenersFilter = this.createSetting("eventListenersFilter", "all");
- this.lastActivePanel = this.createSetting("lastActivePanel", "elements");
- this.lastViewedScriptFile = this.createSetting("lastViewedScriptFile", "application");
- this.monitoringXHREnabled = this.createSetting("monitoringXHREnabled", false);
- this.preserveConsoleLog = this.createSetting("preserveConsoleLog", false);
- this.resourcesLargeRows = this.createSetting("resourcesLargeRows", true);
- this.resourcesSortOptions = this.createSetting("resourcesSortOptions", {timeOption: "responseTime", sizeOption: "transferSize"});
- this.resourceViewTab = this.createSetting("resourceViewTab", "preview");
- this.showInheritedComputedStyleProperties = this.createSetting("showInheritedComputedStyleProperties", false);
- this.showUserAgentStyles = this.createSetting("showUserAgentStyles", true);
- this.watchExpressions = this.createSetting("watchExpressions", []);
- this.breakpoints = this.createSetting("breakpoints", []);
- this.eventListenerBreakpoints = this.createSetting("eventListenerBreakpoints", []);
- this.domBreakpoints = this.createSetting("domBreakpoints", []);
- this.xhrBreakpoints = this.createSetting("xhrBreakpoints", []);
- this.sourceMapsEnabled = this.createSetting("sourceMapsEnabled", false);
- this.cacheDisabled = this.createSetting("cacheDisabled", false);
- this.overrideUserAgent = this.createSetting("overrideUserAgent", "");
- this.userAgent = this.createSetting("userAgent", "");
- this.deviceMetrics = this.createSetting("deviceMetrics", "");
- this.deviceFitWindow = this.createSetting("deviceFitWindow", false);
- this.showScriptFolders = this.createSetting("showScriptFolders", true);
- this.dockToRight = this.createSetting("dockToRight", false);
- this.emulateTouchEvents = this.createSetting("emulateTouchEvents", false);
- this.showPaintRects = this.createSetting("showPaintRects", false);
- this.zoomLevel = this.createSetting("zoomLevel", 0);
- this.savedURLs = this.createSetting("savedURLs", {});
- this.javaScriptDisabled = this.createSetting("javaScriptDisabled", false);
- if (this.breakpoints.get().length > 500000)
- this.breakpoints.set([]);
- }
- WebInspector.Settings.prototype = {
- createSetting: function(key, defaultValue)
- {
- return new WebInspector.Setting(key, defaultValue, this._eventSupport);
- }
- }
- WebInspector.Setting = function(name, defaultValue, eventSupport)
- {
- this._name = name;
- this._defaultValue = defaultValue;
- this._eventSupport = eventSupport;
- }
- WebInspector.Setting.prototype = {
- addChangeListener: function(listener, thisObject)
- {
- this._eventSupport.addEventListener(this._name, listener, thisObject);
- },
- removeChangeListener: function(listener, thisObject)
- {
- this._eventSupport.removeEventListener(this._name, listener, thisObject);
- },
- get name()
- {
- return this._name;
- },
- get: function()
- {
- if (typeof this._value !== "undefined")
- return this._value;
- this._value = this._defaultValue;
- if (window.localStorage != null && this._name in window.localStorage) {
- try {
- this._value = JSON.parse(window.localStorage[this._name]);
- } catch(e) {
- window.localStorage.removeItem(this._name);
- }
- }
- return this._value;
- },
- set: function(value)
- {
- this._value = value;
- if (window.localStorage != null) {
- try {
- window.localStorage[this._name] = JSON.stringify(value);
- } catch(e) {
- console.error("Error saving setting with name:" + this._name);
- }
- }
- this._eventSupport.dispatchEventToListeners(this._name, value);
- }
- }
- WebInspector.ExperimentsSettings = function()
- {
- this._setting = WebInspector.settings.createSetting("experiments", {});
- this._experiments = [];
- this._enabledForTest = {};
- this.showShadowDOM = this._createExperiment("showShadowDOM", "Show shadow DOM");
- this.snippetsSupport = this._createExperiment("snippetsSupport", "Snippets support");
- this.sourceCodePanel = this._createExperiment("sourceCodePanel", "Source Code panel");
- this._cleanUpSetting();
- }
- WebInspector.ExperimentsSettings.prototype = {
- get experiments()
- {
- return this._experiments.slice();
- },
- get experimentsEnabled()
- {
- return "experiments" in WebInspector.queryParamsObject;
- },
- _createExperiment: function(experimentName, experimentTitle)
- {
- var experiment = new WebInspector.Experiment(this, experimentName, experimentTitle);
- this._experiments.push(experiment);
- return experiment;
- },
- isEnabled: function(experimentName)
- {
- if (this._enabledForTest[experimentName])
- return true;
- if (!this.experimentsEnabled)
- return false;
- var experimentsSetting = this._setting.get();
- return experimentsSetting[experimentName];
- },
- setEnabled: function(experimentName, enabled)
- {
- var experimentsSetting = this._setting.get();
- experimentsSetting[experimentName] = enabled;
- this._setting.set(experimentsSetting);
- },
- _enableForTest: function(experimentName)
- {
- this._enabledForTest[experimentName] = true;
- },
- _cleanUpSetting: function()
- {
- var experimentsSetting = this._setting.get();
- var cleanedUpExperimentSetting = {};
- for (var i = 0; i < this._experiments.length; ++i) {
- var experimentName = this._experiments[i].name;
- if (experimentsSetting[experimentName])
- cleanedUpExperimentSetting[experimentName] = true;
- }
- this._setting.set(cleanedUpExperimentSetting);
- }
- }
- WebInspector.Experiment = function(experimentsSettings, name, title)
- {
- this._name = name;
- this._title = title;
- this._experimentsSettings = experimentsSettings;
- }
- WebInspector.Experiment.prototype = {
- get name()
- {
- return this._name;
- },
- get title()
- {
- return this._title;
- },
- isEnabled: function()
- {
- return this._experimentsSettings.isEnabled(this._name);
- },
- setEnabled: function(enabled)
- {
- return this._experimentsSettings.setEnabled(this._name, enabled);
- },
- enableForTest: function()
- {
- this._experimentsSettings._enableForTest(this._name);
- }
- }
- WebInspector.settings = new WebInspector.Settings();
- WebInspector.experimentsSettings = new WebInspector.ExperimentsSettings();
- WebInspector.View = function()
- {
- this.element = document.createElement("div");
- this.element.__view = this;
- this._visible = true;
- this._isRoot = false;
- this._isShowing = false;
- this._children = [];
- this._hideOnDetach = false;
- this._cssFiles = [];
- }
- WebInspector.View._cssFileToVisibleViewCount = {};
- WebInspector.View._cssFileToStyleElement = {};
- WebInspector.View.prototype = {
- markAsRoot: function()
- {
- this._isRoot = true;
- },
- isShowing: function()
- {
- return this._isShowing;
- },
- setHideOnDetach: function()
- {
- this._hideOnDetach = true;
- },
- _parentIsShowing: function()
- {
- return this._isRoot || (this._parentView && this._parentView.isShowing());
- },
- _callOnVisibleChildren: function(method)
- {
- for (var i = 0; i < this._children.length; ++i)
- if (this._children[i]._visible)
- method.call(this._children[i]);
- },
- _processWillShow: function()
- {
- this._loadCSSIfNeeded();
- this._callOnVisibleChildren(this._processWillShow);
- },
- _processWasShown: function()
- {
- this._isShowing = true;
- this.restoreScrollPositions();
- this.wasShown();
- this.onResize();
- this._callOnVisibleChildren(this._processWasShown);
- },
- _processWillHide: function()
- {
- this.storeScrollPositions();
- this._callOnVisibleChildren(this._processWillHide);
- this.willHide();
- this._isShowing = false;
- },
- _processWasHidden: function()
- {
- this._disableCSSIfNeeded();
- this._callOnVisibleChildren(this._processWasHidden);
- },
- _processOnResize: function()
- {
- if (!this.isShowing())
- return;
- this.onResize();
- this._callOnVisibleChildren(this._processOnResize);
- },
- wasShown: function()
- {
- },
- willHide: function()
- {
- },
- onResize: function()
- {
- },
- show: function(parentElement, insertBefore)
- {
- WebInspector.View._assert(parentElement, "Attempt to attach view with no parent element");
- if (this.element.parentElement !== parentElement) {
- var currentParent = parentElement;
- while (currentParent && !currentParent.__view)
- currentParent = currentParent.parentElement;
- if (currentParent) {
- this._parentView = currentParent.__view;
- this._parentView._children.push(this);
- this._isRoot = false;
- } else
- WebInspector.View._assert(this._isRoot, "Attempt to attach view to orphan node");
- } else if (this._visible)
- return;
- this._visible = true;
- if (this._parentIsShowing())
- this._processWillShow();
- this.element.addStyleClass("visible");
- if (this.element.parentElement !== parentElement) {
- WebInspector.View._incrementViewCounter(parentElement, this.element);
- if (insertBefore)
- WebInspector.View._originalInsertBefore.call(parentElement, this.element, insertBefore);
- else
- WebInspector.View._originalAppendChild.call(parentElement, this.element);
- }
- if (this._parentIsShowing())
- this._processWasShown();
- },
- detach: function(overrideHideOnDetach)
- {
- var parentElement = this.element.parentElement;
- if (!parentElement)
- return;
- if (this._parentIsShowing())
- this._processWillHide();
- if (this._hideOnDetach && !overrideHideOnDetach) {
- this.element.removeStyleClass("visible");
- this._visible = false;
- if (this._parentIsShowing())
- this._processWasHidden();
- return;
- }
- WebInspector.View._decrementViewCounter(parentElement, this.element);
- WebInspector.View._originalRemoveChild.call(parentElement, this.element);
- this._visible = false;
- if (this._parentIsShowing())
- this._processWasHidden();
- if (this._parentView) {
- var childIndex = this._parentView._children.indexOf(this);
- WebInspector.View._assert(childIndex >= 0, "Attempt to remove non-child view");
- this._parentView._children.splice(childIndex, 1);
- this._parentView = null;
- } else
- WebInspector.View._assert(this._isRoot, "Removing non-root view from DOM");
- },
- detachChildViews: function()
- {
- var children = this._children.slice();
- for (var i = 0; i < children.length; ++i)
- children[i].detach();
- },
- elementsToRestoreScrollPositionsFor: function()
- {
- return [this.element];
- },
- storeScrollPositions: function()
- {
- var elements = this.elementsToRestoreScrollPositionsFor();
- for (var i = 0; i < elements.length; ++i) {
- var container = elements[i];
- container._scrollTop = container.scrollTop;
- container._scrollLeft = container.scrollLeft;
- }
- },
- restoreScrollPositions: function()
- {
- var elements = this.elementsToRestoreScrollPositionsFor();
- for (var i = 0; i < elements.length; ++i) {
- var container = elements[i];
- if (container._scrollTop)
- container.scrollTop = container._scrollTop;
- if (container._scrollLeft)
- container.scrollLeft = container._scrollLeft;
- }
- },
- canHighlightLine: function()
- {
- return false;
- },
- highlightLine: function(line)
- {
- },
- doResize: function()
- {
- this._processOnResize();
- },
- registerRequiredCSS: function(cssFile)
- {
- this._cssFiles.push(cssFile);
- },
- _loadCSSIfNeeded: function()
- {
- for (var i = 0; i < this._cssFiles.length; ++i) {
- var cssFile = this._cssFiles[i];
- var viewsWithCSSFile = WebInspector.View._cssFileToVisibleViewCount[cssFile];
- WebInspector.View._cssFileToVisibleViewCount[cssFile] = (viewsWithCSSFile || 0) + 1;
- if (!viewsWithCSSFile)
- this._doLoadCSS(cssFile);
- }
- },
- _doLoadCSS: function(cssFile)
- {
- var styleElement = WebInspector.View._cssFileToStyleElement[cssFile];
- if (styleElement) {
- styleElement.disabled = false;
- return;
- }
- if (window.debugCSS) {
- styleElement = document.createElement("link");
- styleElement.rel = "stylesheet";
- styleElement.type = "text/css";
- styleElement.href = cssFile;
- } else {
- var xhr = new XMLHttpRequest();
- xhr.open("GET", cssFile, false);
- xhr.send(null);
- styleElement = document.createElement("style");
- styleElement.type = "text/css";
- styleElement.textContent = xhr.responseText;
- }
- document.head.insertBefore(styleElement, document.head.firstChild);
- WebInspector.View._cssFileToStyleElement[cssFile] = styleElement;
- },
- _disableCSSIfNeeded: function()
- {
- for (var i = 0; i < this._cssFiles.length; ++i) {
- var cssFile = this._cssFiles[i];
- var viewsWithCSSFile = WebInspector.View._cssFileToVisibleViewCount[cssFile];
- viewsWithCSSFile--;
- WebInspector.View._cssFileToVisibleViewCount[cssFile] = viewsWithCSSFile;
- if (!viewsWithCSSFile)
- this._doUnloadCSS(cssFile);
- }
- },
- _doUnloadCSS: function(cssFile)
- {
- var styleElement = WebInspector.View._cssFileToStyleElement[cssFile];
- styleElement.disabled = true;
- },
- printViewHierarchy: function()
- {
- var lines = [];
- this._collectViewHierarchy("", lines);
- console.log(lines.join("\n"));
- },
- _collectViewHierarchy: function(prefix, lines)
- {
- lines.push(prefix + "[" + this.element.className + "]" + (this._children.length ? " {" : ""));
- for (var i = 0; i < this._children.length; ++i)
- this._children[i]._collectViewHierarchy(prefix + " ", lines);
- if (this._children.length)
- lines.push(prefix + "}");
- },
- defaultFocusedElement: function()
- {
- return this._defaultFocusedElement || this.element;
- },
- setDefaultFocusedElement: function(element)
- {
- this._defaultFocusedElement = element;
- },
- focus: function()
- {
- var element = this.defaultFocusedElement();
- if (!element || element.isAncestor(document.activeElement))
- return;
- WebInspector.setCurrentFocusElement(element);
- }
- }
- WebInspector.View.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.View._originalAppendChild = Element.prototype.appendChild;
- WebInspector.View._originalInsertBefore = Element.prototype.insertBefore;
- WebInspector.View._originalRemoveChild = Element.prototype.removeChild;
- WebInspector.View._originalRemoveChildren = Element.prototype.removeChildren;
- WebInspector.View._incrementViewCounter = function(parentElement, childElement)
- {
- var count = (childElement.__viewCounter || 0) + (childElement.__view ? 1 : 0);
- if (!count)
- return;
- while (parentElement) {
- parentElement.__viewCounter = (parentElement.__viewCounter || 0) + count;
- parentElement = parentElement.parentElement;
- }
- }
- WebInspector.View._decrementViewCounter = function(parentElement, childElement)
- {
- var count = (childElement.__viewCounter || 0) + (childElement.__view ? 1 : 0);
- if (!count)
- return;
- while (parentElement) {
- parentElement.__viewCounter -= count;
- parentElement = parentElement.parentElement;
- }
- }
- WebInspector.View._assert = function(condition, message)
- {
- if (!condition) {
- console.trace();
- throw new Error(message);
- }
- }
- Element.prototype.appendChild = function(child)
- {
- WebInspector.View._assert(!child.__view, "Attempt to add view via regular DOM operation.");
- return WebInspector.View._originalAppendChild.call(this, child);
- }
- Element.prototype.insertBefore = function(child, anchor)
- {
- WebInspector.View._assert(!child.__view, "Attempt to add view via regular DOM operation.");
- return WebInspector.View._originalInsertBefore.call(this, child, anchor);
- }
- Element.prototype.removeChild = function(child)
- {
- WebInspector.View._assert(!child.__viewCounter && !child.__view, "Attempt to remove element containing view via regular DOM operation");
- return WebInspector.View._originalRemoveChild.call(this, child);
- }
- Element.prototype.removeChildren = function()
- {
- WebInspector.View._assert(!this.__viewCounter, "Attempt to remove element containing view via regular DOM operation");
- WebInspector.View._originalRemoveChildren.call(this);
- }
- WebInspector.HelpScreen = function(title)
- {
- WebInspector.View.call(this);
- this.registerRequiredCSS("helpScreen.css");
- this.element.className = "help-window-outer";
- this.element.addEventListener("keydown", this._onKeyDown.bind(this), false);
- this.element.tabIndex = 0;
- this.element.addEventListener("focus", this._onBlur.bind(this), false);
- var mainWindow = this.element.createChild("div", "help-window-main");
- var captionWindow = mainWindow.createChild("div", "help-window-caption");
- var closeButton = captionWindow.createChild("button", "help-close-button");
- this.contentElement = mainWindow.createChild("div", "help-content");
- captionWindow.createChild("h1", "help-window-title").textContent = title;
- closeButton.textContent = "\u2716";
- closeButton.addEventListener("click", this.hide.bind(this), false);
- }
- WebInspector.HelpScreen._visibleScreen = null;
- WebInspector.HelpScreen.prototype = {
- showModal: function()
- {
- var visibleHelpScreen = WebInspector.HelpScreen._visibleScreen;
- if (visibleHelpScreen === this)
- return;
- if (visibleHelpScreen)
- visibleHelpScreen.hide();
- WebInspector.HelpScreen._visibleScreen = this;
- this.show(WebInspector.inspectorView.element);
- this.focus();
- },
- hide: function()
- {
- if (!this.isShowing())
- return;
- WebInspector.HelpScreen._visibleScreen = null;
- WebInspector.restoreFocusFromElement(this.element);
- this.detach();
- },
- isClosingKey: function(keyCode)
- {
- return [
- WebInspector.KeyboardShortcut.Keys.Enter.code,
- WebInspector.KeyboardShortcut.Keys.Esc.code,
- WebInspector.KeyboardShortcut.Keys.Space.code,
- ].indexOf(keyCode) >= 0;
- },
- _onKeyDown: function(event)
- {
- if (this.isShowing() && this.isClosingKey(event.keyCode)) {
- this.hide();
- event.consume();
- }
- },
- _onBlur: function(event)
- {
- if (this.isShowing() && !this.element.isSelfOrAncestor(event.target))
- WebInspector.setCurrentFocusElement(this.element);
- }
- }
- WebInspector.HelpScreen.prototype.__proto__ = WebInspector.View.prototype;
- if (!window.InspectorFrontendHost) {
- WebInspector.InspectorFrontendHostStub = function()
- {
- this._attachedWindowHeight = 0;
- this.isStub = true;
- WebInspector.documentCopyEventFired = this.documentCopy.bind(this);
- }
- WebInspector.InspectorFrontendHostStub.prototype = {
- platform: function()
- {
- var match = navigator.userAgent.match(/Windows NT/);
- if (match)
- return "windows";
- match = navigator.userAgent.match(/Mac OS X/);
- if (match)
- return "mac";
- return "linux";
- },
- port: function()
- {
- return "unknown";
- },
- bringToFront: function()
- {
- this._windowVisible = true;
- },
- closeWindow: function()
- {
- this._windowVisible = false;
- },
- requestAttachWindow: function()
- {
- },
- requestDetachWindow: function()
- {
- },
- requestSetDockSide: function()
- {
- },
- setAttachedWindowHeight: function(height)
- {
- },
- moveWindowBy: function(x, y)
- {
- },
- setInjectedScriptForOrigin: function(origin, script)
- {
- },
- loaded: function()
- {
- },
- localizedStringsURL: function()
- {
- return undefined;
- },
- hiddenPanels: function()
- {
- return "";
- },
- inspectedURLChanged: function(url)
- {
- document.title = WebInspector.UIString(Preferences.applicationTitle, url);
- },
- documentCopy: function(event)
- {
- if (!this._textToCopy)
- return;
- event.clipboardData.setData("text", this._textToCopy);
- event.preventDefault();
- delete this._textToCopy;
- },
- copyText: function(text)
- {
- this._textToCopy = text;
- if (!document.execCommand("copy")) {
- var screen = new WebInspector.ClipboardAccessDeniedScreen();
- screen.showModal();
- }
- },
- openInNewTab: function(url)
- {
- window.open(url, "_blank");
- },
- canSave: function()
- {
- return true;
- },
- save: function(url, content, forceSaveAs)
- {
- var builder = new WebKitBlobBuilder();
- builder.append(content);
- var blob = builder.getBlob("application/octet-stream");
- var fr = new FileReader();
- fr.onload = function(e) {
- window.location = this.result;
- }
- fr.readAsDataURL(blob);
- },
- canAppend: function()
- {
- return false;
- },
- append: function(url, content)
- {
- },
- sendMessageToBackend: function(message)
- {
- },
- recordActionTaken: function(actionCode)
- {
- },
- recordPanelShown: function(panelCode)
- {
- },
- recordSettingChanged: function(settingCode)
- {
- },
- loadResourceSynchronously: function(url)
- {
- return "";
- },
- setZoomFactor: function(zoom)
- {
- }
- }
- var InspectorFrontendHost = new WebInspector.InspectorFrontendHostStub();
- Preferences.localizeUI = false;
- WebInspector.clipboardAccessDeniedMessage = function()
- {
- return "";
- }
- WebInspector.ClipboardAccessDeniedScreen = function()
- {
- WebInspector.HelpScreen.call(this, WebInspector.UIString("Clipboard access is denied"));
- var platformMessage = WebInspector.clipboardAccessDeniedMessage();
- if (platformMessage) {
- var p = this.contentElement.createChild("p");
- p.addStyleClass("help-section");
- p.textContent = platformMessage;
- }
- }
- WebInspector.ClipboardAccessDeniedScreen.prototype.__proto__ = WebInspector.HelpScreen.prototype;
- }
- WebInspector.FileManager = function()
- {
- }
- WebInspector.FileManager.EventTypes = {
- SavedURL: "SavedURL",
- AppendedToURL: "AppendedToURL"
- }
- WebInspector.FileManager.prototype = {
- canSave: function()
- {
- return InspectorFrontendHost.canSave();
- },
- canAppend: function()
- {
- return InspectorFrontendHost.canSave() && ("append" in InspectorFrontendHost);
- },
- save: function(url, content, forceSaveAs)
- {
- var savedURLs = WebInspector.settings.savedURLs.get();
- delete savedURLs[url];
- WebInspector.settings.savedURLs.set(savedURLs);
- InspectorFrontendHost.save(url, content, forceSaveAs);
- },
- savedURL: function(url)
- {
- var savedURLs = WebInspector.settings.savedURLs.get();
- savedURLs[url] = true;
- WebInspector.settings.savedURLs.set(savedURLs);
- this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.SavedURL, url);
- },
- isURLSaved: function(url)
- {
- var savedURLs = WebInspector.settings.savedURLs.get();
- return savedURLs[url];
- },
- append: function(url, content)
- {
- InspectorFrontendHost.append(url, content);
- },
- appendedToURL: function(url)
- {
- this.dispatchEventToListeners(WebInspector.FileManager.EventTypes.AppendedToURL, url);
- }
- }
- WebInspector.FileManager.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.fileManager = new WebInspector.FileManager();
- WebInspector.Checkbox = function(label, className, tooltip)
- {
- this.element = document.createElement('label');
- this._inputElement = document.createElement('input');
- this._inputElement.type = "checkbox";
- this.element.className = className;
- this.element.appendChild(this._inputElement);
- this.element.appendChild(document.createTextNode(label));
- if (tooltip)
- this.element.title = tooltip;
- }
- WebInspector.Checkbox.prototype = {
- set checked(checked)
- {
- this._inputElement.checked = checked;
- },
- get checked()
- {
- return this._inputElement.checked;
- },
- addEventListener: function(listener)
- {
- function listenerWrapper(event)
- {
- if (listener)
- listener(event);
- event.consume();
- return true;
- }
- this._inputElement.addEventListener("click", listenerWrapper, false);
- this.element.addEventListener("click", listenerWrapper, false);
- }
- }
- WebInspector.ContextMenu = function() {
- this._items = [];
- this._handlers = {};
- }
- WebInspector.ContextMenu.prototype = {
- show: function(event)
- {
- while (this._items.length > 0 && !("id" in this._items[this._items.length - 1]))
- this._items.splice(this._items.length - 1, 1);
- if (this._items.length) {
- WebInspector._contextMenu = this;
- InspectorFrontendHost.showContextMenu(event, this._items);
- }
- event.consume();
- },
- appendItem: function(label, handler, disabled)
- {
- var id = this._items.length;
- this._items.push({type: "item", id: id, label: label, enabled: !disabled});
- this._handlers[id] = handler;
- },
- appendCheckboxItem: function(label, handler, checked, disabled)
- {
- var id = this._items.length;
- this._items.push({type: "checkbox", id: id, label: label, checked: !!checked, enabled: !disabled});
- this._handlers[id] = handler;
- },
- appendSeparator: function()
- {
- if (this._items.length === 0)
- return;
- if (!("id" in this._items[this._items.length - 1]))
- return;
- this._items.push({type: "separator"});
- },
- isEmpty: function()
- {
- return !this._items.length;
- },
- _itemSelected: function(id)
- {
- if (this._handlers[id])
- this._handlers[id].call(this);
- }
- }
- WebInspector.contextMenuItemSelected = function(id)
- {
- if (WebInspector._contextMenu)
- WebInspector._contextMenu._itemSelected(id);
- }
- WebInspector.contextMenuCleared = function()
- {
- }
- if (!InspectorFrontendHost.showContextMenu) {
- WebInspector.SoftContextMenu = function(items)
- {
- this._items = items;
- }
- WebInspector.SoftContextMenu.prototype = {
- show: function(event)
- {
- this._x = event.x;
- this._y = event.y;
- this._time = new Date().getTime();
- var absoluteX = event.pageX;
- var absoluteY = event.pageY;
- var targetElement = event.target;
- while (targetElement && window !== targetElement.ownerDocument.defaultView) {
- var frameElement = targetElement.ownerDocument.defaultView.frameElement;
- absoluteY += frameElement.totalOffsetTop();
- absoluteX += frameElement.totalOffsetLeft();
- targetElement = frameElement;
- }
- this._glassPaneElement = document.createElement("div");
- this._glassPaneElement.className = "soft-context-menu-glass-pane";
- this._glassPaneElement.tabIndex = 0;
- this._glassPaneElement.addEventListener("mouseup", this._glassPaneMouseUp.bind(this), false);
- this._contextMenuElement = document.createElement("div");
- this._contextMenuElement.className = "soft-context-menu";
- this._contextMenuElement.tabIndex = 0;
- this._contextMenuElement.style.top = absoluteY + "px";
- this._contextMenuElement.style.left = absoluteX + "px";
- this._contextMenuElement.addEventListener("mousedown", this._discardMenu.bind(this), false);
- this._contextMenuElement.addEventListener("keydown", this._menuKeyDown.bind(this), false);
- this._contextMenuElement.addEventListener("blur", this._discardMenu.bind(this), false);
- for (var i = 0; i < this._items.length; ++i)
- this._contextMenuElement.appendChild(this._createMenuItem(this._items[i]));
- this._glassPaneElement.appendChild(this._contextMenuElement);
- document.body.appendChild(this._glassPaneElement);
- this._contextMenuElement.focus();
- if (document.body.offsetWidth < this._contextMenuElement.offsetLeft + this._contextMenuElement.offsetWidth)
- this._contextMenuElement.style.left = (absoluteX - this._contextMenuElement.offsetWidth) + "px";
- if (document.body.offsetHeight < this._contextMenuElement.offsetTop + this._contextMenuElement.offsetHeight)
- this._contextMenuElement.style.top = (document.body.offsetHeight - this._contextMenuElement.offsetHeight) + "px";
- event.consume(true);
- },
- _createMenuItem: function(item)
- {
- if (item.type === "separator")
- return this._createSeparator();
- var menuItemElement = document.createElement("div");
- menuItemElement.className = "soft-context-menu-item";
- var checkMarkElement = document.createElement("span");
- checkMarkElement.textContent = "\u2713 ";
- checkMarkElement.className = "soft-context-menu-item-checkmark";
- if (!item.checked)
- checkMarkElement.style.opacity = "0";
- menuItemElement.appendChild(checkMarkElement);
- menuItemElement.appendChild(document.createTextNode(item.label));
- menuItemElement.addEventListener("mousedown", this._menuItemMouseDown.bind(this), false);
- menuItemElement.addEventListener("mouseup", this._menuItemMouseUp.bind(this), false);
- menuItemElement.addEventListener("mouseover", this._menuItemMouseOver.bind(this), false);
- menuItemElement.addEventListener("mouseout", this._menuItemMouseOut.bind(this), false);
- menuItemElement._actionId = item.id;
- return menuItemElement;
- },
- _createSeparator: function()
- {
- var separatorElement = document.createElement("div");
- separatorElement.className = "soft-context-menu-separator";
- separatorElement._isSeparator = true;
- return separatorElement;
- },
- _menuItemMouseDown: function(event)
- {
- event.consume(true);
- },
- _menuItemMouseUp: function(event)
- {
- this._triggerAction(event.target, event);
- },
- _triggerAction: function(menuItemElement, event)
- {
- this._discardMenu(event);
- if (typeof menuItemElement._actionId !== "undefined") {
- WebInspector.contextMenuItemSelected(menuItemElement._actionId);
- delete menuItemElement._actionId;
- }
- },
- _menuItemMouseOver: function(event)
- {
- this._highlightMenuItem(event.target);
- },
- _menuItemMouseOut: function(event)
- {
- this._highlightMenuItem(null);
- },
- _highlightMenuItem: function(menuItemElement)
- {
- if (this._highlightedMenuItemElement)
- this._highlightedMenuItemElement.removeStyleClass("soft-context-menu-item-mouse-over");
- this._highlightedMenuItemElement = menuItemElement;
- if (this._highlightedMenuItemElement)
- this._highlightedMenuItemElement.addStyleClass("soft-context-menu-item-mouse-over");
- },
- _highlightPrevious: function()
- {
- var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.previousSibling : this._contextMenuElement.lastChild;
- while (menuItemElement && menuItemElement._isSeparator)
- menuItemElement = menuItemElement.previousSibling;
- if (menuItemElement)
- this._highlightMenuItem(menuItemElement);
- },
- _highlightNext: function()
- {
- var menuItemElement = this._highlightedMenuItemElement ? this._highlightedMenuItemElement.nextSibling : this._contextMenuElement.firstChild;
- while (menuItemElement && menuItemElement._isSeparator)
- menuItemElement = menuItemElement.nextSibling;
- if (menuItemElement)
- this._highlightMenuItem(menuItemElement);
- },
- _menuKeyDown: function(event)
- {
- switch (event.keyIdentifier) {
- case "Up":
- this._highlightPrevious(); break;
- case "Down":
- this._highlightNext(); break;
- case "U+001B":
- this._discardMenu(event); break;
- case "Enter":
- if (!isEnterKey(event))
- break;
- case "U+0020":
- if (this._highlightedMenuItemElement)
- this._triggerAction(this._highlightedMenuItemElement, event);
- break;
- }
- event.consume(true);
- },
- _glassPaneMouseUp: function(event)
- {
- if (event.x === this._x && event.y === this._y && new Date().getTime() - this._time < 300)
- return;
- this._discardMenu(event);
- },
- _discardMenu: function(event)
- {
- if (this._glassPaneElement) {
- var glassPane = this._glassPaneElement;
- delete this._glassPaneElement;
- document.body.removeChild(glassPane);
- event.consume(true);
- }
- }
- }
- InspectorFrontendHost.showContextMenu = function(event, items)
- {
- new WebInspector.SoftContextMenu(items).show(event);
- }
- }
- WebInspector.KeyboardShortcut = function()
- {
- }
- WebInspector.KeyboardShortcut.Modifiers = {
- None: 0,
- Shift: 1,
- Ctrl: 2,
- Alt: 4,
- Meta: 8,
- get CtrlOrMeta()
- {
- return WebInspector.isMac() ? this.Meta : this.Ctrl;
- }
- };
- WebInspector.KeyboardShortcut.Keys = {
- Backspace: { code: 8, name: "\u21a4" },
- Tab: { code: 9, name: { mac: "\u21e5", other: "<Tab>" } },
- Enter: { code: 13, name: { mac: "\u21a9", other: "<Enter>" } },
- Esc: { code: 27, name: { mac: "\u238b", other: "<Esc>" } },
- Space: { code: 32, name: "<Space>" },
- PageUp: { code: 33, name: { mac: "\u21de", other: "<PageUp>" } },
- PageDown: { code: 34, name: { mac: "\u21df", other: "<PageDown>" } },
- End: { code: 35, name: { mac: "\u2197", other: "<End>" } },
- Home: { code: 36, name: { mac: "\u2196", other: "<Home>" } },
- Left: { code: 37, name: "<Left>" },
- Up: { code: 38, name: "<Up>" },
- Right: { code: 39, name: "<Right>" },
- Down: { code: 40, name: "<Down>" },
- Delete: { code: 46, name: "<Del>" },
- Zero: { code: 48, name: "0" },
- F1: { code: 112, name: "F1" },
- F2: { code: 113, name: "F2" },
- F3: { code: 114, name: "F3" },
- F4: { code: 115, name: "F4" },
- F5: { code: 116, name: "F5" },
- F6: { code: 117, name: "F6" },
- F7: { code: 118, name: "F7" },
- F8: { code: 119, name: "F8" },
- F9: { code: 120, name: "F9" },
- F10: { code: 121, name: "F10" },
- F11: { code: 122, name: "F11" },
- F12: { code: 123, name: "F12" },
- Semicolon: { code: 186, name: ";" },
- Plus: { code: 187, name: "+" },
- Comma: { code: 188, name: "," },
- Minus: { code: 189, name: "-" },
- Period: { code: 190, name: "." },
- Slash: { code: 191, name: "/" },
- Apostrophe: { code: 192, name: "`" },
- SingleQuote: { code: 222, name: "\'" }
- };
- WebInspector.KeyboardShortcut.makeKey = function(keyCode, modifiers)
- {
- if (typeof keyCode === "string")
- keyCode = keyCode.charCodeAt(0) - 32;
- modifiers = modifiers || WebInspector.KeyboardShortcut.Modifiers.None;
- return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyCode, modifiers);
- }
- WebInspector.KeyboardShortcut.makeKeyFromEvent = function(keyboardEvent)
- {
- var modifiers = WebInspector.KeyboardShortcut.Modifiers.None;
- if (keyboardEvent.shiftKey)
- modifiers |= WebInspector.KeyboardShortcut.Modifiers.Shift;
- if (keyboardEvent.ctrlKey)
- modifiers |= WebInspector.KeyboardShortcut.Modifiers.Ctrl;
- if (keyboardEvent.altKey)
- modifiers |= WebInspector.KeyboardShortcut.Modifiers.Alt;
- if (keyboardEvent.metaKey)
- modifiers |= WebInspector.KeyboardShortcut.Modifiers.Meta;
- return WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers(keyboardEvent.keyCode, modifiers);
- }
- WebInspector.KeyboardShortcut.eventHasCtrlOrMeta = function(event)
- {
- return WebInspector.isMac() ? event.metaKey && !event.ctrlKey : event.ctrlKey && !event.metaKey;
- }
- WebInspector.KeyboardShortcut.makeDescriptor = function(key, modifiers)
- {
- return {
- key: WebInspector.KeyboardShortcut.makeKey(typeof key === "string" ? key : key.code, modifiers),
- name: WebInspector.KeyboardShortcut.shortcutToString(key, modifiers)
- };
- }
- WebInspector.KeyboardShortcut.shortcutToString = function(key, modifiers)
- {
- return WebInspector.KeyboardShortcut._modifiersToString(modifiers) + WebInspector.KeyboardShortcut._keyName(key);
- }
- WebInspector.KeyboardShortcut._keyName = function(key)
- {
- if (typeof key === "string")
- return key.toUpperCase();
- if (typeof key.name === "string")
- return key.name;
- return key.name[WebInspector.platform()] || key.name.other;
- }
- WebInspector.KeyboardShortcut._makeKeyFromCodeAndModifiers = function(keyCode, modifiers)
- {
- return (keyCode & 255) | (modifiers << 8);
- };
- WebInspector.KeyboardShortcut._modifiersToString = function(modifiers)
- {
- const cmdKey = "\u2318";
- const optKey = "\u2325";
- const shiftKey = "\u21e7";
- const ctrlKey = "\u2303";
- var isMac = WebInspector.isMac();
- var res = "";
- if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Ctrl)
- res += isMac ? ctrlKey : "<Ctrl> + ";
- if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Alt)
- res += isMac ? optKey : "<Alt> + ";
- if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Shift)
- res += isMac ? shiftKey : "<Shift> + ";
- if (modifiers & WebInspector.KeyboardShortcut.Modifiers.Meta)
- res += isMac ? cmdKey : "<Win> + ";
- return res;
- };
- WebInspector.TextPrompt = function(completions, stopCharacters)
- {
- this._proxyElement;
- this._proxyElementDisplay = "inline-block";
- this._loadCompletions = completions;
- this._completionStopCharacters = stopCharacters;
- this._suggestForceable = true;
- }
- WebInspector.TextPrompt.Events = {
- ItemApplied: "text-prompt-item-applied",
- ItemAccepted: "text-prompt-item-accepted"
- };
- WebInspector.TextPrompt.prototype = {
- get proxyElement()
- {
- return this._proxyElement;
- },
- setSuggestForceable: function(x)
- {
- this._suggestForceable = x;
- },
- setSuggestBoxEnabled: function(className)
- {
- this._suggestBoxClassName = className;
- },
- renderAsBlock: function()
- {
- this._proxyElementDisplay = "block";
- },
- attach: function(element)
- {
- return this._attachInternal(element);
- },
- attachAndStartEditing: function(element, blurListener)
- {
- this._attachInternal(element);
- this._startEditing(blurListener);
- return this.proxyElement;
- },
- _attachInternal: function(element)
- {
- if (this.proxyElement)
- throw "Cannot attach an attached TextPrompt";
- this._element = element;
- this._boundOnKeyDown = this.onKeyDown.bind(this);
- this._boundSelectStart = this._selectStart.bind(this);
- this._proxyElement = element.ownerDocument.createElement("span");
- this._proxyElement.style.display = this._proxyElementDisplay;
- element.parentElement.insertBefore(this.proxyElement, element);
- this.proxyElement.appendChild(element);
- this._element.addStyleClass("text-prompt");
- this._element.addEventListener("keydown", this._boundOnKeyDown, false);
- this._element.addEventListener("selectstart", this._boundSelectStart, false);
- if (typeof this._suggestBoxClassName === "string")
- this._suggestBox = new WebInspector.TextPrompt.SuggestBox(this, this._element, this._suggestBoxClassName);
- return this.proxyElement;
- },
- detach: function()
- {
- this._removeFromElement();
- this.proxyElement.parentElement.insertBefore(this._element, this.proxyElement);
- this.proxyElement.parentElement.removeChild(this.proxyElement);
- this._element.removeStyleClass("text-prompt");
- this._element.removeEventListener("keydown", this._boundOnKeyDown, false);
- this._element.removeEventListener("selectstart", this._boundSelectStart, false);
- delete this._proxyElement;
- WebInspector.restoreFocusFromElement(this._element);
- },
- get text()
- {
- return this._element.textContent;
- },
- set text(x)
- {
- this._removeSuggestionAids();
- if (!x) {
- this._element.removeChildren();
- this._element.appendChild(document.createElement("br"));
- } else
- this._element.textContent = x;
- this.moveCaretToEndOfPrompt();
- this._element.scrollIntoView();
- },
- _removeFromElement: function()
- {
- this.clearAutoComplete(true);
- this._element.removeEventListener("keydown", this._boundOnKeyDown, false);
- this._element.removeEventListener("selectstart", this._boundSelectStart, false);
- if (this._isEditing)
- this._stopEditing();
- if (this._suggestBox)
- this._suggestBox.removeFromElement();
- },
- _startEditing: function(blurListener)
- {
- this._isEditing = true;
- this._element.addStyleClass("editing");
- if (blurListener) {
- this._blurListener = blurListener;
- this._element.addEventListener("blur", this._blurListener, false);
- }
- this._oldTabIndex = this._element.tabIndex;
- if (this._element.tabIndex < 0)
- this._element.tabIndex = 0;
- WebInspector.setCurrentFocusElement(this._element);
- },
- _stopEditing: function()
- {
- this._element.tabIndex = this._oldTabIndex;
- if (this._blurListener)
- this._element.removeEventListener("blur", this._blurListener, false);
- this._element.removeStyleClass("editing");
- delete this._isEditing;
- },
- _removeSuggestionAids: function()
- {
- this.clearAutoComplete();
- this.hideSuggestBox();
- },
- _selectStart: function(event)
- {
- if (this._selectionTimeout)
- clearTimeout(this._selectionTimeout);
- this._removeSuggestionAids();
- function moveBackIfOutside()
- {
- delete this._selectionTimeout;
- if (!this.isCaretInsidePrompt() && window.getSelection().isCollapsed) {
- this.moveCaretToEndOfPrompt();
- this.autoCompleteSoon();
- }
- }
- this._selectionTimeout = setTimeout(moveBackIfOutside.bind(this), 100);
- },
- defaultKeyHandler: function(event, force)
- {
- this.clearAutoComplete();
- this.autoCompleteSoon(force);
- return false;
- },
- onKeyDown: function(event)
- {
- var handled = false;
- var invokeDefault = true;
- switch (event.keyIdentifier) {
- case "Up":
- handled = this.upKeyPressed(event);
- break;
- case "Down":
- handled = this.downKeyPressed(event);
- break;
- case "PageUp":
- handled = this.pageUpKeyPressed(event);
- break;
- case "PageDown":
- handled = this.pageDownKeyPressed(event);
- break;
- case "U+0009":
- handled = this.tabKeyPressed(event);
- break;
- case "Enter":
- handled = this.enterKeyPressed(event);
- break;
- case "Left":
- case "Home":
- this._removeSuggestionAids();
- invokeDefault = false;
- break;
- case "Right":
- case "End":
- if (this.isCaretAtEndOfPrompt())
- handled = this.acceptAutoComplete();
- else
- this._removeSuggestionAids();
- invokeDefault = false;
- break;
- case "U+001B":
- if (this.isSuggestBoxVisible()) {
- this._suggestBox.hide();
- handled = true;
- }
- break;
- case "U+0020":
- if (this._suggestForceable && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
- this.defaultKeyHandler(event, true);
- handled = true;
- }
- break;
- case "Alt":
- case "Meta":
- case "Shift":
- case "Control":
- invokeDefault = false;
- break;
- }
- if (!handled && invokeDefault)
- handled = this.defaultKeyHandler(event);
- if (handled)
- event.consume(true);
- return handled;
- },
- acceptAutoComplete: function()
- {
- var result = false;
- if (this.isSuggestBoxVisible())
- result = this._suggestBox.acceptSuggestion();
- if (!result)
- result = this.acceptSuggestion();
- return result;
- },
- clearAutoComplete: function(includeTimeout)
- {
- if (includeTimeout && this._completeTimeout) {
- clearTimeout(this._completeTimeout);
- delete this._completeTimeout;
- }
- delete this._waitingForCompletions;
- if (!this.autoCompleteElement)
- return;
- if (this.autoCompleteElement.parentNode)
- this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
- delete this.autoCompleteElement;
- if (!this._userEnteredRange || !this._userEnteredText)
- return;
- this._userEnteredRange.deleteContents();
- this._element.pruneEmptyTextNodes();
- var userTextNode = document.createTextNode(this._userEnteredText);
- this._userEnteredRange.insertNode(userTextNode);
- var selectionRange = document.createRange();
- selectionRange.setStart(userTextNode, this._userEnteredText.length);
- selectionRange.setEnd(userTextNode, this._userEnteredText.length);
- var selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange(selectionRange);
- delete this._userEnteredRange;
- delete this._userEnteredText;
- },
- autoCompleteSoon: function(force)
- {
- var immediately = this.isSuggestBoxVisible() || force;
- if (!this._completeTimeout)
- this._completeTimeout = setTimeout(this.complete.bind(this, true, force), immediately ? 0 : 250);
- },
- complete: function(auto, force, reverse)
- {
- this.clearAutoComplete(true);
- var selection = window.getSelection();
- if (!selection.rangeCount)
- return;
- var selectionRange = selection.getRangeAt(0);
- var isEmptyInput = selectionRange.commonAncestorContainer === this._element;
- var shouldExit;
- if (auto && isEmptyInput && !force)
- shouldExit = true;
- else if (!auto && !isEmptyInput && !selectionRange.commonAncestorContainer.isDescendant(this._element))
- shouldExit = true;
- else if (auto && !force && !this.isCaretAtEndOfPrompt() && !this.isSuggestBoxVisible())
- shouldExit = true;
- else if (!selection.isCollapsed)
- shouldExit = true;
- else if (!force) {
- var wordSuffixRange = selectionRange.startContainer.rangeOfWord(selectionRange.endOffset, this._completionStopCharacters, this._element, "forward");
- if (wordSuffixRange.toString().length)
- shouldExit = true;
- }
- if (shouldExit) {
- this.hideSuggestBox();
- return;
- }
- var wordPrefixRange = selectionRange.startContainer.rangeOfWord(selectionRange.startOffset, this._completionStopCharacters, this._element, "backward");
- this._waitingForCompletions = true;
- this._loadCompletions(this, wordPrefixRange, force, this._completionsReady.bind(this, selection, auto, wordPrefixRange, !!reverse));
- },
- _boxForAnchorAtStart: function(selection, textRange)
- {
- var rangeCopy = selection.getRangeAt(0).cloneRange();
- var anchorElement = document.createElement("span");
- anchorElement.textContent = "\u200B";
- textRange.insertNode(anchorElement);
- var box = anchorElement.boxInWindow(window);
- anchorElement.parentElement.removeChild(anchorElement);
- selection.removeAllRanges();
- selection.addRange(rangeCopy);
- return box;
- },
- _buildCommonPrefix: function(completions, wordPrefixLength)
- {
- var commonPrefix = completions[0];
- for (var i = 0; i < completions.length; ++i) {
- var completion = completions[i];
- var lastIndex = Math.min(commonPrefix.length, completion.length);
- for (var j = wordPrefixLength; j < lastIndex; ++j) {
- if (commonPrefix[j] !== completion[j]) {
- commonPrefix = commonPrefix.substr(0, j);
- break;
- }
- }
- }
- return commonPrefix;
- },
- _completionsReady: function(selection, auto, originalWordPrefixRange, reverse, completions)
- {
- if (!this._waitingForCompletions || !completions || !completions.length) {
- this.hideSuggestBox();
- return;
- }
- delete this._waitingForCompletions;
- var selectionRange = selection.getRangeAt(0);
- var fullWordRange = document.createRange();
- fullWordRange.setStart(originalWordPrefixRange.startContainer, originalWordPrefixRange.startOffset);
- fullWordRange.setEnd(selectionRange.endContainer, selectionRange.endOffset);
- if (originalWordPrefixRange.toString() + selectionRange.toString() != fullWordRange.toString())
- return;
- this._userEnteredRange = fullWordRange;
- this._userEnteredText = fullWordRange.toString();
- if (this._suggestBox)
- this._suggestBox.updateSuggestions(this._boxForAnchorAtStart(selection, fullWordRange), completions, !this.isCaretAtEndOfPrompt());
- var wordPrefixLength = originalWordPrefixRange.toString().length;
- if (auto) {
- var completionText = completions[0];
- var commonPrefix = this._buildCommonPrefix(completions, wordPrefixLength);
- this._commonPrefix = commonPrefix;
- } else {
- if (completions.length === 1) {
- var completionText = completions[0];
- wordPrefixLength = completionText.length;
- } else {
- var commonPrefix = this._buildCommonPrefix(completions, wordPrefixLength);
- wordPrefixLength = commonPrefix.length;
- if (selection.isCollapsed)
- var completionText = completions[0];
- else {
- var currentText = fullWordRange.toString();
- var foundIndex = null;
- for (var i = 0; i < completions.length; ++i) {
- if (completions[i] === currentText)
- foundIndex = i;
- }
- var nextIndex = foundIndex + (reverse ? -1 : 1);
- if (foundIndex === null || nextIndex >= completions.length)
- var completionText = completions[0];
- else if (nextIndex < 0)
- var completionText = completions[completions.length - 1];
- else
- var completionText = completions[nextIndex];
- }
- }
- }
- if (auto) {
- if (this.isCaretAtEndOfPrompt()) {
- this._userEnteredRange.deleteContents();
- this._element.pruneEmptyTextNodes();
- var finalSelectionRange = document.createRange();
- var prefixText = completionText.substring(0, wordPrefixLength);
- var suffixText = completionText.substring(wordPrefixLength);
- var prefixTextNode = document.createTextNode(prefixText);
- fullWordRange.insertNode(prefixTextNode);
- this.autoCompleteElement = document.createElement("span");
- this.autoCompleteElement.className = "auto-complete-text";
- this.autoCompleteElement.textContent = suffixText;
- prefixTextNode.parentNode.insertBefore(this.autoCompleteElement, prefixTextNode.nextSibling);
- finalSelectionRange.setStart(prefixTextNode, wordPrefixLength);
- finalSelectionRange.setEnd(prefixTextNode, wordPrefixLength);
- selection.removeAllRanges();
- selection.addRange(finalSelectionRange);
- }
- } else
- this.applySuggestion(completionText, completions.length > 1, originalWordPrefixRange);
- },
- _completeCommonPrefix: function()
- {
- if (!this.autoCompleteElement || !this._commonPrefix || !this._userEnteredText || !this._commonPrefix.startsWith(this._userEnteredText))
- return;
- if (!this.isSuggestBoxVisible()) {
- this.acceptAutoComplete();
- return;
- }
- this.autoCompleteElement.textContent = this._commonPrefix.substring(this._userEnteredText.length);
- this.acceptSuggestion(true)
- },
- applySuggestion: function(completionText, isIntermediateSuggestion, originalPrefixRange)
- {
- var wordPrefixLength;
- if (originalPrefixRange)
- wordPrefixLength = originalPrefixRange.toString().length;
- else
- wordPrefixLength = this._userEnteredText ? this._userEnteredText.length : 0;
- this._userEnteredRange.deleteContents();
- this._element.pruneEmptyTextNodes();
- var finalSelectionRange = document.createRange();
- var completionTextNode = document.createTextNode(completionText);
- this._userEnteredRange.insertNode(completionTextNode);
- if (this.autoCompleteElement && this.autoCompleteElement.parentNode) {
- this.autoCompleteElement.parentNode.removeChild(this.autoCompleteElement);
- delete this.autoCompleteElement;
- }
- if (isIntermediateSuggestion)
- finalSelectionRange.setStart(completionTextNode, wordPrefixLength);
- else
- finalSelectionRange.setStart(completionTextNode, completionText.length);
- finalSelectionRange.setEnd(completionTextNode, completionText.length);
- var selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange(finalSelectionRange);
- if (isIntermediateSuggestion)
- this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemApplied, { itemText: completionText });
- },
- acceptSuggestion: function(prefixAccepted)
- {
- if (this._isAcceptingSuggestion)
- return false;
- if (!this.autoCompleteElement || !this.autoCompleteElement.parentNode)
- return false;
- var text = this.autoCompleteElement.textContent;
- var textNode = document.createTextNode(text);
- this.autoCompleteElement.parentNode.replaceChild(textNode, this.autoCompleteElement);
- delete this.autoCompleteElement;
- var finalSelectionRange = document.createRange();
- finalSelectionRange.setStart(textNode, text.length);
- finalSelectionRange.setEnd(textNode, text.length);
- var selection = window.getSelection();
- selection.removeAllRanges();
- selection.addRange(finalSelectionRange);
- if (!prefixAccepted) {
- this.hideSuggestBox();
- this.dispatchEventToListeners(WebInspector.TextPrompt.Events.ItemAccepted);
- } else
- this.autoCompleteSoon(true);
- return true;
- },
- hideSuggestBox: function()
- {
- if (this.isSuggestBoxVisible())
- this._suggestBox.hide();
- },
- isSuggestBoxVisible: function()
- {
- return this._suggestBox && this._suggestBox.visible;
- },
- isCaretInsidePrompt: function()
- {
- return this._element.isInsertionCaretInside();
- },
- isCaretAtEndOfPrompt: function()
- {
- var selection = window.getSelection();
- if (!selection.rangeCount || !selection.isCollapsed)
- return false;
- var selectionRange = selection.getRangeAt(0);
- var node = selectionRange.startContainer;
- if (!node.isSelfOrDescendant(this._element))
- return false;
- if (node.nodeType === Node.TEXT_NODE && selectionRange.startOffset < node.nodeValue.length)
- return false;
- var foundNextText = false;
- while (node) {
- if (node.nodeType === Node.TEXT_NODE && node.nodeValue.length) {
- if (foundNextText && (!this.autoCompleteElement || !this.autoCompleteElement.isAncestor(node)))
- return false;
- foundNextText = true;
- }
- node = node.traverseNextNode(this._element);
- }
- return true;
- },
- isCaretOnFirstLine: function()
- {
- var selection = window.getSelection();
- var focusNode = selection.focusNode;
- if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this._element)
- return true;
- if (focusNode.textContent.substring(0, selection.focusOffset).indexOf("\n") !== -1)
- return false;
- focusNode = focusNode.previousSibling;
- while (focusNode) {
- if (focusNode.nodeType !== Node.TEXT_NODE)
- return true;
- if (focusNode.textContent.indexOf("\n") !== -1)
- return false;
- focusNode = focusNode.previousSibling;
- }
- return true;
- },
- isCaretOnLastLine: function()
- {
- var selection = window.getSelection();
- var focusNode = selection.focusNode;
- if (!focusNode || focusNode.nodeType !== Node.TEXT_NODE || focusNode.parentNode !== this._element)
- return true;
- if (focusNode.textContent.substring(selection.focusOffset).indexOf("\n") !== -1)
- return false;
- focusNode = focusNode.nextSibling;
- while (focusNode) {
- if (focusNode.nodeType !== Node.TEXT_NODE)
- return true;
- if (focusNode.textContent.indexOf("\n") !== -1)
- return false;
- focusNode = focusNode.nextSibling;
- }
- return true;
- },
- moveCaretToEndOfPrompt: function()
- {
- var selection = window.getSelection();
- var selectionRange = document.createRange();
- var offset = this._element.childNodes.length;
- selectionRange.setStart(this._element, offset);
- selectionRange.setEnd(this._element, offset);
- selection.removeAllRanges();
- selection.addRange(selectionRange);
- },
- tabKeyPressed: function(event)
- {
- this._completeCommonPrefix();
- return true;
- },
- enterKeyPressed: function(event)
- {
- if (this.isSuggestBoxVisible())
- return this._suggestBox.enterKeyPressed(event);
- return false;
- },
- upKeyPressed: function(event)
- {
- if (this.isSuggestBoxVisible())
- return this._suggestBox.upKeyPressed(event);
- return false;
- },
- downKeyPressed: function(event)
- {
- if (this.isSuggestBoxVisible())
- return this._suggestBox.downKeyPressed(event);
- return false;
- },
- pageUpKeyPressed: function(event)
- {
- if (this.isSuggestBoxVisible())
- return this._suggestBox.pageUpKeyPressed(event);
- return false;
- },
- pageDownKeyPressed: function(event)
- {
- if (this.isSuggestBoxVisible())
- return this._suggestBox.pageDownKeyPressed(event);
- return false;
- },
- }
- WebInspector.TextPrompt.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.TextPromptWithHistory = function(completions, stopCharacters)
- {
- WebInspector.TextPrompt.call(this, completions, stopCharacters);
- this._data = [];
- this._historyOffset = 1;
- this._coalesceHistoryDupes = true;
- }
- WebInspector.TextPromptWithHistory.prototype = {
- get historyData()
- {
- return this._data;
- },
- setCoalesceHistoryDupes: function(x)
- {
- this._coalesceHistoryDupes = x;
- },
- setHistoryData: function(data)
- {
- this._data = [].concat(data);
- this._historyOffset = 1;
- },
- pushHistoryItem: function(text)
- {
- if (this._uncommittedIsTop) {
- this._data.pop();
- delete this._uncommittedIsTop;
- }
- this._historyOffset = 1;
- if (this._coalesceHistoryDupes && text === this._currentHistoryItem())
- return;
- this._data.push(text);
- },
- _pushCurrentText: function()
- {
- if (this._uncommittedIsTop)
- this._data.pop();
- this._uncommittedIsTop = true;
- this.clearAutoComplete(true);
- this._data.push(this.text);
- },
- _previous: function()
- {
- if (this._historyOffset > this._data.length)
- return undefined;
- if (this._historyOffset === 1)
- this._pushCurrentText();
- ++this._historyOffset;
- return this._currentHistoryItem();
- },
- _next: function()
- {
- if (this._historyOffset === 1)
- return undefined;
- --this._historyOffset;
- return this._currentHistoryItem();
- },
- _currentHistoryItem: function()
- {
- return this._data[this._data.length - this._historyOffset];
- },
- defaultKeyHandler: function(event, force)
- {
- var newText;
- var isPrevious;
- switch (event.keyIdentifier) {
- case "Up":
- if (!this.isCaretOnFirstLine())
- break;
- newText = this._previous();
- isPrevious = true;
- break;
- case "Down":
- if (!this.isCaretOnLastLine())
- break;
- newText = this._next();
- break;
- case "U+0050":
- if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey) {
- newText = this._previous();
- isPrevious = true;
- }
- break;
- case "U+004E":
- if (WebInspector.isMac() && event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey)
- newText = this._next();
- break;
- }
- if (newText !== undefined) {
- event.consume(true);
- this.text = newText;
- if (isPrevious) {
- var firstNewlineIndex = this.text.indexOf("\n");
- if (firstNewlineIndex === -1)
- this.moveCaretToEndOfPrompt();
- else {
- var selection = window.getSelection();
- var selectionRange = document.createRange();
- selectionRange.setStart(this._element.firstChild, firstNewlineIndex);
- selectionRange.setEnd(this._element.firstChild, firstNewlineIndex);
- selection.removeAllRanges();
- selection.addRange(selectionRange);
- }
- }
- return true;
- }
- return WebInspector.TextPrompt.prototype.defaultKeyHandler.apply(this, arguments);
- }
- }
- WebInspector.TextPromptWithHistory.prototype.__proto__ = WebInspector.TextPrompt.prototype;
- WebInspector.TextPrompt.SuggestBox = function(textPrompt, inputElement, className)
- {
- this._textPrompt = textPrompt;
- this._inputElement = inputElement;
- this._selectedElement = null;
- this._boundOnScroll = this._onscrollresize.bind(this, true);
- this._boundOnResize = this._onscrollresize.bind(this, false);
- window.addEventListener("scroll", this._boundOnScroll, true);
- window.addEventListener("resize", this._boundOnResize, true);
- this._bodyElement = inputElement.ownerDocument.body;
- this._element = inputElement.ownerDocument.createElement("div");
- this._element.className = "suggest-box " + (className || "");
- this._element.addEventListener("mousedown", this._onboxmousedown.bind(this), true);
- this.containerElement = this._element.createChild("div", "container");
- this.contentElement = this.containerElement.createChild("div", "content");
- }
- WebInspector.TextPrompt.SuggestBox.prototype = {
- get visible()
- {
- return !!this._element.parentElement;
- },
- get hasSelection()
- {
- return !!this._selectedElement;
- },
- _onscrollresize: function(isScroll, event)
- {
- if (isScroll && this._element.isAncestor(event.target) || !this.visible)
- return;
- this._updateBoxPositionWithExistingAnchor();
- },
- _updateBoxPositionWithExistingAnchor: function()
- {
- this._updateBoxPosition(this._anchorBox);
- },
- _updateBoxPosition: function(anchorBox)
- {
- this.contentElement.style.display = "inline-block";
- document.body.appendChild(this.contentElement);
- this.contentElement.positionAt(0, 0);
- var contentWidth = this.contentElement.offsetWidth;
- var contentHeight = this.contentElement.offsetHeight;
- this.contentElement.style.display = "block";
- this.containerElement.appendChild(this.contentElement);
- this._anchorBox = anchorBox;
- const spacer = 6;
- const suggestBoxPaddingX = 21;
- var maxWidth = document.body.offsetWidth - anchorBox.x - spacer;
- var width = Math.min(contentWidth, maxWidth - suggestBoxPaddingX) + suggestBoxPaddingX;
- var paddedWidth = contentWidth + suggestBoxPaddingX;
- var boxX = anchorBox.x;
- if (width < paddedWidth) {
- maxWidth = document.body.offsetWidth - spacer;
- width = Math.min(contentWidth, maxWidth - suggestBoxPaddingX) + suggestBoxPaddingX;
- boxX = document.body.offsetWidth - width;
- }
- const suggestBoxPaddingY = 2;
- var boxY;
- var aboveHeight = anchorBox.y;
- var underHeight = document.body.offsetHeight - anchorBox.y - anchorBox.height;
- var maxHeight = Math.max(underHeight, aboveHeight) - spacer;
- var height = Math.min(contentHeight, maxHeight - suggestBoxPaddingY) + suggestBoxPaddingY;
- if (underHeight >= aboveHeight) {
- boxY = anchorBox.y + anchorBox.height;
- this._element.removeStyleClass("above-anchor");
- this._element.addStyleClass("under-anchor");
- } else {
- boxY = anchorBox.y - height;
- this._element.removeStyleClass("under-anchor");
- this._element.addStyleClass("above-anchor");
- }
- this._element.positionAt(boxX, boxY);
- this._element.style.width = width + "px";
- this._element.style.height = height + "px";
- },
- _onboxmousedown: function(event)
- {
- event.preventDefault();
- },
- hide: function()
- {
- if (!this.visible)
- return;
- this._element.parentElement.removeChild(this._element);
- delete this._selectedElement;
- },
- removeFromElement: function()
- {
- window.removeEventListener("scroll", this._boundOnScroll, true);
- window.removeEventListener("resize", this._boundOnResize, true);
- this.hide();
- },
- _applySuggestion: function(text, isIntermediateSuggestion)
- {
- if (!this.visible || !(text || this._selectedElement))
- return false;
- var suggestion = text || this._selectedElement.textContent;
- if (!suggestion)
- return false;
- this._textPrompt.applySuggestion(suggestion, isIntermediateSuggestion);
- return true;
- },
- acceptSuggestion: function(text)
- {
- var result = this._applySuggestion(text, false);
- this.hide();
- if (!result)
- return false;
- this._textPrompt.acceptSuggestion();
- return true;
- },
- _onNextItem: function(event, isPageScroll)
- {
- var children = this.contentElement.childNodes;
- if (!children.length)
- return false;
- if (!this._selectedElement)
- this._selectedElement = this.contentElement.firstChild;
- else {
- if (!isPageScroll)
- this._selectedElement = this._selectedElement.nextSibling || this.contentElement.firstChild;
- else {
- var candidate = this._selectedElement;
- for (var itemsLeft = this._rowCountPerViewport; itemsLeft; --itemsLeft) {
- if (candidate.nextSibling)
- candidate = candidate.nextSibling;
- else
- break;
- }
- this._selectedElement = candidate;
- }
- }
- this._updateSelection();
- this._applySuggestion(undefined, true);
- return true;
- },
- _onPreviousItem: function(event, isPageScroll)
- {
- var children = this.contentElement.childNodes;
- if (!children.length)
- return false;
- if (!this._selectedElement)
- this._selectedElement = this.contentElement.lastChild;
- else {
- if (!isPageScroll)
- this._selectedElement = this._selectedElement.previousSibling || this.contentElement.lastChild;
- else {
- var candidate = this._selectedElement;
- for (var itemsLeft = this._rowCountPerViewport; itemsLeft; --itemsLeft) {
- if (candidate.previousSibling)
- candidate = candidate.previousSibling;
- else
- break;
- }
- this._selectedElement = candidate;
- }
- }
- this._updateSelection();
- this._applySuggestion(undefined, true);
- return true;
- },
- updateSuggestions: function(anchorBox, completions, canShowForSingleItem)
- {
- if (this._suggestTimeout) {
- clearTimeout(this._suggestTimeout);
- delete this._suggestTimeout;
- }
- this._completionsReady(anchorBox, completions, canShowForSingleItem);
- },
- _onItemMouseDown: function(text, event)
- {
- this.acceptSuggestion(text);
- event.consume(true);
- },
- _createItemElement: function(prefix, text)
- {
- var element = document.createElement("div");
- element.className = "suggest-box-content-item source-code";
- element.tabIndex = -1;
- if (prefix && prefix.length && !text.indexOf(prefix)) {
- var prefixElement = element.createChild("span", "prefix");
- prefixElement.textContent = prefix;
- var suffixElement = element.createChild("span", "suffix");
- suffixElement.textContent = text.substring(prefix.length);
- } else {
- var suffixElement = element.createChild("span", "suffix");
- suffixElement.textContent = text;
- }
- element.addEventListener("mousedown", this._onItemMouseDown.bind(this, text), false);
- return element;
- },
- _updateItems: function(items, canShowForSingleItem)
- {
- this.contentElement.removeChildren();
- var userEnteredText = this._textPrompt._userEnteredText;
- for (var i = 0; i < items.length; ++i) {
- var item = items[i];
- var currentItemElement = this._createItemElement(userEnteredText, item);
- this.contentElement.appendChild(currentItemElement);
- }
- this._selectedElement = canShowForSingleItem ? this.contentElement.firstChild : null;
- this._updateSelection();
- },
- _updateSelection: function()
- {
- for (var child = this.contentElement.firstChild; child; child = child.nextSibling) {
- if (child !== this._selectedElement)
- child.removeStyleClass("selected");
- }
- if (this._selectedElement) {
- this._selectedElement.addStyleClass("selected");
- this._selectedElement.scrollIntoViewIfNeeded(false);
- }
- },
- _canShowBox: function(completions, canShowForSingleItem)
- {
- if (!completions || !completions.length)
- return false;
- if (completions.length > 1)
- return true;
- return canShowForSingleItem && completions[0] !== this._textPrompt._userEnteredText;
- },
- _rememberRowCountPerViewport: function()
- {
- if (!this.contentElement.firstChild)
- return;
- this._rowCountPerViewport = Math.floor(this.containerElement.offsetHeight / this.contentElement.firstChild.offsetHeight);
- },
- _completionsReady: function(anchorBox, completions, canShowForSingleItem)
- {
- if (this._canShowBox(completions, canShowForSingleItem)) {
- this._updateItems(completions, canShowForSingleItem);
- this._updateBoxPosition(anchorBox);
- if (!this.visible)
- this._bodyElement.appendChild(this._element);
- this._rememberRowCountPerViewport();
- } else
- this.hide();
- },
- upKeyPressed: function(event)
- {
- return this._onPreviousItem(event, false);
- },
- downKeyPressed: function(event)
- {
- return this._onNextItem(event, false);
- },
- pageUpKeyPressed: function(event)
- {
- return this._onPreviousItem(event, true);
- },
- pageDownKeyPressed: function(event)
- {
- return this._onNextItem(event, true);
- },
- enterKeyPressed: function(event)
- {
- var hasSelectedItem = !!this._selectedElement;
- this.acceptSuggestion();
- return hasSelectedItem;
- },
- tabKeyPressed: function(event)
- {
- return this.enterKeyPressed(event);
- }
- }
- WebInspector.Popover = function(popoverHelper)
- {
- this.element = document.createElement("div");
- this.element.className = "popover custom-popup-vertical-scroll custom-popup-horizontal-scroll";
- this._popupArrowElement = document.createElement("div");
- this._popupArrowElement.className = "arrow";
- this.element.appendChild(this._popupArrowElement);
- this._contentDiv = document.createElement("div");
- this._contentDiv.className = "content";
- this._visible = false;
- this._popoverHelper = popoverHelper;
- }
- WebInspector.Popover.prototype = {
- show: function(contentElement, anchor, preferredWidth, preferredHeight)
- {
- if (this._disposed)
- return;
- this.contentElement = contentElement;
- if (WebInspector.Popover._popoverElement)
- document.body.removeChild(WebInspector.Popover._popoverElement);
- WebInspector.Popover._popoverElement = this.element;
- this.contentElement.positionAt(0, 0);
- document.body.appendChild(this.contentElement);
- preferredWidth = preferredWidth || this.contentElement.offsetWidth;
- preferredHeight = preferredHeight || this.contentElement.offsetHeight;
- this._contentDiv.appendChild(this.contentElement);
- this.element.appendChild(this._contentDiv);
- document.body.appendChild(this.element);
- this._positionElement(anchor, preferredWidth, preferredHeight);
- this._visible = true;
- if (this._popoverHelper)
- contentElement.addEventListener("mousemove", this._popoverHelper._killHidePopoverTimer.bind(this._popoverHelper), true);
- },
- hide: function()
- {
- if (WebInspector.Popover._popoverElement) {
- delete WebInspector.Popover._popoverElement;
- document.body.removeChild(this.element);
- }
- this._visible = false;
- },
- get visible()
- {
- return this._visible;
- },
- get disposed()
- {
- return this._disposed;
- },
- dispose: function()
- {
- if (this.visible)
- this.hide();
- this._disposed = true;
- },
- setCanShrink: function(canShrink)
- {
- this._hasFixedHeight = !canShrink;
- this._contentDiv.addStyleClass("fixed-height");
- },
- _positionElement: function(anchorElement, preferredWidth, preferredHeight)
- {
- const borderWidth = 25;
- const scrollerWidth = this._hasFixedHeight ? 0 : 11;
- const arrowHeight = 15;
- const arrowOffset = 10;
- const borderRadius = 10;
- preferredWidth = Math.max(preferredWidth, 50);
- const totalWidth = window.innerWidth;
- const totalHeight = window.innerHeight;
- var anchorBox = anchorElement.boxInWindow(window);
- var newElementPosition = { x: 0, y: 0, width: preferredWidth + scrollerWidth, height: preferredHeight };
- var verticalAlignment;
- var roomAbove = anchorBox.y;
- var roomBelow = totalHeight - anchorBox.y - anchorBox.height;
- if (roomAbove > roomBelow) {
- if (anchorBox.y > newElementPosition.height + arrowHeight + borderRadius)
- newElementPosition.y = anchorBox.y - newElementPosition.height - arrowHeight;
- else {
- newElementPosition.y = borderRadius;
- newElementPosition.height = anchorBox.y - borderRadius * 2 - arrowHeight;
- if (this._hasFixedHeight && newElementPosition.height < preferredHeight) {
- newElementPosition.y = borderRadius;
- newElementPosition.height = preferredHeight;
- }
- }
- verticalAlignment = "bottom";
- } else {
- newElementPosition.y = anchorBox.y + anchorBox.height + arrowHeight;
- if (newElementPosition.y + newElementPosition.height + arrowHeight - borderWidth >= totalHeight) {
- newElementPosition.height = totalHeight - anchorBox.y - anchorBox.height - borderRadius * 2 - arrowHeight;
- if (this._hasFixedHeight && newElementPosition.height < preferredHeight) {
- newElementPosition.y = totalHeight - preferredHeight - borderRadius;
- newElementPosition.height = preferredHeight;
- }
- }
- verticalAlignment = "top";
- }
- var horizontalAlignment;
- if (anchorBox.x + newElementPosition.width < totalWidth) {
- newElementPosition.x = Math.max(borderRadius, anchorBox.x - borderRadius - arrowOffset);
- horizontalAlignment = "left";
- } else if (newElementPosition.width + borderRadius * 2 < totalWidth) {
- newElementPosition.x = totalWidth - newElementPosition.width - borderRadius;
- horizontalAlignment = "right";
- var arrowRightPosition = Math.max(0, totalWidth - anchorBox.x - anchorBox.width - borderRadius - arrowOffset);
- arrowRightPosition += anchorBox.width / 2;
- arrowRightPosition = Math.min(arrowRightPosition, newElementPosition.width - borderRadius - arrowOffset);
- this._popupArrowElement.style.right = arrowRightPosition + "px";
- } else {
- newElementPosition.x = borderRadius;
- newElementPosition.width = totalWidth - borderRadius * 2;
- newElementPosition.height += scrollerWidth;
- horizontalAlignment = "left";
- if (verticalAlignment === "bottom")
- newElementPosition.y -= scrollerWidth;
- this._popupArrowElement.style.left = Math.max(0, anchorBox.x - borderRadius * 2 - arrowOffset) + "px";
- this._popupArrowElement.style.left += anchorBox.width / 2;
- }
- this.element.className = "popover custom-popup-vertical-scroll custom-popup-horizontal-scroll " + verticalAlignment + "-" + horizontalAlignment + "-arrow";
- this.element.positionAt(newElementPosition.x - borderWidth, newElementPosition.y - borderWidth);
- this.element.style.width = newElementPosition.width + borderWidth * 2 + "px";
- this.element.style.height = newElementPosition.height + borderWidth * 2 + "px";
- }
- }
- WebInspector.PopoverHelper = function(panelElement, getAnchor, showPopover, onHide, disableOnClick)
- {
- this._panelElement = panelElement;
- this._getAnchor = getAnchor;
- this._showPopover = showPopover;
- this._onHide = onHide;
- this._disableOnClick = !!disableOnClick;
- panelElement.addEventListener("mousedown", this._mouseDown.bind(this), false);
- panelElement.addEventListener("mousemove", this._mouseMove.bind(this), false);
- panelElement.addEventListener("mouseout", this._mouseOut.bind(this), false);
- this.setTimeout(1000);
- }
- WebInspector.PopoverHelper.prototype = {
- setTimeout: function(timeout)
- {
- this._timeout = timeout;
- },
- _mouseDown: function(event)
- {
- if (this._disableOnClick)
- this.hidePopover();
- else {
- this._killHidePopoverTimer();
- this._handleMouseAction(event, true);
- }
- },
- _mouseMove: function(event)
- {
- if (event.target.isSelfOrDescendant(this._hoverElement))
- return;
- this._startHidePopoverTimer();
- this._handleMouseAction(event, false);
- },
- _mouseOut: function(event)
- {
- if (event.target === this._hoverElement)
- this._startHidePopoverTimer();
- },
- _startHidePopoverTimer: function()
- {
- if (!this._popover || this._hidePopoverTimer)
- return;
- function doHide()
- {
- this._hidePopover();
- delete this._hidePopoverTimer;
- }
- this._hidePopoverTimer = setTimeout(doHide.bind(this), this._timeout / 2);
- },
- _handleMouseAction: function(event, isMouseDown)
- {
- this._resetHoverTimer();
- if (event.which && this._disableOnClick)
- return;
- this._hoverElement = this._getAnchor(event.target, event);
- if (!this._hoverElement)
- return;
- const toolTipDelay = isMouseDown ? 0 : (this._popup ? this._timeout * 0.6 : this._timeout);
- this._hoverTimer = setTimeout(this._mouseHover.bind(this, this._hoverElement), toolTipDelay);
- },
- _resetHoverTimer: function()
- {
- if (this._hoverTimer) {
- clearTimeout(this._hoverTimer);
- delete this._hoverTimer;
- }
- },
- isPopoverVisible: function()
- {
- return !!this._popover;
- },
- hidePopover: function()
- {
- this._resetHoverTimer();
- this._hidePopover();
- },
- _hidePopover: function()
- {
- if (!this._popover)
- return;
- if (this._onHide)
- this._onHide();
- this._popover.dispose();
- delete this._popover;
- this._hoverElement = null;
- },
- _mouseHover: function(element)
- {
- delete this._hoverTimer;
- this._hidePopover();
- this._popover = new WebInspector.Popover(this);
- this._showPopover(element, this._popover);
- },
- _killHidePopoverTimer: function()
- {
- if (this._hidePopoverTimer) {
- clearTimeout(this._hidePopoverTimer);
- delete this._hidePopoverTimer;
- this._resetHoverTimer();
- }
- }
- }
- WebInspector.Placard = function(title, subtitle)
- {
- this.element = document.createElement("div");
- this.element.className = "placard";
- this.element.placard = this;
- this.titleElement = document.createElement("div");
- this.titleElement.className = "title";
- this.subtitleElement = document.createElement("div");
- this.subtitleElement.className = "subtitle";
- this.element.appendChild(this.subtitleElement);
- this.element.appendChild(this.titleElement);
- this.title = title;
- this.subtitle = subtitle;
- this.selected = false;
- }
- WebInspector.Placard.prototype = {
- get title()
- {
- return this._title;
- },
- set title(x)
- {
- if (this._title === x)
- return;
- this._title = x;
- this.titleElement.textContent = x;
- },
- get subtitle()
- {
- return this._subtitle;
- },
- set subtitle(x)
- {
- if (this._subtitle === x)
- return;
- this._subtitle = x;
- this.subtitleElement.textContent = x;
- },
- get selected()
- {
- return this._selected;
- },
- set selected(x)
- {
- if (x)
- this.select();
- else
- this.deselect();
- },
- select: function()
- {
- if (this._selected)
- return;
- this._selected = true;
- this.element.addStyleClass("selected");
- },
- deselect: function()
- {
- if (!this._selected)
- return;
- this._selected = false;
- this.element.removeStyleClass("selected");
- },
- toggleSelected: function()
- {
- this.selected = !this.selected;
- },
- discard: function()
- {
- }
- }
- WebInspector.TabbedPane = function()
- {
- WebInspector.View.call(this);
- this.registerRequiredCSS("tabbedPane.css");
- this.element.addStyleClass("tabbed-pane");
- this._headerElement = this.element.createChild("div", "tabbed-pane-header");
- this._headerContentsElement = this._headerElement.createChild("div", "tabbed-pane-header-contents");
- this._tabsElement = this._headerContentsElement.createChild("div", "tabbed-pane-header-tabs");
- this._contentElement = this.element.createChild("div", "tabbed-pane-content");
- this._tabs = [];
- this._tabsHistory = [];
- this._tabsById = {};
- this.element.addEventListener("click", this.focus.bind(this), false);
- this._dropDownButton = this._createDropDownButton();
- }
- WebInspector.TabbedPane.EventTypes = {
- TabSelected: "TabSelected",
- TabClosed: "TabClosed"
- }
- WebInspector.TabbedPane.prototype = {
- get visibleView()
- {
- return this._currentTab ? this._currentTab.view : null;
- },
- get selectedTabId()
- {
- return this._currentTab ? this._currentTab.id : null;
- },
- set shrinkableTabs(shrinkableTabs)
- {
- this._shrinkableTabs = shrinkableTabs;
- },
- set closeableTabs(closeableTabs)
- {
- this._closeableTabs = closeableTabs;
- },
- defaultFocusedElement: function()
- {
- return this.visibleView ? this.visibleView.defaultFocusedElement() : null;
- },
- appendTab: function(id, tabTitle, view, tabTooltip, userGesture)
- {
- var tab = new WebInspector.TabbedPaneTab(this, this._tabsElement, id, tabTitle, this._closeableTabs, view, tabTooltip);
- this._tabsById[id] = tab;
- this._tabs.push(tab);
- this._tabsHistory.push(tab);
- if (this._tabsHistory[0] === tab)
- this.selectTab(tab.id, userGesture);
- this._updateTabElements();
- },
- closeTab: function(id, userGesture)
- {
- this._innerCloseTab(id, userGesture);
- this._updateTabElements();
- if (this._tabsHistory.length)
- this.selectTab(this._tabsHistory[0].id, userGesture);
- },
- _innerCloseTab: function(id, userGesture)
- {
- if (this._currentTab && this._currentTab.id === id)
- this._hideCurrentTab();
- var tab = this._tabsById[id];
- delete this._tabsById[id];
- this._tabsHistory.splice(this._tabsHistory.indexOf(tab), 1);
- this._tabs.splice(this._tabs.indexOf(tab), 1);
- if (tab._shown)
- this._hideTabElement(tab);
- var eventData = { tabId: id, view: tab.view, isUserGesture: userGesture };
- this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabClosed, eventData);
- return true;
- },
- closeAllTabs: function(userGesture)
- {
- var tabs = this._tabs.slice();
- for (var i = 0; i < tabs.length; ++i)
- this._innerCloseTab(tabs[i].id, userGesture);
- this._updateTabElements();
- },
- closeOtherTabs: function(id)
- {
- var tabs = this._tabs.slice();
- for (var i = 0; i < tabs.length; ++i) {
- if (tabs[i].id !== id)
- this._innerCloseTab(tabs[i].id, true);
- }
- this._updateTabElements();
- this.selectTab(id, true);
- },
- selectTab: function(id, userGesture)
- {
- var tab = this._tabsById[id];
- if (!tab)
- return;
- if (this._currentTab && this._currentTab.id === id)
- return;
- this._hideCurrentTab();
- this._showTab(tab);
- this._currentTab = tab;
- this._tabsHistory.splice(this._tabsHistory.indexOf(tab), 1);
- this._tabsHistory.splice(0, 0, tab);
- this._updateTabElements();
- var eventData = { tabId: id, view: tab.view, isUserGesture: userGesture };
- this.dispatchEventToListeners(WebInspector.TabbedPane.EventTypes.TabSelected, eventData);
- return true;
- },
- lastOpenedTabIds: function(tabsCount)
- {
- function tabToTabId(tab) {
- return tab.id;
- }
- return this._tabsHistory.slice(0, tabsCount).map(tabToTabId);
- },
- changeTabTitle: function(id, tabTitle)
- {
- var tab = this._tabsById[id];
- tab.title = tabTitle;
- this._updateTabElements();
- },
- changeTabView: function(id, view)
- {
- var tab = this._tabsById[id];
- if (this._currentTab && this._currentTab.id === tab.id) {
- this._hideTab(tab);
- tab.view = view;
- this._showTab(tab);
- } else
- tab.view = view;
- },
- changeTabTooltip: function(id, tabTooltip)
- {
- var tab = this._tabsById[id];
- tab.tooltip = tabTooltip;
- },
- onResize: function()
- {
- this._updateTabElements();
- },
- _updateTabElements: function()
- {
- if (!this.isShowing())
- return;
- if (!this._tabs.length)
- this._contentElement.addStyleClass("has-no-tabs");
- else
- this._contentElement.removeStyleClass("has-no-tabs");
- if (!this._measuredDropDownButtonWidth)
- this._measureDropDownButton();
- if (this._shrinkableTabs)
- this._updateWidths();
- this._updateTabsDropDown();
- },
- _showTabElement: function(index, tab)
- {
- if (index >= this._tabsElement.children.length)
- this._tabsElement.appendChild(tab.tabElement);
- else
- this._tabsElement.insertBefore(tab.tabElement, this._tabsElement.children[index]);
- tab._shown = true;
- },
- _hideTabElement: function(tab)
- {
- this._tabsElement.removeChild(tab.tabElement);
- tab._shown = false;
- },
- _createDropDownButton: function()
- {
- var dropDownContainer = document.createElement("div");
- dropDownContainer.addStyleClass("tabbed-pane-header-tabs-drop-down-container");
- var dropDownButton = dropDownContainer.createChild("div", "tabbed-pane-header-tabs-drop-down");
- dropDownButton.appendChild(document.createTextNode("\u00bb"));
- this._tabsSelect = dropDownButton.createChild("select", "tabbed-pane-header-tabs-drop-down-select");
- this._tabsSelect.addEventListener("change", this._tabsSelectChanged.bind(this), false);
- return dropDownContainer;
- },
- _updateTabsDropDown: function()
- {
- var tabsToShowIndexes = this._tabsToShowIndexes(this._tabs, this._tabsHistory, this._headerContentsElement.offsetWidth, this._measuredDropDownButtonWidth);
- for (var i = 0; i < this._tabs.length; ++i) {
- if (this._tabs[i]._shown && tabsToShowIndexes.indexOf(i) === -1)
- this._hideTabElement(this._tabs[i]);
- }
- for (var i = 0; i < tabsToShowIndexes.length; ++i) {
- var tab = this._tabs[tabsToShowIndexes[i]];
- if (!tab._shown)
- this._showTabElement(i, tab);
- }
- this._populateDropDownFromIndex();
- },
- _populateDropDownFromIndex: function()
- {
- if (this._dropDownButton.parentElement)
- this._headerContentsElement.removeChild(this._dropDownButton);
- this._tabsSelect.removeChildren();
- var tabsToShow = [];
- for (var i = 0; i < this._tabs.length; ++i) {
- if (!this._tabs[i]._shown)
- tabsToShow.push(this._tabs[i]);
- continue;
- }
- function compareFunction(tab1, tab2)
- {
- return tab1.title.localeCompare(tab2.title);
- }
- tabsToShow.sort(compareFunction);
- for (var i = 0; i < tabsToShow.length; ++i) {
- var option = new Option(tabsToShow[i].title);
- option.tab = tabsToShow[i];
- this._tabsSelect.appendChild(option);
- }
- if (this._tabsSelect.options.length) {
- this._headerContentsElement.appendChild(this._dropDownButton);
- this._tabsSelect.selectedIndex = -1;
- }
- },
- _tabsSelectChanged: function()
- {
- var options = this._tabsSelect.options;
- var selectedOption = options[this._tabsSelect.selectedIndex];
- this.selectTab(selectedOption.tab.id, true);
- },
- _measureDropDownButton: function()
- {
- this._dropDownButton.addStyleClass("measuring");
- this._headerContentsElement.appendChild(this._dropDownButton);
- this._measuredDropDownButtonWidth = this._dropDownButton.offsetWidth;
- this._headerContentsElement.removeChild(this._dropDownButton);
- this._dropDownButton.removeStyleClass("measuring");
- },
- _updateWidths: function()
- {
- var measuredWidths = [];
- for (var tabId in this._tabs)
- measuredWidths.push(this._tabs[tabId].measuredWidth);
- var maxWidth = this._calculateMaxWidth(measuredWidths, this._headerContentsElement.offsetWidth);
- for (var tabId in this._tabs) {
- var tab = this._tabs[tabId];
- tab.width = Math.min(tab.measuredWidth, maxWidth);
- }
- },
- _calculateMaxWidth: function(measuredWidths, totalWidth)
- {
- if (!measuredWidths.length)
- return 0;
- measuredWidths.sort(function(x, y) { return x - y });
- var totalMeasuredWidth = 0;
- for (var i = 0; i < measuredWidths.length; ++i)
- totalMeasuredWidth += measuredWidths[i];
- if (totalWidth >= totalMeasuredWidth)
- return measuredWidths[measuredWidths.length - 1];
- var totalExtraWidth = 0;
- for (var i = measuredWidths.length - 1; i > 0; --i) {
- var extraWidth = measuredWidths[i] - measuredWidths[i - 1];
- totalExtraWidth += (measuredWidths.length - i) * extraWidth;
- if (totalWidth + totalExtraWidth >= totalMeasuredWidth)
- return measuredWidths[i - 1] + (totalWidth + totalExtraWidth - totalMeasuredWidth) / (measuredWidths.length - i);
- }
- return totalWidth / measuredWidths.length;
- },
- _tabsToShowIndexes: function(tabsOrdered, tabsHistory, totalWidth, measuredDropDownButtonWidth)
- {
- var tabsToShowIndexes = [];
- var totalTabsWidth = 0;
- for (var i = 0; i < tabsHistory.length; ++i) {
- totalTabsWidth += tabsHistory[i].width;
- var minimalRequiredWidth = totalTabsWidth;
- if (i !== tabsHistory.length - 1)
- minimalRequiredWidth += measuredDropDownButtonWidth;
- if (minimalRequiredWidth > totalWidth)
- break;
- tabsToShowIndexes.push(tabsOrdered.indexOf(tabsHistory[i]));
- }
- tabsToShowIndexes.sort(function(x, y) { return x - y });
- return tabsToShowIndexes;
- },
- _hideCurrentTab: function()
- {
- if (!this._currentTab)
- return;
- this._hideTab(this._currentTab);
- delete this._currentTab;
- },
- _showTab: function(tab)
- {
- tab.tabElement.addStyleClass("selected");
- tab.view.show(this._contentElement);
- },
- _hideTab: function(tab)
- {
- tab.tabElement.removeStyleClass("selected");
- tab.view.detach();
- },
- canHighlightLine: function()
- {
- return this._currentTab && this._currentTab.view && this._currentTab.view.canHighlightLine();
- },
- highlightLine: function(line)
- {
- if (this.canHighlightLine())
- this._currentTab.view.highlightLine(line);
- },
- elementsToRestoreScrollPositionsFor: function()
- {
- return [ this._contentElement ];
- },
- _insertBefore: function(tab, index)
- {
- this._tabsElement.insertBefore(tab._tabElement, this._tabsElement.childNodes[index]);
- var oldIndex = this._tabs.indexOf(tab);
- this._tabs.splice(oldIndex, 1);
- if (oldIndex < index)
- --index;
- this._tabs.splice(index, 0, tab);
- }
- }
- WebInspector.TabbedPane.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.TabbedPaneTab = function(tabbedPane, measureElement, id, title, closeable, view, tooltip)
- {
- this._closeable = closeable;
- this._tabbedPane = tabbedPane;
- this._measureElement = measureElement;
- this._id = id;
- this._title = title;
- this._tooltip = tooltip;
- this._view = view;
- this._shown = false;
- this._measuredWidth;
- this._tabElement;
- }
- WebInspector.TabbedPaneTab.prototype = {
- get id()
- {
- return this._id;
- },
- get title()
- {
- return this._title;
- },
- set title(title)
- {
- this._title = title;
- if (this._titleElement)
- this._titleElement.textContent = title;
- delete this._measuredWidth;
- },
- get view()
- {
- return this._view;
- },
- set view(view)
- {
- this._view = view;
- },
- get tooltip()
- {
- return this._tooltip;
- },
- set tooltip(tooltip)
- {
- this._tooltip = tooltip;
- if (this._titleElement)
- this._titleElement.title = tooltip || "";
- },
- get tabElement()
- {
- if (typeof(this._tabElement) !== "undefined")
- return this._tabElement;
- this._createTabElement(false);
- return this._tabElement;
- },
- get measuredWidth()
- {
- if (typeof(this._measuredWidth) !== "undefined")
- return this._measuredWidth;
- this._measure();
- return this._measuredWidth;
- },
- get width()
- {
- return this._width || this.measuredWidth;
- },
- set width(width)
- {
- this.tabElement.style.width = width + "px";
- this._width = width;
- },
- _createTabElement: function(measuring)
- {
- var tabElement = document.createElement("div");
- tabElement.addStyleClass("tabbed-pane-header-tab");
- tabElement.tabIndex = -1;
- var titleElement = tabElement.createChild("span", "tabbed-pane-header-tab-title");
- titleElement.textContent = this.title;
- titleElement.title = this.tooltip || "";
- if (!measuring)
- this._titleElement = titleElement;
- if (this._closeable) {
- var closeButtonSpan = tabElement.createChild("span", "tabbed-pane-header-tab-close-button");
- closeButtonSpan.textContent = "\u00D7";
- }
- if (measuring)
- tabElement.addStyleClass("measuring");
- else {
- this._tabElement = tabElement;
- tabElement.addEventListener("click", this._tabClicked.bind(this), false);
- tabElement.addEventListener("mousedown", this._tabMouseDown.bind(this), false);
- if (this._closeable) {
- tabElement.addEventListener("contextmenu", this._tabContextMenu.bind(this), false);
- tabElement.addEventListener("mousemove", this._tabMouseMove.bind(this), false);
- }
- }
- return tabElement;
- },
- _measure: function()
- {
- var measuringTabElement = this._createTabElement(true);
- this._measureElement.appendChild(measuringTabElement);
- this._measuredWidth = measuringTabElement.offsetWidth;
- this._measureElement.removeChild(measuringTabElement);
- },
- _tabClicked: function(event)
- {
- if (this._closeable && (event.button === 1 || event.target.hasStyleClass("tabbed-pane-header-tab-close-button")))
- this._tabbedPane.closeTab(this.id, true);
- },
- _tabMouseDown: function(event)
- {
- if (event.target.hasStyleClass("tabbed-pane-header-tab-close-button") || event.button === 1)
- return;
- this._tabbedPane.selectTab(this.id, true);
- this._dragStartX = event.pageX;
- },
- _tabContextMenu: function(event)
- {
- function close()
- {
- this._tabbedPane.closeTab(this.id, true);
- }
- function closeOthers()
- {
- this._tabbedPane.closeOtherTabs(this.id);
- }
- function closeAll()
- {
- this._tabbedPane.closeAllTabs(true);
- }
- var contextMenu = new WebInspector.ContextMenu();
- contextMenu.appendItem(WebInspector.UIString("Close"), close.bind(this));
- contextMenu.appendItem(WebInspector.UIString("Close Others"), closeOthers.bind(this));
- contextMenu.appendItem(WebInspector.UIString("Close All"), closeAll.bind(this));
- contextMenu.show(event);
- },
- _tabMouseMove: function(event)
- {
- if (isNaN(this._dragStartX))
- return;
- if (event.which !== 1)
- return;
- this._tabbedPane.selectTab(this.id, true);
- WebInspector.elementDragStart(this._tabElement, this._tabDragging.bind(this), this._endTabDragging.bind(this), event, "pointer");
- },
- _tabDragging: function(event)
- {
- var tabElements = this._tabbedPane._tabsElement.childNodes;
- for (var i = 0; i < tabElements.length; ++i) {
- var tabElement = tabElements[i];
- if (tabElement === this._tabElement)
- continue;
- var intersects = tabElement.offsetLeft + tabElement.clientWidth > this._tabElement.offsetLeft &&
- this._tabElement.offsetLeft + this._tabElement.clientWidth > tabElement.offsetLeft;
- if (!intersects)
- continue;
- if (Math.abs(event.pageX - this._dragStartX) < tabElement.clientWidth / 2 + 5)
- break;
- if (event.pageX - this._dragStartX > 0) {
- tabElement = tabElement.nextSibling;
- ++i;
- }
- var oldOffsetLeft = this._tabElement.offsetLeft;
- this._tabbedPane._insertBefore(this, i);
- this._dragStartX += this._tabElement.offsetLeft - oldOffsetLeft;
- break;
- }
- if (!this._tabElement.previousSibling && event.pageX - this._dragStartX < 0) {
- this._tabElement.style.setProperty("left", "0px");
- return;
- }
- if (!this._tabElement.nextSibling && event.pageX - this._dragStartX > 0) {
- this._tabElement.style.setProperty("left", "0px");
- return;
- }
- this._tabElement.style.setProperty("position", "relative");
- this._tabElement.style.setProperty("left", (event.pageX - this._dragStartX) + "px");
- },
- _endTabDragging: function(event)
- {
- this._tabElement.style.removeProperty("position");
- this._tabElement.style.removeProperty("left");
- delete this._dragStartX;
- WebInspector.elementDragEnd(event);
- }
- }
- WebInspector.Drawer = function()
- {
- this.element = document.getElementById("drawer");
- this._savedHeight = 200;
- this._mainElement = document.getElementById("main");
- this._toolbarElement = document.getElementById("toolbar");
- this._mainStatusBar = document.getElementById("main-status-bar");
- this._mainStatusBar.addEventListener("mousedown", this._startStatusBarDragging.bind(this), true);
- this._counters = document.getElementById("counters");
- this._drawerContentsElement = document.createElement("div");
- this._drawerContentsElement.id = "drawer-contents";
- this._drawerContentsElement.className = "drawer-contents";
- this.element.appendChild(this._drawerContentsElement);
- this._drawerStatusBar = document.createElement("div");
- this._drawerStatusBar.id = "drawer-status-bar";
- this._drawerStatusBar.className = "status-bar";
- this.element.appendChild(this._drawerStatusBar);
- this._viewStatusBar = document.createElement("div");
- this._drawerStatusBar.appendChild(this._viewStatusBar);
- }
- WebInspector.Drawer.AnimationType = {
- Immediately: 0,
- Normal: 1,
- Slow: 2
- }
- WebInspector.Drawer.prototype = {
- get visible()
- {
- return !!this._view;
- },
- _constrainHeight: function(height)
- {
- return Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop() - Preferences.minConsoleHeight);
- },
- show: function(view, animationType)
- {
- this.immediatelyFinishAnimation();
- if (this._view && this._view.counterElement)
- this._view.counterElement.parentNode.removeChild(this._view.counterElement);
- var drawerWasVisible = this.visible;
- if (this._view) {
- this._view.detach();
- this._drawerContentsElement.removeChildren();
- }
- this._view = view;
- var statusBarItems = this._view.statusBarItems || [];
- this._viewStatusBar.removeChildren();
- for (var i = 0; i < statusBarItems.length; ++i)
- this._viewStatusBar.appendChild(statusBarItems[i]);
- if (this._view.counterElement)
- this._counters.insertBefore(this._view.counterElement, this._counters.firstChild);
- document.body.addStyleClass("drawer-visible");
- this._view.markAsRoot();
- this._view.show(this._drawerContentsElement);
- if (drawerWasVisible)
- return;
- var anchoredItems = document.getElementById("anchored-status-bar-items");
- var height = this._constrainHeight(this._savedHeight || this.element.offsetHeight);
- var animations = [
- {element: this.element, end: {height: height}},
- {element: this._mainElement, end: {bottom: height}},
- {element: this._mainStatusBar, start: {"padding-left": anchoredItems.offsetWidth - 1}, end: {"padding-left": 0}},
- {element: this._viewStatusBar, start: {opacity: 0}, end: {opacity: 1}}
- ];
- this._drawerStatusBar.insertBefore(anchoredItems, this._drawerStatusBar.firstChild);
- if (this._currentPanelCounters) {
- var oldRight = this._drawerStatusBar.clientWidth - (this._counters.offsetLeft + this._currentPanelCounters.offsetWidth);
- var newRight = WebInspector.Panel.counterRightMargin;
- var rightPadding = (oldRight - newRight);
- animations.push({element: this._currentPanelCounters, start: {"padding-right": rightPadding}, end: {"padding-right": 0}});
- this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);
- this._mainStatusBar.appendChild(this._currentPanelCounters);
- }
- function animationFinished()
- {
- WebInspector.inspectorView.currentPanel().doResize();
- if (this._view && this._view.afterShow)
- this._view.afterShow();
- delete this._currentAnimation;
- if (this._currentPanelCounters)
- this._currentPanelCounters.removeAttribute("style");
- }
- this._currentAnimation = WebInspector.animateStyle(animations, this._animationDuration(animationType), animationFinished.bind(this));
- if (animationType === WebInspector.Drawer.AnimationType.Immediately)
- this._currentAnimation.forceComplete();
- },
- hide: function(animationType)
- {
- this.immediatelyFinishAnimation();
- if (!this.visible)
- return;
- this._savedHeight = this.element.offsetHeight;
- WebInspector.restoreFocusFromElement(this.element);
- var anchoredItems = document.getElementById("anchored-status-bar-items");
- this._mainStatusBar.style.setProperty("padding-left", (anchoredItems.offsetWidth - 1) + "px");
- document.body.removeStyleClass("drawer-visible");
- WebInspector.inspectorView.currentPanel().statusBarResized();
- document.body.addStyleClass("drawer-visible");
- var animations = [
- {element: this._mainElement, end: {bottom: 0}},
- {element: this._mainStatusBar, start: {"padding-left": 0}, end: {"padding-left": anchoredItems.offsetWidth - 1}},
- {element: this._viewStatusBar, start: {opacity: 1}, end: {opacity: 0}}
- ];
- if (this._currentPanelCounters) {
- var newRight = this._drawerStatusBar.clientWidth - this._counters.offsetLeft;
- var oldRight = this._mainStatusBar.clientWidth - (this._currentPanelCounters.offsetLeft + this._currentPanelCounters.offsetWidth);
- var rightPadding = (newRight - oldRight);
- animations.push({element: this._currentPanelCounters, start: {"padding-right": 0}, end: {"padding-right": rightPadding}});
- }
- function animationFinished()
- {
- WebInspector.inspectorView.currentPanel().doResize();
- this._mainStatusBar.insertBefore(anchoredItems, this._mainStatusBar.firstChild);
- this._mainStatusBar.style.removeProperty("padding-left");
- if (this._view.counterElement)
- this._view.counterElement.parentNode.removeChild(this._view.counterElement);
- if (this._currentPanelCounters) {
- this._currentPanelCounters.setAttribute("style", null);
- this._currentPanelCounters.parentNode.removeChild(this._currentPanelCounters);
- this._counters.insertBefore(this._currentPanelCounters, this._counters.firstChild);
- }
- this._view.detach();
- delete this._view;
- this._drawerContentsElement.removeChildren();
- document.body.removeStyleClass("drawer-visible");
- delete this._currentAnimation;
- }
- this._currentAnimation = WebInspector.animateStyle(animations, this._animationDuration(animationType), animationFinished.bind(this));
- if (animationType === WebInspector.Drawer.AnimationType.Immediately)
- this._currentAnimation.forceComplete();
- },
- resize: function()
- {
- if (!this.visible)
- return;
- this._view.storeScrollPositions();
- var height = this._constrainHeight(parseInt(this.element.style.height, 10));
- this._mainElement.style.bottom = height + "px";
- this.element.style.height = height + "px";
- this._view.doResize();
- },
- immediatelyFinishAnimation: function()
- {
- if (this._currentAnimation)
- this._currentAnimation.forceComplete();
- },
- set currentPanelCounters(x)
- {
- if (!x) {
- if (this._currentPanelCounters)
- this._currentPanelCounters.parentElement.removeChild(this._currentPanelCounters);
- delete this._currentPanelCounters;
- return;
- }
- this._currentPanelCounters = x;
- if (this.visible)
- this._mainStatusBar.appendChild(x);
- else
- this._counters.insertBefore(x, this._counters.firstChild);
- },
- _animationDuration: function(animationType)
- {
- switch (animationType) {
- case WebInspector.Drawer.AnimationType.Slow:
- return 2000;
- case WebInspector.Drawer.AnimationType.Normal:
- return 250;
- default:
- return 0;
- }
- },
- _startStatusBarDragging: function(event)
- {
- if (!this.visible || event.target !== this._mainStatusBar)
- return;
- this._view.storeScrollPositions();
- WebInspector.elementDragStart(this._mainStatusBar, this._statusBarDragging.bind(this), this._endStatusBarDragging.bind(this), event, "row-resize");
- this._statusBarDragOffset = event.pageY - this.element.totalOffsetTop();
- event.consume();
- },
- _statusBarDragging: function(event)
- {
- var height = window.innerHeight - event.pageY + this._statusBarDragOffset;
- height = Number.constrain(height, Preferences.minConsoleHeight, window.innerHeight - this._mainElement.totalOffsetTop() - Preferences.minConsoleHeight);
- this._mainElement.style.bottom = height + "px";
- this.element.style.height = height + "px";
- if (WebInspector.inspectorView.currentPanel())
- WebInspector.inspectorView.currentPanel().doResize();
- this._view.doResize();
- event.consume(true);
- },
- _endStatusBarDragging: function(event)
- {
- WebInspector.elementDragEnd(event);
- this._savedHeight = this.element.offsetHeight;
- delete this._statusBarDragOffset;
- event.consume();
- }
- }
- WebInspector.drawer = null;
- WebInspector.ConsoleModel = function()
- {
- this.messages = [];
- this.warnings = 0;
- this.errors = 0;
- this._interruptRepeatCount = false;
- InspectorBackend.registerConsoleDispatcher(new WebInspector.ConsoleDispatcher(this));
- }
- WebInspector.ConsoleModel.Events = {
- ConsoleCleared: "console-cleared",
- MessageAdded: "console-message-added",
- RepeatCountUpdated: "repeat-count-updated"
- }
- WebInspector.ConsoleModel.prototype = {
- enableAgent: function()
- {
- if (WebInspector.settings.monitoringXHREnabled.get())
- ConsoleAgent.setMonitoringXHREnabled(true);
- ConsoleAgent.enable();
- },
- addMessage: function(msg)
- {
- this.messages.push(msg);
- this._previousMessage = msg;
- this._incrementErrorWarningCount(msg);
- this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.MessageAdded, msg);
- this._interruptRepeatCount = false;
- },
- _incrementErrorWarningCount: function(msg)
- {
- switch (msg.level) {
- case WebInspector.ConsoleMessage.MessageLevel.Warning:
- this.warnings += msg.repeatDelta;
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Error:
- this.errors += msg.repeatDelta;
- break;
- }
- },
- requestClearMessages: function()
- {
- ConsoleAgent.clearMessages();
- this.clearMessages();
- },
- clearMessages: function()
- {
- this.messages = [];
- this.errors = 0;
- this.warnings = 0;
- this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.ConsoleCleared);
- },
- interruptRepeatCount: function()
- {
- this._interruptRepeatCount = true;
- },
- _messageRepeatCountUpdated: function(count)
- {
- var msg = this._previousMessage;
- if (!msg)
- return;
- var prevRepeatCount = msg.totalRepeatCount;
- if (!this._interruptRepeatCount) {
- msg.repeatDelta = count - prevRepeatCount;
- msg.repeatCount = msg.repeatCount + msg.repeatDelta;
- msg.totalRepeatCount = count;
- msg.updateRepeatCount();
- this._incrementErrorWarningCount(msg);
- this.dispatchEventToListeners(WebInspector.ConsoleModel.Events.RepeatCountUpdated, msg);
- } else {
- var msgCopy = msg.clone();
- msgCopy.totalRepeatCount = count;
- msgCopy.repeatCount = (count - prevRepeatCount) || 1;
- msgCopy.repeatDelta = msgCopy.repeatCount;
- this.addMessage(msgCopy);
- }
- }
- }
- WebInspector.ConsoleModel.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.ConsoleMessage = function(source, level, url, line, repeatCount)
- {
- this.source = source;
- this.level = level;
- this.url = url || null;
- this.line = line || 0;
- repeatCount = repeatCount || 1;
- this.repeatCount = repeatCount;
- this.repeatDelta = repeatCount;
- this.totalRepeatCount = repeatCount;
- }
- WebInspector.ConsoleMessage.prototype = {
- isErrorOrWarning: function()
- {
- return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
- },
- updateRepeatCount: function()
- {
- },
- clone: function()
- {
- }
- }
- WebInspector.ConsoleMessage.create = function(source, level, message, type, url, line, repeatCount, parameters, stackTrace, request)
- {
- }
- WebInspector.ConsoleMessage.MessageSource = {
- HTML: "html",
- XML: "xml",
- JS: "javascript",
- Network: "network",
- ConsoleAPI: "console-api",
- Other: "other"
- }
- WebInspector.ConsoleMessage.MessageType = {
- Log: "log",
- Dir: "dir",
- DirXML: "dirxml",
- Trace: "trace",
- StartGroup: "startGroup",
- StartGroupCollapsed: "startGroupCollapsed",
- EndGroup: "endGroup",
- Assert: "assert",
- Result: "result"
- }
- WebInspector.ConsoleMessage.MessageLevel = {
- Tip: "tip",
- Log: "log",
- Warning: "warning",
- Error: "error",
- Debug: "debug"
- }
- WebInspector.ConsoleDispatcher = function(console)
- {
- this._console = console;
- }
- WebInspector.ConsoleDispatcher.prototype = {
- messageAdded: function(payload)
- {
- var consoleMessage = WebInspector.ConsoleMessage.create(
- payload.source,
- payload.level,
- payload.text,
- payload.type,
- payload.url,
- payload.line,
- payload.repeatCount,
- payload.parameters,
- payload.stackTrace,
- payload.networkRequestId ? WebInspector.networkRequestById(payload.networkRequestId) : undefined);
- this._console.addMessage(consoleMessage);
- },
- messageRepeatCountUpdated: function(count)
- {
- this._console._messageRepeatCountUpdated(count);
- },
- messagesCleared: function()
- {
- if (!WebInspector.settings.preserveConsoleLog.get())
- this._console.clearMessages();
- }
- }
- WebInspector.console = null;
- WebInspector.ConsoleMessageImpl = function(source, level, message, linkifier, type, url, line, repeatCount, parameters, stackTrace, request)
- {
- WebInspector.ConsoleMessage.call(this, source, level, url, line, repeatCount);
- this._linkifier = linkifier;
- this.type = type || WebInspector.ConsoleMessage.MessageType.Log;
- this._messageText = message;
- this._parameters = parameters;
- this._stackTrace = stackTrace;
- this._request = request;
- this._customFormatters = {
- "object": this._formatParameterAsObject,
- "array": this._formatParameterAsArray,
- "node": this._formatParameterAsNode,
- "string": this._formatParameterAsString
- };
- }
- WebInspector.ConsoleMessageImpl.prototype = {
- _formatMessage: function()
- {
- this._formattedMessage = document.createElement("span");
- this._formattedMessage.className = "console-message-text source-code";
- if (this.source === WebInspector.ConsoleMessage.MessageSource.ConsoleAPI) {
- switch (this.type) {
- case WebInspector.ConsoleMessage.MessageType.Trace:
- this._messageElement = document.createTextNode("console.trace()");
- break;
- case WebInspector.ConsoleMessage.MessageType.Assert:
- var args = [WebInspector.UIString("Assertion failed:")];
- if (this._parameters)
- args = args.concat(this._parameters);
- this._messageElement = this._format(args);
- break;
- case WebInspector.ConsoleMessage.MessageType.Dir:
- var obj = this._parameters ? this._parameters[0] : undefined;
- var args = ["%O", obj];
- this._messageElement = this._format(args);
- break;
- default:
- var args = this._parameters || [this._messageText];
- this._messageElement = this._format(args);
- }
- } else if (this.source === WebInspector.ConsoleMessage.MessageSource.Network) {
- if (this._request) {
- this._stackTrace = this._request.initiator.stackTrace;
- if (this._request.initiator && this._request.initiator.url) {
- this.url = this._request.initiator.url;
- this.line = this._request.initiator.lineNumber;
- }
- this._messageElement = document.createElement("span");
- if (this.level === WebInspector.ConsoleMessage.MessageLevel.Error) {
- this._messageElement.appendChild(document.createTextNode(this._request.requestMethod + " "));
- this._messageElement.appendChild(WebInspector.linkifyRequestAsNode(this._request));
- if (this._request.failed)
- this._messageElement.appendChild(document.createTextNode(" " + this._request.localizedFailDescription));
- else
- this._messageElement.appendChild(document.createTextNode(" " + this._request.statusCode + " (" + this._request.statusText + ")"));
- } else {
- var fragment = WebInspector.linkifyStringAsFragmentWithCustomLinkifier(this._messageText, WebInspector.linkifyRequestAsNode.bind(null, this._request, ""));
- this._messageElement.appendChild(fragment);
- }
- } else {
- if (this.url) {
- var isExternal = !WebInspector.resourceForURL(this.url);
- this._anchorElement = WebInspector.linkifyURLAsNode(this.url, this.url, "console-message-url", isExternal);
- }
- this._messageElement = this._format([this._messageText]);
- }
- } else {
- var args = this._parameters || [this._messageText];
- this._messageElement = this._format(args);
- }
- if (this.source !== WebInspector.ConsoleMessage.MessageSource.Network || this._request) {
- if (this._stackTrace && this._stackTrace.length && this._stackTrace[0].url) {
- this._anchorElement = this._linkifyCallFrame(this._stackTrace[0]);
- } else if (this.url && this.url !== "undefined") {
- this._anchorElement = this._linkifyLocation(this.url, this.line, 0);
- }
- }
- this._formattedMessage.appendChild(this._messageElement);
- if (this._anchorElement) {
- this._formattedMessage.appendChild(document.createTextNode(" "));
- this._formattedMessage.appendChild(this._anchorElement);
- }
- var dumpStackTrace = !!this._stackTrace && this._stackTrace.length && (this.source === WebInspector.ConsoleMessage.MessageSource.Network || this.level === WebInspector.ConsoleMessage.MessageLevel.Error || this.type === WebInspector.ConsoleMessage.MessageType.Trace);
- if (dumpStackTrace) {
- var ol = document.createElement("ol");
- ol.className = "outline-disclosure";
- var treeOutline = new TreeOutline(ol);
- var content = this._formattedMessage;
- var root = new TreeElement(content, null, true);
- content.treeElementForTest = root;
- treeOutline.appendChild(root);
- if (this.type === WebInspector.ConsoleMessage.MessageType.Trace)
- root.expand();
- this._populateStackTraceTreeElement(root);
- this._formattedMessage = ol;
- }
- this._message = this._messageElement.textContent;
- },
- get message()
- {
- var formattedMessage = this.formattedMessage;
- return this._message;
- },
- get formattedMessage()
- {
- if (!this._formattedMessage)
- this._formatMessage();
- return this._formattedMessage;
- },
- _linkifyLocation: function(url, lineNumber, columnNumber)
- {
- lineNumber = lineNumber ? lineNumber - 1 : 0;
- columnNumber = columnNumber ? columnNumber - 1 : 0;
- return this._linkifier.linkifyLocation(url, lineNumber, columnNumber, "console-message-url");
- },
- _linkifyCallFrame: function(callFrame)
- {
- return this._linkifyLocation(callFrame.url, callFrame.lineNumber, callFrame.columnNumber);
- },
- isErrorOrWarning: function()
- {
- return (this.level === WebInspector.ConsoleMessage.MessageLevel.Warning || this.level === WebInspector.ConsoleMessage.MessageLevel.Error);
- },
- _format: function(parameters)
- {
- var formattedResult = document.createElement("span");
- if (!parameters.length)
- return formattedResult;
- for (var i = 0; i < parameters.length; ++i) {
- if (parameters[i] instanceof WebInspector.RemoteObject)
- continue;
- if (typeof parameters[i] === "object")
- parameters[i] = WebInspector.RemoteObject.fromPayload(parameters[i]);
- else
- parameters[i] = WebInspector.RemoteObject.fromPrimitiveValue(parameters[i]);
- }
- var shouldFormatMessage = WebInspector.RemoteObject.type(parameters[0]) === "string" && this.type !== WebInspector.ConsoleMessage.MessageType.Result;
- if (shouldFormatMessage) {
- var result = this._formatWithSubstitutionString(parameters, formattedResult);
- parameters = result.unusedSubstitutions;
- if (parameters.length)
- formattedResult.appendChild(document.createTextNode(" "));
- }
- for (var i = 0; i < parameters.length; ++i) {
- if (shouldFormatMessage && parameters[i].type === "string")
- formattedResult.appendChild(document.createTextNode(parameters[i].description));
- else
- formattedResult.appendChild(this._formatParameter(parameters[i]));
- if (i < parameters.length - 1)
- formattedResult.appendChild(document.createTextNode(" "));
- }
- return formattedResult;
- },
- _formatParameter: function(output, forceObjectFormat)
- {
- var type;
- if (forceObjectFormat)
- type = "object";
- else if (output instanceof WebInspector.RemoteObject)
- type = output.subtype || output.type;
- else
- type = typeof output;
- var formatter = this._customFormatters[type];
- if (!formatter) {
- formatter = this._formatParameterAsValue;
- output = output.description;
- }
- var span = document.createElement("span");
- span.className = "console-formatted-" + type + " source-code";
- formatter.call(this, output, span);
- return span;
- },
- _formatParameterAsValue: function(val, elem)
- {
- elem.appendChild(document.createTextNode(val));
- },
- _formatParameterAsObject: function(obj, elem)
- {
- var section = new WebInspector.ObjectPropertiesSection(obj, obj.description);
- section.enableContextMenu();
- elem.appendChild(section.element);
- },
- _formatParameterAsNode: function(object, elem)
- {
- function printNode(nodeId)
- {
- if (!nodeId) {
- this._formatParameterAsObject(object, elem);
- return;
- }
- var treeOutline = new WebInspector.ElementsTreeOutline(false, false, true);
- treeOutline.setVisible(true);
- treeOutline.rootDOMNode = WebInspector.domAgent.nodeForId(nodeId);
- treeOutline.element.addStyleClass("outline-disclosure");
- if (!treeOutline.children[0].hasChildren)
- treeOutline.element.addStyleClass("single-node");
- elem.appendChild(treeOutline.element);
- treeOutline.element.treeElementForTest = treeOutline.children[0];
- }
- object.pushNodeToFrontend(printNode.bind(this));
- },
- _formatParameterAsArray: function(array, elem)
- {
- const maxFlatArrayLength = 100;
- if (array.arrayLength() > maxFlatArrayLength)
- this._formatParameterAsObject(array, elem);
- else
- array.getOwnProperties(this._printArray.bind(this, array, elem));
- },
- _formatParameterAsString: function(output, elem)
- {
- var span = document.createElement("span");
- span.className = "console-formatted-string source-code";
- span.appendChild(WebInspector.linkifyStringAsFragment(output.description));
- elem.removeStyleClass("console-formatted-string");
- elem.appendChild(document.createTextNode("\""));
- elem.appendChild(span);
- elem.appendChild(document.createTextNode("\""));
- },
- _printArray: function(array, elem, properties)
- {
- if (!properties)
- return;
- var elements = [];
- for (var i = 0; i < properties.length; ++i) {
- var property = properties[i];
- var name = property.name;
- if (!isNaN(name))
- elements[name] = this._formatAsArrayEntry(property.value);
- }
- elem.appendChild(document.createTextNode("["));
- var lastNonEmptyIndex = -1;
- function appendUndefined(elem, index)
- {
- if (index - lastNonEmptyIndex <= 1)
- return;
- var span = elem.createChild(span, "console-formatted-undefined");
- span.textContent = WebInspector.UIString("undefined × %d", index - lastNonEmptyIndex - 1);
- }
- var length = array.arrayLength();
- for (var i = 0; i < length; ++i) {
- var element = elements[i];
- if (!element)
- continue;
- if (i - lastNonEmptyIndex > 1) {
- appendUndefined(elem, i);
- elem.appendChild(document.createTextNode(", "));
- }
- elem.appendChild(element);
- lastNonEmptyIndex = i;
- if (i < length - 1)
- elem.appendChild(document.createTextNode(", "));
- }
- appendUndefined(elem, length);
- elem.appendChild(document.createTextNode("]"));
- },
- _formatAsArrayEntry: function(output)
- {
- return this._formatParameter(output, output.subtype && output.subtype === "array");
- },
- _formatWithSubstitutionString: function(parameters, formattedResult)
- {
- var formatters = {}
- function parameterFormatter(force, obj)
- {
- return this._formatParameter(obj, force);
- }
- function valueFormatter(obj)
- {
- return obj.description;
- }
- formatters.o = parameterFormatter.bind(this, false);
- formatters.s = valueFormatter;
- formatters.f = valueFormatter;
- formatters.i = valueFormatter;
- formatters.d = valueFormatter;
- formatters.O = parameterFormatter.bind(this, true);
- function append(a, b)
- {
- if (!(b instanceof Node))
- a.appendChild(WebInspector.linkifyStringAsFragment(b.toString()));
- else
- a.appendChild(b);
- return a;
- }
- return String.format(parameters[0].description, parameters.slice(1), formatters, formattedResult, append);
- },
- clearHighlight: function()
- {
- if (!this._formattedMessage)
- return;
- var highlightedMessage = this._formattedMessage;
- delete this._formattedMessage;
- delete this._anchorElement;
- delete this._messageElement;
- this._formatMessage();
- this._element.replaceChild(this._formattedMessage, highlightedMessage);
- },
- highlightSearchResults: function(regexObject)
- {
- if (!this._formattedMessage)
- return;
- this._highlightSearchResultsInElement(regexObject, this._messageElement);
- if (this._anchorElement)
- this._highlightSearchResultsInElement(regexObject, this._anchorElement);
- this._element.scrollIntoViewIfNeeded();
- },
- _highlightSearchResultsInElement: function(regexObject, element)
- {
- regexObject.lastIndex = 0;
- var text = element.textContent;
- var match = regexObject.exec(text);
- var offset = 0;
- var matchRanges = [];
- while (match) {
- matchRanges.push({ offset: match.index, length: match[0].length });
- match = regexObject.exec(text);
- }
- WebInspector.highlightSearchResults(element, matchRanges);
- },
- matchesRegex: function(regexObject)
- {
- return regexObject.test(this._message) || (this._anchorElement && regexObject.test(this._anchorElement.textContent));
- },
- toMessageElement: function()
- {
- if (this._element)
- return this._element;
- var element = document.createElement("div");
- element.message = this;
- element.className = "console-message";
- this._element = element;
- switch (this.level) {
- case WebInspector.ConsoleMessage.MessageLevel.Tip:
- element.addStyleClass("console-tip-level");
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Log:
- element.addStyleClass("console-log-level");
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Debug:
- element.addStyleClass("console-debug-level");
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Warning:
- element.addStyleClass("console-warning-level");
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Error:
- element.addStyleClass("console-error-level");
- break;
- }
- if (this.type === WebInspector.ConsoleMessage.MessageType.StartGroup || this.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
- element.addStyleClass("console-group-title");
- element.appendChild(this.formattedMessage);
- if (this.repeatCount > 1)
- this.updateRepeatCount();
- return element;
- },
- _populateStackTraceTreeElement: function(parentTreeElement)
- {
- for (var i = 0; i < this._stackTrace.length; i++) {
- var frame = this._stackTrace[i];
- var content = document.createElement("div");
- var messageTextElement = document.createElement("span");
- messageTextElement.className = "console-message-text source-code";
- var functionName = frame.functionName || WebInspector.UIString("(anonymous function)");
- messageTextElement.appendChild(document.createTextNode(functionName));
- content.appendChild(messageTextElement);
- if (frame.url) {
- content.appendChild(document.createTextNode(" "));
- var urlElement = this._linkifyCallFrame(frame);
- content.appendChild(urlElement);
- }
- var treeElement = new TreeElement(content);
- parentTreeElement.appendChild(treeElement);
- }
- },
- updateRepeatCount: function() {
- if (!this.repeatCountElement) {
- this.repeatCountElement = document.createElement("span");
- this.repeatCountElement.className = "bubble";
- this._element.insertBefore(this.repeatCountElement, this._element.firstChild);
- this._element.addStyleClass("repeated-message");
- }
- this.repeatCountElement.textContent = this.repeatCount;
- },
- toString: function()
- {
- var sourceString;
- switch (this.source) {
- case WebInspector.ConsoleMessage.MessageSource.HTML:
- sourceString = "HTML";
- break;
- case WebInspector.ConsoleMessage.MessageSource.XML:
- sourceString = "XML";
- break;
- case WebInspector.ConsoleMessage.MessageSource.JS:
- sourceString = "JS";
- break;
- case WebInspector.ConsoleMessage.MessageSource.Network:
- sourceString = "Network";
- break;
- case WebInspector.ConsoleMessage.MessageSource.ConsoleAPI:
- sourceString = "ConsoleAPI";
- break;
- case WebInspector.ConsoleMessage.MessageSource.Other:
- sourceString = "Other";
- break;
- }
- var typeString;
- switch (this.type) {
- case WebInspector.ConsoleMessage.MessageType.Log:
- typeString = "Log";
- break;
- case WebInspector.ConsoleMessage.MessageType.Dir:
- typeString = "Dir";
- break;
- case WebInspector.ConsoleMessage.MessageType.DirXML:
- typeString = "Dir XML";
- break;
- case WebInspector.ConsoleMessage.MessageType.Trace:
- typeString = "Trace";
- break;
- case WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed:
- case WebInspector.ConsoleMessage.MessageType.StartGroup:
- typeString = "Start Group";
- break;
- case WebInspector.ConsoleMessage.MessageType.EndGroup:
- typeString = "End Group";
- break;
- case WebInspector.ConsoleMessage.MessageType.Assert:
- typeString = "Assert";
- break;
- case WebInspector.ConsoleMessage.MessageType.Result:
- typeString = "Result";
- break;
- }
- var levelString;
- switch (this.level) {
- case WebInspector.ConsoleMessage.MessageLevel.Tip:
- levelString = "Tip";
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Log:
- levelString = "Log";
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Warning:
- levelString = "Warning";
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Debug:
- levelString = "Debug";
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Error:
- levelString = "Error";
- break;
- }
- return sourceString + " " + typeString + " " + levelString + ": " + this.formattedMessage.textContent + "\n" + this.url + " line " + this.line;
- },
- get text()
- {
- return this._messageText;
- },
- location: function()
- {
- var lineNumber = this.stackTrace ? this.stackTrace[0].lineNumber - 1 : this.line - 1;
- var columnNumber = this.stackTrace && this.stackTrace[0].columnNumber ? this.stackTrace[0].columnNumber - 1 : 0;
- return WebInspector.debuggerModel.createRawLocationByURL(this.url, lineNumber, columnNumber);
- },
- isEqual: function(msg)
- {
- if (!msg)
- return false;
- if (this._stackTrace) {
- if (!msg._stackTrace)
- return false;
- var l = this._stackTrace;
- var r = msg._stackTrace;
- for (var i = 0; i < l.length; i++) {
- if (l[i].url !== r[i].url ||
- l[i].functionName !== r[i].functionName ||
- l[i].lineNumber !== r[i].lineNumber ||
- l[i].columnNumber !== r[i].columnNumber)
- return false;
- }
- }
- return (this.source === msg.source)
- && (this.type === msg.type)
- && (this.level === msg.level)
- && (this.line === msg.line)
- && (this.url === msg.url)
- && (this.message === msg.message)
- && (this._request === msg._request);
- },
- get stackTrace()
- {
- return this._stackTrace;
- },
- clone: function()
- {
- return WebInspector.ConsoleMessage.create(this.source, this.level, this._messageText, this.type, this.url, this.line, this.repeatCount, this._parameters, this._stackTrace, this._request);
- }
- }
- WebInspector.ConsoleMessageImpl.prototype.__proto__ = WebInspector.ConsoleMessage.prototype;
- const ExpressionStopCharacters = " =:[({;,!+-*/&|^<>";
- WebInspector.ConsoleView = function(hideContextSelector)
- {
- WebInspector.View.call(this);
- this.element.id = "console-view";
- this.messages = [];
- this._clearConsoleButton = new WebInspector.StatusBarButton(WebInspector.UIString("Clear console log."), "clear-status-bar-item");
- this._clearConsoleButton.addEventListener("click", this._requestClearMessages, this);
- this._contextSelectElement = document.createElement("select");
- this._contextSelectElement.id = "console-context";
- this._contextSelectElement.className = "status-bar-item";
- this._contextSelectElement.addEventListener("change", this._updateIsolatedWorldSelector.bind(this), false);
- this._isolatedWorldSelectElement = document.createElement("select");
- this._isolatedWorldSelectElement.id = "console-context";
- this._isolatedWorldSelectElement.className = "status-bar-item";
- if (hideContextSelector) {
- this._contextSelectElement.addStyleClass("hidden");
- this._isolatedWorldSelectElement.addStyleClass("hidden");
- }
- this.messagesElement = document.createElement("div");
- this.messagesElement.id = "console-messages";
- this.messagesElement.className = "monospace";
- this.messagesElement.addEventListener("click", this._messagesClicked.bind(this), true);
- this.element.appendChild(this.messagesElement);
- this._scrolledToBottom = true;
- this.promptElement = document.createElement("div");
- this.promptElement.id = "console-prompt";
- this.promptElement.className = "source-code";
- this.promptElement.spellcheck = false;
- this.messagesElement.appendChild(this.promptElement);
- this.messagesElement.appendChild(document.createElement("br"));
- this.topGroup = new WebInspector.ConsoleGroup(null);
- this.messagesElement.insertBefore(this.topGroup.element, this.promptElement);
- this.currentGroup = this.topGroup;
- this._filterBarElement = document.createElement("div");
- this._filterBarElement.id = "console-filter";
- this._filterBarElement.className = "scope-bar status-bar-item";
- function createDividerElement() {
- var dividerElement = document.createElement("div");
- dividerElement.addStyleClass("scope-bar-divider");
- this._filterBarElement.appendChild(dividerElement);
- }
- var updateFilterHandler = this._updateFilter.bind(this);
- function createFilterElement(category, label) {
- var categoryElement = document.createElement("li");
- categoryElement.category = category;
- categoryElement.className = category;
- categoryElement.addEventListener("click", updateFilterHandler, false);
- categoryElement.textContent = label;
- this._filterBarElement.appendChild(categoryElement);
- return categoryElement;
- }
- this.allElement = createFilterElement.call(this, "all", WebInspector.UIString("All"));
- createDividerElement.call(this);
- this.errorElement = createFilterElement.call(this, "errors", WebInspector.UIString("Errors"));
- this.warningElement = createFilterElement.call(this, "warnings", WebInspector.UIString("Warnings"));
- this.logElement = createFilterElement.call(this, "logs", WebInspector.UIString("Logs"));
- this.filter(this.allElement, false);
- this._registerShortcuts();
- this.registerRequiredCSS("textPrompt.css");
- this.messagesElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), false);
- WebInspector.settings.monitoringXHREnabled.addChangeListener(this._monitoringXHREnabledSettingChanged.bind(this));
- WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);
- WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
- this._linkifier = new WebInspector.Linkifier();
- this.prompt = new WebInspector.TextPromptWithHistory(this.completionsForTextPrompt.bind(this), ExpressionStopCharacters + ".");
- this.prompt.setSuggestBoxEnabled("generic-suggest");
- this.prompt.renderAsBlock();
- this.prompt.attach(this.promptElement);
- this.prompt.proxyElement.addEventListener("keydown", this._promptKeyDown.bind(this), false);
- this.prompt.setHistoryData(WebInspector.settings.consoleHistory.get());
- }
- WebInspector.ConsoleView.Events = {
- ConsoleCleared: "console-cleared",
- EntryAdded: "console-entry-added",
- }
- WebInspector.ConsoleView.prototype = {
- get statusBarItems()
- {
- return [this._clearConsoleButton.element, this._contextSelectElement, this._isolatedWorldSelectElement, this._filterBarElement];
- },
- addContext: function(context)
- {
- var option = document.createElement("option");
- option.text = context.displayName;
- option.title = context.url;
- option._context = context;
- context._consoleOption = option;
- this._contextSelectElement.appendChild(option);
- context.addEventListener(WebInspector.FrameEvaluationContext.EventTypes.Updated, this._contextUpdated, this);
- context.addEventListener(WebInspector.FrameEvaluationContext.EventTypes.AddedExecutionContext, this._addedExecutionContext, this);
- this._updateIsolatedWorldSelector();
- },
- removeContext: function(context)
- {
- this._contextSelectElement.removeChild(context._consoleOption);
- this._updateIsolatedWorldSelector();
- },
- _updateIsolatedWorldSelector: function()
- {
- var context = this._currentEvaluationContext();
- if (!context) {
- this._isolatedWorldSelectElement.addStyleClass("hidden");
- return;
- }
- var isolatedContexts = context.isolatedContexts();
- if (!isolatedContexts.length) {
- this._isolatedWorldSelectElement.addStyleClass("hidden");
- return;
- }
- this._isolatedWorldSelectElement.removeStyleClass("hidden");
- this._isolatedWorldSelectElement.removeChildren();
- this._appendIsolatedContextOption(context.mainWorldContext());
- for (var i = 0; i < isolatedContexts.length; i++)
- this._appendIsolatedContextOption(isolatedContexts[i]);
- },
- _appendIsolatedContextOption: function(isolatedContext)
- {
- if (!isolatedContext)
- return;
- var option = document.createElement("option");
- option.text = isolatedContext.name;
- option.title = isolatedContext.id;
- option._executionContextId = isolatedContext.id;
- this._isolatedWorldSelectElement.appendChild(option);
- },
- _contextUpdated: function(event)
- {
- var context = event.data;
- var option = context._consoleOption;
- option.text = context.displayName;
- option.title = context.url;
- },
- _addedExecutionContext: function(event)
- {
- var context = event.data;
- if (context === this._currentEvaluationContext())
- this._updateIsolatedWorldSelector();
- },
- _currentEvaluationContextId: function()
- {
- var result = this._currentIsolatedContextId();
- if (result !== undefined)
- return result;
- var context = this._currentEvaluationContext();
- if (context && context.mainWorldContext())
- return context.mainWorldContext().id;
- return undefined;
- },
- _currentEvaluationContext: function()
- {
- if (this._contextSelectElement.selectedIndex === -1)
- return undefined;
- return this._contextSelectElement[this._contextSelectElement.selectedIndex]._context;
- },
- _currentIsolatedContextId: function()
- {
- if (this._isolatedWorldSelectElement.hasStyleClass("hidden"))
- return undefined;
- if (this._isolatedWorldSelectElement.selectedIndex === -1)
- return undefined;
- return this._isolatedWorldSelectElement[this._isolatedWorldSelectElement.selectedIndex]._executionContextId;
- },
- _updateFilter: function(e)
- {
- var isMac = WebInspector.isMac();
- var selectMultiple = false;
- if (isMac && e.metaKey && !e.ctrlKey && !e.altKey && !e.shiftKey)
- selectMultiple = true;
- if (!isMac && e.ctrlKey && !e.metaKey && !e.altKey && !e.shiftKey)
- selectMultiple = true;
- this.filter(e.target, selectMultiple);
- },
- filter: function(target, selectMultiple)
- {
- function unselectAll()
- {
- this.allElement.removeStyleClass("selected");
- this.errorElement.removeStyleClass("selected");
- this.warningElement.removeStyleClass("selected");
- this.logElement.removeStyleClass("selected");
- this.messagesElement.removeStyleClass("filter-all");
- this.messagesElement.removeStyleClass("filter-errors");
- this.messagesElement.removeStyleClass("filter-warnings");
- this.messagesElement.removeStyleClass("filter-logs");
- }
- var targetFilterClass = "filter-" + target.category;
- if (target.category === "all") {
- if (target.hasStyleClass("selected")) {
- return;
- }
- unselectAll.call(this);
- } else {
- if (this.allElement.hasStyleClass("selected")) {
- this.allElement.removeStyleClass("selected");
- this.messagesElement.removeStyleClass("filter-all");
- }
- }
- if (!selectMultiple) {
- unselectAll.call(this);
- target.addStyleClass("selected");
- this.messagesElement.addStyleClass(targetFilterClass);
- return;
- }
- if (target.hasStyleClass("selected")) {
- target.removeStyleClass("selected");
- this.messagesElement.removeStyleClass(targetFilterClass);
- } else {
- target.addStyleClass("selected");
- this.messagesElement.addStyleClass(targetFilterClass);
- }
- },
- willHide: function()
- {
- this.prompt.hideSuggestBox();
- this.prompt.clearAutoComplete(true);
- },
- wasShown: function()
- {
- if (!this.prompt.isCaretInsidePrompt())
- this.prompt.moveCaretToEndOfPrompt();
- },
- afterShow: function()
- {
- WebInspector.setCurrentFocusElement(this.promptElement);
- },
- storeScrollPositions: function()
- {
- WebInspector.View.prototype.storeScrollPositions.call(this);
- this._scrolledToBottom = this.messagesElement.isScrolledToBottom();
- },
- restoreScrollPositions: function()
- {
- if (this._scrolledToBottom)
- this._immediatelyScrollIntoView();
- else
- WebInspector.View.prototype.restoreScrollPositions.call(this);
- },
- onResize: function()
- {
- this.restoreScrollPositions();
- },
- _isScrollIntoViewScheduled: function()
- {
- return !!this._scrollIntoViewTimer;
- },
- _scheduleScrollIntoView: function()
- {
- if (this._scrollIntoViewTimer)
- return;
- function scrollIntoView()
- {
- delete this._scrollIntoViewTimer;
- this.promptElement.scrollIntoView(true);
- }
- this._scrollIntoViewTimer = setTimeout(scrollIntoView.bind(this), 20);
- },
- _immediatelyScrollIntoView: function()
- {
- this.promptElement.scrollIntoView(true);
- this._cancelScheduledScrollIntoView();
- },
- _cancelScheduledScrollIntoView: function()
- {
- if (!this._isScrollIntoViewScheduled())
- return;
- clearTimeout(this._scrollIntoViewTimer);
- delete this._scrollIntoViewTimer;
- },
- _consoleMessageAdded: function(event)
- {
- this._appendConsoleMessage(event.data);
- },
- _appendConsoleMessage: function(msg)
- {
- if (!this._isScrollIntoViewScheduled() && ((msg instanceof WebInspector.ConsoleCommandResult) || this.messagesElement.isScrolledToBottom()))
- this._scheduleScrollIntoView();
- this.messages.push(msg);
- if (msg.type === WebInspector.ConsoleMessage.MessageType.EndGroup) {
- var parentGroup = this.currentGroup.parentGroup
- if (parentGroup)
- this.currentGroup = parentGroup;
- } else {
- if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) {
- var group = new WebInspector.ConsoleGroup(this.currentGroup);
- this.currentGroup.messagesElement.appendChild(group.element);
- this.currentGroup = group;
- }
- this.currentGroup.addMessage(msg);
- }
- this.dispatchEventToListeners(WebInspector.ConsoleView.Events.EntryAdded, msg);
- },
- _consoleCleared: function()
- {
- this._scrolledToBottom = true;
- this.messages = [];
- this.currentGroup = this.topGroup;
- this.topGroup.messagesElement.removeChildren();
- this.dispatchEventToListeners(WebInspector.ConsoleView.Events.ConsoleCleared);
- this._linkifier.reset();
- },
- completionsForTextPrompt: function(textPrompt, wordRange, force, completionsReadyCallback)
- {
- var expressionRange = wordRange.startContainer.rangeOfWord(wordRange.startOffset, ExpressionStopCharacters, textPrompt.proxyElement, "backward");
- var expressionString = expressionRange.toString();
- var prefix = wordRange.toString();
- this.completionsForExpression(expressionString, prefix, force, completionsReadyCallback);
- },
- completionsForExpression: function(expressionString, prefix, force, completionsReadyCallback)
- {
- var lastIndex = expressionString.length - 1;
- var dotNotation = (expressionString[lastIndex] === ".");
- var bracketNotation = (expressionString[lastIndex] === "[");
- if (dotNotation || bracketNotation)
- expressionString = expressionString.substr(0, lastIndex);
- if (expressionString && parseInt(expressionString, 10) == expressionString) {
- completionsReadyCallback([]);
- return;
- }
- if (!prefix && !expressionString && !force) {
- completionsReadyCallback([]);
- return;
- }
- if (!expressionString && WebInspector.debuggerModel.selectedCallFrame())
- WebInspector.debuggerModel.getSelectedCallFrameVariables(receivedPropertyNames.bind(this));
- else
- this.evalInInspectedWindow(expressionString, "completion", true, true, false, evaluated.bind(this));
- function evaluated(result, wasThrown)
- {
- if (!result || wasThrown) {
- completionsReadyCallback([]);
- return;
- }
- function getCompletions(primitiveType)
- {
- var object;
- if (primitiveType === "string")
- object = new String("");
- else if (primitiveType === "number")
- object = new Number(0);
- else if (primitiveType === "boolean")
- object = new Boolean(false);
- else
- object = this;
- var resultSet = {};
- for (var o = object; o; o = o.__proto__) {
- try {
- var names = Object.getOwnPropertyNames(o);
- for (var i = 0; i < names.length; ++i)
- resultSet[names[i]] = true;
- } catch (e) {
- }
- }
- return resultSet;
- }
- if (result.type === "object" || result.type === "function")
- result.callFunctionJSON(getCompletions, undefined, receivedPropertyNames.bind(this));
- else if (result.type === "string" || result.type === "number" || result.type === "boolean")
- this.evalInInspectedWindow("(" + getCompletions + ")(\"" + result.type + "\")", "completion", false, true, true, receivedPropertyNamesFromEval.bind(this));
- }
- function receivedPropertyNamesFromEval(notRelevant, wasThrown, result)
- {
- if (result && !wasThrown)
- receivedPropertyNames.call(this, result.value);
- else
- completionsReadyCallback([]);
- }
- function receivedPropertyNames(propertyNames)
- {
- RuntimeAgent.releaseObjectGroup("completion");
- if (!propertyNames) {
- completionsReadyCallback([]);
- return;
- }
- var includeCommandLineAPI = (!dotNotation && !bracketNotation);
- if (includeCommandLineAPI) {
- const commandLineAPI = ["dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear"];
- for (var i = 0; i < commandLineAPI.length; ++i)
- propertyNames[commandLineAPI[i]] = true;
- }
- this._reportCompletions(completionsReadyCallback, dotNotation, bracketNotation, expressionString, prefix, Object.keys(propertyNames));
- }
- },
- _reportCompletions: function(completionsReadyCallback, dotNotation, bracketNotation, expressionString, prefix, properties) {
- if (bracketNotation) {
- if (prefix.length && prefix[0] === "'")
- var quoteUsed = "'";
- else
- var quoteUsed = "\"";
- }
- var results = [];
- if (!expressionString) {
- const keywords = ["break", "case", "catch", "continue", "default", "delete", "do", "else", "finally", "for", "function", "if", "in",
- "instanceof", "new", "return", "switch", "this", "throw", "try", "typeof", "var", "void", "while", "with"];
- properties = properties.concat(keywords);
- }
- properties.sort();
- for (var i = 0; i < properties.length; ++i) {
- var property = properties[i];
- if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
- continue;
- if (bracketNotation) {
- if (!/^[0-9]+$/.test(property))
- property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + quoteUsed;
- property += "]";
- }
- if (property.length < prefix.length)
- continue;
- if (prefix.length && !property.startsWith(prefix))
- continue;
- results.push(property);
- }
- completionsReadyCallback(results);
- },
- _handleContextMenuEvent: function(event)
- {
- if (!window.getSelection().isCollapsed) {
- return;
- }
- var contextMenu = new WebInspector.ContextMenu();
- if (WebInspector.populateHrefContextMenu(contextMenu, null, event))
- contextMenu.appendSeparator();
- function monitoringXHRItemAction()
- {
- WebInspector.settings.monitoringXHREnabled.set(!WebInspector.settings.monitoringXHREnabled.get());
- }
- contextMenu.appendCheckboxItem(WebInspector.UIString("Log XMLHttpRequests"), monitoringXHRItemAction.bind(this), WebInspector.settings.monitoringXHREnabled.get());
- function preserveLogItemAction()
- {
- WebInspector.settings.preserveConsoleLog.set(!WebInspector.settings.preserveConsoleLog.get());
- }
- contextMenu.appendCheckboxItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Preserve log upon navigation" : "Preserve Log upon Navigation"), preserveLogItemAction.bind(this), WebInspector.settings.preserveConsoleLog.get());
- contextMenu.appendSeparator();
- contextMenu.appendItem(WebInspector.UIString(WebInspector.useLowerCaseMenuTitles() ? "Clear console" : "Clear Console"), this._requestClearMessages.bind(this));
- contextMenu.show(event);
- },
- _monitoringXHREnabledSettingChanged: function(event)
- {
- ConsoleAgent.setMonitoringXHREnabled(event.data);
- },
- _messagesClicked: function(event)
- {
- if (!this.prompt.isCaretInsidePrompt() && window.getSelection().isCollapsed)
- this.prompt.moveCaretToEndOfPrompt();
- },
- _registerShortcuts: function()
- {
- this._shortcuts = {};
- var shortcut = WebInspector.KeyboardShortcut;
- if (WebInspector.isMac()) {
- var shortcutK = shortcut.makeDescriptor("k", WebInspector.KeyboardShortcut.Modifiers.Meta);
- this._shortcuts[shortcutK.key] = this._requestClearMessages.bind(this);
- }
- var shortcutL = shortcut.makeDescriptor("l", WebInspector.KeyboardShortcut.Modifiers.Ctrl);
- this._shortcuts[shortcutL.key] = this._requestClearMessages.bind(this);
- var shortcutM = shortcut.makeDescriptor("m", WebInspector.KeyboardShortcut.Modifiers.CtrlOrMeta | WebInspector.KeyboardShortcut.Modifiers.Shift);
- this._shortcuts[shortcutM.key] = this._dumpMemory.bind(this);
- var section = WebInspector.shortcutsScreen.section(WebInspector.UIString("Console"));
- var keys = WebInspector.isMac() ? [ shortcutK.name, shortcutL.name ] : [ shortcutL.name ];
- section.addAlternateKeys(keys, WebInspector.UIString("Clear console"));
- keys = [
- shortcut.shortcutToString(shortcut.Keys.Tab),
- shortcut.shortcutToString(shortcut.Keys.Tab, shortcut.Modifiers.Shift)
- ];
- section.addRelatedKeys(keys, WebInspector.UIString("Next/previous suggestion"));
- section.addKey(shortcut.shortcutToString(shortcut.Keys.Right), WebInspector.UIString("Accept suggestion"));
- keys = [
- shortcut.shortcutToString(shortcut.Keys.Down),
- shortcut.shortcutToString(shortcut.Keys.Up)
- ];
- section.addRelatedKeys(keys, WebInspector.UIString("Next/previous line"));
- keys = [
- shortcut.shortcutToString("N", shortcut.Modifiers.Alt),
- shortcut.shortcutToString("P", shortcut.Modifiers.Alt)
- ];
- if (WebInspector.isMac())
- section.addRelatedKeys(keys, WebInspector.UIString("Next/previous command"));
- section.addKey(shortcut.shortcutToString(shortcut.Keys.Enter), WebInspector.UIString("Execute command"));
- },
- _requestClearMessages: function()
- {
- WebInspector.console.requestClearMessages();
- },
- _promptKeyDown: function(event)
- {
- if (isEnterKey(event)) {
- this._enterKeyPressed(event);
- return;
- }
- var shortcut = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
- var handler = this._shortcuts[shortcut];
- if (handler) {
- handler();
- event.preventDefault();
- return;
- }
- },
- evalInInspectedWindow: function(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, callback)
- {
- if (WebInspector.debuggerModel.selectedCallFrame()) {
- WebInspector.debuggerModel.evaluateOnSelectedCallFrame(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, returnByValue, callback);
- return;
- }
- if (!expression) {
- expression = "this";
- }
- function evalCallback(error, result, wasThrown)
- {
- if (error) {
- console.error(error);
- callback(null, false);
- return;
- }
- if (returnByValue)
- callback(null, !!wasThrown, wasThrown ? null : result);
- else
- callback(WebInspector.RemoteObject.fromPayload(result), !!wasThrown);
- }
- var contextId = this._currentEvaluationContextId();
- RuntimeAgent.evaluate(expression, objectGroup, includeCommandLineAPI, doNotPauseOnExceptionsAndMuteConsole, contextId, returnByValue, evalCallback);
- },
- evaluateUsingTextPrompt: function(expression, showResultOnly)
- {
- this._appendCommand(expression, this.prompt.text, false, showResultOnly);
- },
- _enterKeyPressed: function(event)
- {
- if (event.altKey || event.ctrlKey || event.shiftKey)
- return;
- event.consume(true);
- this.prompt.clearAutoComplete(true);
- var str = this.prompt.text;
- if (!str.length)
- return;
- this._appendCommand(str, "", true, false);
- },
- _appendCommand: function(text, newPromptText, useCommandLineAPI, showResultOnly)
- {
- if (!showResultOnly) {
- var commandMessage = new WebInspector.ConsoleCommand(text);
- WebInspector.console.interruptRepeatCount();
- this._appendConsoleMessage(commandMessage);
- }
- this.prompt.text = newPromptText;
- function printResult(result, wasThrown)
- {
- if (!result)
- return;
- if (!showResultOnly) {
- this.prompt.pushHistoryItem(text);
- WebInspector.settings.consoleHistory.set(this.prompt.historyData.slice(-30));
- }
- this._appendConsoleMessage(new WebInspector.ConsoleCommandResult(result, wasThrown, commandMessage, this._linkifier));
- }
- this.evalInInspectedWindow(text, "console", true, false, false, printResult.bind(this));
- WebInspector.userMetrics.ConsoleEvaluated.record();
- },
- elementsToRestoreScrollPositionsFor: function()
- {
- return [this.messagesElement];
- },
- _dumpMemory: function()
- {
- function comparator(a, b)
- {
- if (a.size < b.size)
- return 1;
- if (a.size > b.size)
- return -1;
- return a.title.localeCompare(b.title);
- }
- function callback(error, groups)
- {
- var titles = [];
- groups.sort(comparator);
- for (var i = 0; i < groups.length; ++i) {
- var suffix = groups[i].size > 0 ? " [" + groups[i].size + "]" : "";
- titles.push(groups[i].title + suffix + (groups[i].documentURI ? " (" + groups[i].documentURI + ")" : ""));
- }
- var counter = 1;
- var previousTitle = null;
- for (var i = 0; i < titles.length; ++i) {
- var title = titles[i];
- if (title === previousTitle) {
- counter++;
- continue;
- }
- if (previousTitle)
- WebInspector.log(counter > 1 ? counter + " x " + previousTitle : previousTitle);
- previousTitle = title;
- counter = 1;
- }
- WebInspector.log(counter > 1 ? counter + " x " + previousTitle : previousTitle);
- }
- MemoryAgent.getDOMNodeCount(callback);
- }
- }
- WebInspector.ConsoleView.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.ConsoleCommand = function(command)
- {
- this.command = command;
- }
- WebInspector.ConsoleCommand.prototype = {
- clearHighlight: function()
- {
- var highlightedMessage = this._formattedCommand;
- delete this._formattedCommand;
- this._formatCommand();
- this._element.replaceChild(this._formattedCommand, highlightedMessage);
- },
- highlightSearchResults: function(regexObject)
- {
- regexObject.lastIndex = 0;
- var text = this.command;
- var match = regexObject.exec(text);
- var offset = 0;
- var matchRanges = [];
- while (match) {
- matchRanges.push({ offset: match.index, length: match[0].length });
- match = regexObject.exec(text);
- }
- WebInspector.highlightSearchResults(this._formattedCommand, matchRanges);
- this._element.scrollIntoViewIfNeeded();
- },
- matchesRegex: function(regexObject)
- {
- return regexObject.test(this.command);
- },
- toMessageElement: function()
- {
- if (!this._element) {
- this._element = document.createElement("div");
- this._element.command = this;
- this._element.className = "console-user-command";
- this._formatCommand();
- this._element.appendChild(this._formattedCommand);
- }
- return this._element;
- },
- _formatCommand: function()
- {
- this._formattedCommand = document.createElement("span");
- this._formattedCommand.className = "console-message-text source-code";
- this._formattedCommand.textContent = this.command;
- },
- }
- WebInspector.ConsoleCommandResult = function(result, wasThrown, originatingCommand, linkifier)
- {
- var level = (wasThrown ? WebInspector.ConsoleMessage.MessageLevel.Error : WebInspector.ConsoleMessage.MessageLevel.Log);
- this.originatingCommand = originatingCommand;
- WebInspector.ConsoleMessageImpl.call(this, WebInspector.ConsoleMessage.MessageSource.JS, level, "", linkifier, WebInspector.ConsoleMessage.MessageType.Result, undefined, undefined, undefined, [result]);
- }
- WebInspector.ConsoleCommandResult.prototype = {
- toMessageElement: function()
- {
- var element = WebInspector.ConsoleMessageImpl.prototype.toMessageElement.call(this);
- element.addStyleClass("console-user-command-result");
- return element;
- }
- }
- WebInspector.ConsoleCommandResult.prototype.__proto__ = WebInspector.ConsoleMessageImpl.prototype;
- WebInspector.ConsoleGroup = function(parentGroup)
- {
- this.parentGroup = parentGroup;
- var element = document.createElement("div");
- element.className = "console-group";
- element.group = this;
- this.element = element;
- if (parentGroup) {
- var bracketElement = document.createElement("div");
- bracketElement.className = "console-group-bracket";
- element.appendChild(bracketElement);
- }
- var messagesElement = document.createElement("div");
- messagesElement.className = "console-group-messages";
- element.appendChild(messagesElement);
- this.messagesElement = messagesElement;
- }
- WebInspector.ConsoleGroup.prototype = {
- addMessage: function(msg)
- {
- var element = msg.toMessageElement();
- if (msg.type === WebInspector.ConsoleMessage.MessageType.StartGroup || msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed) {
- this.messagesElement.parentNode.insertBefore(element, this.messagesElement);
- element.addEventListener("click", this._titleClicked.bind(this), false);
- var groupElement = element.enclosingNodeOrSelfWithClass("console-group");
- if (groupElement && msg.type === WebInspector.ConsoleMessage.MessageType.StartGroupCollapsed)
- groupElement.addStyleClass("collapsed");
- } else
- this.messagesElement.appendChild(element);
- if (element.previousSibling && msg.originatingCommand && element.previousSibling.command === msg.originatingCommand)
- element.previousSibling.addStyleClass("console-adjacent-user-command-result");
- },
- _titleClicked: function(event)
- {
- var groupTitleElement = event.target.enclosingNodeOrSelfWithClass("console-group-title");
- if (groupTitleElement) {
- var groupElement = groupTitleElement.enclosingNodeOrSelfWithClass("console-group");
- if (groupElement)
- if (groupElement.hasStyleClass("collapsed"))
- groupElement.removeStyleClass("collapsed");
- else
- groupElement.addStyleClass("collapsed");
- groupTitleElement.scrollIntoViewIfNeeded(true);
- }
- event.consume(true);
- }
- }
- WebInspector.consoleView = null;
- WebInspector.ConsoleMessage.create = function(source, level, message, type, url, line, repeatCount, parameters, stackTrace, request)
- {
- return new WebInspector.ConsoleMessageImpl(source, level, message, WebInspector.consoleView._linkifier, type, url, line, repeatCount, parameters, stackTrace, request);
- }
- WebInspector.Panel = function(name)
- {
- WebInspector.View.call(this);
- this.element.addStyleClass("panel");
- this.element.addStyleClass(name);
- this._panelName = name;
- this._shortcuts = {};
- WebInspector.settings[this._sidebarWidthSettingName()] = WebInspector.settings.createSetting(this._sidebarWidthSettingName(), undefined);
- }
- WebInspector.Panel.counterRightMargin = 25;
- WebInspector.Panel.prototype = {
- get toolbarItem()
- {
- if (this._toolbarItem)
- return this._toolbarItem;
- this._toolbarItem = WebInspector.Toolbar.createPanelToolbarItem(this);
- return this._toolbarItem;
- },
- get name()
- {
- return this._panelName;
- },
- show: function()
- {
- WebInspector.View.prototype.show.call(this, WebInspector.inspectorView.element);
- },
- wasShown: function()
- {
- var statusBarItems = this.statusBarItems;
- if (statusBarItems) {
- this._statusBarItemContainer = document.createElement("div");
- for (var i = 0; i < statusBarItems.length; ++i)
- this._statusBarItemContainer.appendChild(statusBarItems[i]);
- document.getElementById("main-status-bar").appendChild(this._statusBarItemContainer);
- }
- if ("_toolbarItem" in this)
- this._toolbarItem.addStyleClass("toggled-on");
- this.focus();
- },
- willHide: function()
- {
- if (this._statusBarItemContainer && this._statusBarItemContainer.parentNode)
- this._statusBarItemContainer.parentNode.removeChild(this._statusBarItemContainer);
- delete this._statusBarItemContainer;
- if ("_toolbarItem" in this)
- this._toolbarItem.removeStyleClass("toggled-on");
- },
- reset: function()
- {
- this.searchCanceled();
- },
- defaultFocusedElement: function()
- {
- return this.sidebarTreeElement || this.element;
- },
- searchCanceled: function()
- {
- WebInspector.searchController.updateSearchMatchesCount(0, this);
- },
- performSearch: function(query)
- {
- this.searchCanceled();
- },
- jumpToNextSearchResult: function()
- {
- },
- jumpToPreviousSearchResult: function()
- {
- },
- createSplitView: function(parentElement, position, defaultWidth)
- {
- if (this.splitView)
- return;
- if (!parentElement)
- parentElement = this.element;
- this.splitView = new WebInspector.SplitView(position || WebInspector.SplitView.SidebarPosition.Left, this._sidebarWidthSettingName(), defaultWidth);
- this.splitView.show(parentElement);
- this.splitView.addEventListener(WebInspector.SplitView.EventTypes.Resized, this.sidebarResized.bind(this));
- this.sidebarElement = this.splitView.sidebarElement;
- },
- createSplitViewWithSidebarTree: function(parentElement, position, defaultWidth)
- {
- if (this.splitView)
- return;
- this.createSplitView(parentElement, position);
- this.sidebarTreeElement = document.createElement("ol");
- this.sidebarTreeElement.className = "sidebar-tree";
- this.splitView.sidebarElement.appendChild(this.sidebarTreeElement);
- this.splitView.sidebarElement.addStyleClass("sidebar");
- this.sidebarTree = new TreeOutline(this.sidebarTreeElement);
- this.sidebarTree.panel = this;
- },
- _sidebarWidthSettingName: function()
- {
- return this._panelName + "SidebarWidth";
- },
- get toolbarItemLabel()
- {
- },
- get statusBarItems()
- {
- },
- sidebarResized: function(width)
- {
- },
- statusBarResized: function()
- {
- },
- canShowAnchorLocation: function(anchor)
- {
- return false;
- },
- showAnchorLocation: function(anchor)
- {
- },
- elementsToRestoreScrollPositionsFor: function()
- {
- return [];
- },
- handleShortcut: function(event)
- {
- var shortcutKey = WebInspector.KeyboardShortcut.makeKeyFromEvent(event);
- var handler = this._shortcuts[shortcutKey];
- if (handler) {
- handler(event);
- event.handled = true;
- }
- },
- registerShortcut: function(key, handler)
- {
- this._shortcuts[key] = handler;
- },
- unregisterShortcut: function(key)
- {
- delete this._shortcuts[key];
- }
- }
- WebInspector.Panel.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.InspectorView = function()
- {
- WebInspector.View.call(this);
- this.markAsRoot();
- this.element.id = "main-panels";
- this.element.setAttribute("spellcheck", false);
- this._history = [];
- this._historyIterator = -1;
- document.addEventListener("keydown", this._keyDown.bind(this), false);
- this._panelOrder = [];
- }
- WebInspector.InspectorView.Events = {
- PanelSelected: "panel-selected"
- }
- WebInspector.InspectorView.prototype = {
- addPanel: function(panel)
- {
- this._panelOrder.push(panel);
- WebInspector.toolbar.addPanel(panel);
- },
- currentPanel: function()
- {
- return this._currentPanel;
- },
- setCurrentPanel: function(x)
- {
- if (this._currentPanel === x)
- return;
- if (this._currentPanel)
- this._currentPanel.detach();
- this._currentPanel = x;
- if (x) {
- x.show();
- this.dispatchEventToListeners(WebInspector.InspectorView.Events.PanelSelected);
- WebInspector.searchController.activePanelChanged();
- }
- for (var panelName in WebInspector.panels) {
- if (WebInspector.panels[panelName] === x) {
- WebInspector.settings.lastActivePanel.set(panelName);
- this._pushToHistory(panelName);
- WebInspector.userMetrics.panelShown(panelName);
- }
- }
- },
- _keyDown: function(event)
- {
- switch (event.keyIdentifier) {
- case "U+005B":
- case "U+00DB":
- var isRotateLeft = WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event) && !event.shiftKey && !event.altKey;
- if (isRotateLeft) {
- var index = this._panelOrder.indexOf(this.currentPanel());
- index = (index === 0) ? this._panelOrder.length - 1 : index - 1;
- this._panelOrder[index].toolbarItem.click();
- event.consume();
- return;
- }
- var isGoBack = WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event) && event.altKey;
- if (isGoBack && this._canGoBackInHistory()) {
- this._goBackInHistory();
- event.consume();
- }
- break;
- case "U+005D":
- case "U+00DD":
- var isRotateRight = WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event) && !event.shiftKey && !event.altKey;
- if (isRotateRight) {
- var index = this._panelOrder.indexOf(this.currentPanel());
- index = (index + 1) % this._panelOrder.length;
- this._panelOrder[index].toolbarItem.click();
- event.consume();
- return;
- }
- var isGoForward = WebInspector.KeyboardShortcut.eventHasCtrlOrMeta(event) && event.altKey;
- if (isGoForward && this._canGoForwardInHistory()) {
- this._goForwardInHistory();
- event.consume();
- }
- break;
- }
- },
- _canGoBackInHistory: function()
- {
- return this._historyIterator > 0;
- },
- _goBackInHistory: function()
- {
- this._inHistory = true;
- this.setCurrentPanel(WebInspector.panels[this._history[--this._historyIterator]]);
- delete this._inHistory;
- },
- _canGoForwardInHistory: function()
- {
- return this._historyIterator < this._history.length - 1;
- },
- _goForwardInHistory: function()
- {
- this._inHistory = true;
- this.setCurrentPanel(WebInspector.panels[this._history[++this._historyIterator]]);
- delete this._inHistory;
- },
- _pushToHistory: function(panelName)
- {
- if (this._inHistory)
- return;
- this._history.splice(this._historyIterator + 1, this._history.length - this._historyIterator - 1);
- if (!this._history.length || this._history[this._history.length - 1] !== panelName)
- this._history.push(panelName);
- this._historyIterator = this._history.length - 1;
- }
- }
- WebInspector.InspectorView.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.inspectorView = null;
- WebInspector.AdvancedSearchController = function()
- {
- this._shortcut = WebInspector.AdvancedSearchController.createShortcut();
- this._searchId = 0;
- WebInspector.settings.advancedSearchConfig = WebInspector.settings.createSetting("advancedSearchConfig", new WebInspector.SearchConfig("", true, false));
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, this._frameNavigated, this);
- }
- WebInspector.AdvancedSearchController.createShortcut = function()
- {
- if (WebInspector.isMac())
- return WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.Meta | WebInspector.KeyboardShortcut.Modifiers.Alt);
- else
- return WebInspector.KeyboardShortcut.makeDescriptor("f", WebInspector.KeyboardShortcut.Modifiers.Ctrl | WebInspector.KeyboardShortcut.Modifiers.Shift);
- }
- WebInspector.AdvancedSearchController.prototype = {
- handleShortcut: function(event)
- {
- if (WebInspector.KeyboardShortcut.makeKeyFromEvent(event) === this._shortcut.key) {
- this.show();
- event.handled = true;
- }
- },
- _frameNavigated: function()
- {
- this.resetSearch();
- },
- registerSearchScope: function(searchScope)
- {
- this._searchScope = searchScope;
- },
- show: function()
- {
- if (!this._searchView)
- this._searchView = new WebInspector.SearchView(this);
- if (this._searchView.isShowing())
- this._searchView.focus();
- else
- WebInspector.showViewInDrawer(this._searchView);
- },
- close: function()
- {
- this.stopSearch();
- WebInspector.closeDrawerView();
- },
- _onSearchResult: function(searchId, searchResult)
- {
- if (searchId !== this._searchId)
- return;
- this._searchView.addSearchResult(searchResult);
- if (!searchResult.searchMatches.length)
- return;
- if (!this._searchResultsPane)
- this._searchResultsPane = this._currentSearchScope.createSearchResultsPane(this._searchConfig);
- this._searchView.resultsPane = this._searchResultsPane;
- this._searchResultsPane.addSearchResult(searchResult);
- },
- _onSearchFinished: function(searchId, finished)
- {
- if (searchId !== this._searchId)
- return;
- if (!this._searchResultsPane)
- this._searchView.nothingFound();
- this._searchView.searchFinished(finished);
- },
- startSearch: function(searchConfig)
- {
- this.resetSearch();
- ++this._searchId;
- this._searchConfig = searchConfig;
- this._currentSearchScope = this._searchScope;
- var totalSearchResultsCount = this._currentSearchScope.performSearch(searchConfig, this._onSearchResult.bind(this, this._searchId), this._onSearchFinished.bind(this, this._searchId));
- this._searchView.searchStarted(totalSearchResultsCount);
- },
- resetSearch: function()
- {
- this.stopSearch();
- if (this._searchResultsPane) {
- this._searchView.resetResults();
- delete this._searchResultsPane;
- }
- },
- stopSearch: function()
- {
- if (this._currentSearchScope)
- this._currentSearchScope.stopSearch();
- }
- }
- WebInspector.SearchView = function(controller)
- {
- WebInspector.View.call(this);
- this.registerRequiredCSS("textViewer.css");
- this._controller = controller;
- this.element.className = "search-view";
- this._searchPanelElement = this.element.createChild("div");
- this._searchPanelElement.tabIndex = 0;
- this._searchPanelElement.className = "search-panel";
- this._searchPanelElement.addEventListener("keydown", this._onKeyDown.bind(this), false);
- this._searchResultsElement = this.element.createChild("div");
- this._searchResultsElement.className = "search-results";
- this._search = this._searchPanelElement.createChild("input");
- this._search.setAttribute("type", "search");
- this._search.addStyleClass("search-config-search");
- this._search.setAttribute("results", "0");
- this._search.setAttribute("size", 20);
- this._ignoreCaseLabel = this._searchPanelElement.createChild("label");
- this._ignoreCaseLabel.addStyleClass("search-config-label");
- this._ignoreCaseCheckbox = this._ignoreCaseLabel.createChild("input");
- this._ignoreCaseCheckbox.setAttribute("type", "checkbox");
- this._ignoreCaseCheckbox.addStyleClass("search-config-checkbox");
- this._ignoreCaseLabel.appendChild(document.createTextNode(WebInspector.UIString("Ignore case")));
- this._regexLabel = this._searchPanelElement.createChild("label");
- this._regexLabel.addStyleClass("search-config-label");
- this._regexCheckbox = this._regexLabel.createChild("input");
- this._regexCheckbox.setAttribute("type", "checkbox");
- this._regexCheckbox.addStyleClass("search-config-checkbox");
- this._regexLabel.appendChild(document.createTextNode(WebInspector.UIString("Regular expression")));
- this._searchDoneButton = this._searchPanelElement.createChild("button");
- this._searchDoneButton.textContent = WebInspector.UIString("Close");
- this._searchDoneButton.addStyleClass("search-close-button");
- this._searchDoneButton.addEventListener("click", this._closeButtonPressed.bind(this));
- this._searchStatusBarElement = document.createElement("div");
- this._searchStatusBarElement.className = "search-status-bar-item";
- this._searchMessageElement = this._searchStatusBarElement.createChild("div");
- this._searchMessageElement.className = "search-status-bar-message";
- this._searchProgressElement = document.createElement("progress");
- this._searchProgressElement.className = "search-status-bar-progress";
- this._searchStopButtonItem = document.createElement("div");
- this._searchStopButtonItem.className = "search-status-bar-stop-button-item";
- this._searchStopStatusBarButton = new WebInspector.StatusBarButton(WebInspector.UIString("Stop search"), "search-status-bar-stop-button");
- this._searchStopButtonItem.appendChild(this._searchStopStatusBarButton.element);
- this._searchStopStatusBarButton.addEventListener("click", this._searchStopButtonPressed, this);
- this._searchResultsMessageElement = document.createElement("span");
- this._searchResultsMessageElement.className = "search-results-status-bar-message";
- this._load();
- }
- WebInspector.SearchView.maxQueriesCount = 20;
- WebInspector.SearchView.prototype = {
- get statusBarItems()
- {
- return [this._searchStatusBarElement];
- },
- get counterElement()
- {
- return this._searchResultsMessageElement;
- },
- get searchConfig()
- {
- return new WebInspector.SearchConfig(this._search.value, this._ignoreCaseCheckbox.checked, this._regexCheckbox.checked);
- },
- set resultsPane(resultsPane)
- {
- this.resetResults();
- this._searchResultsElement.appendChild(resultsPane.element);
- },
- searchStarted: function(totalSearchResultsCount)
- {
- this.resetResults();
- this._resetCounters();
- this._totalSearchResultsCount = totalSearchResultsCount;
- this._searchMessageElement.textContent = WebInspector.UIString("Searching...");
- this._searchStatusBarElement.appendChild(this._searchProgressElement);
- this._searchStatusBarElement.appendChild(this._searchStopButtonItem);
- this._updateSearchProgress();
- this._updateSearchResultsMessage();
- if (!this._searchingView)
- this._searchingView = new WebInspector.EmptyView(WebInspector.UIString("Searching..."));
- this._searchingView.show(this._searchResultsElement);
- },
- _updateSearchResultsMessage: function()
- {
- if (this._searchMatchesCount && this._searchResultsCount)
- this._searchResultsMessageElement.textContent = WebInspector.UIString("Found %d matches in %d files.", this._searchMatchesCount, this._nonEmptySearchResultsCount);
- else
- this._searchResultsMessageElement.textContent = "";
- },
- _updateSearchProgress: function()
- {
- this._searchProgressElement.setAttribute("max", this._totalSearchResultsCount);
- this._searchProgressElement.setAttribute("value", this._searchResultsCount);
- },
- resetResults: function()
- {
- if (this._searchingView)
- this._searchingView.detach();
- if (this._notFoundView)
- this._notFoundView.detach();
- this._searchResultsElement.removeChildren();
- },
- _resetCounters: function()
- {
- this._searchMatchesCount = 0;
- this._searchResultsCount = 0;
- this._nonEmptySearchResultsCount = 0;
- },
- nothingFound: function()
- {
- this.resetResults();
- if (!this._notFoundView)
- this._notFoundView = new WebInspector.EmptyView(WebInspector.UIString("No matches found."));
- this._notFoundView.show(this._searchResultsElement);
- this._searchResultsMessageElement.textContent = WebInspector.UIString("No matches found.");
- },
- addSearchResult: function(searchResult)
- {
- this._searchMatchesCount += searchResult.searchMatches.length;
- this._searchResultsCount++;
- if (searchResult.searchMatches.length)
- this._nonEmptySearchResultsCount++;
- this._updateSearchResultsMessage();
- this._updateSearchProgress();
- },
- searchFinished: function(finished)
- {
- this._searchMessageElement.textContent = finished ? WebInspector.UIString("Search finished.") : WebInspector.UIString("Search interrupted.");
- this._searchStatusBarElement.removeChild(this._searchProgressElement);
- this._searchStatusBarElement.removeChild(this._searchStopButtonItem);
- },
- focus: function()
- {
- WebInspector.setCurrentFocusElement(this._search);
- this._search.select();
- },
- wasShown: function()
- {
- this.focus();
- },
- willHide: function()
- {
- this._controller.stopSearch();
- },
- _onKeyDown: function(event)
- {
- switch (event.keyCode) {
- case WebInspector.KeyboardShortcut.Keys.Enter.code:
- this._onAction();
- break;
- case WebInspector.KeyboardShortcut.Keys.Esc.code:
- this._controller.close();
- event.consume(true);
- break;
- }
- },
- _save: function()
- {
- var searchConfig = new WebInspector.SearchConfig(this.searchConfig.query, this.searchConfig.ignoreCase, this.searchConfig.isRegex);
- WebInspector.settings.advancedSearchConfig.set(searchConfig);
- },
- _load: function()
- {
- var searchConfig = WebInspector.settings.advancedSearchConfig.get();
- this._search.value = searchConfig.query;
- this._ignoreCaseCheckbox.checked = searchConfig.ignoreCase;
- this._regexCheckbox.checked = searchConfig.isRegex;
- },
- _closeButtonPressed: function()
- {
- this._controller.close();
- },
- _searchStopButtonPressed: function()
- {
- this._controller.stopSearch();
- this.focus();
- },
- _onAction: function()
- {
- if (!this.searchConfig.query || !this.searchConfig.query.length)
- return;
- this._save();
- this._controller.startSearch(this.searchConfig);
- }
- }
- WebInspector.SearchView.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.SearchConfig = function(query, ignoreCase, isRegex)
- {
- this.query = query;
- this.ignoreCase = ignoreCase;
- this.isRegex = isRegex;
- }
- WebInspector.SearchScope = function()
- {
- }
- WebInspector.SearchScope.prototype = {
- performSearch: function(searchConfig, searchResultCallback, searchFinishedCallback) { },
- stopSearch: function() { },
- createSearchResultsPane: function(searchConfig) { }
- }
- WebInspector.SearchResult = function(offset, length)
- {
- this.offset = offset;
- this.length = length;
- }
- WebInspector.SearchResultsPane = function(searchConfig)
- {
- this._searchConfig = searchConfig;
- this.element = document.createElement("div");
- }
- WebInspector.SearchResultsPane.prototype = {
- get searchConfig()
- {
- return this._searchConfig;
- },
- addSearchResult: function(searchResult) { }
- }
- WebInspector.FileBasedSearchResultsPane = function(searchConfig)
- {
- WebInspector.SearchResultsPane.call(this, searchConfig);
- this._searchResults = [];
- this.element.id ="search-results-pane-file-based";
- this._treeOutlineElement = document.createElement("ol");
- this._treeOutlineElement.className = "outline-disclosure";
- this._treeOutlineElement.addStyleClass("search-results-outline-disclosure");
- this.element.appendChild(this._treeOutlineElement);
- this._treeOutline = new TreeOutline(this._treeOutlineElement);
- this._matchesExpandedCount = 0;
- }
- WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount = 20;
- WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce = 20;
- WebInspector.FileBasedSearchResultsPane.prototype = {
- _createAnchor: function(uiSourceCode, lineNumber, columnNumber)
- {
- var anchor = document.createElement("a");
- anchor.preferredPanel = "scripts";
- anchor.href = uiSourceCode.url;
- anchor.uiSourceCode = uiSourceCode;
- anchor.lineNumber = lineNumber;
- return anchor;
- },
- addSearchResult: function(searchResult)
- {
- this._searchResults.push(searchResult);
- var uiSourceCode = searchResult.uiSourceCode;
- var searchMatches = searchResult.searchMatches;
- var fileTreeElement = this._addFileTreeElement(uiSourceCode.url, searchMatches.length, this._searchResults.length - 1);
- },
- _fileTreeElementExpanded: function(searchResult, fileTreeElement)
- {
- if (fileTreeElement._initialized)
- return;
- var toIndex = Math.min(searchResult.searchMatches.length, WebInspector.FileBasedSearchResultsPane.fileMatchesShownAtOnce);
- if (toIndex < searchResult.searchMatches.length) {
- this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex - 1);
- this._appendShowMoreMatchesElement(fileTreeElement, searchResult, toIndex - 1);
- } else
- this._appendSearchMatches(fileTreeElement, searchResult, 0, toIndex);
- fileTreeElement._initialized = true;
- },
- _appendSearchMatches: function(fileTreeElement, searchResult, fromIndex, toIndex)
- {
- var uiSourceCode = searchResult.uiSourceCode;
- var searchMatches = searchResult.searchMatches;
- var regex = createSearchRegex(this._searchConfig.query, !this._searchConfig.ignoreCase, this._searchConfig.isRegex);
- for (var i = fromIndex; i < toIndex; ++i) {
- var lineNumber = searchMatches[i].lineNumber;
- var lineContent = searchMatches[i].lineContent;
- var matchRanges = this._regexMatchRanges(lineContent, regex);
- var anchor = this._createAnchor(uiSourceCode, lineNumber, matchRanges[0].offset);
- var numberString = numberToStringWithSpacesPadding(lineNumber + 1, 4);
- var lineNumberSpan = document.createElement("span");
- lineNumberSpan.addStyleClass("webkit-line-number");
- lineNumberSpan.addStyleClass("search-match-line-number");
- lineNumberSpan.textContent = numberString;
- anchor.appendChild(lineNumberSpan);
- var contentSpan = this._createContentSpan(lineContent, matchRanges);
- anchor.appendChild(contentSpan);
- var searchMatchElement = new TreeElement("", null, false);
- fileTreeElement.appendChild(searchMatchElement);
- searchMatchElement.listItemElement.className = "search-match";
- searchMatchElement.listItemElement.appendChild(anchor);
- }
- },
- _appendShowMoreMatchesElement: function(fileTreeElement, searchResult, startMatchIndex)
- {
- var matchesLeftCount = searchResult.searchMatches.length - startMatchIndex;
- var showMoreMatchesText = WebInspector.UIString("Show all matches (%d more).", matchesLeftCount);
- var showMoreMatchesElement = new TreeElement(showMoreMatchesText, null, false);
- fileTreeElement.appendChild(showMoreMatchesElement);
- showMoreMatchesElement.listItemElement.addStyleClass("show-more-matches");
- showMoreMatchesElement.onselect = this._showMoreMatchesElementSelected.bind(this, searchResult, startMatchIndex);
- },
- _showMoreMatchesElementSelected: function(searchResult, startMatchIndex, showMoreMatchesElement)
- {
- var fileTreeElement = showMoreMatchesElement.parent;
- fileTreeElement.removeChild(showMoreMatchesElement);
- this._appendSearchMatches(fileTreeElement, searchResult, startMatchIndex, searchResult.searchMatches.length);
- },
- _addFileTreeElement: function(fileName, searchMatchesCount, searchResultIndex)
- {
- var fileTreeElement = new TreeElement("", null, true);
- fileTreeElement.toggleOnClick = true;
- fileTreeElement.selectable = false;
- this._treeOutline.appendChild(fileTreeElement);
- fileTreeElement.listItemElement.addStyleClass("search-result");
- var fileNameSpan = document.createElement("span");
- fileNameSpan.className = "search-result-file-name";
- fileNameSpan.textContent = fileName;
- fileTreeElement.listItemElement.appendChild(fileNameSpan);
- var matchesCountSpan = document.createElement("span");
- matchesCountSpan.className = "search-result-matches-count";
- if (searchMatchesCount === 1)
- matchesCountSpan.textContent = WebInspector.UIString("(%d match)", searchMatchesCount);
- else
- matchesCountSpan.textContent = WebInspector.UIString("(%d matches)", searchMatchesCount);
- fileTreeElement.listItemElement.appendChild(matchesCountSpan);
- var searchResult = this._searchResults[searchResultIndex];
- fileTreeElement.onexpand = this._fileTreeElementExpanded.bind(this, searchResult);
- if (this._matchesExpandedCount < WebInspector.FileBasedSearchResultsPane.matchesExpandedByDefaultCount)
- fileTreeElement.expand();
- this._matchesExpandedCount += searchResult.searchMatches.length;
- return fileTreeElement;
- },
- _regexMatchRanges: function(lineContent, regex)
- {
- regex.lastIndex = 0;
- var match;
- var offset = 0;
- var matchRanges = [];
- while ((regex.lastIndex < lineContent.length) && (match = regex.exec(lineContent)))
- matchRanges.push(new WebInspector.SearchResult(match.index, match[0].length));
- return matchRanges;
- },
- _createContentSpan: function(lineContent, matchRanges)
- {
- var contentSpan = document.createElement("span");
- contentSpan.className = "search-match-content";
- contentSpan.textContent = lineContent;
- WebInspector.highlightRangesWithStyleClass(contentSpan, matchRanges, "highlighted-match");
- return contentSpan;
- }
- }
- WebInspector.FileBasedSearchResultsPane.prototype.__proto__ = WebInspector.SearchResultsPane.prototype;
- WebInspector.FileBasedSearchResultsPane.SearchResult = function(uiSourceCode, searchMatches) {
- this.uiSourceCode = uiSourceCode;
- this.searchMatches = searchMatches;
- }
- WebInspector.advancedSearchController = null;
- WebInspector.TimelineGrid = function()
- {
- this.element = document.createElement("div");
- this._itemsGraphsElement = document.createElement("div");
- this._itemsGraphsElement.id = "resources-graphs";
- this.element.appendChild(this._itemsGraphsElement);
- this._dividersElement = document.createElement("div");
- this._dividersElement.className = "resources-dividers";
- this.element.appendChild(this._dividersElement);
- this._eventDividersElement = document.createElement("div");
- this._eventDividersElement.className = "resources-event-dividers";
- this.element.appendChild(this._eventDividersElement);
- this._dividersLabelBarElement = document.createElement("div");
- this._dividersLabelBarElement.className = "resources-dividers-label-bar";
- this.element.appendChild(this._dividersLabelBarElement);
- }
- WebInspector.TimelineGrid.prototype = {
- get itemsGraphsElement()
- {
- return this._itemsGraphsElement;
- },
- get dividersElement()
- {
- return this._dividersElement;
- },
- removeDividers: function()
- {
- this._dividersElement.removeChildren();
- this._dividersLabelBarElement.removeChildren();
- },
- updateDividers: function(calculator)
- {
- var dividersElementClientWidth = this._dividersElement.clientWidth;
- var dividerCount = Math.round(dividersElementClientWidth / 64);
- var slice = calculator.boundarySpan / dividerCount;
- this._currentDividerSlice = slice;
- var divider = this._dividersElement.firstChild;
- var dividerLabelBar = this._dividersLabelBarElement.firstChild;
- var paddingLeft = calculator.paddingLeft;
- for (var i = paddingLeft ? 0 : 1; i <= dividerCount; ++i) {
- if (!divider) {
- divider = document.createElement("div");
- divider.className = "resources-divider";
- this._dividersElement.appendChild(divider);
- dividerLabelBar = document.createElement("div");
- dividerLabelBar.className = "resources-divider";
- var label = document.createElement("div");
- label.className = "resources-divider-label";
- dividerLabelBar._labelElement = label;
- dividerLabelBar.appendChild(label);
- this._dividersLabelBarElement.appendChild(dividerLabelBar);
- }
- if (i === (paddingLeft ? 0 : 1)) {
- divider.addStyleClass("first");
- dividerLabelBar.addStyleClass("first");
- } else {
- divider.removeStyleClass("first");
- dividerLabelBar.removeStyleClass("first");
- }
- if (i === dividerCount) {
- divider.addStyleClass("last");
- dividerLabelBar.addStyleClass("last");
- } else {
- divider.removeStyleClass("last");
- dividerLabelBar.removeStyleClass("last");
- }
- var left;
- if (!slice) {
- left = dividersElementClientWidth / dividerCount * i + paddingLeft;
- dividerLabelBar._labelElement.textContent = "";
- } else {
- left = calculator.computePosition(calculator.minimumBoundary + slice * i);
- dividerLabelBar._labelElement.textContent = calculator.formatTime(slice * i);
- }
- var percentLeft = 100 * left / dividersElementClientWidth;
- this._setDividerAndBarLeft(divider, dividerLabelBar, percentLeft);
- divider = divider.nextSibling;
- dividerLabelBar = dividerLabelBar.nextSibling;
- }
- while (divider) {
- var nextDivider = divider.nextSibling;
- this._dividersElement.removeChild(divider);
- divider = nextDivider;
- }
- while (dividerLabelBar) {
- var nextDivider = dividerLabelBar.nextSibling;
- this._dividersLabelBarElement.removeChild(dividerLabelBar);
- dividerLabelBar = nextDivider;
- }
- return true;
- },
- _setDividerAndBarLeft: function(divider, dividerLabelBar, percentLeft)
- {
- var percentStyleLeft = parseFloat(divider.style.left);
- if (!isNaN(percentStyleLeft) && Math.abs(percentStyleLeft - percentLeft) < 0.1)
- return;
- divider.style.left = percentLeft + "%";
- dividerLabelBar.style.left = percentLeft + "%";
- },
- addEventDivider: function(divider)
- {
- this._eventDividersElement.appendChild(divider);
- },
- addEventDividers: function(dividers)
- {
- this.element.removeChild(this._eventDividersElement);
- for (var i = 0; i < dividers.length; ++i) {
- if (dividers[i])
- this._eventDividersElement.appendChild(dividers[i]);
- }
- this.element.appendChild(this._eventDividersElement);
- },
- removeEventDividers: function()
- {
- this._eventDividersElement.removeChildren();
- },
- hideEventDividers: function()
- {
- this._eventDividersElement.addStyleClass("hidden");
- },
- showEventDividers: function()
- {
- this._eventDividersElement.removeStyleClass("hidden");
- },
- setScrollAndDividerTop: function(scrollTop, dividersTop)
- {
- this._dividersElement.style.top = scrollTop + "px";
- this._eventDividersElement.style.top = scrollTop + "px";
- this._dividersLabelBarElement.style.top = dividersTop + "px";
- }
- }
- WebInspector.ContentProvider = function() { }
- WebInspector.ContentProvider.prototype = {
- contentURL: function() { },
- contentType: function() { },
- requestContent: function(callback) { },
- searchInContent: function(query, caseSensitive, isRegex, callback) { }
- }
- WebInspector.ContentProvider.SearchMatch = function(lineNumber, lineContent) {
- this.lineNumber = lineNumber;
- this.lineContent = lineContent;
- }
- WebInspector.Resource = function(request, url, documentURL, frameId, loaderId, type, mimeType)
- {
- this._request = request;
- if (this._request)
- this._request.setResource(this);
- this.url = url;
- this._documentURL = documentURL;
- this._frameId = frameId;
- this._loaderId = loaderId;
- this._type = type || WebInspector.resourceTypes.Other;
- this._mimeType = mimeType;
- this.history = [];
- this._content;
- this._contentEncoded;
- this._pendingContentCallbacks = [];
- }
- WebInspector.Resource._domainModelBindings = [];
- WebInspector.Resource.registerDomainModelBinding = function(type, binding)
- {
- WebInspector.Resource._domainModelBindings[type.name()] = binding;
- }
- WebInspector.Resource._resourceRevisionRegistry = function()
- {
- if (!WebInspector.Resource._resourceRevisionRegistryObject) {
- if (window.localStorage) {
- var resourceHistory = window.localStorage["resource-history"];
- try {
- WebInspector.Resource._resourceRevisionRegistryObject = resourceHistory ? JSON.parse(resourceHistory) : {};
- } catch (e) {
- WebInspector.Resource._resourceRevisionRegistryObject = {};
- }
- } else
- WebInspector.Resource._resourceRevisionRegistryObject = {};
- }
- return WebInspector.Resource._resourceRevisionRegistryObject;
- }
- WebInspector.Resource.restoreRevisions = function()
- {
- var registry = WebInspector.Resource._resourceRevisionRegistry();
- var filteredRegistry = {};
- for (var url in registry) {
- var historyItems = registry[url];
- var resource = WebInspector.resourceForURL(url);
- var filteredHistoryItems = [];
- for (var i = 0; historyItems && i < historyItems.length; ++i) {
- var historyItem = historyItems[i];
- if (resource && historyItem.loaderId === resource.loaderId) {
- resource.addRevision(window.localStorage[historyItem.key], new Date(historyItem.timestamp), true);
- filteredHistoryItems.push(historyItem);
- filteredRegistry[url] = filteredHistoryItems;
- } else
- delete window.localStorage[historyItem.key];
- }
- }
- WebInspector.Resource._resourceRevisionRegistryObject = filteredRegistry;
- function persist()
- {
- window.localStorage["resource-history"] = JSON.stringify(filteredRegistry);
- }
- setTimeout(persist, 0);
- }
- WebInspector.Resource.persistRevision = function(resource)
- {
- if (!window.localStorage)
- return;
- var url = resource.url;
- var loaderId = resource.loaderId;
- var timestamp = resource._contentTimestamp.getTime();
- var key = "resource-history|" + url + "|" + loaderId + "|" + timestamp;
- var content = resource._content;
- var registry = WebInspector.Resource._resourceRevisionRegistry();
- var historyItems = registry[resource.url];
- if (!historyItems) {
- historyItems = [];
- registry[resource.url] = historyItems;
- }
- historyItems.push({url: url, loaderId: loaderId, timestamp: timestamp, key: key});
- function persist()
- {
- window.localStorage[key] = content;
- window.localStorage["resource-history"] = JSON.stringify(registry);
- }
- setTimeout(persist, 0);
- }
- WebInspector.Resource.Events = {
- RevisionAdded: "revision-added",
- MessageAdded: "message-added",
- MessagesCleared: "messages-cleared",
- }
- WebInspector.Resource.prototype = {
- get request()
- {
- return this._request;
- },
- get url()
- {
- return this._url;
- },
- set url(x)
- {
- this._url = x;
- this._parsedURL = new WebInspector.ParsedURL(x);
- },
- get parsedURL()
- {
- return this._parsedURL;
- },
- get documentURL()
- {
- return this._documentURL;
- },
- get frameId()
- {
- return this._frameId;
- },
- get loaderId()
- {
- return this._loaderId;
- },
- get displayName()
- {
- return this._parsedURL.displayName;
- },
- get type()
- {
- return this._request ? this._request.type : this._type;
- },
- get mimeType()
- {
- return this._request ? this._request.mimeType : this._mimeType;
- },
- get messages()
- {
- return this._messages || [];
- },
- addMessage: function(msg)
- {
- if (!msg.isErrorOrWarning() || !msg.message)
- return;
- if (!this._messages)
- this._messages = [];
- this._messages.push(msg);
- this.dispatchEventToListeners(WebInspector.Resource.Events.MessageAdded, msg);
- },
- get errors()
- {
- return this._errors || 0;
- },
- set errors(x)
- {
- this._errors = x;
- },
- get warnings()
- {
- return this._warnings || 0;
- },
- set warnings(x)
- {
- this._warnings = x;
- },
- clearErrorsAndWarnings: function()
- {
- this._messages = [];
- this._warnings = 0;
- this._errors = 0;
- this.dispatchEventToListeners(WebInspector.Resource.Events.MessagesCleared);
- },
- get content()
- {
- return this._content;
- },
- get contentEncoded()
- {
- return this._contentEncoded;
- },
- get contentTimestamp()
- {
- return this._contentTimestamp;
- },
- isEditable: function()
- {
- if (this._actualResource)
- return false;
- var binding = WebInspector.Resource._domainModelBindings[this.type.name()];
- return binding && binding.canSetContent(this);
- },
- setContent: function(newContent, majorChange, callback)
- {
- if (!this.isEditable()) {
- if (callback)
- callback("Resource is not editable");
- return;
- }
- var binding = WebInspector.Resource._domainModelBindings[this.type.name()];
- binding.setContent(this, newContent, majorChange, callback);
- },
- addRevision: function(newContent, timestamp, restoringHistory)
- {
- var revision = new WebInspector.ResourceRevision(this, this._content, this._contentTimestamp);
- this.history.push(revision);
- this._content = newContent;
- this._contentTimestamp = timestamp || new Date();
- this.dispatchEventToListeners(WebInspector.Resource.Events.RevisionAdded, revision);
- if (!restoringHistory)
- this._persistRevision();
- WebInspector.resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceContentCommitted, { resource: this, content: newContent });
- },
- _persistRevision: function()
- {
- WebInspector.Resource.persistRevision(this);
- },
- contentURL: function()
- {
- return this._url;
- },
- contentType: function()
- {
- return this.type;
- },
- requestContent: function(callback)
- {
- if (typeof this._content !== "undefined") {
- callback(this._content, !!this._contentEncoded, this.canonicalMimeType());
- return;
- }
- this._pendingContentCallbacks.push(callback);
- this._innerRequestContent();
- },
- canonicalMimeType: function()
- {
- return this.type.canonicalMimeType() || this.mimeType;
- },
- searchInContent: function(query, caseSensitive, isRegex, callback)
- {
- function callbackWrapper(error, searchMatches)
- {
- callback(searchMatches || []);
- }
- if (this.frameId)
- PageAgent.searchInResource(this.frameId, this.url, query, caseSensitive, isRegex, callbackWrapper);
- else
- callback([]);
- },
- populateImageSource: function(image)
- {
- function onResourceContent()
- {
- image.src = this._contentURL();
- }
- this.requestContent(onResourceContent.bind(this));
- },
- _contentURL: function()
- {
- const maxDataUrlSize = 1024 * 1024;
- if (this._content == null || this._content.length > maxDataUrlSize)
- return this.url;
- return "data:" + this.mimeType + (this._contentEncoded ? ";base64," : ",") + this._content;
- },
- _innerRequestContent: function()
- {
- if (this._contentRequested)
- return;
- this._contentRequested = true;
- function callback(error, content, contentEncoded)
- {
- this._content = error ? null : content;
- this._contentEncoded = contentEncoded;
- this._originalContent = content;
- var callbacks = this._pendingContentCallbacks.slice();
- for (var i = 0; i < callbacks.length; ++i)
- callbacks[i](this._content, this._contentEncoded, this.canonicalMimeType());
- this._pendingContentCallbacks.length = 0;
- delete this._contentRequested;
- }
- PageAgent.getResourceContent(this.frameId, this.url, callback.bind(this));
- }
- }
- WebInspector.Resource.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.ResourceRevision = function(resource, content, timestamp)
- {
- this._resource = resource;
- this._content = content;
- this._timestamp = timestamp;
- }
- WebInspector.ResourceRevision.prototype = {
- get resource()
- {
- return this._resource;
- },
- get timestamp()
- {
- return this._timestamp;
- },
- get content()
- {
- return this._content || null;
- },
- revertToThis: function()
- {
- function revert(content)
- {
- this._resource.setContent(content, true);
- }
- this.requestContent(revert.bind(this));
- },
- contentURL: function()
- {
- return this._resource.url;
- },
- contentType: function()
- {
- return this._resource.contentType();
- },
- requestContent: function(callback)
- {
- if (typeof this._content === "string") {
- callback(this._content, false, this.resource.mimeType);
- return;
- }
- if (typeof this.resource._originalContent === "string") {
- this._content = this._resource._originalContent;
- callback(this._content, false, this.resource.mimeType);
- return;
- }
- function callbackWrapper(error, content, contentEncoded)
- {
- callback(error ? null : content, contentEncoded, this.resource.mimeType);
- }
- PageAgent.getResourceContent(this._resource.frameId, this._resource.url, callbackWrapper.bind(this));
- },
- searchInContent: function(query, caseSensitive, isRegex, callback)
- {
- callback([]);
- }
- }
- WebInspector.ResourceDomainModelBinding = function() { }
- WebInspector.ResourceDomainModelBinding.prototype = {
- canSetContent: function(resource) { return true; },
- setContent: function(resource, content, majorChange, callback) { }
- }
- WebInspector.NetworkRequest = function(requestId, url, documentURL, frameId, loaderId)
- {
- this._requestId = requestId;
- this.url = url;
- this._documentURL = documentURL;
- this._frameId = frameId;
- this._loaderId = loaderId;
- this._startTime = -1;
- this._endTime = -1;
- this.statusCode = 0;
- this.statusText = "";
- this.requestMethod = "";
- this.requestTime = 0;
- this.receiveHeadersEnd = 0;
- this._type = WebInspector.resourceTypes.Other;
- this._content = undefined;
- this._contentEncoded = false;
- this._pendingContentCallbacks = [];
- this._frames = [];
- }
- WebInspector.NetworkRequest.Events = {
- FinishedLoading: "FinishedLoading",
- TimingChanged: "TimingChanged",
- RequestHeadersChanged: "RequestHeadersChanged",
- ResponseHeadersChanged: "ResponseHeadersChanged",
- }
- WebInspector.NetworkRequest.prototype = {
- get requestId()
- {
- return this._requestId;
- },
- set requestId(requestId)
- {
- this._requestId = requestId;
- },
- get url()
- {
- return this._url;
- },
- set url(x)
- {
- if (this._url === x)
- return;
- this._url = x;
- this._parsedURL = new WebInspector.ParsedURL(x);
- delete this._parsedQueryParameters;
- },
- get documentURL()
- {
- return this._documentURL;
- },
- get parsedURL()
- {
- return this._parsedURL;
- },
- get frameId()
- {
- return this._frameId;
- },
- get loaderId()
- {
- return this._loaderId;
- },
- get startTime()
- {
- return this._startTime || -1;
- },
- set startTime(x)
- {
- this._startTime = x;
- },
- get responseReceivedTime()
- {
- return this._responseReceivedTime || -1;
- },
- set responseReceivedTime(x)
- {
- this._responseReceivedTime = x;
- },
- get endTime()
- {
- return this._endTime || -1;
- },
- set endTime(x)
- {
- if (this.timing && this.timing.requestTime) {
- this._endTime = Math.max(x, this.responseReceivedTime);
- } else {
- this._endTime = x;
- if (this._responseReceivedTime > x)
- this._responseReceivedTime = x;
- }
- },
- get duration()
- {
- if (this._endTime === -1 || this._startTime === -1)
- return -1;
- return this._endTime - this._startTime;
- },
- get latency()
- {
- if (this._responseReceivedTime === -1 || this._startTime === -1)
- return -1;
- return this._responseReceivedTime - this._startTime;
- },
- get receiveDuration()
- {
- if (this._endTime === -1 || this._responseReceivedTime === -1)
- return -1;
- return this._endTime - this._responseReceivedTime;
- },
- get resourceSize()
- {
- return this._resourceSize || 0;
- },
- set resourceSize(x)
- {
- this._resourceSize = x;
- },
- get transferSize()
- {
- if (this.cached)
- return 0;
- if (this.statusCode === 304)
- return this.responseHeadersSize;
- if (this._transferSize !== undefined)
- return this._transferSize;
- var bodySize = Number(this.responseHeaderValue("Content-Length") || this.resourceSize);
- return this.responseHeadersSize + bodySize;
- },
- increaseTransferSize: function(x)
- {
- this._transferSize = (this._transferSize || 0) + x;
- },
- get finished()
- {
- return this._finished;
- },
- set finished(x)
- {
- if (this._finished === x)
- return;
- this._finished = x;
- if (x) {
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.FinishedLoading, this);
- if (this._pendingContentCallbacks.length)
- this._innerRequestContent();
- }
- },
- get failed()
- {
- return this._failed;
- },
- set failed(x)
- {
- this._failed = x;
- },
- get canceled()
- {
- return this._canceled;
- },
- set canceled(x)
- {
- this._canceled = x;
- },
- get cached()
- {
- return this._cached;
- },
- set cached(x)
- {
- this._cached = x;
- if (x)
- delete this._timing;
- },
- get timing()
- {
- return this._timing;
- },
- set timing(x)
- {
- if (x && !this._cached) {
- this._startTime = x.requestTime;
- this._responseReceivedTime = x.requestTime + x.receiveHeadersEnd / 1000.0;
- this._timing = x;
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.TimingChanged, this);
- }
- },
- get mimeType()
- {
- return this._mimeType;
- },
- set mimeType(x)
- {
- this._mimeType = x;
- },
- get displayName()
- {
- return this._parsedURL.displayName;
- },
- get folder()
- {
- var path = this._parsedURL.path;
- var indexOfQuery = path.indexOf("?");
- if (indexOfQuery !== -1)
- path = path.substring(0, indexOfQuery);
- var lastSlashIndex = path.lastIndexOf("/");
- return lastSlashIndex !== -1 ? path.substring(0, lastSlashIndex) : "";
- },
- get type()
- {
- return this._type;
- },
- set type(x)
- {
- this._type = x;
- },
- get redirectSource()
- {
- if (this.redirects && this.redirects.length > 0)
- return this.redirects[this.redirects.length - 1];
- return this._redirectSource;
- },
- set redirectSource(x)
- {
- this._redirectSource = x;
- },
- get requestHeaders()
- {
- return this._requestHeaders || [];
- },
- set requestHeaders(x)
- {
- this._requestHeaders = x;
- delete this._sortedRequestHeaders;
- delete this._requestCookies;
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);
- },
- get requestHeadersText()
- {
- if (this._requestHeadersText === undefined) {
- this._requestHeadersText = this.requestMethod + " " + this.url + " HTTP/1.1\r\n";
- for (var i = 0; i < this.requestHeaders; ++i)
- this._requestHeadersText += this.requestHeaders[i].name + ": " + this.requestHeaders[i].value + "\r\n";
- }
- return this._requestHeadersText;
- },
- set requestHeadersText(x)
- {
- this._requestHeadersText = x;
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.RequestHeadersChanged);
- },
- get requestHeadersSize()
- {
- return this.requestHeadersText.length;
- },
- get sortedRequestHeaders()
- {
- if (this._sortedRequestHeaders !== undefined)
- return this._sortedRequestHeaders;
- this._sortedRequestHeaders = [];
- this._sortedRequestHeaders = this.requestHeaders.slice();
- this._sortedRequestHeaders.sort(function(a,b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()) });
- return this._sortedRequestHeaders;
- },
- requestHeaderValue: function(headerName)
- {
- return this._headerValue(this.requestHeaders, headerName);
- },
- get requestCookies()
- {
- if (!this._requestCookies)
- this._requestCookies = WebInspector.CookieParser.parseCookie(this.requestHeaderValue("Cookie"));
- return this._requestCookies;
- },
- get requestFormData()
- {
- return this._requestFormData;
- },
- set requestFormData(x)
- {
- this._requestFormData = x;
- delete this._parsedFormParameters;
- },
- get requestHttpVersion()
- {
- var firstLine = this.requestHeadersText.split(/\r\n/)[0];
- var match = firstLine.match(/(HTTP\/\d+\.\d+)$/);
- return match ? match[1] : undefined;
- },
- get responseHeaders()
- {
- return this._responseHeaders || [];
- },
- set responseHeaders(x)
- {
- this._responseHeaders = x;
- delete this._sortedResponseHeaders;
- delete this._responseCookies;
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);
- },
- get responseHeadersText()
- {
- if (this._responseHeadersText === undefined) {
- this._responseHeadersText = "HTTP/1.1 " + this.statusCode + " " + this.statusText + "\r\n";
- for (var i = 0; i < this.requestHeaders; ++i)
- this._responseHeadersText += this.responseHeaders[i].name + ": " + this.responseHeaders[i].value + "\r\n";
- }
- return this._responseHeadersText;
- },
- set responseHeadersText(x)
- {
- this._responseHeadersText = x;
- this.dispatchEventToListeners(WebInspector.NetworkRequest.Events.ResponseHeadersChanged);
- },
- get responseHeadersSize()
- {
- return this.responseHeadersText.length;
- },
- get sortedResponseHeaders()
- {
- if (this._sortedResponseHeaders !== undefined)
- return this._sortedResponseHeaders;
- this._sortedResponseHeaders = [];
- this._sortedResponseHeaders = this.responseHeaders.slice();
- this._sortedResponseHeaders.sort(function(a,b) { return a.name.toLowerCase().localeCompare(b.name.toLowerCase()) });
- return this._sortedResponseHeaders;
- },
- responseHeaderValue: function(headerName)
- {
- return this._headerValue(this.responseHeaders, headerName);
- },
- get responseCookies()
- {
- if (!this._responseCookies)
- this._responseCookies = WebInspector.CookieParser.parseSetCookie(this.responseHeaderValue("Set-Cookie"));
- return this._responseCookies;
- },
- get queryParameters()
- {
- if (this._parsedQueryParameters)
- return this._parsedQueryParameters;
- var queryString = this.url.split("?", 2)[1];
- if (!queryString)
- return null;
- queryString = queryString.split("#", 2)[0];
- this._parsedQueryParameters = this._parseParameters(queryString);
- return this._parsedQueryParameters;
- },
- get formParameters()
- {
- if (this._parsedFormParameters)
- return this._parsedFormParameters;
- if (!this.requestFormData)
- return null;
- var requestContentType = this.requestContentType();
- if (!requestContentType || !requestContentType.match(/^application\/x-www-form-urlencoded\s*(;.*)?$/i))
- return null;
- this._parsedFormParameters = this._parseParameters(this.requestFormData);
- return this._parsedFormParameters;
- },
- get responseHttpVersion()
- {
- var match = this.responseHeadersText.match(/^(HTTP\/\d+\.\d+)/);
- return match ? match[1] : undefined;
- },
- _parseParameters: function(queryString)
- {
- function parseNameValue(pair)
- {
- var parameter = {};
- var splitPair = pair.split("=", 2);
- parameter.name = splitPair[0];
- if (splitPair.length === 1)
- parameter.value = "";
- else
- parameter.value = splitPair[1];
- return parameter;
- }
- return queryString.split("&").map(parseNameValue);
- },
- _headerValue: function(headers, headerName)
- {
- headerName = headerName.toLowerCase();
- var values = [];
- for (var i = 0; i < headers.length; ++i) {
- if (headers[i].name.toLowerCase() === headerName)
- values.push(headers[i].value);
- }
- if (headerName === "set-cookie")
- return values.join("\n");
- return values.join(", ");
- },
- get content()
- {
- return this._content;
- },
- get contentEncoded()
- {
- return this._contentEncoded;
- },
- contentURL: function()
- {
- return this._url;
- },
- contentType: function()
- {
- return this._type;
- },
- requestContent: function(callback)
- {
- if (this.type === WebInspector.resourceTypes.WebSocket) {
- callback(null, false, this._mimeType);
- return;
- }
- if (typeof this._content !== "undefined") {
- callback(this.content || null, this._contentEncoded, this._mimeType);
- return;
- }
- this._pendingContentCallbacks.push(callback);
- if (this.finished)
- this._innerRequestContent();
- },
- searchInContent: function(query, caseSensitive, isRegex, callback)
- {
- callback([]);
- },
- isHttpFamily: function()
- {
- return !!this.url.match(/^https?:/i);
- },
- requestContentType: function()
- {
- return this.requestHeaderValue("Content-Type");
- },
- isPingRequest: function()
- {
- return "text/ping" === this.requestContentType();
- },
- hasErrorStatusCode: function()
- {
- return this.statusCode >= 400;
- },
- populateImageSource: function(image)
- {
- function onResourceContent(content, contentEncoded, mimeType)
- {
- const maxDataUrlSize = 1024 * 1024;
- if (this._content == null || this._content.length > maxDataUrlSize)
- return this.url;
- image.src = "data:" + this.mimeType + (this._contentEncoded ? ";base64," : ",") + this._content;
- }
- this.requestContent(onResourceContent.bind(this));
- },
- _innerRequestContent: function()
- {
- if (this._contentRequested)
- return;
- this._contentRequested = true;
- function onResourceContent(error, content, contentEncoded)
- {
- this._content = error ? null : content;
- this._contentEncoded = contentEncoded;
- var callbacks = this._pendingContentCallbacks.slice();
- for (var i = 0; i < callbacks.length; ++i)
- callbacks[i](this._content, this._contentEncoded, this._mimeType);
- this._pendingContentCallbacks.length = 0;
- delete this._contentRequested;
- }
- NetworkAgent.getResponseBody(this._requestId, onResourceContent.bind(this));
- },
- setResource: function(resource)
- {
- this._resource = resource;
- },
- resource: function()
- {
- return this._resource;
- },
- frames: function()
- {
- return this._frames;
- },
- frame: function(position)
- {
- return this._frames[position];
- },
- addFrameError: function(errorMessage, time)
- {
- var errorObject = {};
- errorObject.errorMessage = errorMessage;
- errorObject.time = time;
- this._pushFrame(errorObject);
- },
- addFrame: function(response, time, sent)
- {
- response.time = time;
- if (sent)
- response.sent = true;
- this._pushFrame(response);
- },
- _pushFrame: function(object)
- {
- if (this._frames.length >= 100) {
- this._frames.splice(0, 10);
- }
- this._frames.push(object);
- }
- }
- WebInspector.NetworkRequest.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.CSSStyleModel = function()
- {
- this._pendingCommandsMajorState = [];
- WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.UndoRedoRequested, this._undoRedoRequested, this);
- WebInspector.domAgent.addEventListener(WebInspector.DOMAgent.Events.UndoRedoCompleted, this._undoRedoCompleted, this);
- new WebInspector.CSSStyleModelResourceBinding(this);
- InspectorBackend.registerCSSDispatcher(new WebInspector.CSSDispatcher(this));
- CSSAgent.enable();
- }
- WebInspector.CSSStyleModel.parseRuleArrayPayload = function(ruleArray)
- {
- var result = [];
- for (var i = 0; i < ruleArray.length; ++i)
- result.push(WebInspector.CSSRule.parsePayload(ruleArray[i]));
- return result;
- }
- WebInspector.CSSStyleModel.Events = {
- StyleSheetChanged: "StyleSheetChanged",
- MediaQueryResultChanged: "MediaQueryResultChanged"
- }
- WebInspector.CSSStyleModel.prototype = {
- getMatchedStylesAsync: function(nodeId, forcedPseudoClasses, needPseudo, needInherited, userCallback)
- {
- function callback(userCallback, error, matchedPayload, pseudoPayload, inheritedPayload)
- {
- if (error) {
- if (userCallback)
- userCallback(null);
- return;
- }
- var result = {};
- if (matchedPayload)
- result.matchedCSSRules = WebInspector.CSSStyleModel.parseRuleArrayPayload(matchedPayload);
- if (pseudoPayload) {
- result.pseudoElements = [];
- for (var i = 0; i < pseudoPayload.length; ++i) {
- var entryPayload = pseudoPayload[i];
- result.pseudoElements.push({ pseudoId: entryPayload.pseudoId, rules: WebInspector.CSSStyleModel.parseRuleArrayPayload(entryPayload.rules) });
- }
- }
- if (inheritedPayload) {
- result.inherited = [];
- for (var i = 0; i < inheritedPayload.length; ++i) {
- var entryPayload = inheritedPayload[i];
- var entry = {};
- if (entryPayload.inlineStyle)
- entry.inlineStyle = WebInspector.CSSStyleDeclaration.parsePayload(entryPayload.inlineStyle);
- if (entryPayload.matchedCSSRules)
- entry.matchedCSSRules = WebInspector.CSSStyleModel.parseRuleArrayPayload(entryPayload.matchedCSSRules);
- result.inherited.push(entry);
- }
- }
- if (userCallback)
- userCallback(result);
- }
- CSSAgent.getMatchedStylesForNode(nodeId, forcedPseudoClasses || [], needPseudo, needInherited, callback.bind(null, userCallback));
- },
- getComputedStyleAsync: function(nodeId, forcedPseudoClasses, userCallback)
- {
- function callback(userCallback, error, computedPayload)
- {
- if (error || !computedPayload)
- userCallback(null);
- else
- userCallback(WebInspector.CSSStyleDeclaration.parseComputedStylePayload(computedPayload));
- }
- CSSAgent.getComputedStyleForNode(nodeId, forcedPseudoClasses || [], callback.bind(null, userCallback));
- },
- getInlineStylesAsync: function(nodeId, userCallback)
- {
- function callback(userCallback, error, inlinePayload, attributesStylePayload)
- {
- if (error || !inlinePayload)
- userCallback(null, null);
- else
- userCallback(WebInspector.CSSStyleDeclaration.parsePayload(inlinePayload), attributesStylePayload ? WebInspector.CSSStyleDeclaration.parsePayload(attributesStylePayload) : null);
- }
- CSSAgent.getInlineStylesForNode(nodeId, callback.bind(null, userCallback));
- },
- setRuleSelector: function(ruleId, nodeId, newSelector, successCallback, failureCallback)
- {
- function checkAffectsCallback(nodeId, successCallback, rulePayload, selectedNodeIds)
- {
- if (!selectedNodeIds)
- return;
- var doesAffectSelectedNode = (selectedNodeIds.indexOf(nodeId) >= 0);
- var rule = WebInspector.CSSRule.parsePayload(rulePayload);
- successCallback(rule, doesAffectSelectedNode);
- }
- function callback(nodeId, successCallback, failureCallback, newSelector, error, rulePayload)
- {
- this._pendingCommandsMajorState.pop();
- if (error)
- failureCallback();
- else {
- WebInspector.domAgent.markUndoableState();
- var ownerDocumentId = this._ownerDocumentId(nodeId);
- if (ownerDocumentId)
- WebInspector.domAgent.querySelectorAll(ownerDocumentId, newSelector, checkAffectsCallback.bind(this, nodeId, successCallback, rulePayload));
- else
- failureCallback();
- }
- }
- this._pendingCommandsMajorState.push(true);
- CSSAgent.setRuleSelector(ruleId, newSelector, callback.bind(this, nodeId, successCallback, failureCallback, newSelector));
- },
- addRule: function(nodeId, selector, successCallback, failureCallback)
- {
- function checkAffectsCallback(nodeId, successCallback, rulePayload, selectedNodeIds)
- {
- if (!selectedNodeIds)
- return;
- var doesAffectSelectedNode = (selectedNodeIds.indexOf(nodeId) >= 0);
- var rule = WebInspector.CSSRule.parsePayload(rulePayload);
- successCallback(rule, doesAffectSelectedNode);
- }
- function callback(successCallback, failureCallback, selector, error, rulePayload)
- {
- this._pendingCommandsMajorState.pop();
- if (error) {
- failureCallback();
- } else {
- WebInspector.domAgent.markUndoableState();
- var ownerDocumentId = this._ownerDocumentId(nodeId);
- if (ownerDocumentId)
- WebInspector.domAgent.querySelectorAll(ownerDocumentId, selector, checkAffectsCallback.bind(this, nodeId, successCallback, rulePayload));
- else
- failureCallback();
- }
- }
- this._pendingCommandsMajorState.push(true);
- CSSAgent.addRule(nodeId, selector, callback.bind(this, successCallback, failureCallback, selector));
- },
- mediaQueryResultChanged: function()
- {
- this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.MediaQueryResultChanged);
- },
- _ownerDocumentId: function(nodeId)
- {
- var node = WebInspector.domAgent.nodeForId(nodeId);
- if (!node)
- return null;
- return node.ownerDocument ? node.ownerDocument.id : null;
- },
- _fireStyleSheetChanged: function(styleSheetId)
- {
- if (!this._pendingCommandsMajorState.length)
- return;
- var majorChange = this._pendingCommandsMajorState[this._pendingCommandsMajorState.length - 1];
- if (!majorChange || !styleSheetId || !this.hasEventListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged))
- return;
- this.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.StyleSheetChanged, { styleSheetId: styleSheetId, majorChange: majorChange });
- },
- setStyleSheetText: function(styleSheetId, newText, majorChange, userCallback)
- {
- function callback(error)
- {
- this._pendingCommandsMajorState.pop();
- if (!error && majorChange)
- WebInspector.domAgent.markUndoableState();
- if (!error && userCallback)
- userCallback(error);
- }
- this._pendingCommandsMajorState.push(majorChange);
- CSSAgent.setStyleSheetText(styleSheetId, newText, callback.bind(this));
- },
- _undoRedoRequested: function()
- {
- this._pendingCommandsMajorState.push(true);
- },
- _undoRedoCompleted: function()
- {
- this._pendingCommandsMajorState.pop();
- }
- }
- WebInspector.CSSStyleModel.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.CSSStyleDeclaration = function(payload)
- {
- this.id = payload.styleId;
- this.width = payload.width;
- this.height = payload.height;
- this.range = payload.range;
- this._shorthandValues = WebInspector.CSSStyleDeclaration.buildShorthandValueMap(payload.shorthandEntries);
- this._livePropertyMap = {};
- this._allProperties = [];
- this._longhandProperties = {};
- this.__disabledProperties = {};
- var payloadPropertyCount = payload.cssProperties.length;
- var propertyIndex = 0;
- for (var i = 0; i < payloadPropertyCount; ++i) {
- var property = WebInspector.CSSProperty.parsePayload(this, i, payload.cssProperties[i]);
- this._allProperties.push(property);
- if (property.disabled)
- this.__disabledProperties[i] = property;
- if (!property.active && !property.styleBased)
- continue;
- var name = property.name;
- this[propertyIndex] = name;
- this._livePropertyMap[name] = property;
- if (property.shorthand) {
- var longhands = this._longhandProperties[property.shorthand];
- if (!longhands) {
- longhands = [];
- this._longhandProperties[property.shorthand] = longhands;
- }
- longhands.push(property);
- }
- ++propertyIndex;
- }
- this.length = propertyIndex;
- if ("cssText" in payload)
- this.cssText = payload.cssText;
- }
- WebInspector.CSSStyleDeclaration.buildShorthandValueMap = function(shorthandEntries)
- {
- var result = {};
- for (var i = 0; i < shorthandEntries.length; ++i)
- result[shorthandEntries[i].name] = shorthandEntries[i].value;
- return result;
- }
- WebInspector.CSSStyleDeclaration.parsePayload = function(payload)
- {
- return new WebInspector.CSSStyleDeclaration(payload);
- }
- WebInspector.CSSStyleDeclaration.parseComputedStylePayload = function(payload)
- {
- var newPayload = { cssProperties: [], shorthandEntries: [], width: "", height: "" };
- if (payload)
- newPayload.cssProperties = payload;
- return new WebInspector.CSSStyleDeclaration(newPayload);
- }
- WebInspector.CSSStyleDeclaration.prototype = {
- get allProperties()
- {
- return this._allProperties;
- },
- getLiveProperty: function(name)
- {
- return this._livePropertyMap[name];
- },
- getPropertyValue: function(name)
- {
- var property = this._livePropertyMap[name];
- return property ? property.value : "";
- },
- getPropertyPriority: function(name)
- {
- var property = this._livePropertyMap[name];
- return property ? property.priority : "";
- },
- getPropertyShorthand: function(name)
- {
- var property = this._livePropertyMap[name];
- return property ? property.shorthand : "";
- },
- isPropertyImplicit: function(name)
- {
- var property = this._livePropertyMap[name];
- return property ? property.implicit : "";
- },
- styleTextWithShorthands: function()
- {
- var cssText = "";
- var foundProperties = {};
- for (var i = 0; i < this.length; ++i) {
- var individualProperty = this[i];
- var shorthandProperty = this.getPropertyShorthand(individualProperty);
- var propertyName = (shorthandProperty || individualProperty);
- if (propertyName in foundProperties)
- continue;
- if (shorthandProperty) {
- var value = this.getShorthandValue(shorthandProperty);
- var priority = this.getShorthandPriority(shorthandProperty);
- } else {
- var value = this.getPropertyValue(individualProperty);
- var priority = this.getPropertyPriority(individualProperty);
- }
- foundProperties[propertyName] = true;
- cssText += propertyName + ": " + value;
- if (priority)
- cssText += " !" + priority;
- cssText += "; ";
- }
- return cssText;
- },
- getLonghandProperties: function(name)
- {
- return this._longhandProperties[name] || [];
- },
- getShorthandValue: function(shorthandProperty)
- {
- var property = this.getLiveProperty(shorthandProperty);
- return property ? property.value : this._shorthandValues[shorthandProperty];
- },
- getShorthandPriority: function(shorthandProperty)
- {
- var priority = this.getPropertyPriority(shorthandProperty);
- if (priority)
- return priority;
- var longhands = this._longhandProperties[shorthandProperty];
- return longhands ? this.getPropertyPriority(longhands[0]) : null;
- },
- propertyAt: function(index)
- {
- return (index < this.allProperties.length) ? this.allProperties[index] : null;
- },
- pastLastSourcePropertyIndex: function()
- {
- for (var i = this.allProperties.length - 1; i >= 0; --i) {
- var property = this.allProperties[i];
- if (property.active || property.disabled)
- return i + 1;
- }
- return 0;
- },
- newBlankProperty: function(index)
- {
- index = (typeof index === "undefined") ? this.pastLastSourcePropertyIndex() : index;
- return new WebInspector.CSSProperty(this, index, "", "", "", "active", true, false, false, "");
- },
- insertPropertyAt: function(index, name, value, userCallback)
- {
- function callback(userCallback, error, payload)
- {
- WebInspector.cssModel._pendingCommandsMajorState.pop();
- if (!userCallback)
- return;
- if (error) {
- console.error(error);
- userCallback(null);
- } else {
- userCallback(WebInspector.CSSStyleDeclaration.parsePayload(payload));
- }
- }
- WebInspector.cssModel._pendingCommandsMajorState.push(true);
- CSSAgent.setPropertyText(this.id, index, name + ": " + value + ";", false, callback.bind(this, userCallback));
- },
- appendProperty: function(name, value, userCallback)
- {
- this.insertPropertyAt(this.allProperties.length, name, value, userCallback);
- }
- }
- WebInspector.CSSRule = function(payload)
- {
- this.id = payload.ruleId;
- this.selectorText = payload.selectorText;
- this.sourceLine = payload.sourceLine;
- this.sourceURL = payload.sourceURL;
- this.origin = payload.origin;
- this.style = WebInspector.CSSStyleDeclaration.parsePayload(payload.style);
- this.style.parentRule = this;
- this.selectorRange = payload.selectorRange;
- if (payload.media)
- this.media = WebInspector.CSSMedia.parseMediaArrayPayload(payload.media);
- }
- WebInspector.CSSRule.parsePayload = function(payload)
- {
- return new WebInspector.CSSRule(payload);
- }
- WebInspector.CSSRule.prototype = {
- get isUserAgent()
- {
- return this.origin === "user-agent";
- },
- get isUser()
- {
- return this.origin === "user";
- },
- get isViaInspector()
- {
- return this.origin === "inspector";
- },
- get isRegular()
- {
- return this.origin === "regular";
- }
- }
- WebInspector.CSSProperty = function(ownerStyle, index, name, value, priority, status, parsedOk, implicit, shorthand, text)
- {
- this.ownerStyle = ownerStyle;
- this.index = index;
- this.name = name;
- this.value = value;
- this.priority = priority;
- this.status = status;
- this.parsedOk = parsedOk;
- this.implicit = implicit;
- this.shorthand = shorthand;
- this.text = text;
- }
- WebInspector.CSSProperty.parsePayload = function(ownerStyle, index, payload)
- {
- var result = new WebInspector.CSSProperty(
- ownerStyle, index, payload.name, payload.value, payload.priority || "", payload.status || "style", ("parsedOk" in payload) ? payload.parsedOk : true, !!payload.implicit, payload.shorthandName || "", payload.text);
- return result;
- }
- WebInspector.CSSProperty.prototype = {
- get propertyText()
- {
- if (this.text !== undefined)
- return this.text;
- if (this.name === "")
- return "";
- return this.name + ": " + this.value + (this.priority ? " !" + this.priority : "") + ";";
- },
- get isLive()
- {
- return this.active || this.styleBased;
- },
- get active()
- {
- return this.status === "active";
- },
- get styleBased()
- {
- return this.status === "style";
- },
- get inactive()
- {
- return this.status === "inactive";
- },
- get disabled()
- {
- return this.status === "disabled";
- },
- setText: function(propertyText, majorChange, overwrite, userCallback)
- {
- function enabledCallback(style)
- {
- if (userCallback)
- userCallback(style);
- }
- function callback(error, stylePayload)
- {
- WebInspector.cssModel._pendingCommandsMajorState.pop();
- if (!error) {
- if (majorChange)
- WebInspector.domAgent.markUndoableState();
- this.text = propertyText;
- var style = WebInspector.CSSStyleDeclaration.parsePayload(stylePayload);
- var newProperty = style.allProperties[this.index];
- if (newProperty && this.disabled && !propertyText.match(/^\s*$/)) {
- newProperty.setDisabled(false, enabledCallback);
- return;
- }
- if (userCallback)
- userCallback(style);
- } else {
- if (userCallback)
- userCallback(null);
- }
- }
- if (!this.ownerStyle)
- throw "No ownerStyle for property";
- WebInspector.cssModel._pendingCommandsMajorState.push(majorChange);
- CSSAgent.setPropertyText(this.ownerStyle.id, this.index, propertyText, overwrite, callback.bind(this));
- },
- setValue: function(newValue, majorChange, overwrite, userCallback)
- {
- var text = this.name + ": " + newValue + (this.priority ? " !" + this.priority : "") + ";"
- this.setText(text, majorChange, overwrite, userCallback);
- },
- setDisabled: function(disabled, userCallback)
- {
- if (!this.ownerStyle && userCallback)
- userCallback(null);
- if (disabled === this.disabled && userCallback)
- userCallback(this.ownerStyle);
- function callback(error, stylePayload)
- {
- WebInspector.cssModel._pendingCommandsMajorState.pop();
- if (error) {
- if (userCallback)
- userCallback(null);
- return;
- }
- WebInspector.domAgent.markUndoableState();
- if (userCallback) {
- var style = WebInspector.CSSStyleDeclaration.parsePayload(stylePayload);
- userCallback(style);
- }
- }
- WebInspector.cssModel._pendingCommandsMajorState.push(false);
- CSSAgent.toggleProperty(this.ownerStyle.id, this.index, disabled, callback.bind(this));
- }
- }
- WebInspector.CSSMedia = function(payload)
- {
- this.text = payload.text;
- this.source = payload.source;
- this.sourceURL = payload.sourceURL || "";
- this.sourceLine = typeof payload.sourceLine === "undefined" || this.source === "linkedSheet" ? -1 : payload.sourceLine;
- }
- WebInspector.CSSMedia.Source = {
- LINKED_SHEET: "linkedSheet",
- INLINE_SHEET: "inlineSheet",
- MEDIA_RULE: "mediaRule",
- IMPORT_RULE: "importRule"
- };
- WebInspector.CSSMedia.parsePayload = function(payload)
- {
- return new WebInspector.CSSMedia(payload);
- }
- WebInspector.CSSMedia.parseMediaArrayPayload = function(payload)
- {
- var result = [];
- for (var i = 0; i < payload.length; ++i)
- result.push(WebInspector.CSSMedia.parsePayload(payload[i]));
- return result;
- }
- WebInspector.CSSStyleSheet = function(payload)
- {
- this.id = payload.styleSheetId;
- this.rules = [];
- this.styles = {};
- for (var i = 0; i < payload.rules.length; ++i) {
- var rule = WebInspector.CSSRule.parsePayload(payload.rules[i]);
- this.rules.push(rule);
- if (rule.style)
- this.styles[rule.style.id] = rule.style;
- }
- if ("text" in payload)
- this._text = payload.text;
- }
- WebInspector.CSSStyleSheet.createForId = function(styleSheetId, userCallback)
- {
- function callback(error, styleSheetPayload)
- {
- if (error)
- userCallback(null);
- else
- userCallback(new WebInspector.CSSStyleSheet(styleSheetPayload));
- }
- CSSAgent.getStyleSheet(styleSheetId, callback.bind(this));
- }
- WebInspector.CSSStyleSheet.prototype = {
- getText: function()
- {
- return this._text;
- },
- setText: function(newText, majorChange, userCallback)
- {
- function callback(error)
- {
- if (!error)
- WebInspector.domAgent.markUndoableState();
- WebInspector.cssModel._pendingCommandsMajorState.pop();
- if (userCallback)
- userCallback(error);
- }
- WebInspector.cssModel._pendingCommandsMajorState.push(majorChange);
- CSSAgent.setStyleSheetText(this.id, newText, callback.bind(this));
- }
- }
- WebInspector.CSSStyleModelResourceBinding = function(cssModel)
- {
- this._cssModel = cssModel;
- this._urlToStyleSheetId = {};
- this._styleSheetIdToURL = {};
- this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, this._inspectedURLChanged, this);
- WebInspector.Resource.registerDomainModelBinding(WebInspector.resourceTypes.Stylesheet, this);
- }
- WebInspector.CSSStyleModelResourceBinding.prototype = {
- setContent: function(resource, content, majorChange, userCallback)
- {
- if (majorChange && resource.type === WebInspector.resourceTypes.Stylesheet)
- resource.addRevision(content);
- if (this._urlToStyleSheetId[resource.url]) {
- this._innerSetContent(resource.url, content, majorChange, userCallback, null);
- return;
- }
- this._loadStyleSheetHeaders(this._innerSetContent.bind(this, resource.url, content, majorChange, userCallback));
- },
- canSetContent: function()
- {
- return true;
- },
- _inspectedURLChanged: function(event)
- {
- this._urlToStyleSheetId = {};
- this._styleSheetIdToURL = {};
- },
- _innerSetContent: function(url, content, majorChange, userCallback, error)
- {
- if (error) {
- userCallback(error);
- return;
- }
- var styleSheetId = this._urlToStyleSheetId[url];
- if (!styleSheetId) {
- if (userCallback)
- userCallback("No stylesheet found: " + url);
- return;
- }
- this._isSettingContent = true;
- function callbackWrapper(error)
- {
- if (userCallback)
- userCallback(error);
- delete this._isSettingContent;
- }
- this._cssModel.setStyleSheetText(styleSheetId, content, majorChange, callbackWrapper.bind(this));
- },
- _loadStyleSheetHeaders: function(callback)
- {
- function didGetAllStyleSheets(error, infos)
- {
- if (error) {
- callback(error);
- return;
- }
- for (var i = 0; i < infos.length; ++i) {
- var info = infos[i];
- this._urlToStyleSheetId[info.sourceURL] = info.styleSheetId;
- this._styleSheetIdToURL[info.styleSheetId] = info.sourceURL;
- }
- callback();
- }
- CSSAgent.getAllStyleSheets(didGetAllStyleSheets.bind(this));
- },
- _styleSheetChanged: function(event)
- {
- if (this._isSettingContent)
- return;
- if (!event.data.majorChange)
- return;
- function callback(error, content)
- {
- if (!error)
- this._innerStyleSheetChanged(event.data.styleSheetId, content);
- }
- CSSAgent.getStyleSheetText(event.data.styleSheetId, callback.bind(this));
- },
- _innerStyleSheetChanged: function(styleSheetId, content)
- {
- function setContent()
- {
- var url = this._styleSheetIdToURL[styleSheetId];
- if (!url)
- return;
- var resource = WebInspector.resourceForURL(url);
- if (resource && resource.type === WebInspector.resourceTypes.Stylesheet)
- resource.addRevision(content);
- }
- if (!this._styleSheetIdToURL[styleSheetId]) {
- this._loadStyleSheetHeaders(setContent.bind(this));
- return;
- }
- setContent.call(this);
- }
- }
- WebInspector.CSSStyleModelResourceBinding.prototype.__proto__ = WebInspector.ResourceDomainModelBinding.prototype;
- WebInspector.CSSDispatcher = function(cssModel)
- {
- this._cssModel = cssModel;
- }
- WebInspector.CSSDispatcher.prototype = {
- mediaQueryResultChanged: function()
- {
- this._cssModel.mediaQueryResultChanged();
- },
- styleSheetChanged: function(styleSheetId)
- {
- this._cssModel._fireStyleSheetChanged(styleSheetId);
- }
- }
- WebInspector.cssModel = null;
- WebInspector.NetworkManager = function()
- {
- WebInspector.Object.call(this);
- this._dispatcher = new WebInspector.NetworkDispatcher(this);
- if (WebInspector.settings.cacheDisabled.get())
- NetworkAgent.setCacheDisabled(true);
- NetworkAgent.enable();
- WebInspector.settings.cacheDisabled.addChangeListener(this._cacheDisabledSettingChanged, this);
- if (WebInspector.settings.userAgent.get())
- this._userAgentSettingChanged();
- WebInspector.settings.userAgent.addChangeListener(this._userAgentSettingChanged, this);
- }
- WebInspector.NetworkManager.EventTypes = {
- ResourceTrackingEnabled: "ResourceTrackingEnabled",
- ResourceTrackingDisabled: "ResourceTrackingDisabled",
- RequestStarted: "RequestStarted",
- RequestUpdated: "RequestUpdated",
- RequestFinished: "RequestFinished",
- RequestUpdateDropped: "RequestUpdateDropped"
- }
- WebInspector.NetworkManager._MIMETypes = {
- "text/html": {"document": true},
- "text/xml": {"document": true},
- "text/plain": {"document": true},
- "application/xhtml+xml": {"document": true},
- "text/css": {"stylesheet": true},
- "text/xsl": {"stylesheet": true},
- "image/jpeg": {"image": true},
- "image/png": {"image": true},
- "image/gif": {"image": true},
- "image/bmp": {"image": true},
- "image/svg+xml": {"image": true},
- "image/vnd.microsoft.icon": {"image": true},
- "image/webp": {"image": true},
- "image/x-icon": {"image": true},
- "image/x-xbitmap": {"image": true},
- "font/ttf": {"font": true},
- "font/opentype": {"font": true},
- "font/woff": {"font": true},
- "application/x-font-type1": {"font": true},
- "application/x-font-ttf": {"font": true},
- "application/x-font-woff": {"font": true},
- "application/x-truetype-font": {"font": true},
- "text/javascript": {"script": true},
- "text/ecmascript": {"script": true},
- "application/javascript": {"script": true},
- "application/ecmascript": {"script": true},
- "application/x-javascript": {"script": true},
- "application/json": {"script": true},
- "text/javascript1.1": {"script": true},
- "text/javascript1.2": {"script": true},
- "text/javascript1.3": {"script": true},
- "text/jscript": {"script": true},
- "text/livescript": {"script": true},
- }
- WebInspector.NetworkManager.prototype = {
- enableResourceTracking: function()
- {
- function callback(error)
- {
- this.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.ResourceTrackingEnabled);
- }
- NetworkAgent.enable(callback.bind(this));
- },
- disableResourceTracking: function()
- {
- function callback(error)
- {
- this.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.ResourceTrackingDisabled);
- }
- NetworkAgent.disable(callback.bind(this));
- },
- inflightRequestForURL: function(url)
- {
- return this._dispatcher._inflightRequestsByURL[url];
- },
- _cacheDisabledSettingChanged: function(event)
- {
- var enabled = event.data;
- NetworkAgent.setCacheDisabled(enabled);
- },
- _userAgentSettingChanged: function()
- {
- NetworkAgent.setUserAgentOverride(WebInspector.settings.userAgent.get());
- }
- }
- WebInspector.NetworkManager.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.NetworkDispatcher = function(manager)
- {
- this._manager = manager;
- this._inflightRequestsById = {};
- this._inflightRequestsByURL = {};
- InspectorBackend.registerNetworkDispatcher(this);
- }
- WebInspector.NetworkDispatcher.prototype = {
- _headersMapToHeadersArray: function(headersMap)
- {
- var result = [];
- for (var name in headersMap) {
- var values = headersMap[name].split("\n");
- for (var i = 0; i < values.length; ++i)
- result.push({ name: name, value: values[i] });
- }
- return result;
- },
- _updateNetworkRequestWithRequest: function(networkRequest, request)
- {
- networkRequest.requestMethod = request.method;
- networkRequest.requestHeaders = this._headersMapToHeadersArray(request.headers);
- networkRequest.requestFormData = request.postData;
- },
- _updateNetworkRequestWithResponse: function(networkRequest, response)
- {
- if (!response)
- return;
- if (response.url && networkRequest.url !== response.url)
- networkRequest.url = response.url;
- networkRequest.mimeType = response.mimeType;
- networkRequest.statusCode = response.status;
- networkRequest.statusText = response.statusText;
- networkRequest.responseHeaders = this._headersMapToHeadersArray(response.headers);
- if (response.headersText)
- networkRequest.responseHeadersText = response.headersText;
- if (response.requestHeaders)
- networkRequest.requestHeaders = this._headersMapToHeadersArray(response.requestHeaders);
- if (response.requestHeadersText)
- networkRequest.requestHeadersText = response.requestHeadersText;
- networkRequest.connectionReused = response.connectionReused;
- networkRequest.connectionId = response.connectionId;
- if (response.fromDiskCache)
- networkRequest.cached = true;
- else
- networkRequest.timing = response.timing;
- if (!this._mimeTypeIsConsistentWithType(networkRequest)) {
- WebInspector.console.addMessage(WebInspector.ConsoleMessage.create(WebInspector.ConsoleMessage.MessageSource.Network,
- WebInspector.ConsoleMessage.MessageLevel.Warning,
- WebInspector.UIString("Resource interpreted as %s but transferred with MIME type %s: \"%s\".", networkRequest.type.title(), networkRequest.mimeType, networkRequest.url),
- WebInspector.ConsoleMessage.MessageType.Log,
- "",
- 0,
- 1,
- [],
- null,
- networkRequest));
- }
- },
- _mimeTypeIsConsistentWithType: function(networkRequest)
- {
- if (networkRequest.hasErrorStatusCode() || networkRequest.statusCode === 304)
- return true;
- if (typeof networkRequest.type === "undefined"
- || networkRequest.type === WebInspector.resourceTypes.Other
- || networkRequest.type === WebInspector.resourceTypes.XHR
- || networkRequest.type === WebInspector.resourceTypes.WebSocket)
- return true;
- if (!networkRequest.mimeType)
- return true;
- if (networkRequest.mimeType in WebInspector.NetworkManager._MIMETypes)
- return networkRequest.type.name() in WebInspector.NetworkManager._MIMETypes[networkRequest.mimeType];
- return false;
- },
- _updateNetworkRequestWithCachedResource: function(networkRequest, cachedResource)
- {
- networkRequest.type = WebInspector.resourceTypes[cachedResource.type];
- networkRequest.resourceSize = cachedResource.bodySize;
- this._updateNetworkRequestWithResponse(networkRequest, cachedResource.response);
- },
- _isNull: function(response)
- {
- if (!response)
- return true;
- return !response.status && !response.mimeType && (!response.headers || !Object.keys(response.headers).length);
- },
- requestWillBeSent: function(requestId, frameId, loaderId, documentURL, request, time, initiator, redirectResponse)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (networkRequest) {
- if (!redirectResponse)
- return;
- this.responseReceived(requestId, frameId, loaderId, time, "Other", redirectResponse);
- networkRequest = this._appendRedirect(requestId, time, request.url);
- } else
- networkRequest = this._createNetworkRequest(requestId, frameId, loaderId, request.url, documentURL, initiator);
- networkRequest.hasNetworkData = true;
- this._updateNetworkRequestWithRequest(networkRequest, request);
- networkRequest.startTime = time;
- this._startNetworkRequest(networkRequest);
- },
- requestServedFromCache: function(requestId)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.cached = true;
- },
- responseReceived: function(requestId, frameId, loaderId, time, resourceType, response)
- {
- if (this._isNull(response))
- return;
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest) {
- var eventData = {};
- eventData.url = response.url;
- eventData.frameId = frameId;
- eventData.loaderId = loaderId;
- eventData.resourceType = resourceType;
- eventData.mimeType = response.mimeType;
- this._manager.dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped, eventData);
- return;
- }
- networkRequest.responseReceivedTime = time;
- networkRequest.type = WebInspector.resourceTypes[resourceType];
- this._updateNetworkRequestWithResponse(networkRequest, response);
- this._updateNetworkRequest(networkRequest);
- },
- dataReceived: function(requestId, time, dataLength, encodedDataLength)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.resourceSize += dataLength;
- if (encodedDataLength != -1)
- networkRequest.increaseTransferSize(encodedDataLength);
- networkRequest.endTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- loadingFinished: function(requestId, finishTime)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- this._finishNetworkRequest(networkRequest, finishTime);
- },
- loadingFailed: function(requestId, time, localizedDescription, canceled)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.failed = true;
- networkRequest.canceled = canceled;
- networkRequest.localizedFailDescription = localizedDescription;
- this._finishNetworkRequest(networkRequest, time);
- },
- requestServedFromMemoryCache: function(requestId, frameId, loaderId, documentURL, time, initiator, cachedResource)
- {
- var networkRequest = this._createNetworkRequest(requestId, frameId, loaderId, cachedResource.url, documentURL, initiator);
- this._updateNetworkRequestWithCachedResource(networkRequest, cachedResource);
- networkRequest.cached = true;
- networkRequest.requestMethod = "GET";
- this._startNetworkRequest(networkRequest);
- networkRequest.startTime = networkRequest.responseReceivedTime = time;
- this._finishNetworkRequest(networkRequest, time);
- },
- webSocketCreated: function(requestId, requestURL)
- {
- var networkRequest = new WebInspector.NetworkRequest(requestId, requestURL, "", "", "");
- networkRequest.type = WebInspector.resourceTypes.WebSocket;
- this._startNetworkRequest(networkRequest);
- },
- webSocketWillSendHandshakeRequest: function(requestId, time, request)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.requestMethod = "GET";
- networkRequest.requestHeaders = this._headersMapToHeadersArray(request.headers);
- networkRequest.webSocketRequestKey3 = request.requestKey3;
- networkRequest.startTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- webSocketHandshakeResponseReceived: function(requestId, time, response)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.statusCode = response.status;
- networkRequest.statusText = response.statusText;
- networkRequest.responseHeaders = this._headersMapToHeadersArray(response.headers);
- networkRequest.webSocketChallengeResponse = response.challengeResponse;
- networkRequest.responseReceivedTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- webSocketFrameReceived: function(requestId, time, response)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.addFrame(response, time);
- networkRequest.responseReceivedTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- webSocketFrameSent: function(requestId, time, response)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.addFrame(response, time, true);
- networkRequest.responseReceivedTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- webSocketFrameError: function(requestId, time, errorMessage)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- networkRequest.addFrameError(errorMessage, time);
- networkRequest.responseReceivedTime = time;
- this._updateNetworkRequest(networkRequest);
- },
- webSocketClosed: function(requestId, time)
- {
- var networkRequest = this._inflightRequestsById[requestId];
- if (!networkRequest)
- return;
- this._finishNetworkRequest(networkRequest, time);
- },
- _appendRedirect: function(requestId, time, redirectURL)
- {
- var originalNetworkRequest = this._inflightRequestsById[requestId];
- var previousRedirects = originalNetworkRequest.redirects || [];
- originalNetworkRequest.requestId = "redirected:" + requestId + "." + previousRedirects.length;
- delete originalNetworkRequest.redirects;
- if (previousRedirects.length > 0)
- originalNetworkRequest.redirectSource = previousRedirects[previousRedirects.length - 1];
- this._finishNetworkRequest(originalNetworkRequest, time);
- var newNetworkRequest = this._createNetworkRequest(requestId, originalNetworkRequest.frameId, originalNetworkRequest.loaderId,
- redirectURL, originalNetworkRequest.documentURL, originalNetworkRequest.initiator);
- newNetworkRequest.redirects = previousRedirects.concat(originalNetworkRequest);
- return newNetworkRequest;
- },
- _startNetworkRequest: function(networkRequest)
- {
- this._inflightRequestsById[networkRequest.requestId] = networkRequest;
- this._inflightRequestsByURL[networkRequest.url] = networkRequest;
- this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestStarted, networkRequest);
- },
- _updateNetworkRequest: function(networkRequest)
- {
- this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestUpdated, networkRequest);
- },
- _finishNetworkRequest: function(networkRequest, finishTime)
- {
- networkRequest.endTime = finishTime;
- networkRequest.finished = true;
- this._dispatchEventToListeners(WebInspector.NetworkManager.EventTypes.RequestFinished, networkRequest);
- delete this._inflightRequestsById[networkRequest.requestId];
- delete this._inflightRequestsByURL[networkRequest.url];
- },
- _dispatchEventToListeners: function(eventType, networkRequest)
- {
- this._manager.dispatchEventToListeners(eventType, networkRequest);
- },
- _createNetworkRequest: function(requestId, frameId, loaderId, url, documentURL, initiator)
- {
- var networkRequest = new WebInspector.NetworkRequest(requestId, url, documentURL, frameId, loaderId);
- networkRequest.initiator = initiator;
- return networkRequest;
- }
- }
- WebInspector.networkManager = null;
- WebInspector.NavigatorOverlayController = function(panel, parentSplitView, navigatorView, editorView)
- {
- this._panel = panel;
- this._parentSplitView = parentSplitView;
- this._navigatorView = navigatorView;
- this._editorView = editorView;
- this._navigatorSidebarResizeWidgetElement = document.createElement("div");
- this._navigatorSidebarResizeWidgetElement.addStyleClass("scripts-navigator-resizer-widget");
- this._parentSplitView.installResizer(this._navigatorSidebarResizeWidgetElement);
- this._navigatorView.element.appendChild(this._navigatorSidebarResizeWidgetElement);
- this._navigatorShowHideButton = new WebInspector.StatusBarButton(WebInspector.UIString("Hide navigator"), "scripts-navigator-show-hide-button", 3);
- this._navigatorShowHideButton.state = "pinned";
- this._navigatorShowHideButton.addEventListener("click", this._toggleNavigator, this);
- this._editorView.element.appendChild(this._navigatorShowHideButton.element);
- WebInspector.settings.navigatorHidden = WebInspector.settings.createSetting("navigatorHidden", true);
- if (WebInspector.settings.navigatorHidden.get())
- this._toggleNavigator();
- }
- WebInspector.NavigatorOverlayController.prototype = {
- wasShown: function()
- {
- window.setTimeout(this._maybeShowNavigatorOverlay.bind(this), 0);
- },
- _escDownWhileNavigatorOverlayOpen: function(event)
- {
- this.hideNavigatorOverlay();
- },
- _maybeShowNavigatorOverlay: function()
- {
- if (WebInspector.settings.navigatorHidden.get() && !WebInspector.settings.navigatorWasOnceHidden.get())
- this.showNavigatorOverlay();
- },
- _toggleNavigator: function()
- {
- if (this._navigatorShowHideButton.state === "overlay")
- this._pinNavigator();
- else if (this._navigatorShowHideButton.state === "hidden")
- this.showNavigatorOverlay();
- else
- this._hidePinnedNavigator();
- },
- _hidePinnedNavigator: function()
- {
- this._navigatorShowHideButton.state = "hidden";
- this._navigatorShowHideButton.title = WebInspector.UIString("Show navigator");
- this._parentSplitView.element.appendChild(this._navigatorShowHideButton.element);
- this._editorView.element.addStyleClass("navigator-hidden");
- this._navigatorSidebarResizeWidgetElement.addStyleClass("hidden");
- this._parentSplitView.hideSidebarElement();
- this._navigatorView.detach();
- this._editorView.focus();
- WebInspector.settings.navigatorWasOnceHidden.set(true);
- WebInspector.settings.navigatorHidden.set(true);
- },
- _pinNavigator: function()
- {
- this._navigatorShowHideButton.state = "pinned";
- this._navigatorShowHideButton.title = WebInspector.UIString("Hide navigator");
- this._editorView.element.removeStyleClass("navigator-hidden");
- this._navigatorSidebarResizeWidgetElement.removeStyleClass("hidden");
- this._editorView.element.appendChild(this._navigatorShowHideButton.element);
- this._innerHideNavigatorOverlay();
- this._parentSplitView.showSidebarElement();
- this._navigatorView.show(this._parentSplitView.sidebarElement);
- this._navigatorView.focus();
- WebInspector.settings.navigatorHidden.set(false);
- },
- showNavigatorOverlay: function()
- {
- if (this._navigatorShowHideButton.state === "overlay")
- return;
- this._navigatorShowHideButton.state = "overlay";
- this._navigatorShowHideButton.title = WebInspector.UIString("Pin navigator");
- this._sidebarOverlay = new WebInspector.SidebarOverlay(this._navigatorView, "scriptsPanelNavigatorOverlayWidth", Preferences.minScriptsSidebarWidth);
- var navigatorOverlayResizeWidgetElement = document.createElement("div");
- navigatorOverlayResizeWidgetElement.addStyleClass("scripts-navigator-resizer-widget");
- this._sidebarOverlay.resizerWidgetElement = navigatorOverlayResizeWidgetElement;
- this._navigatorView.element.appendChild(this._navigatorShowHideButton.element);
- this._boundContainingElementFocused = this._containingElementFocused.bind(this);
- this._parentSplitView.element.addEventListener("mousedown", this._boundContainingElementFocused, false);
- this._panel.registerShortcut(WebInspector.KeyboardShortcut.Keys.Esc.code, this._escDownWhileNavigatorOverlayOpen.bind(this));
- this._sidebarOverlay.show(this._parentSplitView.element);
- this._navigatorView.focus();
- },
- hideNavigatorOverlay: function()
- {
- if (this._navigatorShowHideButton.state !== "overlay")
- return;
- this._navigatorShowHideButton.state = "hidden";
- this._navigatorShowHideButton.title = WebInspector.UIString("Show navigator");
- this._parentSplitView.element.appendChild(this._navigatorShowHideButton.element);
- this._innerHideNavigatorOverlay();
- this._editorView.focus();
- },
- _innerHideNavigatorOverlay: function()
- {
- this._parentSplitView.element.removeEventListener("mousedown", this._boundContainingElementFocused, false);
- this._panel.unregisterShortcut(WebInspector.KeyboardShortcut.Keys.Esc.code);
- this._sidebarOverlay.hide();
- },
- _containingElementFocused: function(event)
- {
- if (!event.target.isSelfOrDescendant(this._sidebarOverlay.element))
- this.hideNavigatorOverlay();
- },
- isNavigatorPinned: function()
- {
- return this._navigatorShowHideButton.state === "pinned";
- },
- isNavigatorHidden: function()
- {
- return this._navigatorShowHideButton.state === "hidden";
- }
- }
- WebInspector.NavigatorView = function()
- {
- WebInspector.View.call(this);
- this.registerRequiredCSS("navigatorView.css");
- this._treeSearchBoxElement = document.createElement("div");
- this._treeSearchBoxElement.className = "navigator-tree-search-box";
- this.element.appendChild(this._treeSearchBoxElement);
- var scriptsTreeElement = document.createElement("ol");
- this._scriptsTree = new WebInspector.NavigatorTreeOutline(this._treeSearchBoxElement, scriptsTreeElement);
- var scriptsOutlineElement = document.createElement("div");
- scriptsOutlineElement.addStyleClass("outline-disclosure");
- scriptsOutlineElement.addStyleClass("navigator");
- scriptsOutlineElement.appendChild(scriptsTreeElement);
- this.element.addStyleClass("fill");
- this.element.addStyleClass("navigator-container");
- this.element.appendChild(scriptsOutlineElement);
- this.setDefaultFocusedElement(this._scriptsTree.element);
- this._folderTreeElements = {};
- this._scriptTreeElementsByUISourceCode = new Map();
- WebInspector.settings.showScriptFolders.addChangeListener(this._showScriptFoldersSettingChanged.bind(this));
- }
- WebInspector.NavigatorView.Events = {
- ItemSelected: "ItemSelected",
- FileRenamed: "FileRenamed"
- }
- WebInspector.NavigatorView.prototype = {
- addUISourceCode: function(uiSourceCode)
- {
- if (this._scriptTreeElementsByUISourceCode.get(uiSourceCode))
- return;
- var scriptTreeElement = new WebInspector.NavigatorSourceTreeElement(this, uiSourceCode, "");
- this._scriptTreeElementsByUISourceCode.put(uiSourceCode, scriptTreeElement);
- this._updateScriptTitle(uiSourceCode);
- this._addUISourceCodeListeners(uiSourceCode);
- var folderTreeElement = this.getOrCreateFolderTreeElement(uiSourceCode);
- folderTreeElement.appendChild(scriptTreeElement);
- },
- _uiSourceCodeTitleChanged: function(event)
- {
- var uiSourceCode = event.target;
- this._updateScriptTitle(uiSourceCode)
- },
- _uiSourceCodeWorkingCopyChanged: function(event)
- {
- var uiSourceCode = event.target;
- this._updateScriptTitle(uiSourceCode)
- },
- _uiSourceCodeContentChanged: function(event)
- {
- var uiSourceCode = event.target;
- this._updateScriptTitle(uiSourceCode);
- },
- _updateScriptTitle: function(uiSourceCode, ignoreIsDirty)
- {
- var scriptTreeElement = this._scriptTreeElementsByUISourceCode.get(uiSourceCode);
- if (!scriptTreeElement)
- return;
- var titleText;
- if (uiSourceCode.parsedURL.isValid) {
- titleText = uiSourceCode.parsedURL.lastPathComponent;
- if (uiSourceCode.parsedURL.queryParams)
- titleText += "?" + uiSourceCode.parsedURL.queryParams;
- } else if (uiSourceCode.parsedURL)
- titleText = uiSourceCode.parsedURL.url;
- if (!titleText)
- titleText = WebInspector.UIString("(program)");
- if (!ignoreIsDirty && uiSourceCode.isDirty())
- titleText = "*" + titleText;
- scriptTreeElement.titleText = titleText;
- },
- isScriptSourceAdded: function(uiSourceCode)
- {
- var scriptTreeElement = this._scriptTreeElementsByUISourceCode.get(uiSourceCode);
- return !!scriptTreeElement;
- },
- revealUISourceCode: function(uiSourceCode)
- {
- if (this._scriptsTree.selectedTreeElement)
- this._scriptsTree.selectedTreeElement.deselect();
- this._lastSelectedUISourceCode = uiSourceCode;
- var scriptTreeElement = this._scriptTreeElementsByUISourceCode.get(uiSourceCode);
- scriptTreeElement.revealAndSelect(true);
- },
- replaceUISourceCode: function(oldUISourceCode, uiSourceCode)
- {
- var added = false;
- var selected = false;
- if (this._scriptTreeElementsByUISourceCode.get(oldUISourceCode)) {
- added = true;
- if (this._lastSelectedUISourceCode === oldUISourceCode)
- selected = true;
- this._removeUISourceCode(oldUISourceCode);
- }
- if (!added)
- return;
- this.addUISourceCode(uiSourceCode);
- if (selected)
- this.revealUISourceCode(uiSourceCode);
- },
- _scriptSelected: function(uiSourceCode, focusSource)
- {
- this._lastSelectedUISourceCode = uiSourceCode;
- var data = { uiSourceCode: uiSourceCode, focusSource: focusSource};
- this.dispatchEventToListeners(WebInspector.NavigatorView.Events.ItemSelected, data);
- },
- _removeUISourceCode: function(uiSourceCode)
- {
- var treeElement = this._scriptTreeElementsByUISourceCode.get(uiSourceCode);
- while (treeElement) {
- var parent = treeElement.parent;
- if (parent) {
- if (treeElement instanceof WebInspector.NavigatorFolderTreeElement)
- delete this._folderTreeElements[treeElement.folderIdentifier];
- parent.removeChild(treeElement);
- if (parent.children.length)
- break;
- }
- treeElement = parent;
- }
- this._scriptTreeElementsByUISourceCode.remove(uiSourceCode);
- this._removeUISourceCodeListeners(uiSourceCode);
- },
- _addUISourceCodeListeners: function(uiSourceCode)
- {
- uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.TitleChanged, this._uiSourceCodeTitleChanged, this);
- uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._uiSourceCodeWorkingCopyChanged, this);
- uiSourceCode.addEventListener(WebInspector.UISourceCode.Events.ContentChanged, this._uiSourceCodeContentChanged, this);
- },
- _removeUISourceCodeListeners: function(uiSourceCode)
- {
- uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.TitleChanged, this._uiSourceCodeTitleChanged, this);
- uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.WorkingCopyChanged, this._uiSourceCodeWorkingCopyChanged, this);
- uiSourceCode.removeEventListener(WebInspector.UISourceCode.Events.ContentChanged, this._uiSourceCodeContentChanged, this);
- },
- _showScriptFoldersSettingChanged: function()
- {
- var uiSourceCodes = this._scriptsTree.scriptTreeElements();
- this.reset();
- for (var i = 0; i < uiSourceCodes.length; ++i)
- this.addUISourceCode(uiSourceCodes[i]);
- if (this._lastSelectedUISourceCode)
- this.revealUISourceCode(this._lastSelectedUISourceCode);
- },
- _fileRenamed: function(uiSourceCode, newTitle)
- {
- var data = { uiSourceCode: uiSourceCode, name: newTitle };
- this.dispatchEventToListeners(WebInspector.NavigatorView.Events.FileRenamed, data);
- },
- rename: function(uiSourceCode, callback)
- {
- var scriptTreeElement = this._scriptTreeElementsByUISourceCode.get(uiSourceCode);
- if (!scriptTreeElement)
- return;
- WebInspector.markBeingEdited(scriptTreeElement.treeOutline.element, true);
- function commitHandler(element, newTitle, oldTitle)
- {
- if (newTitle && newTitle !== oldTitle)
- this._fileRenamed(uiSourceCode, newTitle);
- else
- this._updateScriptTitle(uiSourceCode);
- afterEditing(true);
- }
- function cancelHandler()
- {
- afterEditing(false);
- }
- function afterEditing(committed)
- {
- WebInspector.markBeingEdited(scriptTreeElement.treeOutline.element, false);
- if (callback)
- callback(committed);
- }
- var editingConfig = new WebInspector.EditingConfig(commitHandler.bind(this), cancelHandler.bind(this));
- this._updateScriptTitle(uiSourceCode, true);
- WebInspector.startEditing(scriptTreeElement.titleElement, editingConfig);
- window.getSelection().setBaseAndExtent(scriptTreeElement.titleElement, 0, scriptTreeElement.titleElement, 1);
- },
- reset: function()
- {
- var uiSourceCodes = this._scriptsTree.scriptTreeElements;
- for (var i = 0; i < uiSourceCodes.length; ++i)
- this._removeUISourceCodeListeners(uiSourceCodes[i]);
- this._scriptsTree.stopSearch();
- this._scriptsTree.removeChildren();
- this._folderTreeElements = {};
- this._scriptTreeElementsByUISourceCode.clear();
- },
- createFolderTreeElement: function(parentFolderElement, folderIdentifier, domain, folderName)
- {
- var folderTreeElement = new WebInspector.NavigatorFolderTreeElement(folderIdentifier, domain, folderName);
- parentFolderElement.appendChild(folderTreeElement);
- this._folderTreeElements[folderIdentifier] = folderTreeElement;
- return folderTreeElement;
- },
- getOrCreateFolderTreeElement: function(uiSourceCode)
- {
- return this._getOrCreateFolderTreeElement(uiSourceCode.parsedURL.host, uiSourceCode.parsedURL.folderPathComponents);
- },
- _getOrCreateFolderTreeElement: function(domain, folderName)
- {
- var folderIdentifier = domain + "/" + folderName;
- if (this._folderTreeElements[folderIdentifier])
- return this._folderTreeElements[folderIdentifier];
- var showScriptFolders = WebInspector.settings.showScriptFolders.get();
- if ((!domain && !folderName) || !showScriptFolders)
- return this._scriptsTree;
- var parentFolderElement;
- if (!folderName)
- parentFolderElement = this._scriptsTree;
- else
- parentFolderElement = this._getOrCreateFolderTreeElement(domain, "");
- return this.createFolderTreeElement(parentFolderElement, folderIdentifier, domain, folderName);
- },
- handleContextMenu: function(event, uiSourceCode)
- {
- }
- }
- WebInspector.NavigatorView.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.NavigatorTreeOutline = function(treeSearchBoxElement, element)
- {
- TreeOutline.call(this, element);
- this.element = element;
- this._treeSearchBoxElement = treeSearchBoxElement;
- this.comparator = WebInspector.NavigatorTreeOutline._treeElementsCompare;
- this.searchable = true;
- this.searchInputElement = document.createElement("input");
- }
- WebInspector.NavigatorTreeOutline._treeElementsCompare = function compare(treeElement1, treeElement2)
- {
- function typeWeight(treeElement)
- {
- if (treeElement instanceof WebInspector.NavigatorFolderTreeElement) {
- if (treeElement.isDomain)
- return 1;
- return 2;
- }
- return 3;
- }
- var typeWeight1 = typeWeight(treeElement1);
- var typeWeight2 = typeWeight(treeElement2);
- var result;
- if (typeWeight1 > typeWeight2)
- result = 1;
- else if (typeWeight1 < typeWeight2)
- result = -1;
- else {
- var title1 = treeElement1.titleText;
- var title2 = treeElement2.titleText;
- result = title1.localeCompare(title2);
- }
- return result;
- }
- WebInspector.NavigatorTreeOutline.prototype = {
- scriptTreeElements: function()
- {
- var result = [];
- if (this.children.length) {
- for (var treeElement = this.children[0]; treeElement; treeElement = treeElement.traverseNextTreeElement(false, this, true)) {
- if (treeElement instanceof WebInspector.NavigatorSourceTreeElement)
- result.push(treeElement.uiSourceCode);
- }
- }
- return result;
- },
- searchStarted: function()
- {
- this._treeSearchBoxElement.appendChild(this.searchInputElement);
- this._treeSearchBoxElement.addStyleClass("visible");
- },
- searchFinished: function()
- {
- this._treeSearchBoxElement.removeChild(this.searchInputElement);
- this._treeSearchBoxElement.removeStyleClass("visible");
- }
- }
- WebInspector.NavigatorTreeOutline.prototype.__proto__ = TreeOutline.prototype;
- WebInspector.BaseNavigatorTreeElement = function(title, iconClasses, hasChildren, noIcon)
- {
- TreeElement.call(this, "", null, hasChildren);
- this._titleText = title;
- this._iconClasses = iconClasses;
- this._noIcon = noIcon;
- }
- WebInspector.BaseNavigatorTreeElement.prototype = {
- onattach: function()
- {
- this.listItemElement.removeChildren();
- if (this._iconClasses) {
- for (var i = 0; i < this._iconClasses.length; ++i)
- this.listItemElement.addStyleClass(this._iconClasses[i]);
- }
- var selectionElement = document.createElement("div");
- selectionElement.className = "selection";
- this.listItemElement.appendChild(selectionElement);
- if (!this._noIcon) {
- this.imageElement = document.createElement("img");
- this.imageElement.className = "icon";
- this.listItemElement.appendChild(this.imageElement);
- }
- this.titleElement = document.createElement("div");
- this.titleElement.className = "base-navigator-tree-element-title";
- this._titleTextNode = document.createTextNode("");
- this._titleTextNode.textContent = this._titleText;
- this.titleElement.appendChild(this._titleTextNode);
- this.listItemElement.appendChild(this.titleElement);
- this.expand();
- },
- onreveal: function()
- {
- if (this.listItemElement)
- this.listItemElement.scrollIntoViewIfNeeded(true);
- },
- get titleText()
- {
- return this._titleText;
- },
- set titleText(titleText)
- {
- this._titleText = titleText || "";
- if (this.titleElement)
- this.titleElement.textContent = this._titleText;
- },
- matchesSearchText: function(searchText)
- {
- return this.titleText.match(new RegExp("^" + searchText.escapeForRegExp(), "i"));
- }
- }
- WebInspector.BaseNavigatorTreeElement.prototype.__proto__ = TreeElement.prototype;
- WebInspector.NavigatorFolderTreeElement = function(folderIdentifier, domain, folderName)
- {
- this._folderIdentifier = folderIdentifier;
- this._folderName = folderName;
- var iconClass = this.isDomain ? "navigator-domain-tree-item" : "navigator-folder-tree-item";
- var title = this.isDomain ? domain : folderName.substring(1);
- WebInspector.BaseNavigatorTreeElement.call(this, title, [iconClass], true);
- this.tooltip = folderName;
- }
- WebInspector.NavigatorFolderTreeElement.prototype = {
- get folderIdentifier()
- {
- return this._folderIdentifier;
- },
- get isDomain()
- {
- return this._folderName === "";
- },
- onattach: function()
- {
- WebInspector.BaseNavigatorTreeElement.prototype.onattach.call(this);
- if (this._isDomain)
- this.collapse();
- else
- this.expand();
- }
- }
- WebInspector.NavigatorFolderTreeElement.prototype.__proto__ = WebInspector.BaseNavigatorTreeElement.prototype;
- WebInspector.NavigatorSourceTreeElement = function(navigatorView, uiSourceCode, title)
- {
- WebInspector.BaseNavigatorTreeElement.call(this, title, ["navigator-" + uiSourceCode.contentType().name() + "-tree-item"], false);
- this._navigatorView = navigatorView;
- this._uiSourceCode = uiSourceCode;
- this.tooltip = uiSourceCode.url;
- }
- WebInspector.NavigatorSourceTreeElement.prototype = {
- get uiSourceCode()
- {
- return this._uiSourceCode;
- },
- onattach: function()
- {
- WebInspector.BaseNavigatorTreeElement.prototype.onattach.call(this);
- this.listItemElement.addEventListener("click", this._onclick.bind(this), false);
- this.listItemElement.addEventListener("contextmenu", this._handleContextMenuEvent.bind(this), false);
- },
- onspace: function()
- {
- this._navigatorView._scriptSelected(this.uiSourceCode, true);
- return true;
- },
- _onclick: function(event)
- {
- this._navigatorView._scriptSelected(this.uiSourceCode, false);
- },
- ondblclick: function()
- {
- this._navigatorView._scriptSelected(this.uiSourceCode, true);
- },
- onenter: function()
- {
- this._navigatorView._scriptSelected(this.uiSourceCode, true);
- return true;
- },
- _handleContextMenuEvent: function(event)
- {
- this._navigatorView.handleContextMenu(event, this._uiSourceCode);
- }
- }
- WebInspector.NavigatorSourceTreeElement.prototype.__proto__ = WebInspector.BaseNavigatorTreeElement.prototype;
- WebInspector.NetworkLog = function()
- {
- this._requests = [];
- WebInspector.networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestStarted, this._onRequestStarted, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, this._onMainFrameNavigated, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.OnLoad, this._onLoad, this);
- WebInspector.resourceTreeModel.addEventListener(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, this._onDOMContentLoaded, this);
- }
- WebInspector.NetworkLog.prototype = {
- get requests()
- {
- return this._requests;
- },
- pageLoadForRequest: function(request)
- {
- return request.__page;
- },
- _onMainFrameNavigated: function(event)
- {
- var mainFrame = event.data;
- this._currentPageLoad = null;
- var oldRequests = this._requests.splice(0, this._requests.length);
- for (var i = 0; i < oldRequests.length; ++i) {
- var request = oldRequests[i];
- if (request.loaderId === mainFrame.loaderId) {
- if (!this._currentPageLoad)
- this._currentPageLoad = new WebInspector.PageLoad(request);
- this._requests.push(request);
- request.__page = this._currentPageLoad;
- }
- }
- },
- _onRequestStarted: function(event)
- {
- var request = event.data;
- this._requests.push(request);
- request.__page = this._currentPageLoad;
- },
- _onDOMContentLoaded: function(event)
- {
- if (this._currentPageLoad)
- this._currentPageLoad.contentLoadTime = event.data;
- },
- _onLoad: function(event)
- {
- if (this._currentPageLoad)
- this._currentPageLoad.loadTime = event.data;
- }
- }
- WebInspector.networkLog = null;
- WebInspector.PageLoad = function(mainRequest)
- {
- this.id = ++WebInspector.PageLoad._lastIdentifier;
- this.url = mainRequest.url;
- this.startTime = mainRequest.startTime;
- }
- WebInspector.PageLoad._lastIdentifier = 0;
- WebInspector.ResourceTreeModel = function(networkManager)
- {
- networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.ResourceTrackingEnabled, this._onResourceTrackingEnabled, this);
- networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdated, this._onRequestUpdated, this);
- networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestFinished, this._onRequestUpdated, this);
- networkManager.addEventListener(WebInspector.NetworkManager.EventTypes.RequestUpdateDropped, this._onRequestUpdateDropped, this);
- WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.MessageAdded, this._consoleMessageAdded, this);
- WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.RepeatCountUpdated, this._consoleMessageAdded, this);
- WebInspector.console.addEventListener(WebInspector.ConsoleModel.Events.ConsoleCleared, this._consoleCleared, this);
- PageAgent.enable();
- NetworkAgent.enable();
- this._fetchResourceTree();
- InspectorBackend.registerPageDispatcher(new WebInspector.PageDispatcher(this));
- this._pendingConsoleMessages = {};
- }
- WebInspector.ResourceTreeModel.EventTypes = {
- FrameAdded: "FrameAdded",
- FrameNavigated: "FrameNavigated",
- FrameDetached: "FrameDetached",
- MainFrameNavigated: "MainFrameNavigated",
- ResourceAdded: "ResourceAdded",
- ResourceContentCommitted: "resource-content-committed",
- WillLoadCachedResources: "WillLoadCachedResources",
- CachedResourcesLoaded: "CachedResourcesLoaded",
- DOMContentLoaded: "DOMContentLoaded",
- OnLoad: "OnLoad",
- InspectedURLChanged: "InspectedURLChanged"
- }
- WebInspector.ResourceTreeModel.prototype = {
- _onResourceTrackingEnabled: function()
- {
- this._fetchResourceTree();
- },
- _fetchResourceTree: function()
- {
- this._frames = {};
- delete this._cachedResourcesProcessed;
- PageAgent.getResourceTree(this._processCachedResources.bind(this));
- },
- _processCachedResources: function(error, mainFramePayload)
- {
- if (error) {
- console.error(JSON.stringify(error));
- return;
- }
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.WillLoadCachedResources);
- WebInspector.inspectedPageURL = mainFramePayload.frame.url;
- this._addFramesRecursively(null, mainFramePayload);
- this._dispatchInspectedURLChanged();
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.CachedResourcesLoaded);
- WebInspector.Resource.restoreRevisions();
- this._cachedResourcesProcessed = true;
- },
- _dispatchInspectedURLChanged: function()
- {
- InspectorFrontendHost.inspectedURLChanged(WebInspector.inspectedPageURL);
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.InspectedURLChanged, WebInspector.inspectedPageURL);
- },
- _addFrame: function(frame)
- {
- this._frames[frame.id] = frame;
- if (frame.isMainFrame())
- this.mainFrame = frame;
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameAdded, frame);
- },
- _frameNavigated: function(framePayload)
- {
- if (this._frontendReused(framePayload))
- return;
- if (!this._cachedResourcesProcessed)
- return;
- var frame = this._frames[framePayload.id];
- if (frame) {
- frame._navigate(framePayload);
- } else {
- var parentFrame = this._frames[framePayload.parentId];
- frame = new WebInspector.ResourceTreeFrame(this, parentFrame, framePayload);
- if (frame.isMainFrame() && this.mainFrame) {
- this._frameDetached(this.mainFrame.id);
- }
- this._addFrame(frame);
- }
- if (frame.isMainFrame())
- WebInspector.inspectedPageURL = frame.url;
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameNavigated, frame);
- if (frame.isMainFrame())
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.MainFrameNavigated, frame);
- var resources = frame.resources();
- for (var i = 0; i < resources.length; ++i)
- this.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resources[i]);
- if (frame.isMainFrame())
- this._dispatchInspectedURLChanged();
- },
- _frontendReused: function(framePayload)
- {
- if (!framePayload.parentId && !WebInspector.networkLog.requests.length) {
- this._fetchResourceTree();
- return true;
- }
- return false;
- },
- _frameDetached: function(frameId)
- {
- if (!this._cachedResourcesProcessed)
- return;
- var frame = this._frames[frameId];
- if (!frame)
- return;
- if (frame.parentFrame)
- frame.parentFrame._removeChildFrame(frame);
- else
- frame._remove();
- },
- _onRequestUpdated: function(event)
- {
- if (!this._cachedResourcesProcessed)
- return;
- var request = event.data;
- if (request.failed || request.type === WebInspector.resourceTypes.XHR)
- return;
- var frame = this._frames[request.frameId];
- if (frame) {
- var resource = frame._addRequest(request);
- this._addPendingConsoleMessagesToResource(resource);
- }
- },
- _onRequestUpdateDropped: function(event)
- {
- if (!this._cachedResourcesProcessed)
- return;
- var frameId = event.data.frameId;
- var frame = this._frames[frameId];
- if (!frame)
- return;
- var url = event.data.url;
- if (frame._resourcesMap[url])
- return;
- var resource = new WebInspector.Resource(null, url, frame.url, frameId, event.data.loaderId, WebInspector.resourceTypes[event.data.resourceType], event.data.mimeType);
- frame._addResource(resource);
- },
- frameForId: function(frameId)
- {
- return this._frames[frameId];
- },
- forAllResources: function(callback)
- {
- if (this.mainFrame)
- return this.mainFrame._callForFrameResources(callback);
- return false;
- },
- _consoleMessageAdded: function(event)
- {
- var msg = event.data;
- var resource = msg.url ? this.resourceForURL(msg.url) : null;
- if (resource)
- this._addConsoleMessageToResource(msg, resource);
- else
- this._addPendingConsoleMessage(msg);
- },
- _addPendingConsoleMessage: function(msg)
- {
- if (!msg.url)
- return;
- if (!this._pendingConsoleMessages[msg.url])
- this._pendingConsoleMessages[msg.url] = [];
- this._pendingConsoleMessages[msg.url].push(msg);
- },
- _addPendingConsoleMessagesToResource: function(resource)
- {
- var messages = this._pendingConsoleMessages[resource.url];
- if (messages) {
- for (var i = 0; i < messages.length; i++)
- this._addConsoleMessageToResource(messages[i], resource);
- delete this._pendingConsoleMessages[resource.url];
- }
- },
- _addConsoleMessageToResource: function(msg, resource)
- {
- switch (msg.level) {
- case WebInspector.ConsoleMessage.MessageLevel.Warning:
- resource.warnings += msg.repeatDelta;
- break;
- case WebInspector.ConsoleMessage.MessageLevel.Error:
- resource.errors += msg.repeatDelta;
- break;
- }
- resource.addMessage(msg);
- },
- _consoleCleared: function()
- {
- function callback(resource)
- {
- resource.clearErrorsAndWarnings();
- }
- this._pendingConsoleMessages = {};
- this.forAllResources(callback);
- },
- resourceForURL: function(url)
- {
- return this.mainFrame ? this.mainFrame.resourceForURL(url) : null;
- },
- _addFramesRecursively: function(parentFrame, frameTreePayload)
- {
- var framePayload = frameTreePayload.frame;
- var frame = new WebInspector.ResourceTreeFrame(this, parentFrame, framePayload);
- var frameResource = this._createResourceFromFramePayload(framePayload, framePayload.url, WebInspector.resourceTypes.Document, framePayload.mimeType);
- if (frame.isMainFrame())
- WebInspector.inspectedPageURL = frameResource.url;
- this._addFrame(frame);
- frame._addResource(frameResource);
- for (var i = 0; frameTreePayload.childFrames && i < frameTreePayload.childFrames.length; ++i)
- this._addFramesRecursively(frame, frameTreePayload.childFrames[i]);
- if (!frameTreePayload.resources)
- return;
- for (var i = 0; i < frameTreePayload.resources.length; ++i) {
- var subresource = frameTreePayload.resources[i];
- var resource = this._createResourceFromFramePayload(framePayload, subresource.url, WebInspector.resourceTypes[subresource.type], subresource.mimeType);
- frame._addResource(resource);
- }
- },
- _createResourceFromFramePayload: function(frame, url, type, mimeType)
- {
- return new WebInspector.Resource(null, url, frame.url, frame.id, frame.loaderId, type, mimeType);
- }
- }
- WebInspector.ResourceTreeModel.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.ResourceTreeFrame = function(model, parentFrame, payload)
- {
- this._model = model;
- this._parentFrame = parentFrame;
- this._id = payload.id;
- this._loaderId = payload.loaderId;
- this._name = payload.name;
- this._url = payload.url;
- this._securityOrigin = payload.securityOrigin || "";
- this._mimeType = payload.mimeType;
- this._childFrames = [];
- this._resourcesMap = {};
- if (this._parentFrame)
- this._parentFrame._childFrames.push(this);
- }
- WebInspector.ResourceTreeFrame.prototype = {
- get id()
- {
- return this._id;
- },
- get name()
- {
- return this._name || "";
- },
- get url()
- {
- return this._url;
- },
- get securityOrigin()
- {
- return this._securityOrigin;
- },
- get loaderId()
- {
- return this._loaderId;
- },
- get parentFrame()
- {
- return this._parentFrame;
- },
- get childFrames()
- {
- return this._childFrames;
- },
- isMainFrame: function()
- {
- return !this._parentFrame;
- },
- _navigate: function(framePayload)
- {
- this._loaderId = framePayload.loaderId;
- this._name = framePayload.name;
- this._url = framePayload.url;
- this._securityOrigin = framePayload.securityOrigin || "";
- this._mimeType = framePayload.mimeType;
- var mainResource = this._resourcesMap[this._url];
- this._resourcesMap = {};
- this._removeChildFrames();
- if (mainResource && mainResource.loaderId === this._loaderId)
- this._addResource(mainResource);
- },
- get mainResource()
- {
- return this._resourcesMap[this._url];
- },
- _removeChildFrame: function(frame)
- {
- this._childFrames.remove(frame);
- frame._remove();
- },
- _removeChildFrames: function()
- {
- var copy = this._childFrames.slice();
- for (var i = 0; i < copy.length; ++i)
- this._removeChildFrame(copy[i]);
- },
- _remove: function()
- {
- this._removeChildFrames();
- delete this._model._frames[this.id];
- this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.FrameDetached, this);
- },
- _addResource: function(resource)
- {
- if (this._resourcesMap[resource.url] === resource) {
- return;
- }
- this._resourcesMap[resource.url] = resource;
- this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resource);
- },
- _addRequest: function(request)
- {
- var resource = this._resourcesMap[request.url];
- if (resource && resource.request === request) {
- return resource;
- }
- resource = new WebInspector.Resource(request, request.url, request.documentURL, request.frameId, request.loaderId, request.type, request.mimeType);
- this._resourcesMap[resource.url] = resource;
- this._model.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.ResourceAdded, resource);
- return resource;
- },
- resources: function()
- {
- var result = [];
- for (var url in this._resourcesMap)
- result.push(this._resourcesMap[url]);
- return result;
- },
- resourceForURL: function(url)
- {
- var result;
- function filter(resource)
- {
- if (resource.url === url) {
- result = resource;
- return true;
- }
- }
- this._callForFrameResources(filter);
- return result;
- },
- _callForFrameResources: function(callback)
- {
- for (var url in this._resourcesMap) {
- if (callback(this._resourcesMap[url]))
- return true;
- }
- for (var i = 0; i < this._childFrames.length; ++i) {
- if (this._childFrames[i]._callForFrameResources(callback))
- return true;
- }
- return false;
- }
- }
- WebInspector.PageDispatcher = function(resourceTreeModel)
- {
- this._resourceTreeModel = resourceTreeModel;
- }
- WebInspector.PageDispatcher.prototype = {
- domContentEventFired: function(time)
- {
- this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.DOMContentLoaded, time);
- },
- loadEventFired: function(time)
- {
- this._resourceTreeModel.dispatchEventToListeners(WebInspector.ResourceTreeModel.EventTypes.OnLoad, time);
- },
- frameNavigated: function(frame)
- {
- this._resourceTreeModel._frameNavigated(frame);
- },
- frameDetached: function(frameId)
- {
- this._resourceTreeModel._frameDetached(frameId);
- }
- }
- WebInspector.resourceTreeModel = null;
- WebInspector.ParsedURL = function(url)
- {
- this.isValid = false;
- this.url = url;
- this.scheme = "";
- this.host = "";
- this.port = "";
- this.path = "";
- this.queryParams = "";
- this.fragment = "";
- this.folderPathComponents = "";
- this.lastPathComponent = "";
- var match = url.match(/^([^:]+):\/\/([^\/:]*)(?::([\d]+))?(?:(\/[^#]*)(?:#(.*))?)?$/i);
- if (match) {
- this.isValid = true;
- this.scheme = match[1].toLowerCase();
- this.host = match[2];
- this.port = match[3];
- this.path = match[4] || "/";
- this.fragment = match[5];
- } else {
- if (this.url.startsWith("data:")) {
- this.scheme = "data";
- return;
- }
- if (this.url === "about:blank") {
- this.scheme = "about";
- return;
- }
- this.path = this.url;
- }
- if (this.path) {
- var path = this.path;
- var indexOfQuery = path.indexOf("?");
- if (indexOfQuery !== -1) {
- this.queryParams = path.substring(indexOfQuery + 1)
- path = path.substring(0, indexOfQuery);
- }
- var lastSlashIndex = path.lastIndexOf("/");
- if (lastSlashIndex !== -1) {
- this.folderPathComponents = path.substring(0, lastSlashIndex);
- this.lastPathComponent = path.substring(lastSlashIndex + 1);
- } else
- this.lastPathComponent = path;
- }
- }
- WebInspector.ParsedURL.prototype = {
- get displayName()
- {
- if (this._displayName)
- return this._displayName;
- if (this.scheme === "data") {
- this._displayName = this.url.trimEnd(20);
- return this._displayName;
- }
- if (this.url === "about:blank")
- return this.url;
- this._displayName = this.lastPathComponent;
- if (!this._displayName)
- this._displayName = WebInspector.displayDomain(this.host);
- if (!this._displayName && this.url)
- this._displayName = this.url.trimURL(WebInspector.inspectedPageDomain ? WebInspector.inspectedPageDomain : "");
- if (this._displayName === "/")
- this._displayName = this.url;
- return this._displayName;
- }
- }
- String.prototype.asParsedURL = function()
- {
- var parsedURL = new WebInspector.ParsedURL(this.toString());
- if (parsedURL.isValid)
- return parsedURL;
- return null;
- }
- WebInspector.resourceForURL = function(url)
- {
- return WebInspector.resourceTreeModel.resourceForURL(url);
- }
- WebInspector.forAllResources = function(callback)
- {
- WebInspector.resourceTreeModel.forAllResources(callback);
- }
- WebInspector.displayDomain = function(host)
- {
- if (host && (!WebInspector.inspectedPageDomain || (WebInspector.inspectedPageDomain && host !== WebInspector.inspectedPageDomain)))
- return host;
- return "";
- }
- WebInspector.displayNameForURL = function(url)
- {
- if (!url)
- return "";
- var resource = WebInspector.resourceForURL(url);
- if (resource)
- return resource.displayName;
- if (!WebInspector.inspectedPageURL)
- return url.trimURL("");
- var parsedURL = WebInspector.inspectedPageURL.asParsedURL();
- var lastPathComponent = parsedURL.lastPathComponent;
- var index = WebInspector.inspectedPageURL.indexOf(lastPathComponent);
- if (index !== -1 && index + lastPathComponent.length === WebInspector.inspectedPageURL.length) {
- var baseURL = WebInspector.inspectedPageURL.substring(0, index);
- if (url.startsWith(baseURL))
- return url.substring(index);
- }
- return url.trimURL(parsedURL.host);
- }
- WebInspector.linkifyStringAsFragmentWithCustomLinkifier = function(string, linkifier)
- {
- var container = document.createDocumentFragment();
- var linkStringRegEx = /(?:[a-zA-Z][a-zA-Z0-9+.-]{2,}:\/\/|www\.)[\w$\-_+*'=\|\/\\(){}[\]%@&#~,:;.!?]{2,}[\w$\-_+*=\|\/\\({%@&#~]/;
- var lineColumnRegEx = /:(\d+)(:(\d+))?$/;
- while (string) {
- var linkString = linkStringRegEx.exec(string);
- if (!linkString)
- break;
- linkString = linkString[0];
- var linkIndex = string.indexOf(linkString);
- var nonLink = string.substring(0, linkIndex);
- container.appendChild(document.createTextNode(nonLink));
- var title = linkString;
- var realURL = (linkString.startsWith("www.") ? "http://" + linkString : linkString);
- var lineColumnMatch = lineColumnRegEx.exec(realURL);
- if (lineColumnMatch)
- realURL = realURL.substring(0, realURL.length - lineColumnMatch[0].length);
- var linkNode = linkifier(title, realURL, lineColumnMatch ? lineColumnMatch[1] : undefined);
- container.appendChild(linkNode);
- string = string.substring(linkIndex + linkString.length, string.length);
- }
- if (string)
- container.appendChild(document.createTextNode(string));
- return container;
- }
- WebInspector._linkifierPlugins = [];
- /**
- * @param {function(string):string} plugin
- */
- WebInspector.registerLinkifierPlugin = function(plugin)
- {
- WebInspector._linkifierPlugins.push(plugin);
- }
- /**
- * @param {string} string
- * @return {DocumentFragment}
- */
- WebInspector.linkifyStringAsFragment = function(string)
- {
- /**
- * @param {string} title
- * @param {string} url
- * @param {string=} lineNumber
- * @return {Node}
- */
- function linkifier(title, url, lineNumber)
- {
- for (var i = 0; i < WebInspector._linkifierPlugins.length; ++i)
- title = WebInspector._linkifierPlugins[i](title);
- var isExternal = !WebInspector.resourceForURL(url);
- var urlNode = WebInspector.linkifyURLAsNode(url, title, undefined, isExternal);
- if (typeof(lineNumber) !== "undefined") {
- urlNode.lineNumber = lineNumber;
- urlNode.preferredPanel = "scripts";
- }
-
- return urlNode;
- }
-
- return WebInspector.linkifyStringAsFragmentWithCustomLinkifier(string, linkifier);
- }
- /**
- * @param {string} url
- * @param {string=} linkText
- * @param {string=} classes
- * @param {boolean=} isExternal
- * @param {string=} tooltipText
- * @return {Element}
- */
- WebInspector.linkifyURLAsNode = function(url, linkText, classes, isExternal, tooltipText)
- {
- if (!linkText)
- linkText = url;
- classes = (classes ? classes + " " : "");
- classes += isExternal ? "webkit-html-external-link" : "webkit-html-resource-link";
- var a = document.createElement("a");
- a.href = url;
- a.className = classes;
- if (typeof tooltipText === "undefined")
- a.title = url;
- else if (typeof tooltipText !== "string" || tooltipText.length)
- a.title = tooltipText;
- a.textContent = linkText;
- a.style.maxWidth = "100%";
- if (isExternal)
- a.setAttribute("target", "_blank");
- return a;
- }
- /**
- * @param {string} url
- * @param {number=} lineNumber
- * @return {string}
- */
- WebInspector.formatLinkText = function(url, lineNumber)
- {
- var text = WebInspector.displayNameForURL(url);
- if (typeof lineNumber === "number")
- text += ":" + (lineNumber + 1);
- return text;
- }
- /**
- * @param {string} url
- * @param {number=} lineNumber
- * @param {string=} classes
- * @param {string=} tooltipText
- * @return {Element}
- */
- WebInspector.linkifyResourceAsNode = function(url, lineNumber, classes, tooltipText)
- {
- var linkText = WebInspector.formatLinkText(url, lineNumber);
- var anchor = WebInspector.linkifyURLAsNode(url, linkText, classes, false, tooltipText);
- anchor.preferredPanel = "resources";
- anchor.lineNumber = lineNumber;
- return anchor;
- }
- /**
- * @param {WebInspector.NetworkRequest} request
- * @param {string=} classes
- * @return {Element}
- */
- WebInspector.linkifyRequestAsNode = function(request, classes)
- {
- var anchor = WebInspector.linkifyURLAsNode(request.url);
- anchor.preferredPanel = "network";
- anchor.requestId = request.requestId;
- return anchor;
- }
- /**
- * @return {?string} null if the specified resource MUST NOT have a URL (e.g. "javascript:...")
- */
- WebInspector.resourceURLForRelatedNode = function(node, url)
- {
- if (!url || url.indexOf("://") > 0)
- return url;
- if (url.trim().startsWith("javascript:"))
- return null; // Do not provide a resource URL for security.
- for (var frameOwnerCandidate = node; frameOwnerCandidate; frameOwnerCandidate = frameOwnerCandidate.parentNode) {
- if (frameOwnerCandidate.documentURL) {
- var result = WebInspector.completeURL(frameOwnerCandidate.documentURL, url);
- if (result)
- return result;
- break;
- }
- }
- // documentURL not found or has bad value
- var resourceURL = url;
- function callback(resource)
- {
- if (resource.parsedURL.path === url) {
- resourceURL = resource.url;
- return true;
- }
- }
- WebInspector.forAllResources(callback);
- return resourceURL;
- }
- /**
- * @param {string} baseURL
- * @param {string} href
- * @return {?string}
- */
- WebInspector.completeURL = function(baseURL, href)
- {
- if (href) {
- // Return absolute URLs as-is.
- var parsedHref = href.asParsedURL();
- if (parsedHref && parsedHref.scheme)
- return href;
- // Return special URLs as-is.
- var trimmedHref = href.trim();
- if (trimmedHref.startsWith("data:") || trimmedHref.startsWith("javascript:"))
- return href;
- }
- var parsedURL = baseURL.asParsedURL();
- if (parsedURL) {
- var path = href;
- if (path.charAt(0) !== "/") {
- var basePath = parsedURL.path;
- // Trim off the query part of the basePath.
- var questionMarkIndex = basePath.indexOf("?");
- if (questionMarkIndex > 0)
- basePath = basePath.substring(0, questionMarkIndex);
- // A href of "?foo=bar" implies "basePath?foo=bar".
- // With "basePath?a=b" and "?foo=bar" we should get "basePath?foo=bar".
- var prefix;
- if (path.charAt(0) === "?") {
- var basePathCutIndex = basePath.indexOf("?");
- if (basePathCutIndex !== -1)
- prefix = basePath.substring(0, basePathCutIndex);
- else
- prefix = basePath;
- } else
- prefix = basePath.substring(0, basePath.lastIndexOf("/")) + "/";
- path = prefix + path;
- } else if (path.length > 1 && path.charAt(1) === "/") {
- // href starts with "//" which is a full URL with the protocol dropped (use the baseURL protocol).
- return parsedURL.scheme + ":" + path;
- }
- return parsedURL.scheme + "://" + parsedURL.host + (parsedURL.port ? (":" + parsedURL.port) : "") + path;
- }
- return null;
- }
- /* ResourceType.js */
- /*
- * Copyright (C) 2012 Google Inc. All rights reserved.
- * Copyright (C) 2007, 2008 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 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.
- */
- /**
- * @constructor
- * @param {string} name
- * @param {string} title
- * @param {string} categoryTitle
- * @param {string} color
- * @param {boolean} isTextType
- */
- WebInspector.ResourceType = function(name, title, categoryTitle, color, isTextType)
- {
- this._name = name;
- this._title = title;
- this._categoryTitle = categoryTitle;
- this._color = color;
- this._isTextType = isTextType;
- }
- WebInspector.ResourceType.prototype = {
- /**
- * @return {string}
- */
- name: function()
- {
- return this._name;
- },
- /**
- * @return {string}
- */
- title: function()
- {
- return this._title;
- },
- /**
- * @return {string}
- */
- categoryTitle: function()
- {
- return this._categoryTitle;
- },
- /**
- * @return {string}
- */
- color: function()
- {
- return this._color;
- },
- /**
- * @return {boolean}
- */
- isTextType: function()
- {
- return this._isTextType;
- },
- /**
- * @return {string}
- */
- toString: function()
- {
- return this._name;
- },
- /**
- * @return {string}
- */
- canonicalMimeType: function()
- {
- if (this === WebInspector.resourceTypes.Document)
- return "text/html";
- if (this === WebInspector.resourceTypes.Script)
- return "text/javascript";
- if (this === WebInspector.resourceTypes.Stylesheet)
- return "text/css";
- return "";
- }
- }
- //Keep these in sync with WebCore::InspectorPageAgent::resourceTypeJson
- WebInspector.resourceTypes = {
- Document: new WebInspector.ResourceType("document", "Document", "Documents", "rgb(47,102,236)", true),
- Stylesheet: new WebInspector.ResourceType("stylesheet", "Stylesheet", "Stylesheets", "rgb(157,231,119)", true),
- Image: new WebInspector.ResourceType("image", "Image", "Images", "rgb(164,60,255)", false),
- Script: new WebInspector.ResourceType("script", "Script", "Scripts", "rgb(255,121,0)", true),
- XHR: new WebInspector.ResourceType("xhr", "XHR", "XHR", "rgb(231,231,10)", true),
- Font: new WebInspector.ResourceType("font", "Font", "Fonts", "rgb(255,82,62)", false),
- WebSocket: new WebInspector.ResourceType("websocket", "WebSocket", "WebSockets", "rgb(186,186,186)", false), // FIXME: Decide the color.
- Other: new WebInspector.ResourceType("other", "Other", "Other", "rgb(186,186,186)", false)
- }
- /* TimelineManager.js */
- /*
- * Copyright (C) 2011 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
- /**
- * @constructor
- * @extends {WebInspector.Object}
- */
- WebInspector.TimelineManager = function()
- {
- WebInspector.Object.call(this);
- this._dispatcher = new WebInspector.TimelineDispatcher(this);
- this._enablementCount = 0;
- }
- WebInspector.TimelineManager.EventTypes = {
- TimelineStarted: "TimelineStarted",
- TimelineStopped: "TimelineStopped",
- TimelineEventRecorded: "TimelineEventRecorded"
- }
- WebInspector.TimelineManager.prototype = {
- /**
- * @param {number=} maxCallStackDepth
- */
- start: function(maxCallStackDepth)
- {
- this._enablementCount++;
- if (this._enablementCount === 1)
- TimelineAgent.start(maxCallStackDepth, this._started.bind(this));
- },
- stop: function()
- {
- if (!this._enablementCount) {
- console.error("WebInspector.TimelineManager start/stop calls are unbalanced");
- return;
- }
- this._enablementCount--;
- if (!this._enablementCount)
- TimelineAgent.stop(this._stopped.bind(this));
- },
- _started: function()
- {
- this.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStarted);
- },
- _stopped: function()
- {
- this.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineStopped);
- }
- }
- WebInspector.TimelineManager.prototype.__proto__ = WebInspector.Object.prototype;
- /**
- * @constructor
- * @implements {TimelineAgent.Dispatcher}
- */
- WebInspector.TimelineDispatcher = function(manager)
- {
- this._manager = manager;
- InspectorBackend.registerTimelineDispatcher(this);
- }
- WebInspector.TimelineDispatcher.prototype = {
- eventRecorded: function(record)
- {
- this._manager.dispatchEventToListeners(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, record);
- }
- }
- /**
- * @type {WebInspector.TimelineManager}
- */
- WebInspector.timelineManager;
- /* TimelineModel.js */
- /*
- * Copyright (C) 2012 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
- /**
- * @constructor
- * @extends {WebInspector.Object}
- */
- WebInspector.TimelineModel = function()
- {
- this._records = [];
- this._minimumRecordTime = -1;
- this._maximumRecordTime = -1;
- this._collectionEnabled = false;
- WebInspector.timelineManager.addEventListener(WebInspector.TimelineManager.EventTypes.TimelineEventRecorded, this._onRecordAdded, this);
- }
- WebInspector.TimelineModel.RecordType = {
- Root: "Root",
- EventDispatch: "EventDispatch",
- BeginFrame: "BeginFrame",
- Layout: "Layout",
- RecalculateStyles: "RecalculateStyles",
- Paint: "Paint",
- ParseHTML: "ParseHTML",
- TimerInstall: "TimerInstall",
- TimerRemove: "TimerRemove",
- TimerFire: "TimerFire",
- XHRReadyStateChange: "XHRReadyStateChange",
- XHRLoad: "XHRLoad",
- EvaluateScript: "EvaluateScript",
- TimeStamp: "TimeStamp",
- MarkLoad: "MarkLoad",
- MarkDOMContent: "MarkDOMContent",
- ScheduleResourceRequest: "ScheduleResourceRequest",
- ResourceSendRequest: "ResourceSendRequest",
- ResourceReceiveResponse: "ResourceReceiveResponse",
- ResourceReceivedData: "ResourceReceivedData",
- ResourceFinish: "ResourceFinish",
- FunctionCall: "FunctionCall",
- GCEvent: "GCEvent",
- RequestAnimationFrame: "RequestAnimationFrame",
- CancelAnimationFrame: "CancelAnimationFrame",
- FireAnimationFrame: "FireAnimationFrame"
- }
- WebInspector.TimelineModel.Events = {
- RecordAdded: "RecordAdded",
- RecordsCleared: "RecordsCleared"
- }
- WebInspector.TimelineModel.startTimeInSeconds = function(record)
- {
- return record.startTime / 1000;
- }
- WebInspector.TimelineModel.endTimeInSeconds = function(record)
- {
- return (typeof record.endTime === "undefined" ? record.startTime : record.endTime) / 1000;
- }
- WebInspector.TimelineModel.durationInSeconds = function(record)
- {
- return WebInspector.TimelineModel.endTimeInSeconds(record) - WebInspector.TimelineModel.startTimeInSeconds(record);
- }
- /**
- * @param {Object} total
- * @param {Object} rawRecord
- */
- WebInspector.TimelineModel.aggregateTimeForRecord = function(total, rawRecord)
- {
- var childrenTime = 0;
- var children = rawRecord["children"] || [];
- for (var i = 0; i < children.length; ++i) {
- WebInspector.TimelineModel.aggregateTimeForRecord(total, children[i]);
- childrenTime += WebInspector.TimelineModel.durationInSeconds(children[i]);
- }
- var categoryName = WebInspector.TimelinePresentationModel.recordStyle(rawRecord).category.name;
- var ownTime = WebInspector.TimelineModel.durationInSeconds(rawRecord) - childrenTime;
- total[categoryName] = (total[categoryName] || 0) + ownTime;
- }
- WebInspector.TimelineModel.prototype = {
- startRecord: function()
- {
- if (this._collectionEnabled)
- return;
- this.reset();
- WebInspector.timelineManager.start(30);
- this._collectionEnabled = true;
- },
- stopRecord: function()
- {
- if (!this._collectionEnabled)
- return;
- WebInspector.timelineManager.stop();
- this._collectionEnabled = false;
- },
- get records()
- {
- return this._records;
- },
- _onRecordAdded: function(event)
- {
- if (this._collectionEnabled)
- this._addRecord(event.data);
- },
- _addRecord: function(record)
- {
- this._records.push(record);
- this._updateBoundaries(record);
- this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordAdded, record);
- },
- _loadNextChunk: function(data, index)
- {
- for (var i = 0; i < 20 && index < data.length; ++i, ++index)
- this._addRecord(data[index]);
- if (index !== data.length)
- setTimeout(this._loadNextChunk.bind(this, data, index), 0);
- },
- loadFromFile: function(file)
- {
- function onLoad(e)
- {
- var data = JSON.parse(e.target.result);
- this.reset();
- this._loadNextChunk(data, 1);
- }
- function onError(e)
- {
- switch(e.target.error.code) {
- case e.target.error.NOT_FOUND_ERR:
- WebInspector.log(WebInspector.UIString('Timeline.loadFromFile: File "%s" not found.', file.name));
- break;
- case e.target.error.NOT_READABLE_ERR:
- WebInspector.log(WebInspector.UIString('Timeline.loadFromFile: File "%s" is not readable', file.name));
- break;
- case e.target.error.ABORT_ERR:
- break;
- default:
- WebInspector.log(WebInspector.UIString('Timeline.loadFromFile: An error occurred while reading the file "%s"', file.name));
- }
- }
- var reader = new FileReader();
- reader.onload = onLoad.bind(this);
- reader.onerror = onError;
- reader.readAsText(file);
- },
- saveToFile: function()
- {
- var records = ['[' + JSON.stringify(new String(window.navigator.appVersion))];
- for (var i = 0; i < this._records.length; ++i)
- records.push(JSON.stringify(this._records[i]));
- records[records.length - 1] = records[records.length - 1] + "]";
- var now = new Date();
- var fileName = "TimelineRawData-" + now.toISO8601Compact() + ".json";
- WebInspector.fileManager.save(fileName, records.join(",\n"), true);
- },
- reset: function()
- {
- this._records = [];
- this._minimumRecordTime = -1;
- this._maximumRecordTime = -1;
- this.dispatchEventToListeners(WebInspector.TimelineModel.Events.RecordsCleared);
- },
- minimumRecordTime: function()
- {
- return this._minimumRecordTime;
- },
- maximumRecordTime: function()
- {
- return this._maximumRecordTime;
- },
- _updateBoundaries: function(record)
- {
- var startTime = WebInspector.TimelineModel.startTimeInSeconds(record);
- var endTime = WebInspector.TimelineModel.endTimeInSeconds(record);
- if (this._minimumRecordTime === -1 || startTime < this._minimumRecordTime)
- this._minimumRecordTime = startTime;
- if (this._maximumRecordTime === -1 || endTime > this._maximumRecordTime)
- this._maximumRecordTime = endTime;
- },
- /**
- * @param {Object} rawRecord
- */
- recordOffsetInSeconds: function(rawRecord)
- {
- return WebInspector.TimelineModel.startTimeInSeconds(rawRecord) - this._minimumRecordTime;
- }
- }
- WebInspector.TimelineModel.prototype.__proto__ = WebInspector.Object.prototype;
- /* UserAgentSupport.js */
- /*
- * Copyright (C) 2012 Google 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:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * 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.
- * * Neither the name of Google Inc. 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 THE COPYRIGHT HOLDERS AND 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 THE COPYRIGHT
- * OWNER OR 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.
- */
- /**
- * @constructor
- */
- WebInspector.UserAgentSupport = function()
- {
- if (WebInspector.settings.deviceMetrics.get())
- this._deviceMetricsChanged();
- WebInspector.settings.deviceMetrics.addChangeListener(this._deviceMetricsChanged, this);
- WebInspector.settings.deviceFitWindow.addChangeListener(this._deviceMetricsChanged, this);
- }
- /**
- * @constructor
- * @param {number} width
- * @param {number} height
- * @param {number} fontScaleFactor
- */
- WebInspector.UserAgentSupport.DeviceMetrics = function(width, height, fontScaleFactor)
- {
- this.width = width;
- this.height = height;
- this.fontScaleFactor = fontScaleFactor;
- }
- /**
- * @return {WebInspector.UserAgentSupport.DeviceMetrics}
- */
- WebInspector.UserAgentSupport.DeviceMetrics.parseSetting = function(value)
- {
- if (value) {
- var splitMetrics = value.split("x");
- if (splitMetrics.length === 3)
- return new WebInspector.UserAgentSupport.DeviceMetrics(parseInt(splitMetrics[0], 10), parseInt(splitMetrics[1], 10), parseFloat(splitMetrics[2]));
- }
- return new WebInspector.UserAgentSupport.DeviceMetrics(0, 0, 1);
- }
- /**
- * @return {?WebInspector.UserAgentSupport.DeviceMetrics}
- */
- WebInspector.UserAgentSupport.DeviceMetrics.parseUserInput = function(widthString, heightString, fontScaleFactorString)
- {
- function isUserInputValid(value, isInteger)
- {
- if (!value)
- return true;
- return isInteger ? /^[0]*[1-9][\d]*$/.test(value) : /^[0]*([1-9][\d]*(\.\d+)?|\.\d+)$/.test(value);
- }
- if (!widthString ^ !heightString)
- return null;
- var isWidthValid = isUserInputValid(widthString, true);
- var isHeightValid = isUserInputValid(heightString, true);
- var isFontScaleFactorValid = isUserInputValid(fontScaleFactorString, false);
- if (!isWidthValid && !isHeightValid && !isFontScaleFactorValid)
- return null;
- var width = isWidthValid ? parseInt(widthString || "0", 10) : -1;
- var height = isHeightValid ? parseInt(heightString || "0", 10) : -1;
- var fontScaleFactor = isFontScaleFactorValid ? parseFloat(fontScaleFactorString) : -1;
- return new WebInspector.UserAgentSupport.DeviceMetrics(width, height, fontScaleFactor);
- }
- WebInspector.UserAgentSupport.DeviceMetrics.prototype = {
- /**
- * @return {boolean}
- */
- isValid: function()
- {
- return this.isWidthValid() && this.isHeightValid() && this.isFontScaleFactorValid();
- },
- /**
- * @return {boolean}
- */
- isWidthValid: function()
- {
- return this.width >= 0;
- },
- /**
- * @return {boolean}
- */
- isHeightValid: function()
- {
- return this.height >= 0;
- },
- /**
- * @return {boolean}
- */
- isFontScaleFactorValid: function()
- {
- return this.fontScaleFactor > 0;
- },
- /**
- * @return {string}
- */
- toSetting: function()
- {
- if (!this.isValid())
- return "";
- return this.width && this.height ? this.width + "x" + this.height + "x" + this.fontScaleFactor : "";
- },
- /**
- * @return {string}
- */
- widthToInput: function()
- {
- return this.isWidthValid() && this.width ? String(this.width) : "";
- },
- /**
- * @return {string}
- */
- heightToInput: function()
- {
- return this.isHeightValid() && this.height ? String(this.height) : "";
- },
- /**
- * @return {string}
- */
- fontScaleFactorToInput: function()
- {
- return this.isFontScaleFactorValid() && this.fontScaleFactor ? String(this.fontScaleFactor) : "";
- }
- }
- WebInspector.UserAgentSupport.prototype = {
- _deviceMetricsChanged: function()
- {
- var metrics = WebInspector.UserAgentSupport.DeviceMetrics.parseSetting(WebInspector.settings.deviceMetrics.get());
- if (metrics.isValid())
- PageAgent.setDeviceMetricsOverride(metrics.width, metrics.height, metrics.fontScaleFactor, WebInspector.settings.deviceFitWindow.get());
- }
- }
- /* Database.js */
- /*
- * Copyright (C) 2007, 2008 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 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.
- */
- /**
- * @constructor
- */
- WebInspector.Database = function(id, domain, name, version)
- {
- this._id = id;
- this._domain = domain;
- this._name = name;
- this._version = version;
- }
- WebInspector.Database.prototype = {
- /** @return {string} */
- get id()
- {
- return this._id;
- },
- /** @return {string} */
- get name()
- {
- return this._name;
- },
- set name(x)
- {
- this._name = x;
- },
- /** @return {string} */
- get version()
- {
- return this._version;
- },
- set version(x)
- {
- this._version = x;
- },
- /** @return {string} */
- get domain()
- {
- return this._domain;
- },
- set domain(x)
- {
- this._domain = x;
- },
- /** @return {string} */
- get displayDomain()
- {
- return WebInspector.displayDomain(this._domain);
- },
- /**
- * @param {function(Array.<string>)} callback
- */
- getTableNames: function(callback)
- {
- function sortingCallback(error, names)
- {
- if (!error)
- callback(names.sort());
- }
- DatabaseAgent.getDatabaseTableNames(this._id, sortingCallback);
- },
- /**
- * @param {string} query
- * @param {function(Array.<string>, Array.<*>)} onSuccess
- * @param {function(DatabaseAgent.Error)} onError
- */
- executeSql: function(query, onSuccess, onError)
- {
- function callback(error, success, transactionId)
- {
- if (error) {
- onError(error);
- return;
- }
- if (!success) {
- onError(WebInspector.UIString("Database not found."));
- return;
- }
- WebInspector.DatabaseDispatcher._callbacks[transactionId] = {"onSuccess": onSuccess, "onError": onError};
- }
- DatabaseAgent.executeSQL(this._id, query, callback);
- }
- }
- /**
- * @constructor
- * @implements {DatabaseAgent.Dispatcher}
- */
- WebInspector.DatabaseDispatcher = function()
- {
- }
- WebInspector.DatabaseDispatcher._callbacks = {};
- WebInspector.DatabaseDispatcher.prototype = {
- /**
- * @param {DatabaseAgent.Database} payload
- */
- addDatabase: function(payload)
- {
- var database = new WebInspector.Database(
- payload.id,
- payload.domain,
- payload.name,
- payload.version);
- WebInspector.panels.resources.addDatabase(database);
- },
- /**
- * @param {number} transactionId
- * @param {Array.<string>} columnNames
- * @param {Array.<*>} values
- */
- sqlTransactionSucceeded: function(transactionId, columnNames, values)
- {
- if (!WebInspector.DatabaseDispatcher._callbacks[transactionId])
- return;
- var callback = WebInspector.DatabaseDispatcher._callbacks[transactionId]["onSuccess"];
- delete WebInspector.DatabaseDispatcher._callbacks[transactionId];
- if (callback)
- callback(columnNames, values);
- },
- /**
- * @param {number} transactionId
- * @param {?DatabaseAgent.Error} errorObj
- */
- sqlTransactionFailed: function(transactionId, errorObj)
- {
- if (!WebInspector.DatabaseDispatcher._callbacks[transactionId])
- return;
- var callback = WebInspector.DatabaseDispatcher._callbacks[transactionId]["onError"];
- delete WebInspector.DatabaseDispatcher._callbacks[transactionId];
- if (callback)
- callback(errorObj);
- }
- }
- /* DOMStorage.js */
- /*
- * Copyright (C) 2008 Nokia 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 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 "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.
- */
- /**
- * @constructor
- */
- WebInspector.DOMStorage = function(id, domain, isLocalStorage)
- {
- this._id = id;
- this._domain = domain;
- this._isLocalStorage = isLocalStorage;
- }
- WebInspector.DOMStorage.prototype = {
- /** @return {string} */
- get id()
- {
- return this._id;
- },
- /** @return {string} */
- get domain()
- {
- return this._domain;
- },
- /** @return {boolean} */
- get isLocalStorage()
- {
- return this._isLocalStorage;
- },
- /**
- * @param {function(?Protocol.Error, Array.<DOMStorageAgent.Entry>):void=} callback
- */
- getEntries: function(callback)
- {
- DOMStorageAgent.getDOMStorageEntries(this._id, callback);
- },
- /**
- * @param {string} key
- * @param {string} value
- * @param {function(?Protocol.Error, boolean):void=} callback
- */
- setItem: function(key, value, callback)
- {
- DOMStorageAgent.setDOMStorageItem(this._id, key, value, callback);
- },
- /**
- * @param {string} key
- * @param {function(?Protocol.Error, boolean):void=} callback
- */
- removeItem: function(key, callback)
- {
- DOMStorageAgent.removeDOMStorageItem(this._id, key, callback);
- }
- }
- /**
- * @constructor
- * @implements {DOMStorageAgent.Dispatcher}
- */
- WebInspector.DOMStorageDispatcher = function()
- {
- }
- WebInspector.DOMStorageDispatcher.prototype = {
- /**
- * @param {DOMStorageAgent.Entry} payload
- */
- addDOMStorage: function(payload)
- {
- var domStorage = new WebInspector.DOMStorage(
- payload.id,
- payload.host,
- payload.isLocalStorage);
- WebInspector.panels.resources.addDOMStorage(domStorage);
- },
- /**
- * @param {string} storageId
- */
- updateDOMStorage: function(storageId)
- {
- WebInspector.panels.resources.updateDOMStorage(storageId);
- }
- }
- /* DOMStorageItemsView.js */
- /*
- * Copyright (C) 2008 Nokia 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.
- *
- * THIS SOFTWARE IS PROVIDED ``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 INC. OR
- * 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.
- */
- /**
- * @constructor
- * @extends {WebInspector.View}
- */
- WebInspector.DOMStorageItemsView = function(domStorage)
- {
- WebInspector.View.call(this);
- this.domStorage = domStorage;
- this.element.addStyleClass("storage-view");
- this.element.addStyleClass("table");
- this.deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
- this.deleteButton.visible = false;
- this.deleteButton.addEventListener("click", this._deleteButtonClicked, this);
- this.refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
- this.refreshButton.addEventListener("click", this._refreshButtonClicked, this);
- }
- WebInspector.DOMStorageItemsView.prototype = {
- get statusBarItems()
- {
- return [this.refreshButton.element, this.deleteButton.element];
- },
- wasShown: function()
- {
- this.update();
- },
- willHide: function()
- {
- this.deleteButton.visible = false;
- },
- update: function()
- {
- this.detachChildViews();
- this.domStorage.getEntries(this._showDOMStorageEntries.bind(this));
- },
- _showDOMStorageEntries: function(error, entries)
- {
- if (error)
- return;
- this._dataGrid = this._dataGridForDOMStorageEntries(entries);
- this._dataGrid.show(this.element);
- this._dataGrid.autoSizeColumns(10);
- this.deleteButton.visible = true;
- },
- _dataGridForDOMStorageEntries: function(entries)
- {
- var columns = {};
- columns[0] = {};
- columns[1] = {};
- columns[0].title = WebInspector.UIString("Key");
- columns[1].title = WebInspector.UIString("Value");
- var nodes = [];
- var keys = [];
- var length = entries.length;
- for (var i = 0; i < entries.length; i++) {
- var data = {};
- var key = entries[i][0];
- data[0] = key;
- var value = entries[i][1];
- data[1] = value;
- var node = new WebInspector.DataGridNode(data, false);
- node.selectable = true;
- nodes.push(node);
- keys.push(key);
- }
- var dataGrid = new WebInspector.DataGrid(columns, this._editingCallback.bind(this), this._deleteCallback.bind(this));
- length = nodes.length;
- for (var i = 0; i < length; ++i)
- dataGrid.rootNode().appendChild(nodes[i]);
- dataGrid.addCreationNode(false);
- if (length > 0)
- nodes[0].selected = true;
- return dataGrid;
- },
- _deleteButtonClicked: function(event)
- {
- if (!this._dataGrid || !this._dataGrid.selectedNode)
- return;
- this._deleteCallback(this._dataGrid.selectedNode);
- },
- _refreshButtonClicked: function(event)
- {
- this.update();
- },
- _editingCallback: function(editingNode, columnIdentifier, oldText, newText)
- {
- var domStorage = this.domStorage;
- if (columnIdentifier === 0) {
- if (oldText)
- domStorage.removeItem(oldText);
- domStorage.setItem(newText, editingNode.data[1]);
- } else {
- domStorage.setItem(editingNode.data[0], newText);
- }
- this.update();
- },
- _deleteCallback: function(node)
- {
- if (!node || node.isCreationNode)
- return;
- if (this.domStorage)
- this.domStorage.removeItem(node.data[0]);
- this.update();
- }
- }
- WebInspector.DOMStorageItemsView.prototype.__proto__ = WebInspector.View.prototype;
- /* DataGrid.js */
- /*
- * Copyright (C) 2008 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.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR
- * 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.
- */
- /**
- * @constructor
- * @extends {WebInspector.View}
- * @param {function(WebInspector.DataGridNode, number, string, string)=} editCallback
- * @param {function(WebInspector.DataGridNode)=} deleteCallback
- */
- WebInspector.DataGrid = function(columns, editCallback, deleteCallback)
- {
- WebInspector.View.call(this);
- this.registerRequiredCSS("dataGrid.css");
- this.element.className = "data-grid";
- this.element.tabIndex = 0;
- this.element.addEventListener("keydown", this._keyDown.bind(this), false);
- this._headerTable = document.createElement("table");
- this._headerTable.className = "header";
- this._headerTableHeaders = {};
- this._dataTable = document.createElement("table");
- this._dataTable.className = "data";
- this._dataTable.addEventListener("mousedown", this._mouseDownInDataTable.bind(this), true);
- this._dataTable.addEventListener("click", this._clickInDataTable.bind(this), true);
- this._dataTable.addEventListener("contextmenu", this._contextMenuInDataTable.bind(this), true);
- // FIXME: Add a createCallback which is different from editCallback and has different
- // behavior when creating a new node.
- if (editCallback) {
- this._dataTable.addEventListener("dblclick", this._ondblclick.bind(this), false);
- this._editCallback = editCallback;
- }
- if (deleteCallback)
- this._deleteCallback = deleteCallback;
- this.aligned = {};
- this._scrollContainer = document.createElement("div");
- this._scrollContainer.className = "data-container";
- this._scrollContainer.appendChild(this._dataTable);
- this.element.appendChild(this._headerTable);
- this.element.appendChild(this._scrollContainer);
- var headerRow = document.createElement("tr");
- var columnGroup = document.createElement("colgroup");
- this._columnCount = 0;
- for (var columnIdentifier in columns) {
- var column = columns[columnIdentifier];
- if (column.disclosure)
- this.disclosureColumnIdentifier = columnIdentifier;
- var col = document.createElement("col");
- if (column.width)
- col.style.width = column.width;
- column.element = col;
- columnGroup.appendChild(col);
- var cell = document.createElement("th");
- cell.className = columnIdentifier + "-column";
- cell.columnIdentifier = columnIdentifier;
- this._headerTableHeaders[columnIdentifier] = cell;
- var div = document.createElement("div");
- if (column.titleDOMFragment)
- div.appendChild(column.titleDOMFragment);
- else
- div.textContent = column.title;
- cell.appendChild(div);
- if (column.sort) {
- cell.addStyleClass("sort-" + column.sort);
- this._sortColumnCell = cell;
- }
- if (column.sortable) {
- cell.addEventListener("click", this._clickInHeaderCell.bind(this), false);
- cell.addStyleClass("sortable");
- }
- if (column.aligned)
- this.aligned[columnIdentifier] = column.aligned;
- headerRow.appendChild(cell);
- ++this._columnCount;
- }
- columnGroup.span = this._columnCount;
- var cell = document.createElement("th");
- cell.className = "corner";
- headerRow.appendChild(cell);
- this._headerTableColumnGroup = columnGroup;
- this._headerTable.appendChild(this._headerTableColumnGroup);
- this.headerTableBody.appendChild(headerRow);
- var fillerRow = document.createElement("tr");
- fillerRow.className = "filler";
- for (var columnIdentifier in columns) {
- var column = columns[columnIdentifier];
- var td = document.createElement("td");
- td.className = columnIdentifier + "-column";
- fillerRow.appendChild(td);
- }
- this._dataTableColumnGroup = columnGroup.cloneNode(true);
- this._dataTable.appendChild(this._dataTableColumnGroup);
- this.dataTableBody.appendChild(fillerRow);
- this.columns = columns || {};
- this._columnsArray = [];
- for (var columnIdentifier in columns) {
- columns[columnIdentifier].ordinal = this._columnsArray.length;
- columns[columnIdentifier].identifier = columnIdentifier;
- this._columnsArray.push(columns[columnIdentifier]);
- }
- for (var i = 0; i < this._columnsArray.length; ++i)
- this._columnsArray[i].bodyElement = this._dataTableColumnGroup.children[i];
- this.selectedNode = null;
- this.expandNodesWhenArrowing = false;
- this.setRootNode(new WebInspector.DataGridNode());
- this.indentWidth = 15;
- this.resizers = [];
- this._columnWidthsInitialized = false;
- }
- WebInspector.DataGrid.Events = {
- SelectedNode: "SelectedNode",
- DeselectedNode: "DeselectedNode"
- }
- /**
- * @param {Array.<string>} columnNames
- * @param {Array.<string>} values
- */
- WebInspector.DataGrid.createSortableDataGrid = function(columnNames, values)
- {
- var numColumns = columnNames.length;
- if (!numColumns)
- return null;
- var columns = {};
- for (var i = 0; i < columnNames.length; ++i) {
- var column = {};
- column.width = columnNames[i].length;
- column.title = columnNames[i];
- column.sortable = true;
- columns[columnNames[i]] = column;
- }
- var nodes = [];
- for (var i = 0; i < values.length / numColumns; ++i) {
- var data = {};
- for (var j = 0; j < columnNames.length; ++j)
- data[columnNames[j]] = values[numColumns * i + j];
- var node = new WebInspector.DataGridNode(data, false);
- node.selectable = false;
- nodes.push(node);
- }
- var dataGrid = new WebInspector.DataGrid(columns);
- var length = nodes.length;
- for (var i = 0; i < length; ++i)
- dataGrid.rootNode().appendChild(nodes[i]);
- dataGrid.addEventListener("sorting changed", sortDataGrid, this);
- function sortDataGrid()
- {
- var nodes = dataGrid._rootNode.children.slice();
- var sortColumnIdentifier = dataGrid.sortColumnIdentifier;
- var sortDirection = dataGrid.sortOrder === "ascending" ? 1 : -1;
- var columnIsNumeric = true;
- for (var i = 0; i < nodes.length; i++) {
- if (isNaN(Number(nodes[i].data[sortColumnIdentifier])))
- columnIsNumeric = false;
- }
- function comparator(dataGridNode1, dataGridNode2)
- {
- var item1 = dataGridNode1.data[sortColumnIdentifier];
- var item2 = dataGridNode2.data[sortColumnIdentifier];
- var comparison;
- if (columnIsNumeric) {
- // Sort numbers based on comparing their values rather than a lexicographical comparison.
- var number1 = parseFloat(item1);
- var number2 = parseFloat(item2);
- comparison = number1 < number2 ? -1 : (number1 > number2 ? 1 : 0);
- } else
- comparison = item1 < item2 ? -1 : (item1 > item2 ? 1 : 0);
- return sortDirection * comparison;
- }
- nodes.sort(comparator);
- dataGrid.rootNode().removeChildren();
- for (var i = 0; i < nodes.length; i++)
- dataGrid._rootNode.appendChild(nodes[i]);
- }
- return dataGrid;
- }
- WebInspector.DataGrid.prototype = {
- setRootNode: function(rootNode)
- {
- if (this._rootNode) {
- this._rootNode.removeChildren();
- this._rootNode.dataGrid = null;
- this._rootNode._isRoot = false;
- }
- this._rootNode = rootNode;
- rootNode._isRoot = true;
- rootNode.hasChildren = false;
- rootNode._expanded = true;
- rootNode._revealed = true;
- rootNode.dataGrid = this;
- },
- rootNode: function()
- {
- return this._rootNode;
- },
- get refreshCallback()
- {
- return this._refreshCallback;
- },
- set refreshCallback(refreshCallback)
- {
- this._refreshCallback = refreshCallback;
- },
- _ondblclick: function(event)
- {
- if (this._editing || this._editingNode)
- return;
- this._startEditing(event.target);
- },
- _startEditingColumnOfDataGridNode: function(node, column)
- {
- this._editing = true;
- this._editingNode = node;
- this._editingNode.select();
- var element = this._editingNode._element.children[column];
- WebInspector.startEditing(element, this._startEditingConfig(element));
- window.getSelection().setBaseAndExtent(element, 0, element, 1);
- },
- _startEditing: function(target)
- {
- var element = target.enclosingNodeOrSelfWithNodeName("td");
- if (!element)
- return;
- this._editingNode = this.dataGridNodeFromNode(target);
- if (!this._editingNode) {
- if (!this.creationNode)
- return;
- this._editingNode = this.creationNode;
- }
- // Force editing the 1st column when editing the creation node
- if (this._editingNode.isCreationNode)
- return this._startEditingColumnOfDataGridNode(this._editingNode, 0);
- this._editing = true;
- WebInspector.startEditing(element, this._startEditingConfig(element));
- window.getSelection().setBaseAndExtent(element, 0, element, 1);
- },
- _startEditingConfig: function(element)
- {
- return new WebInspector.EditingConfig(this._editingCommitted.bind(this), this._editingCancelled.bind(this), element.textContent);
- },
- _editingCommitted: function(element, newText, oldText, context, moveDirection)
- {
- // FIXME: We need more column identifiers here throughout this function.
- // Not needed yet since only editable DataGrid is DOM Storage, which is Key - Value.
- // FIXME: Better way to do this than regular expressions?
- var columnIdentifier = parseInt(element.className.match(/\b(\d+)-column\b/)[1], 10);
- var textBeforeEditing = this._editingNode.data[columnIdentifier];
- var currentEditingNode = this._editingNode;
- function moveToNextIfNeeded(wasChange) {
- if (!moveDirection)
- return;
- if (moveDirection === "forward") {
- if (currentEditingNode.isCreationNode && columnIdentifier === 0 && !wasChange)
- return;
- if (columnIdentifier === 0)
- return this._startEditingColumnOfDataGridNode(currentEditingNode, 1);
- var nextDataGridNode = currentEditingNode.traverseNextNode(true, null, true);
- if (nextDataGridNode)
- return this._startEditingColumnOfDataGridNode(nextDataGridNode, 0);
- if (currentEditingNode.isCreationNode && wasChange) {
- this.addCreationNode(false);
- return this._startEditingColumnOfDataGridNode(this.creationNode, 0);
- }
- return;
- }
- if (moveDirection === "backward") {
- if (columnIdentifier === 1)
- return this._startEditingColumnOfDataGridNode(currentEditingNode, 0);
- var nextDataGridNode = currentEditingNode.traversePreviousNode(true, null, true);
- if (nextDataGridNode)
- return this._startEditingColumnOfDataGridNode(nextDataGridNode, 1);
- return;
- }
- }
- if (textBeforeEditing == newText) {
- this._editingCancelled(element);
- moveToNextIfNeeded.call(this, false);
- return;
- }
- // Update the text in the datagrid that we typed
- this._editingNode.data[columnIdentifier] = newText;
- // Make the callback - expects an editing node (table row), the column number that is being edited,
- // the text that used to be there, and the new text.
- this._editCallback(this._editingNode, columnIdentifier, textBeforeEditing, newText);
- if (this._editingNode.isCreationNode)
- this.addCreationNode(false);
- this._editingCancelled(element);
- moveToNextIfNeeded.call(this, true);
- },
- _editingCancelled: function(element)
- {
- delete this._editing;
- this._editingNode = null;
- },
- /**
- * @return {?string}
- */
- get sortColumnIdentifier()
- {
- if (!this._sortColumnCell)
- return null;
- return this._sortColumnCell.columnIdentifier;
- },
- /**
- * @return {?string}
- */
- get sortOrder()
- {
- if (!this._sortColumnCell || this._sortColumnCell.hasStyleClass("sort-ascending"))
- return "ascending";
- if (this._sortColumnCell.hasStyleClass("sort-descending"))
- return "descending";
- return null;
- },
- get headerTableBody()
- {
- if ("_headerTableBody" in this)
- return this._headerTableBody;
- this._headerTableBody = this._headerTable.getElementsByTagName("tbody")[0];
- if (!this._headerTableBody) {
- this._headerTableBody = this.element.ownerDocument.createElement("tbody");
- this._headerTable.insertBefore(this._headerTableBody, this._headerTable.tFoot);
- }
- return this._headerTableBody;
- },
- get dataTableBody()
- {
- if ("_dataTableBody" in this)
- return this._dataTableBody;
- this._dataTableBody = this._dataTable.getElementsByTagName("tbody")[0];
- if (!this._dataTableBody) {
- this._dataTableBody = this.element.ownerDocument.createElement("tbody");
- this._dataTable.insertBefore(this._dataTableBody, this._dataTable.tFoot);
- }
- return this._dataTableBody;
- },
- /**
- * @param {number=} maxDescentLevel
- */
- autoSizeColumns: function(minPercent, maxPercent, maxDescentLevel)
- {
- if (minPercent)
- minPercent = Math.min(minPercent, Math.floor(100 / this._columnCount));
- var widths = {};
- var columns = this.columns;
- for (var columnIdentifier in columns)
- widths[columnIdentifier] = (columns[columnIdentifier].title || "").length;
- maxDescentLevel = maxDescentLevel || 0;
- var children = this._enumerateChildren(this._rootNode, [], maxDescentLevel + 1);
- for (var i = 0; i < children.length; ++i) {
- var node = children[i];
- for (var columnIdentifier in columns) {
- var text = node.data[columnIdentifier] || "";
- if (text.length > widths[columnIdentifier])
- widths[columnIdentifier] = text.length;
- }
- }
- var totalColumnWidths = 0;
- for (var columnIdentifier in columns)
- totalColumnWidths += widths[columnIdentifier];
- var recoupPercent = 0;
- for (var columnIdentifier in columns) {
- var width = Math.round(100 * widths[columnIdentifier] / totalColumnWidths);
- if (minPercent && width < minPercent) {
- recoupPercent += (minPercent - width);
- width = minPercent;
- } else if (maxPercent && width > maxPercent) {
- recoupPercent -= (width - maxPercent);
- width = maxPercent;
- }
- widths[columnIdentifier] = width;
- }
- while (minPercent && recoupPercent > 0) {
- for (var columnIdentifier in columns) {
- if (widths[columnIdentifier] > minPercent) {
- --widths[columnIdentifier];
- --recoupPercent;
- if (!recoupPercent)
- break;
- }
- }
- }
- while (maxPercent && recoupPercent < 0) {
- for (var columnIdentifier in columns) {
- if (widths[columnIdentifier] < maxPercent) {
- ++widths[columnIdentifier];
- ++recoupPercent;
- if (!recoupPercent)
- break;
- }
- }
- }
- for (var columnIdentifier in columns)
- columns[columnIdentifier].element.style.width = widths[columnIdentifier] + "%";
- this._columnWidthsInitialized = false;
- this.updateWidths();
- },
- _enumerateChildren: function(rootNode, result, maxLevel)
- {
- if (!rootNode._isRoot)
- result.push(rootNode);
- if (!maxLevel)
- return;
- for (var i = 0; i < rootNode.children.length; ++i)
- this._enumerateChildren(rootNode.children[i], result, maxLevel - 1);
- return result;
- },
- onResize: function()
- {
- this.updateWidths();
- },
- // Updates the widths of the table, including the positions of the column
- // resizers.
- //
- // IMPORTANT: This function MUST be called once after the element of the
- // DataGrid is attached to its parent element and every subsequent time the
- // width of the parent element is changed in order to make it possible to
- // resize the columns.
- //
- // If this function is not called after the DataGrid is attached to its
- // parent element, then the DataGrid's columns will not be resizable.
- updateWidths: function()
- {
- var headerTableColumns = this._headerTableColumnGroup.children;
- var tableWidth = this._dataTable.offsetWidth;
- var numColumns = headerTableColumns.length;
- if (!this._columnWidthsInitialized && this.element.offsetWidth) {
- for (var i = 0; i < numColumns; i++) {
- var columnWidth = this.headerTableBody.rows[0].cells[i].offsetWidth;
- var percentWidth = ((columnWidth / tableWidth) * 100) + "%";
- this._headerTableColumnGroup.children[i].style.width = percentWidth;
- this._dataTableColumnGroup.children[i].style.width = percentWidth;
- }
- this._columnWidthsInitialized = true;
- }
- this._positionResizers();
- this.dispatchEventToListeners("width changed");
- },
- columnWidthsMap: function()
- {
- var result = {};
- for (var i = 0; i < this._columnsArray.length; ++i) {
- var width = this._headerTableColumnGroup.children[i].style.width;
- result[this._columnsArray[i].columnIdentifier] = parseFloat(width);
- }
- return result;
- },
- applyColumnWidthsMap: function(columnWidthsMap)
- {
- for (var columnIdentifier in this.columns) {
- var column = this.columns[columnIdentifier];
- var width = (columnWidthsMap[columnIdentifier] || 0) + "%";
- this._headerTableColumnGroup.children[column.ordinal].style.width = width;
- this._dataTableColumnGroup.children[column.ordinal].style.width = width;
- }
- delete this._columnWidthsInitialized;
- this.updateWidths();
- },
- isColumnVisible: function(columnIdentifier)
- {
- var column = this.columns[columnIdentifier];
- var columnElement = column.element;
- return !columnElement.hidden;
- },
- showColumn: function(columnIdentifier)
- {
- var column = this.columns[columnIdentifier];
- var columnElement = column.element;
- if (!columnElement.hidden)
- return;
- columnElement.hidden = false;
- columnElement.removeStyleClass("hidden");
- var columnBodyElement = column.bodyElement;
- columnBodyElement.hidden = false;
- columnBodyElement.removeStyleClass("hidden");
- },
- hideColumn: function(columnIdentifier)
- {
- var column = this.columns[columnIdentifier];
- var columnElement = column.element;
- if (columnElement.hidden)
- return;
- var oldWidth = parseFloat(columnElement.style.width);
- columnElement.hidden = true;
- columnElement.addStyleClass("hidden");
- columnElement.style.width = 0;
- var columnBodyElement = column.bodyElement;
- columnBodyElement.hidden = true;
- columnBodyElement.addStyleClass("hidden");
- columnBodyElement.style.width = 0;
- this._columnWidthsInitialized = false;
- },
- get scrollContainer()
- {
- return this._scrollContainer;
- },
- isScrolledToLastRow: function()
- {
- return this._scrollContainer.isScrolledToBottom();
- },
- scrollToLastRow: function()
- {
- this._scrollContainer.scrollTop = this._scrollContainer.scrollHeight - this._scrollContainer.offsetHeight;
- },
- _positionResizers: function()
- {
- var headerTableColumns = this._headerTableColumnGroup.children;
- var numColumns = headerTableColumns.length;
- var left = 0;
- var previousResizer = null;
- for (var i = 0; i < numColumns - 1; i++) {
- var resizer = this.resizers[i];
- if (!resizer) {
- resizer = document.createElement("div");
- resizer.addStyleClass("data-grid-resizer");
- resizer.addEventListener("mousedown", this._startResizerDragging.bind(this), false);
- this.element.appendChild(resizer);
- this.resizers[i] = resizer;
- }
- left += this.headerTableBody.rows[0].cells[i].offsetWidth;
- var columnIsVisible = !this._headerTableColumnGroup.children[i].hidden;
- if (columnIsVisible) {
- resizer.style.removeProperty("display");
- resizer.style.left = left + "px";
- resizer.leftNeighboringColumnID = i;
- if (previousResizer)
- previousResizer.rightNeighboringColumnID = i;
- previousResizer = resizer;
- } else {
- resizer.style.setProperty("display", "none");
- resizer.leftNeighboringColumnID = 0;
- resizer.rightNeighboringColumnID = 0;
- }
- }
- if (previousResizer)
- previousResizer.rightNeighboringColumnID = numColumns - 1;
- },
- addCreationNode: function(hasChildren)
- {
- if (this.creationNode)
- this.creationNode.makeNormal();
- var emptyData = {};
- for (var column in this.columns)
- emptyData[column] = '';
- this.creationNode = new WebInspector.CreationDataGridNode(emptyData, hasChildren);
- this.rootNode().appendChild(this.creationNode);
- },
- sortNodes: function(comparator, reverseMode)
- {
- function comparatorWrapper(a, b)
- {
- if (a._dataGridNode._data.summaryRow)
- return 1;
- if (b._dataGridNode._data.summaryRow)
- return -1;
- var aDataGirdNode = a._dataGridNode;
- var bDataGirdNode = b._dataGridNode;
- return reverseMode ? comparator(bDataGirdNode, aDataGirdNode) : comparator(aDataGirdNode, bDataGirdNode);
- }
- var tbody = this.dataTableBody;
- var tbodyParent = tbody.parentElement;
- tbodyParent.removeChild(tbody);
- var childNodes = tbody.childNodes;
- var fillerRow = childNodes[childNodes.length - 1];
- var sortedRows = Array.prototype.slice.call(childNodes, 0, childNodes.length - 1);
- sortedRows.sort(comparatorWrapper);
- var sortedRowsLength = sortedRows.length;
- tbody.removeChildren();
- var previousSiblingNode = null;
- for (var i = 0; i < sortedRowsLength; ++i) {
- var row = sortedRows[i];
- var node = row._dataGridNode;
- node.previousSibling = previousSiblingNode;
- if (previousSiblingNode)
- previousSiblingNode.nextSibling = node;
- tbody.appendChild(row);
- previousSiblingNode = node;
- }
- if (previousSiblingNode)
- previousSiblingNode.nextSibling = null;
- tbody.appendChild(fillerRow);
- tbodyParent.appendChild(tbody);
- },
- _keyDown: function(event)
- {
- if (!this.selectedNode || event.shiftKey || event.metaKey || event.ctrlKey || this._editing)
- return;
- var handled = false;
- var nextSelectedNode;
- if (event.keyIdentifier === "Up" && !event.altKey) {
- nextSelectedNode = this.selectedNode.traversePreviousNode(true);
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traversePreviousNode(true);
- handled = nextSelectedNode ? true : false;
- } else if (event.keyIdentifier === "Down" && !event.altKey) {
- nextSelectedNode = this.selectedNode.traverseNextNode(true);
- while (nextSelectedNode && !nextSelectedNode.selectable)
- nextSelectedNode = nextSelectedNode.traverseNextNode(true);
- handled = nextSelectedNode ? true : false;
- } else if (event.keyIdentifier === "Left") {
- if (this.selectedNode.expanded) {
- if (event.altKey)
- this.selectedNode.collapseRecursively();
- else
- this.selectedNode.collapse();
- handled = true;
- } else if (this.selectedNode.parent && !this.selectedNode.parent._isRoot) {
- handled = true;
- if (this.selectedNode.parent.selectable) {
- nextSelectedNode = this.selectedNode.parent;
- handled = nextSelectedNode ? true : false;
- } else if (this.selectedNode.parent)
- this.selectedNode.parent.collapse();
- }
- } else if (event.keyIdentifier === "Right") {
- if (!this.selectedNode.revealed) {
- this.selectedNode.reveal();
- handled = true;
- } else if (this.selectedNode.hasChildren) {
- handled = true;
- if (this.selectedNode.expanded) {
- nextSelectedNode = this.selectedNode.children[0];
- handled = nextSelectedNode ? true : false;
- } else {
- if (event.altKey)
- this.selectedNode.expandRecursively();
- else
- this.selectedNode.expand();
- }
- }
- } else if (event.keyCode === 8 || event.keyCode === 46) {
- if (this._deleteCallback) {
- handled = true;
- this._deleteCallback(this.selectedNode);
- }
- } else if (isEnterKey(event)) {
- if (this._editCallback) {
- handled = true;
- this._startEditing(this.selectedNode._element.children[0]);
- }
- }
- if (nextSelectedNode) {
- nextSelectedNode.reveal();
- nextSelectedNode.select();
- }
- if (handled)
- event.consume(true);
- },
- dataGridNodeFromNode: function(target)
- {
- var rowElement = target.enclosingNodeOrSelfWithNodeName("tr");
- return rowElement && rowElement._dataGridNode;
- },
- dataGridNodeFromPoint: function(x, y)
- {
- var node = this._dataTable.ownerDocument.elementFromPoint(x, y);
- var rowElement = node.enclosingNodeOrSelfWithNodeName("tr");
- return rowElement && rowElement._dataGridNode;
- },
- _clickInHeaderCell: function(event)
- {
- var cell = event.target.enclosingNodeOrSelfWithNodeName("th");
- if (!cell || !cell.columnIdentifier || !cell.hasStyleClass("sortable"))
- return;
- var sortOrder = this.sortOrder;
- if (this._sortColumnCell)
- this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");
- if (cell == this._sortColumnCell) {
- if (sortOrder === "ascending")
- sortOrder = "descending";
- else
- sortOrder = "ascending";
- }
- this._sortColumnCell = cell;
- cell.addStyleClass("sort-" + sortOrder);
- this.dispatchEventToListeners("sorting changed");
- },
- markColumnAsSortedBy: function(columnIdentifier, sortOrder)
- {
- if (this._sortColumnCell)
- this._sortColumnCell.removeMatchingStyleClasses("sort-\\w+");
- this._sortColumnCell = this._headerTableHeaders[columnIdentifier];
- this._sortColumnCell.addStyleClass("sort-" + sortOrder);
- },
- headerTableHeader: function(columnIdentifier)
- {
- return this._headerTableHeaders[columnIdentifier];
- },
- _mouseDownInDataTable: function(event)
- {
- var gridNode = this.dataGridNodeFromNode(event.target);
- if (!gridNode || !gridNode.selectable)
- return;
- if (gridNode.isEventWithinDisclosureTriangle(event))
- return;
- if (event.metaKey) {
- if (gridNode.selected)
- gridNode.deselect();
- else
- gridNode.select();
- } else
- gridNode.select();
- },
- _contextMenuInDataTable: function(event)
- {
- var contextMenu = new WebInspector.ContextMenu();
- var gridNode = this.dataGridNodeFromNode(event.target);
- if (this._refreshCallback && (!gridNode || gridNode !== this.creationNode))
- contextMenu.appendItem(WebInspector.UIString("Refresh"), this._refreshCallback.bind(this));
- if (gridNode && gridNode.selectable && !gridNode.isEventWithinDisclosureTriangle(event)) {
- if (this._editCallback) {
- if (gridNode === this.creationNode)
- contextMenu.appendItem(WebInspector.UIString("Add New"), this._startEditing.bind(this, event.target));
- else
- contextMenu.appendItem(WebInspector.UIString("Edit"), this._startEditing.bind(this, event.target));
- }
- if (this._deleteCallback && gridNode !== this.creationNode)
- contextMenu.appendItem(WebInspector.UIString("Delete"), this._deleteCallback.bind(this, gridNode));
- }
- contextMenu.show(event);
- },
- _clickInDataTable: function(event)
- {
- var gridNode = this.dataGridNodeFromNode(event.target);
- if (!gridNode || !gridNode.hasChildren)
- return;
- if (!gridNode.isEventWithinDisclosureTriangle(event))
- return;
- if (gridNode.expanded) {
- if (event.altKey)
- gridNode.collapseRecursively();
- else
- gridNode.collapse();
- } else {
- if (event.altKey)
- gridNode.expandRecursively();
- else
- gridNode.expand();
- }
- },
- get resizeMethod()
- {
- if (typeof this._resizeMethod === "undefined")
- return WebInspector.DataGrid.ResizeMethod.Nearest;
- return this._resizeMethod;
- },
- set resizeMethod(method)
- {
- this._resizeMethod = method;
- },
- _startResizerDragging: function(event)
- {
- this._currentResizer = event.target;
- if (!this._currentResizer.rightNeighboringColumnID)
- return;
- WebInspector.elementDragStart(this._currentResizer, this._resizerDragging.bind(this),
- this._endResizerDragging.bind(this), event, "col-resize");
- },
- _resizerDragging: function(event)
- {
- var resizer = this._currentResizer;
- if (!resizer)
- return;
- var dragPoint = event.clientX - this.element.totalOffsetLeft();
- var leftCellIndex = resizer.leftNeighboringColumnID;
- var rightCellIndex = resizer.rightNeighboringColumnID;
- var firstRowCells = this.headerTableBody.rows[0].cells;
- var leftEdgeOfPreviousColumn = 0;
- for (var i = 0; i < leftCellIndex; i++)
- leftEdgeOfPreviousColumn += firstRowCells[i].offsetWidth;
- if (this.resizeMethod == WebInspector.DataGrid.ResizeMethod.Last) {
- rightCellIndex = this.resizers.length;
- } else if (this.resizeMethod == WebInspector.DataGrid.ResizeMethod.First) {
- leftEdgeOfPreviousColumn += firstRowCells[leftCellIndex].offsetWidth - firstRowCells[0].offsetWidth;
- leftCellIndex = 0;
- }
- var rightEdgeOfNextColumn = leftEdgeOfPreviousColumn + firstRowCells[leftCellIndex].offsetWidth + firstRowCells[rightCellIndex].offsetWidth;
- var leftMinimum = leftEdgeOfPreviousColumn + this.ColumnResizePadding;
- var rightMaximum = rightEdgeOfNextColumn - this.ColumnResizePadding;
- dragPoint = Number.constrain(dragPoint, leftMinimum, rightMaximum);
- resizer.style.left = (dragPoint - this.CenterResizerOverBorderAdjustment) + "px";
- var percentLeftColumn = (((dragPoint - leftEdgeOfPreviousColumn) / this._dataTable.offsetWidth) * 100) + "%";
- this._headerTableColumnGroup.children[leftCellIndex].style.width = percentLeftColumn;
- this._dataTableColumnGroup.children[leftCellIndex].style.width = percentLeftColumn;
- var percentRightColumn = (((rightEdgeOfNextColumn - dragPoint) / this._dataTable.offsetWidth) * 100) + "%";
- this._headerTableColumnGroup.children[rightCellIndex].style.width = percentRightColumn;
- this._dataTableColumnGroup.children[rightCellIndex].style.width = percentRightColumn;
- this._positionResizers();
- event.preventDefault();
- this.dispatchEventToListeners("width changed");
- },
- _endResizerDragging: function(event)
- {
- WebInspector.elementDragEnd(event);
- this._currentResizer = null;
- this.dispatchEventToListeners("width changed");
- },
- ColumnResizePadding: 10,
- CenterResizerOverBorderAdjustment: 3,
- }
- WebInspector.DataGrid.ResizeMethod = {
- Nearest: "nearest",
- First: "first",
- Last: "last"
- }
- WebInspector.DataGrid.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.DataGridNode = function(data, hasChildren)
- {
- this._expanded = false;
- this._selected = false;
- this._shouldRefreshChildren = true;
- this._data = data || {};
- this.hasChildren = hasChildren || false;
- this.children = [];
- this.dataGrid = null;
- this.parent = null;
- this.previousSibling = null;
- this.nextSibling = null;
- this.disclosureToggleWidth = 10;
- }
- WebInspector.DataGridNode.prototype = {
- selectable: true,
- _isRoot: false,
- get element()
- {
- if (this._element)
- return this._element;
- if (!this.dataGrid)
- return null;
- this._element = document.createElement("tr");
- this._element._dataGridNode = this;
- if (this.hasChildren)
- this._element.addStyleClass("parent");
- if (this.expanded)
- this._element.addStyleClass("expanded");
- if (this.selected)
- this._element.addStyleClass("selected");
- if (this.revealed)
- this._element.addStyleClass("revealed");
- this.createCells();
- return this._element;
- },
- createCells: function()
- {
- for (var columnIdentifier in this.dataGrid.columns) {
- var cell = this.createCell(columnIdentifier);
- this._element.appendChild(cell);
- }
- },
- get data()
- {
- return this._data;
- },
- set data(x)
- {
- this._data = x || {};
- this.refresh();
- },
- get revealed()
- {
- if ("_revealed" in this)
- return this._revealed;
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor._isRoot) {
- if (!currentAncestor.expanded) {
- this._revealed = false;
- return false;
- }
- currentAncestor = currentAncestor.parent;
- }
- this._revealed = true;
- return true;
- },
- set hasChildren(x)
- {
- if (this._hasChildren === x)
- return;
- this._hasChildren = x;
- if (!this._element)
- return;
- if (this._hasChildren)
- {
- this._element.addStyleClass("parent");
- if (this.expanded)
- this._element.addStyleClass("expanded");
- }
- else
- {
- this._element.removeStyleClass("parent");
- this._element.removeStyleClass("expanded");
- }
- },
- get hasChildren()
- {
- return this._hasChildren;
- },
- set revealed(x)
- {
- if (this._revealed === x)
- return;
- this._revealed = x;
- if (this._element) {
- if (this._revealed)
- this._element.addStyleClass("revealed");
- else
- this._element.removeStyleClass("revealed");
- }
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = x && this.expanded;
- },
- get depth()
- {
- if ("_depth" in this)
- return this._depth;
- if (this.parent && !this.parent._isRoot)
- this._depth = this.parent.depth + 1;
- else
- this._depth = 0;
- return this._depth;
- },
- get leftPadding()
- {
- if (typeof(this._leftPadding) === "number")
- return this._leftPadding;
- this._leftPadding = this.depth * this.dataGrid.indentWidth;
- return this._leftPadding;
- },
- get shouldRefreshChildren()
- {
- return this._shouldRefreshChildren;
- },
- set shouldRefreshChildren(x)
- {
- this._shouldRefreshChildren = x;
- if (x && this.expanded)
- this.expand();
- },
- get selected()
- {
- return this._selected;
- },
- set selected(x)
- {
- if (x)
- this.select();
- else
- this.deselect();
- },
- get expanded()
- {
- return this._expanded;
- },
- set expanded(x)
- {
- if (x)
- this.expand();
- else
- this.collapse();
- },
- refresh: function()
- {
- if (!this._element || !this.dataGrid)
- return;
- this._element.removeChildren();
- this.createCells();
- },
- createCell: function(columnIdentifier)
- {
- var cell = document.createElement("td");
- cell.className = columnIdentifier + "-column";
- var alignment = this.dataGrid.aligned[columnIdentifier];
- if (alignment)
- cell.addStyleClass(alignment);
- var div = document.createElement("div");
- div.textContent = this.data[columnIdentifier];
- cell.appendChild(div);
- if (columnIdentifier === this.dataGrid.disclosureColumnIdentifier) {
- cell.addStyleClass("disclosure");
- if (this.leftPadding)
- cell.style.setProperty("padding-left", this.leftPadding + "px");
- }
- return cell;
- },
- nodeHeight: function()
- {
- var rowHeight = 16;
- if (!this.revealed)
- return 0;
- if (!this.expanded)
- return rowHeight;
- var result = rowHeight;
- for (var i = 0; i < this.children.length; i++)
- result += this.children[i].nodeHeight();
- return result;
- },
- appendChild: function(child)
- {
- this.insertChild(child, this.children.length);
- },
- insertChild: function(child, index)
- {
- if (!child)
- throw("insertChild: Node can't be undefined or null.");
- if (child.parent === this)
- throw("insertChild: Node is already a child of this node.");
- if (child.parent)
- child.parent.removeChild(child);
- this.children.splice(index, 0, child);
- this.hasChildren = true;
- child.parent = this;
- child.dataGrid = this.dataGrid;
- child._recalculateSiblings(index);
- delete child._depth;
- delete child._revealed;
- delete child._attached;
- child._shouldRefreshChildren = true;
- var current = child.children[0];
- while (current) {
- current.dataGrid = this.dataGrid;
- delete current._depth;
- delete current._revealed;
- delete current._attached;
- current._shouldRefreshChildren = true;
- current = current.traverseNextNode(false, child, true);
- }
- if (this.expanded)
- child._attach();
- if (!this.revealed)
- child.revealed = false;
- },
- removeChild: function(child)
- {
- if (!child)
- throw("removeChild: Node can't be undefined or null.");
- if (child.parent !== this)
- throw("removeChild: Node is not a child of this node.");
- child.deselect();
- child._detach();
- this.children.remove(child, true);
- if (child.previousSibling)
- child.previousSibling.nextSibling = child.nextSibling;
- if (child.nextSibling)
- child.nextSibling.previousSibling = child.previousSibling;
- child.dataGrid = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
- if (this.children.length <= 0)
- this.hasChildren = false;
- },
- removeChildren: function()
- {
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- child.deselect();
- child._detach();
- child.dataGrid = null;
- child.parent = null;
- child.nextSibling = null;
- child.previousSibling = null;
- }
- this.children = [];
- this.hasChildren = false;
- },
- _recalculateSiblings: function(myIndex)
- {
- if (!this.parent)
- return;
- var previousChild = (myIndex > 0 ? this.parent.children[myIndex - 1] : null);
- if (previousChild) {
- previousChild.nextSibling = this;
- this.previousSibling = previousChild;
- } else
- this.previousSibling = null;
- var nextChild = this.parent.children[myIndex + 1];
- if (nextChild) {
- nextChild.previousSibling = this;
- this.nextSibling = nextChild;
- } else
- this.nextSibling = null;
- },
- collapse: function()
- {
- if (this._isRoot)
- return;
- if (this._element)
- this._element.removeStyleClass("expanded");
- this._expanded = false;
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = false;
- this.dispatchEventToListeners("collapsed");
- },
- collapseRecursively: function()
- {
- var item = this;
- while (item) {
- if (item.expanded)
- item.collapse();
- item = item.traverseNextNode(false, this, true);
- }
- },
- expand: function()
- {
- if (!this.hasChildren || this.expanded)
- return;
- if (this._isRoot)
- return;
- if (this.revealed && !this._shouldRefreshChildren)
- for (var i = 0; i < this.children.length; ++i)
- this.children[i].revealed = true;
- if (this._shouldRefreshChildren) {
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._detach();
- this.dispatchEventToListeners("populate");
- if (this._attached) {
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i];
- if (this.revealed)
- child.revealed = true;
- child._attach();
- }
- }
- delete this._shouldRefreshChildren;
- }
- if (this._element)
- this._element.addStyleClass("expanded");
- this._expanded = true;
- this.dispatchEventToListeners("expanded");
- },
- expandRecursively: function()
- {
- var item = this;
- while (item) {
- item.expand();
- item = item.traverseNextNode(false, this);
- }
- },
- reveal: function()
- {
- if (this._isRoot)
- return;
- var currentAncestor = this.parent;
- while (currentAncestor && !currentAncestor._isRoot) {
- if (!currentAncestor.expanded)
- currentAncestor.expand();
- currentAncestor = currentAncestor.parent;
- }
- this.element.scrollIntoViewIfNeeded(false);
- this.dispatchEventToListeners("revealed");
- },
- select: function(supressSelectedEvent)
- {
- if (!this.dataGrid || !this.selectable || this.selected)
- return;
- if (this.dataGrid.selectedNode)
- this.dataGrid.selectedNode.deselect();
- this._selected = true;
- this.dataGrid.selectedNode = this;
- if (this._element)
- this._element.addStyleClass("selected");
- if (!supressSelectedEvent) {
- this.dispatchEventToListeners("selected");
- this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.SelectedNode);
- }
- },
- revealAndSelect: function()
- {
- if (this._isRoot)
- return;
- this.reveal();
- this.select();
- },
- deselect: function(supressDeselectedEvent)
- {
- if (!this.dataGrid || this.dataGrid.selectedNode !== this || !this.selected)
- return;
- this._selected = false;
- this.dataGrid.selectedNode = null;
- if (this._element)
- this._element.removeStyleClass("selected");
- if (!supressDeselectedEvent) {
- this.dispatchEventToListeners("deselected");
- this.dataGrid.dispatchEventToListeners(WebInspector.DataGrid.Events.DeselectedNode);
- }
- },
- traverseNextNode: function(skipHidden, stayWithin, dontPopulate, info)
- {
- if (!dontPopulate && this.hasChildren)
- this.dispatchEventToListeners("populate");
- if (info)
- info.depthChange = 0;
- var node = (!skipHidden || this.revealed) ? this.children[0] : null;
- if (node && (!skipHidden || this.expanded)) {
- if (info)
- info.depthChange = 1;
- return node;
- }
- if (this === stayWithin)
- return null;
- node = (!skipHidden || this.revealed) ? this.nextSibling : null;
- if (node)
- return node;
- node = this;
- while (node && !node._isRoot && !((!skipHidden || node.revealed) ? node.nextSibling : null) && node.parent !== stayWithin) {
- if (info)
- info.depthChange -= 1;
- node = node.parent;
- }
- if (!node)
- return null;
- return (!skipHidden || node.revealed) ? node.nextSibling : null;
- },
- traversePreviousNode: function(skipHidden, dontPopulate)
- {
- var node = (!skipHidden || this.revealed) ? this.previousSibling : null;
- if (!dontPopulate && node && node.hasChildren)
- node.dispatchEventToListeners("populate");
- while (node && ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null)) {
- if (!dontPopulate && node.hasChildren)
- node.dispatchEventToListeners("populate");
- node = ((!skipHidden || (node.revealed && node.expanded)) ? node.children[node.children.length - 1] : null);
- }
- if (node)
- return node;
- if (!this.parent || this.parent._isRoot)
- return null;
- return this.parent;
- },
- isEventWithinDisclosureTriangle: function(event)
- {
- if (!this.hasChildren)
- return false;
- var cell = event.target.enclosingNodeOrSelfWithNodeName("td");
- if (!cell.hasStyleClass("disclosure"))
- return false;
- var left = cell.totalOffsetLeft() + this.leftPadding;
- return event.pageX >= left && event.pageX <= left + this.disclosureToggleWidth;
- },
- _attach: function()
- {
- if (!this.dataGrid || this._attached)
- return;
- this._attached = true;
- var nextNode = null;
- var previousNode = this.traversePreviousNode(true, true);
- if (previousNode && previousNode.element.parentNode && previousNode.element.nextSibling)
- nextNode = previousNode.element.nextSibling;
- if (!nextNode)
- nextNode = this.dataGrid.dataTableBody.firstChild;
- this.dataGrid.dataTableBody.insertBefore(this.element, nextNode);
- if (this.expanded)
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._attach();
- },
- _detach: function()
- {
- if (!this._attached)
- return;
- this._attached = false;
- if (this._element && this._element.parentNode)
- this._element.parentNode.removeChild(this._element);
- for (var i = 0; i < this.children.length; ++i)
- this.children[i]._detach();
- this.wasDetached();
- },
- wasDetached: function()
- {
- },
- savePosition: function()
- {
- if (this._savedPosition)
- return;
- if (!this.parent)
- throw("savePosition: Node must have a parent.");
- this._savedPosition = {
- parent: this.parent,
- index: this.parent.children.indexOf(this)
- };
- },
- restorePosition: function()
- {
- if (!this._savedPosition)
- return;
- if (this.parent !== this._savedPosition.parent)
- this._savedPosition.parent.insertChild(this, this._savedPosition.index);
- delete this._savedPosition;
- }
- }
- WebInspector.DataGridNode.prototype.__proto__ = WebInspector.Object.prototype;
- WebInspector.CreationDataGridNode = function(data, hasChildren)
- {
- WebInspector.DataGridNode.call(this, data, hasChildren);
- this.isCreationNode = true;
- }
- WebInspector.CreationDataGridNode.prototype = {
- makeNormal: function()
- {
- delete this.isCreationNode;
- delete this.makeNormal;
- }
- }
- WebInspector.CreationDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
- WebInspector.ShowMoreDataGridNode = function(callback, startPosition, endPosition, chunkSize)
- {
- WebInspector.DataGridNode.call(this, {summaryRow:true}, false);
- this._callback = callback;
- this._startPosition = startPosition;
- this._endPosition = endPosition;
- this._chunkSize = chunkSize;
- this.showNext = document.createElement("button");
- this.showNext.setAttribute("type", "button");
- this.showNext.addEventListener("click", this._showNextChunk.bind(this), false);
- this.showNext.textContent = WebInspector.UIString("Show %d before", this._chunkSize);
- this.showAll = document.createElement("button");
- this.showAll.setAttribute("type", "button");
- this.showAll.addEventListener("click", this._showAll.bind(this), false);
- this.showLast = document.createElement("button");
- this.showLast.setAttribute("type", "button");
- this.showLast.addEventListener("click", this._showLastChunk.bind(this), false);
- this.showLast.textContent = WebInspector.UIString("Show %d after", this._chunkSize);
- this._updateLabels();
- this.selectable = false;
- }
- WebInspector.ShowMoreDataGridNode.prototype = {
- _showNextChunk: function()
- {
- this._callback(this._startPosition, this._startPosition + this._chunkSize);
- },
- _showAll: function()
- {
- this._callback(this._startPosition, this._endPosition);
- },
- _showLastChunk: function()
- {
- this._callback(this._endPosition - this._chunkSize, this._endPosition);
- },
- _updateLabels: function()
- {
- var totalSize = this._endPosition - this._startPosition;
- if (totalSize > this._chunkSize) {
- this.showNext.removeStyleClass("hidden");
- this.showLast.removeStyleClass("hidden");
- } else {
- this.showNext.addStyleClass("hidden");
- this.showLast.addStyleClass("hidden");
- }
- this.showAll.textContent = WebInspector.UIString("Show all %d", totalSize);
- },
- createCells: function()
- {
- var cell = document.createElement("td");
- if (this.depth)
- cell.style.setProperty("padding-left", (this.depth * this.dataGrid.indentWidth) + "px");
- cell.appendChild(this.showNext);
- cell.appendChild(this.showAll);
- cell.appendChild(this.showLast);
- this._element.appendChild(cell);
- var columns = this.dataGrid.columns;
- var count = 0;
- for (var c in columns)
- ++count;
- while (--count > 0) {
- cell = document.createElement("td");
- this._element.appendChild(cell);
- }
- },
- setStartPosition: function(from)
- {
- this._startPosition = from;
- this._updateLabels();
- },
- setEndPosition: function(to)
- {
- this._endPosition = to;
- this._updateLabels();
- },
- nodeHeight: function()
- {
- return 33;
- }
- };
- WebInspector.ShowMoreDataGridNode.prototype.__proto__ = WebInspector.DataGridNode.prototype;
- WebInspector.CookiesTable = function(cookieDomain, expandable, deleteCallback, refreshCallback)
- {
- WebInspector.View.call(this);
- this.element.className = "fill";
- this._cookieDomain = cookieDomain;
- var columns = { 0: {}, 1: {}, 2: {}, 3: {}, 4: {}, 5: {}, 6: {}, 7: {} };
- columns[0].title = WebInspector.UIString("Name");
- columns[0].sortable = true;
- columns[0].disclosure = expandable;
- columns[0].width = "24%";
- columns[1].title = WebInspector.UIString("Value");
- columns[1].sortable = true;
- columns[1].width = "34%";
- columns[2].title = WebInspector.UIString("Domain");
- columns[2].sortable = true;
- columns[2].width = "7%";
- columns[3].title = WebInspector.UIString("Path");
- columns[3].sortable = true;
- columns[3].width = "7%";
- columns[4].title = WebInspector.UIString("Expires");
- columns[4].sortable = true;
- columns[4].width = "7%";
- columns[5].title = WebInspector.UIString("Size");
- columns[5].aligned = "right";
- columns[5].sortable = true;
- columns[5].width = "7%";
- columns[6].title = WebInspector.UIString("HTTP");
- columns[6].aligned = "centered";
- columns[6].sortable = true;
- columns[6].width = "7%";
- columns[7].title = WebInspector.UIString("Secure");
- columns[7].aligned = "centered";
- columns[7].sortable = true;
- columns[7].width = "7%";
- this._dataGrid = new WebInspector.DataGrid(columns, undefined, deleteCallback ? this._onDeleteFromGrid.bind(this, deleteCallback) : undefined);
- this._dataGrid.addEventListener("sorting changed", this._rebuildTable, this);
- this._dataGrid.refreshCallback = refreshCallback;
- this._dataGrid.show(this.element);
- this._data = [];
- }
- WebInspector.CookiesTable.prototype = {
- updateWidths: function()
- {
- if (this._dataGrid)
- this._dataGrid.updateWidths();
- },
- setCookies: function(cookies)
- {
- this._data = [{cookies: cookies}];
- this._rebuildTable();
- },
- addCookiesFolder: function(folderName, cookies)
- {
- this._data.push({cookies: cookies, folderName: folderName});
- this._rebuildTable();
- },
- get selectedCookie()
- {
- var node = this._dataGrid.selectedNode;
- return node ? node.cookie : null;
- },
- _rebuildTable: function()
- {
- this._dataGrid.rootNode().removeChildren();
- for (var i = 0; i < this._data.length; ++i) {
- var item = this._data[i];
- if (item.folderName) {
- var groupData = [ item.folderName, "", "", "", "", this._totalSize(item.cookies), "", "" ];
- var groupNode = new WebInspector.DataGridNode(groupData);
- groupNode.selectable = true;
- this._dataGrid.rootNode().appendChild(groupNode);
- groupNode.element.addStyleClass("row-group");
- this._populateNode(groupNode, item.cookies);
- groupNode.expand();
- } else
- this._populateNode(this._dataGrid.rootNode(), item.cookies);
- }
- },
- _populateNode: function(parentNode, cookies)
- {
- var selectedCookie = this.selectedCookie;
- parentNode.removeChildren();
- if (!cookies)
- return;
- this._sortCookies(cookies);
- for (var i = 0; i < cookies.length; ++i) {
- var cookieNode = this._createGridNode(cookies[i]);
- parentNode.appendChild(cookieNode);
- if (selectedCookie === cookies[i])
- cookieNode.selected = true;
- }
- },
- _totalSize: function(cookies)
- {
- var totalSize = 0;
- for (var i = 0; cookies && i < cookies.length; ++i)
- totalSize += cookies[i].size;
- return totalSize;
- },
- _sortCookies: function(cookies)
- {
- var sortDirection = this._dataGrid.sortOrder === "ascending" ? 1 : -1;
- function localeCompare(field, cookie1, cookie2)
- {
- return sortDirection * (cookie1[field] + "").localeCompare(cookie2[field] + "")
- }
- function numberCompare(field, cookie1, cookie2)
- {
- return sortDirection * (cookie1[field] - cookie2[field]);
- }
- function expiresCompare(cookie1, cookie2)
- {
- if (cookie1.session !== cookie2.session)
- return sortDirection * (cookie1.session ? 1 : -1);
- if (cookie1.session)
- return 0;
- return sortDirection * (cookie1.expires - cookie2.expires);
- }
- var comparator;
- switch (parseInt(this._dataGrid.sortColumnIdentifier, 10)) {
- case 0: comparator = localeCompare.bind(this, "name"); break;
- case 1: comparator = localeCompare.bind(this, "value"); break;
- case 2: comparator = localeCompare.bind(this, "domain"); break;
- case 3: comparator = localeCompare.bind(this, "path"); break;
- case 4: comparator = expiresCompare; break;
- case 5: comparator = numberCompare.bind(this, "size"); break;
- case 6: comparator = localeCompare.bind(this, "httpOnly"); break;
- case 7: comparator = localeCompare.bind(this, "secure"); break;
- default: localeCompare.bind(this, "name");
- }
- cookies.sort(comparator);
- },
- _createGridNode: function(cookie)
- {
- var data = {};
- data[0] = cookie.name;
- data[1] = cookie.value;
- data[2] = cookie.domain || "";
- data[3] = cookie.path || "";
- data[4] = cookie.type === WebInspector.Cookie.Type.Request ? "" :
- (cookie.session ? WebInspector.UIString("Session") : new Date(cookie.expires).toGMTString());
- data[5] = cookie.size;
- const checkmark = "\u2713";
- data[6] = (cookie.httpOnly ? checkmark : "");
- data[7] = (cookie.secure ? checkmark : "");
- var node = new WebInspector.DataGridNode(data);
- node.cookie = cookie;
- node.selectable = true;
- return node;
- },
- _onDeleteFromGrid: function(deleteCallback, node)
- {
- deleteCallback(node.cookie);
- }
- }
- WebInspector.CookiesTable.prototype.__proto__ = WebInspector.View.prototype;
- WebInspector.CookieItemsView = function(treeElement, cookieDomain)
- {
- WebInspector.View.call(this);
- this.element.addStyleClass("storage-view");
- this._deleteButton = new WebInspector.StatusBarButton(WebInspector.UIString("Delete"), "delete-storage-status-bar-item");
- this._deleteButton.visible = false;
- this._deleteButton.addEventListener("click", this._deleteButtonClicked, this);
- this._refreshButton = new WebInspector.StatusBarButton(WebInspector.UIString("Refresh"), "refresh-storage-status-bar-item");
- this._refreshButton.addEventListener("click", this._refreshButtonClicked, this);
- this._treeElement = treeElement;
- this._cookieDomain = cookieDomain;
- this._emptyView = new WebInspector.EmptyView(WebInspector.UIString("This site has no cookies."));
- this._emptyView.show(this.element);
- this.element.addEventListener("contextmenu", this._contextMenu.bind(this), true);
- }
- WebInspector.CookieItemsView.prototype = {
- get statusBarItems()
- {
- return [this._refreshButton.element, this._deleteButton.element];
- },
- wasShown: function()
- {
- this._update();
- },
- willHide: function()
- {
- this._deleteButton.visible = false;
- },
- _update: function()
- {
- WebInspector.Cookies.getCookiesAsync(this._updateWithCookies.bind(this));
- },
- _updateWithCookies: function(allCookies, isAdvanced)
- {
- this._cookies = isAdvanced ? this._filterCookiesForDomain(allCookies) : allCookies;
- if (!this._cookies.length) {
- this._emptyView.show(this.element);
- this._deleteButton.visible = false;
- if (this._cookiesTable)
- this._cookiesTable.detach();
- return;
- }
- if (!this._cookiesTable)
- this._cookiesTable = isAdvanced ? new WebInspector.CookiesTable(this._cookieDomain, false, this._deleteCookie.bind(this), this._update.bind(this))