summaryrefslogtreecommitdiff
path: root/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js')
-rw-r--r--Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js301
1 files changed, 0 insertions, 301 deletions
diff --git a/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js b/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js
deleted file mode 100644
index 24f327baa..000000000
--- a/Source/WebInspectorUI/UserInterface/Controllers/JavaScriptRuntimeCompletionProvider.js
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2013 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. 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 INC. 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.
- */
-
-Object.defineProperty(WebInspector, "javaScriptRuntimeCompletionProvider",
-{
- get: function()
- {
- if (!WebInspector.JavaScriptRuntimeCompletionProvider._instance)
- WebInspector.JavaScriptRuntimeCompletionProvider._instance = new WebInspector.JavaScriptRuntimeCompletionProvider;
- return WebInspector.JavaScriptRuntimeCompletionProvider._instance;
- }
-});
-
-WebInspector.JavaScriptRuntimeCompletionProvider = class JavaScriptRuntimeCompletionProvider extends WebInspector.Object
-{
- constructor()
- {
- super();
-
- console.assert(!WebInspector.JavaScriptRuntimeCompletionProvider._instance);
-
- WebInspector.debuggerManager.addEventListener(WebInspector.DebuggerManager.Event.ActiveCallFrameDidChange, this._clearLastProperties, this);
- }
-
- // Protected
-
- completionControllerCompletionsNeeded(completionController, defaultCompletions, base, prefix, suffix, forced)
- {
- // Don't allow non-forced empty prefix completions unless the base is that start of property access.
- if (!forced && !prefix && !/[.[]$/.test(base)) {
- completionController.updateCompletions(null);
- return;
- }
-
- // If the base ends with an open parentheses or open curly bracket then treat it like there is
- // no base so we get global object completions.
- if (/[({]$/.test(base))
- base = "";
-
- var lastBaseIndex = base.length - 1;
- var dotNotation = base[lastBaseIndex] === ".";
- var bracketNotation = base[lastBaseIndex] === "[";
-
- if (dotNotation || bracketNotation) {
- base = base.substring(0, lastBaseIndex);
-
- // Don't suggest anything for an empty base that is using dot notation.
- // Bracket notation with an empty base will be treated as an array.
- if (!base && dotNotation) {
- completionController.updateCompletions(defaultCompletions);
- return;
- }
-
- // Don't allow non-forced empty prefix completions if the user is entering a number, since it might be a float.
- // But allow number completions if the base already has a decimal, so "10.0." will suggest Number properties.
- if (!forced && !prefix && dotNotation && base.indexOf(".") === -1 && parseInt(base, 10) == base) {
- completionController.updateCompletions(null);
- return;
- }
-
- // An empty base with bracket notation is not property access, it is an array.
- // Clear the bracketNotation flag so completions are not quoted.
- if (!base && bracketNotation)
- bracketNotation = false;
- }
-
- // If the base is the same as the last time, we can reuse the property names we have already gathered.
- // Doing this eliminates delay caused by the async nature of the code below and it only calls getters
- // and functions once instead of repetitively. Sure, there can be difference each time the base is evaluated,
- // but this optimization gives us more of a win. We clear the cache after 30 seconds or when stepping in the
- // debugger to make sure we don't use stale properties in most cases.
- if (this._lastBase === base && this._lastPropertyNames) {
- receivedPropertyNames.call(this, this._lastPropertyNames);
- return;
- }
-
- this._lastBase = base;
- this._lastPropertyNames = null;
-
- var activeCallFrame = WebInspector.debuggerManager.activeCallFrame;
- if (!base && activeCallFrame && !this._alwaysEvaluateInWindowContext)
- activeCallFrame.collectScopeChainVariableNames(receivedPropertyNames.bind(this));
- else
- WebInspector.runtimeManager.evaluateInInspectedWindow(base, "completion", true, true, false, false, false, evaluated.bind(this));
-
- function updateLastPropertyNames(propertyNames)
- {
- if (this._clearLastPropertiesTimeout)
- clearTimeout(this._clearLastPropertiesTimeout);
- this._clearLastPropertiesTimeout = setTimeout(this._clearLastProperties.bind(this), WebInspector.JavaScriptLogViewController.CachedPropertiesDuration);
-
- this._lastPropertyNames = propertyNames || {};
- }
-
- function evaluated(result, wasThrown)
- {
- if (wasThrown || !result || result.type === "undefined" || (result.type === "object" && result.subtype === "null")) {
- RuntimeAgent.releaseObjectGroup("completion");
-
- updateLastPropertyNames.call(this, {});
- completionController.updateCompletions(defaultCompletions);
-
- return;
- }
-
- function getArrayCompletions(primitiveType)
- {
- var array = this;
- var arrayLength;
-
- var resultSet = {};
- for (var o = array; o; o = o.__proto__) {
- try {
- if (o === array && o.length) {
- // If the array type has a length, don't include a list of all the indexes.
- // Include it at the end and the frontend can build the list.
- arrayLength = o.length;
- } else {
- var names = Object.getOwnPropertyNames(o);
- for (var i = 0; i < names.length; ++i)
- resultSet[names[i]] = true;
- }
- } catch (e) {
- // Ignore
- }
- }
-
- if (arrayLength)
- resultSet["length"] = arrayLength;
-
- return resultSet;
- }
-
- 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 if (primitiveType === "symbol")
- object = Symbol();
- 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) {
- // Ignore
- }
- }
-
- return resultSet;
- }
-
- if (result.subtype === "array")
- result.callFunctionJSON(getArrayCompletions, undefined, receivedArrayPropertyNames.bind(this));
- else 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" || result.type === "symbol")
- WebInspector.runtimeManager.evaluateInInspectedWindow("(" + getCompletions + ")(\"" + result.type + "\")", "completion", false, true, true, false, false, receivedPropertyNamesFromEvaluate.bind(this));
- else
- console.error("Unknown result type: " + result.type);
- }
-
- function receivedPropertyNamesFromEvaluate(object, wasThrown, result)
- {
- receivedPropertyNames.call(this, result && !wasThrown ? result.value : null);
- }
-
- function receivedArrayPropertyNames(propertyNames)
- {
- // FIXME: <https://webkit.org/b/143589> Web Inspector: Better handling for large collections in Object Trees
- // If there was an array like object, we generate autocompletion up to 1000 indexes, but this should
- // handle a list with arbitrary length.
- if (propertyNames && typeof propertyNames.length === "number") {
- var max = Math.min(propertyNames.length, 1000);
- for (var i = 0; i < max; ++i)
- propertyNames[i] = true;
- }
-
- receivedPropertyNames.call(this, propertyNames);
- }
-
- function receivedPropertyNames(propertyNames)
- {
- propertyNames = propertyNames || {};
-
- updateLastPropertyNames.call(this, propertyNames);
-
- RuntimeAgent.releaseObjectGroup("completion");
-
- if (!base) {
- var commandLineAPI = ["$", "$$", "$x", "dir", "dirxml", "keys", "values", "profile", "profileEnd", "monitorEvents", "unmonitorEvents", "inspect", "copy", "clear", "getEventListeners", "$0", "$_"];
- if (WebInspector.debuggerManager.paused && WebInspector.debuggerManager.pauseReason === WebInspector.DebuggerManager.PauseReason.Exception)
- commandLineAPI.push("$exception");
- for (var i = 0; i < commandLineAPI.length; ++i)
- propertyNames[commandLineAPI[i]] = true;
-
- // FIXME: Due to caching, sometimes old $n values show up as completion results even though they are not available. We should clear that proactively.
- for (var i = 1; i <= WebInspector.ConsoleCommandResultMessage.maximumSavedResultIndex; ++i)
- propertyNames["$" + i] = true;
- }
-
- propertyNames = Object.keys(propertyNames);
-
- var implicitSuffix = "";
- if (bracketNotation) {
- var quoteUsed = prefix[0] === "'" ? "'" : "\"";
- if (suffix !== "]" && suffix !== quoteUsed)
- implicitSuffix = "]";
- }
-
- var completions = defaultCompletions;
- var knownCompletions = completions.keySet();
-
- for (var i = 0; i < propertyNames.length; ++i) {
- var property = propertyNames[i];
-
- if (dotNotation && !/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(property))
- continue;
-
- if (bracketNotation) {
- if (parseInt(property) != property)
- property = quoteUsed + property.escapeCharacters(quoteUsed + "\\") + (suffix !== quoteUsed ? quoteUsed : "");
- }
-
- if (!property.startsWith(prefix) || property in knownCompletions)
- continue;
-
- completions.push(property);
- knownCompletions[property] = true;
- }
-
- function compare(a, b)
- {
- // Try to sort in numerical order first.
- let numericCompareResult = a - b;
- if (!isNaN(numericCompareResult))
- return numericCompareResult;
-
- // Sort __defineGetter__, __lookupGetter__, and friends last.
- let aRareProperty = a.startsWith("__") && a.endsWith("__");
- let bRareProperty = b.startsWith("__") && b.endsWith("__");
- if (aRareProperty && !bRareProperty)
- return 1;
- if (!aRareProperty && bRareProperty)
- return -1;
-
- // Not numbers, sort as strings.
- return a.localeCompare(b);
- }
-
- completions.sort(compare);
-
- completionController.updateCompletions(completions, implicitSuffix);
- }
- }
-
- // Private
-
- _clearLastProperties()
- {
- if (this._clearLastPropertiesTimeout) {
- clearTimeout(this._clearLastPropertiesTimeout);
- delete this._clearLastPropertiesTimeout;
- }
-
- // Clear the cache of property names so any changes while stepping or sitting idle get picked up if the same
- // expression is evaluated again.
- this._lastPropertyNames = null;
- }
-};