/**
* @constructor
* @extends {WebInspector.SelectionDialogContentProvider}
- * @param {!WebInspector.View} view
* @param {!WebInspector.UISourceCode} uiSourceCode
* @param {function(number, number)} selectItemCallback
*/
-WebInspector.StyleSheetOutlineDialog = function(view, uiSourceCode, selectItemCallback)
+WebInspector.StyleSheetOutlineDialog = function(uiSourceCode, selectItemCallback)
{
WebInspector.SelectionDialogContentProvider.call(this);
this._selectItemCallback = selectItemCallback;
this._rules = [];
- this._view = view;
- this._uiSourceCode = uiSourceCode;
- this._requestItems();
+ this._outlineWorker = new Worker("ScriptFormatterWorker.js");
+ this._outlineWorker.onmessage = this._didBuildOutlineChunk.bind(this);
+ this._outlineWorker.postMessage({ method: "cssOutline", params: { content: uiSourceCode.workingCopy() } });
}
/**
{
if (WebInspector.Dialog.currentInstance())
return null;
- var delegate = new WebInspector.StyleSheetOutlineDialog(view, uiSourceCode, selectItemCallback);
+ var delegate = new WebInspector.StyleSheetOutlineDialog(uiSourceCode, selectItemCallback);
var filteredItemSelectionDialog = new WebInspector.FilteredItemSelectionDialog(delegate);
WebInspector.Dialog.show(view.element, filteredItemSelectionDialog);
}
WebInspector.StyleSheetOutlineDialog.prototype = {
/**
+ * @param {!MessageEvent} event
+ */
+ _didBuildOutlineChunk: function(event)
+ {
+ var data = /** @type {!WebInspector.StyleSheetOutlineDialog.MessageEventData} */ (event.data);
+ var chunk = data.chunk;
+ for (var i = 0; i < chunk.length; ++i)
+ this._rules.push(chunk[i]);
+
+ if (data.total === data.index)
+ this.dispose();
+
+ this.refresh();
+ },
+
+ /**
* @return {number}
*/
itemCount: function()
*/
itemKeyAt: function(itemIndex)
{
- return this._rules[itemIndex].selectorText;
+ var rule = this._rules[itemIndex];
+ return rule.selectorText || rule.atRule;
},
/**
itemScoreAt: function(itemIndex, query)
{
var rule = this._rules[itemIndex];
- return -rule.rawLocation.lineNumber;
+ return -rule.lineNumber;
},
/**
renderItem: function(itemIndex, query, titleElement, subtitleElement)
{
var rule = this._rules[itemIndex];
- titleElement.textContent = rule.selectorText;
+ titleElement.textContent = rule.selectorText || rule.atRule;
this.highlightRanges(titleElement, query);
- subtitleElement.textContent = ":" + (rule.rawLocation.lineNumber + 1);
- },
-
- _requestItems: function()
- {
- /**
- * @param {?Protocol.Error} error
- * @param {!Array.<!CSSAgent.CSSStyleSheetHeader>} infos
- * @this {WebInspector.StyleSheetOutlineDialog}
- */
- function didGetAllStyleSheets(error, infos)
- {
- if (error)
- return;
-
- for (var i = 0; i < infos.length; ++i) {
- var info = infos[i];
- if (info.sourceURL === this._uiSourceCode.url) {
- WebInspector.CSSStyleSheet.createForId(info.styleSheetId, didGetStyleSheet.bind(this));
- return;
- }
- }
- }
-
- CSSAgent.getAllStyleSheets(didGetAllStyleSheets.bind(this));
-
- /**
- * @param {?WebInspector.CSSStyleSheet} styleSheet
- * @this {WebInspector.StyleSheetOutlineDialog}
- */
- function didGetStyleSheet(styleSheet)
- {
- if (!styleSheet)
- return;
-
- this._rules = styleSheet.rules;
- this.refresh();
- }
+ subtitleElement.textContent = ":" + (rule.lineNumber + 1);
},
/**
selectItem: function(itemIndex, promptValue)
{
var rule = this._rules[itemIndex];
- var lineNumber = rule.rawLocation.lineNumber;
+ var lineNumber = rule.lineNumber;
if (!isNaN(lineNumber) && lineNumber >= 0)
- this._selectItemCallback(lineNumber, rule.rawLocation.columnNumber);
+ this._selectItemCallback(lineNumber, rule.columnNumber);
+ },
+
+ dispose: function()
+ {
+ if (this._outlineWorker) {
+ this._outlineWorker.terminate();
+ delete this._outlineWorker;
+ }
},
__proto__: WebInspector.SelectionDialogContentProvider.prototype
}
+
+/**
+ * @typedef {{index: number, total: number, chunk: !Array.<!{selectorText: ?string, atRule: ?string, lineNumber: number, columnNumber: number}>}}
+ */
+WebInspector.StyleSheetOutlineDialog.MessageEventData;