Index: chrome/browser/resources/extensions/extension_code.js |
diff --git a/chrome/browser/resources/extensions/extension_code.js b/chrome/browser/resources/extensions/extension_code.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ce806f20b50961e2ad451f84c5b113936e5ac302 |
--- /dev/null |
+++ b/chrome/browser/resources/extensions/extension_code.js |
@@ -0,0 +1,108 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+cr.define('extensions', function() { |
+ 'use strict'; |
+ |
+ /** |
+ * ExtensionCode is an element which displays code in a styled div, and is |
+ * designed to highlight errors. |
+ */ |
+ function ExtensionCode(div) { |
+ div.__proto__ = ExtensionCode.prototype; |
+ return div; |
+ } |
+ |
+ ExtensionCode.prototype = { |
+ __proto__: HTMLDivElement.prototype, |
+ |
+ /** |
+ * Populate the content area of the code div with the given code. This will |
+ * highlight the erroneous section (if any). |
+ * @param {Object} code An object with four strings: beforeHighlight, |
+ * afterHighlight, highlight, and the message. The 'highlight' strings |
+ * represent the three portions of the file's content to display - the |
+ * portion which is most relevant and should be emphasized (highlight), |
+ * and the parts both before and after this portion. The message is the |
+ * error message, which will be the mouseover hint for the highlighted |
+ * region. These may be empty. |
+ * @param {string} emptyMessage The message to display if the code |
+ * object is empty (e.g., 'could not load code'). |
+ */ |
+ populate: function(code, emptyMessage) { |
+ // Clear any remnant content, so we don't have multiple code listed. |
+ this.clear(); |
+ |
+ var sourceDiv = document.createElement('div'); |
+ sourceDiv.classList.add('extension-code-source'); |
+ this.appendChild(sourceDiv); |
+ |
+ // If there's no code, then display an appropriate message. |
+ if (!code) { |
+ var span = document.createElement('span'); |
+ span.textContent = emptyMessage; |
+ sourceDiv.appendChild(span); |
+ return; |
+ } |
+ |
+ var lineCount = 0; |
+ var createSpan = function(source, isHighlighted) { |
+ lineCount += source.split('\n').length - 1; |
+ var span = document.createElement('span'); |
+ span.className = isHighlighted ? 'extension-code-highlighted-source' : |
+ 'extension-code-normal-source'; |
+ span.textContent = source; |
+ return span; |
+ }; |
+ |
+ if (code.beforeHighlight) |
+ sourceDiv.appendChild(createSpan(code.beforeHighlight, false)); |
+ |
+ if (code.highlight) { |
+ var highlightSpan = createSpan(code.highlight, true); |
+ highlightSpan.title = code.message; |
+ sourceDiv.appendChild(highlightSpan); |
+ } |
+ |
+ if (code.afterHighlight) |
+ sourceDiv.appendChild(createSpan(code.afterHighlight, false)); |
+ |
+ // Make the line numbers. This should be the number of line breaks + 1 |
+ // (the last line doesn't break, but should still be numbered). |
+ var content = ''; |
+ for (var i = 1; i < lineCount + 1; ++i) |
+ content += i + '\n'; |
+ var span = document.createElement('span'); |
+ span.textContent = content; |
+ |
+ var linesDiv = document.createElement('div'); |
+ linesDiv.classList.add('extension-code-line-numbers'); |
+ linesDiv.appendChild(span); |
+ this.insertBefore(linesDiv, this.firstChild); |
+ }, |
+ |
+ /** |
+ * Clears the content of the element. |
+ */ |
+ clear: function() { |
+ while (this.firstChild) |
+ this.removeChild(this.firstChild); |
+ }, |
+ |
+ /** |
+ * Scrolls to the error, if there is one. This cannot be called when the |
+ * div is hidden. |
+ */ |
+ scrollToError: function() { |
+ var errorSpan = this.querySelector('.extension-code-highlighted-source'); |
+ if (errorSpan) |
+ errorSpan.scrollIntoView(false); // Scroll to bottom of view. |
+ } |
+ }; |
+ |
+ // Export |
+ return { |
+ ExtensionCode: ExtensionCode |
+ }; |
+}); |