Skip to content

Commit

Permalink
squash 'resources/unpacked/devtools' changes from 4edefc6..f4c45a0
Browse files Browse the repository at this point in the history
f4c45a0 [devtools] Support different encodings for Page.CaptureScreenshot.
2cde168 Revert of DevTools: Correct Source Panel Show/Hide Toolbar buttons (patchset #1 id:1 of https://codereview.chromium.org/2600493002/ )
53bf5fa Timeline: remove the remains of TimelineModel.Record
4a470d6 DevTools: convert datagrid and network waterfall sort icons to UI.Icon
c6ec1da [DevTools] Support BreakReason.OOM
830adfe [DevTools] Fix overflow in devices view.
ca89e20 DevTools: Console: Provide autocompletions for Maps
6a0cd76 DevTools: fix network waterfall sorting icon
1ac9326 Timeline: rewrite TimelineUIUtils.buildRangeStats() to work without TimelineRecord
bbdd9d2 DevTools: render (verbose|info) (intervensions|deprecations|violations) with warning background.
db4c148 Revert of DevTools: Console: Provide autocompletions for Maps (patchset #6 id:100001 of https://codereview.chromium.org/2639703002/ )
4da9dcd [DevTools] Hide empty toolbars
f1eb331 DevTools: introduce object previews experiment
4e4a20f DevTools: Console: Provide autocompletions for Maps
50f80e6 DevTools: align tabbed pane close tab buttons.
3be25d0 Revert of [devtools] Support different encodings for Page.CaptureScreenshot. (patchset #8 id:480001 of https://codereview.chromium.org/2592983002/ )

git-subtree-dir: resources/unpacked/devtools
git-subtree-split: f4c45a0
  • Loading branch information
darwin committed Jan 25, 2017
1 parent 53de4c8 commit 97116fc
Show file tree
Hide file tree
Showing 31 changed files with 505 additions and 432 deletions.
2 changes: 1 addition & 1 deletion front_end/components/CustomPreviewSection.js
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ Components.CustomPreviewSection = class {
this._header.classList.toggle('expanded', this._expanded);
this._cachedContent.classList.toggle('hidden', !this._expanded);
if (this._expanded)
this._expandIcon.setIconType('smallicon-triangle-bottom');
this._expandIcon.setIconType('smallicon-triangle-down');
else
this._expandIcon.setIconType('smallicon-triangle-right');
}
Expand Down
2 changes: 1 addition & 1 deletion front_end/components/EventListenersUtils.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ SDK.EventListener.frameworkEventListeners = function(object) {
* @return {!Promise<!{properties: ?Array.<!SDK.RemoteObjectProperty>, internalProperties: ?Array.<!SDK.RemoteObjectProperty>}>}
*/
function getOwnProperties(object) {
return object.getOwnPropertiesPromise();
return object.getOwnPropertiesPromise(false /* generatePreview */);
}

/**
Expand Down
3 changes: 2 additions & 1 deletion front_end/components/EventListenersView.js
Original file line number Diff line number Diff line change
Expand Up @@ -285,7 +285,8 @@ Components.ObjectEventListenerBar = class extends UI.TreeElement {
var subtitle = this.listItemElement.createChild('span', 'event-listener-tree-subtitle');
subtitle.appendChild(linkifier.linkifyRawLocation(this._eventListener.location(), this._eventListener.sourceURL()));

title.appendChild(Components.ObjectPropertiesSection.createValueElement(object, false));
title.appendChild(
Components.ObjectPropertiesSection.createValueElement(object, false /* wasThrown */, false /* showPreview */));

if (this._eventListener.removeFunction()) {
var deleteButton = title.createChild('span', 'event-listener-button');
Expand Down
142 changes: 127 additions & 15 deletions front_end/components/JavaScriptAutocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,24 @@ Components.JavaScriptAutocomplete.CompletionGroup;
* @return {!Promise<!UI.SuggestBox.Suggestions>}
*/
Components.JavaScriptAutocomplete.completionsForTextInCurrentContext = function(text, query, force) {
var clippedExpression = Components.JavaScriptAutocomplete._clipExpression(text, true);
var mapCompletionsPromise = Components.JavaScriptAutocomplete._mapCompletions(text, query);
return Components.JavaScriptAutocomplete.completionsForExpression(clippedExpression, query, force)
.then(completions => mapCompletionsPromise.then(mapCompletions => mapCompletions.concat(completions)));
};

/**
* @param {string} text
* @param {boolean=} allowEndingBracket
* @return {string}
*/
Components.JavaScriptAutocomplete._clipExpression = function(text, allowEndingBracket) {
var index;
var stopChars = new Set('=:({;,!+-*/&|^<>`'.split(''));
var whiteSpaceChars = new Set(' \r\n\t'.split(''));
var continueChars = new Set('[. \r\n\t'.split(''));

for (index = text.length - 1; index >= 0; index--) {
// Pass less stop characters to rangeOfWord so the range will be a more complete expression.
if (stopChars.has(text.charAt(index)))
break;
if (whiteSpaceChars.has(text.charAt(index)) && !continueChars.has(text.charAt(index - 1)))
Expand All @@ -35,16 +46,112 @@ Components.JavaScriptAutocomplete.completionsForTextInCurrentContext = function(
if (character === ']')
bracketCount++;
// Allow an open bracket at the end for property completion.
if (character === '[' && index < clippedExpression.length - 1) {
if (character === '[' && (index < clippedExpression.length - 1 || !allowEndingBracket)) {
bracketCount--;
if (bracketCount < 0)
break;
}
index--;
}
clippedExpression = clippedExpression.substring(index + 1).trim();
return clippedExpression.substring(index + 1).trim();
};

/**
* @param {string} text
* @param {string} query
* @return {!Promise<!UI.SuggestBox.Suggestions>}
*/
Components.JavaScriptAutocomplete._mapCompletions = function(text, query) {
var mapMatch = text.match(/\.\s*(get|set|delete)\s*\(\s*$/);
var executionContext = UI.context.flavor(SDK.ExecutionContext);
if (!executionContext || !mapMatch)
return Promise.resolve([]);

var clippedExpression = Components.JavaScriptAutocomplete._clipExpression(text.substring(0, mapMatch.index));
var fulfill;
var promise = new Promise(x => fulfill = x);
executionContext.evaluate(clippedExpression, 'completion', true, true, false, false, false, evaluated);
return promise;

/**
* @param {?SDK.RemoteObject} result
* @param {!Protocol.Runtime.ExceptionDetails=} exceptionDetails
*/
function evaluated(result, exceptionDetails) {
if (!result || !!exceptionDetails || result.subtype !== 'map') {
fulfill([]);
return;
}
result.getOwnPropertiesPromise(false).then(extractEntriesProperty);
}

/**
* @param {!{properties: ?Array<!SDK.RemoteObjectProperty>, internalProperties: ?Array<!SDK.RemoteObjectProperty>}} properties
*/
function extractEntriesProperty(properties) {
var internalProperties = properties.internalProperties || [];
var entriesProperty = internalProperties.find(property => property.name === '[[Entries]]');
if (!entriesProperty) {
fulfill([]);
return;
}
entriesProperty.value.callFunctionJSONPromise(getEntries).then(keysObj => gotKeys(Object.keys(keysObj)));
}

/**
* @suppressReceiverCheck
* @this {!Array<{key:?, value:?}>}
* @return {!Object}
*/
function getEntries() {
var result = {__proto__: null};
for (var i = 0; i < this.length; i++) {
if (typeof this[i].key === 'string')
result[this[i].key] = true;
}
return result;
}

return Components.JavaScriptAutocomplete.completionsForExpression(clippedExpression, query, force);
/**
* @param {!Array<string>} rawKeys
*/
function gotKeys(rawKeys) {
var caseSensitivePrefix = [];
var caseInsensitivePrefix = [];
var caseSensitiveAnywhere = [];
var caseInsensitiveAnywhere = [];
var quoteChar = '"';
if (query.startsWith('\''))
quoteChar = '\'';
var endChar = ')';
if (mapMatch[0].indexOf('set') !== -1)
endChar = ', ';

var sorter = rawKeys.length < 1000 ? String.naturalOrderComparator : undefined;
var keys = rawKeys.sort(sorter).map(key => quoteChar + key + quoteChar + endChar);

for (var key of keys) {
if (key.length < query.length)
continue;
if (query.length && key.toLowerCase().indexOf(query.toLowerCase()) === -1)
continue;
// Substitute actual newlines with newline characters. @see crbug.com/498421
var title = key.split('\n').join('\\n');

if (key.startsWith(query))
caseSensitivePrefix.push({title: title, priority: 4});
else if (key.toLowerCase().startsWith(query.toLowerCase()))
caseInsensitivePrefix.push({title: title, priority: 3});
else if (key.indexOf(query) !== -1)
caseSensitiveAnywhere.push({title: title, priority: 2});
else
caseInsensitiveAnywhere.push({title: title, priority: 1});
}
var suggestions = caseSensitivePrefix.concat(caseInsensitivePrefix, caseSensitiveAnywhere, caseInsensitiveAnywhere);
if (suggestions.length)
suggestions[0].subtitle = Common.UIString('Keys');
fulfill(suggestions);
}
};

/**
Expand Down Expand Up @@ -76,8 +183,8 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
if (!query && !expressionString && !force)
return Promise.resolve([]);

var fufill;
var promise = new Promise(x => fufill = x);
var fulfill;
var promise = new Promise(x => fulfill = x);
var selectedFrame = executionContext.debuggerModel.selectedCallFrame();
if (!expressionString && selectedFrame)
variableNamesInScopes(selectedFrame, receivedPropertyNames);
Expand All @@ -91,7 +198,7 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
*/
function evaluated(result, exceptionDetails) {
if (!result || !!exceptionDetails) {
fufill([]);
fulfill([]);
return;
}

Expand All @@ -104,7 +211,9 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
return Promise.resolve(/** @type {?SDK.RemoteObject} */ (null));
if (object.type !== 'object' || object.subtype !== 'proxy')
return Promise.resolve(/** @type {?SDK.RemoteObject} */ (object));
return object.getOwnPropertiesPromise().then(extractTargetFromProperties).then(extractTarget);
return object.getOwnPropertiesPromise(false /* generatePreview */)
.then(extractTargetFromProperties)
.then(extractTarget);
}

/**
Expand Down Expand Up @@ -206,7 +315,9 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
for (var i = 0; i < scopeChain.length; ++i) {
var scope = scopeChain[i];
var object = scope.object();
object.getAllProperties(false, propertiesCollected.bind(null, scope.typeName()));
object.getAllProperties(
false /* accessorPropertiesOnly */, false /* generatePreview */,
propertiesCollected.bind(null, scope.typeName()));
}
}

Expand All @@ -219,7 +330,7 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
if (result && !exceptionDetails)
receivedPropertyNames(/** @type {!Object} */ (result.value));
else
fufill([]);
fulfill([]);
}

/**
Expand All @@ -228,7 +339,7 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
function receivedPropertyNames(object) {
executionContext.target().runtimeAgent().releaseObjectGroup('completion');
if (!object) {
fufill([]);
fulfill([]);
return;
}
var propertyGroups = /** @type {!Array<!Components.JavaScriptAutocomplete.CompletionGroup>} */ (object);
Expand Down Expand Up @@ -258,7 +369,7 @@ Components.JavaScriptAutocomplete.completionsForExpression = function(expression
];
propertyGroups.push({items: commandLineAPI});
}
fufill(Components.JavaScriptAutocomplete._completionsForQuery(
fulfill(Components.JavaScriptAutocomplete._completionsForQuery(
dotNotation, bracketNotation, expressionString, query, propertyGroups));
}
};
Expand Down Expand Up @@ -292,7 +403,7 @@ Components.JavaScriptAutocomplete._completionsForQuery = function(
var result = [];
var lastGroupTitle;
for (var group of propertyGroups) {
group.items.sort(itemComparator);
group.items.sort(itemComparator.bind(null, group.items.length > 1000));
var caseSensitivePrefix = [];
var caseInsensitivePrefix = [];
var caseSensitiveAnywhere = [];
Expand Down Expand Up @@ -336,17 +447,18 @@ Components.JavaScriptAutocomplete._completionsForQuery = function(
return result;

/**
* @param {boolean} naturalOrder
* @param {string} a
* @param {string} b
* @return {number}
*/
function itemComparator(a, b) {
function itemComparator(naturalOrder, a, b) {
var aStartsWithUnderscore = a.startsWith('_');
var bStartsWithUnderscore = b.startsWith('_');
if (aStartsWithUnderscore && !bStartsWithUnderscore)
return 1;
if (bStartsWithUnderscore && !aStartsWithUnderscore)
return -1;
return String.naturalOrderComparator(a, b);
return naturalOrder ? String.naturalOrderComparator(a, b) : a.localeCompare(b);
}
};
1 change: 1 addition & 0 deletions front_end/components/ObjectPopoverHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ Components.ObjectPopoverHelper = class extends UI.PopoverHelper {

if (result.type === 'function') {
result.getOwnProperties(
false /* generatePreview */,
didGetFunctionProperties.bind(this, result, popoverContentElement, valueElement, anchorElement));
return;
}
Expand Down
32 changes: 22 additions & 10 deletions front_end/components/ObjectPropertiesSection.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,8 @@ Components.ObjectPropertiesSection = class extends UI.TreeOutlineInShadow {
static defaultObjectPresentation(object, linkifier, skipProto) {
var componentRoot = createElementWithClass('span', 'source-code');
var shadowRoot = UI.createShadowRootWithCoreStyles(componentRoot, 'components/objectValue.css');
shadowRoot.appendChild(Components.ObjectPropertiesSection.createValueElement(object, false));
shadowRoot.appendChild(
Components.ObjectPropertiesSection.createValueElement(object, false /* wasThrown */, true /* showPreview */));
if (!object.hasChildren)
return componentRoot;

Expand Down Expand Up @@ -218,27 +219,30 @@ Components.ObjectPropertiesSection = class extends UI.TreeOutlineInShadow {
/**
* @param {!SDK.RemoteObject} value
* @param {boolean} wasThrown
* @param {boolean} showPreview
* @param {!Element=} parentElement
* @param {!Components.Linkifier=} linkifier
* @return {!Element}
*/
static createValueElementWithCustomSupport(value, wasThrown, parentElement, linkifier) {
static createValueElementWithCustomSupport(value, wasThrown, showPreview, parentElement, linkifier) {
if (value.customPreview()) {
var result = (new Components.CustomPreviewComponent(value)).element;
result.classList.add('object-properties-section-custom-section');
return result;
}
return Components.ObjectPropertiesSection.createValueElement(value, wasThrown, parentElement, linkifier);
return Components.ObjectPropertiesSection.createValueElement(
value, wasThrown, showPreview, parentElement, linkifier);
}

/**
* @param {!SDK.RemoteObject} value
* @param {boolean} wasThrown
* @param {boolean} showPreview
* @param {!Element=} parentElement
* @param {!Components.Linkifier=} linkifier
* @return {!Element}
*/
static createValueElement(value, wasThrown, parentElement, linkifier) {
static createValueElement(value, wasThrown, showPreview, parentElement, linkifier) {
var valueElement;
var type = value.type;
var subtype = value.subtype;
Expand All @@ -261,8 +265,13 @@ Components.ObjectPropertiesSection = class extends UI.TreeOutlineInShadow {
parentElement.classList.add('hbox');
} else {
valueElement = createElementWithClass('span', 'object-value-' + (subtype || type));
valueElement.setTextContentTruncatedIfNeeded(description);
valueElement.title = description || '';
if (Runtime.experiments.isEnabled('objectPreviews') && value.preview && showPreview) {
var previewFormatter = new Components.RemoteObjectPreviewFormatter();
previewFormatter.appendObjectPreview(valueElement, value.preview, false /* isEntry */);
} else {
valueElement.setTextContentTruncatedIfNeeded(description);
}
}

if (wasThrown) {
Expand Down Expand Up @@ -546,10 +555,11 @@ Components.ObjectPropertyTreeElement = class extends UI.TreeElement {
treeElement, properties, internalProperties, skipProto, targetValue || value, linkifier, emptyPlaceholder);
}

var generatePreview = Runtime.experiments.isEnabled('objectPreviews');
if (flattenProtoChain)
value.getAllProperties(false, callback);
value.getAllProperties(false, generatePreview, callback);
else
SDK.RemoteObject.loadFromObjectPerProto(value, callback);
SDK.RemoteObject.loadFromObjectPerProto(value, generatePreview, callback);
}

/**
Expand Down Expand Up @@ -781,8 +791,9 @@ Components.ObjectPropertyTreeElement = class extends UI.TreeElement {
separatorElement.textContent = ': ';

if (this.property.value) {
var showPreview = this.property.name !== '__proto__';
this.valueElement = Components.ObjectPropertiesSection.createValueElementWithCustomSupport(
this.property.value, this.property.wasThrown, this.listItemElement, this._linkifier);
this.property.value, this.property.wasThrown, showPreview, this.listItemElement, this._linkifier);
this.valueElement.addEventListener('contextmenu', this._contextMenuFired.bind(this, this.property), false);
} else if (this.property.getter) {
this.valueElement = Components.ObjectPropertyTreeElement.createRemoteObjectAccessorPropertySpan(
Expand Down Expand Up @@ -1166,7 +1177,8 @@ Components.ArrayGroupingTreeElement = class extends UI.TreeElement {
function processArrayFragment(arrayFragment, wasThrown) {
if (!arrayFragment || wasThrown)
return;
arrayFragment.getAllProperties(false, processProperties.bind(this));
arrayFragment.getAllProperties(
false, Runtime.experiments.isEnabled('objectPreviews'), processProperties.bind(this));
}

/** @this {Components.ArrayGroupingTreeElement} */
Expand Down Expand Up @@ -1224,7 +1236,7 @@ Components.ArrayGroupingTreeElement = class extends UI.TreeElement {
function processObjectFragment(arrayFragment, wasThrown) {
if (!arrayFragment || wasThrown)
return;
arrayFragment.getOwnProperties(processProperties.bind(this));
arrayFragment.getOwnProperties(Runtime.experiments.isEnabled('objectPreviews'), processProperties.bind(this));
}

/**
Expand Down
Loading

0 comments on commit 97116fc

Please sign in to comment.