summaryrefslogtreecommitdiffstats
path: root/WebCore/page/inspector/SourcePanel.js
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/page/inspector/SourcePanel.js')
-rw-r--r--WebCore/page/inspector/SourcePanel.js144
1 files changed, 144 insertions, 0 deletions
diff --git a/WebCore/page/inspector/SourcePanel.js b/WebCore/page/inspector/SourcePanel.js
new file mode 100644
index 0000000..32d7899
--- /dev/null
+++ b/WebCore/page/inspector/SourcePanel.js
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2007 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.
+ */
+
+WebInspector.SourcePanel = function(resource, views)
+{
+ var allViews = [{ title: WebInspector.UIString("Source"), name: "source" }];
+ if (views)
+ allViews = allViews.concat(views);
+
+ WebInspector.ResourcePanel.call(this, resource, allViews);
+
+ this.currentView = this.views.source;
+
+ var sourceView = this.views.source;
+
+ sourceView.messages = [];
+ sourceView.frameNeedsSetup = true;
+
+ sourceView.frameElement = document.createElement("iframe");
+ sourceView.frameElement.setAttribute("viewsource", "true");
+ sourceView.contentElement.appendChild(sourceView.frameElement);
+}
+
+WebInspector.SourcePanel.prototype = {
+ show: function()
+ {
+ WebInspector.ResourcePanel.prototype.show.call(this);
+ this.setupSourceFrameIfNeeded();
+ },
+
+ setupSourceFrameIfNeeded: function()
+ {
+ if (this.views.source.frameNeedsSetup) {
+ this.attach();
+
+ InspectorController.addSourceToFrame(this.resource.identifier, this.views.source.frameElement);
+ WebInspector.addMainEventListeners(this.views.source.frameElement.contentDocument);
+
+ var length = this.views.source.messages;
+ for (var i = 0; i < length; ++i)
+ this._addMessageToSource(this.views.source.messages[i]);
+
+ delete this.views.source.frameNeedsSetup;
+ }
+ },
+
+ sourceRow: function(lineNumber)
+ {
+ this.setupSourceFrameIfNeeded();
+
+ var doc = this.views.source.frameElement.contentDocument;
+ var rows = doc.getElementsByTagName("table")[0].rows;
+
+ // Line numbers are a 1-based index, but the rows collection is 0-based.
+ --lineNumber;
+ if (lineNumber >= rows.length)
+ lineNumber = rows.length - 1;
+
+ return rows[lineNumber];
+ },
+
+ showSourceLine: function(lineNumber)
+ {
+ var row = this.sourceRow(lineNumber);
+ if (!row)
+ return;
+ this.currentView = this.views.source;
+ row.scrollIntoViewIfNeeded(true);
+ },
+
+ addMessageToSource: function(msg)
+ {
+ this.views.source.messages.push(msg);
+ if (!this.views.source.frameNeedsSetup)
+ this._addMessageToSource(msg);
+ },
+
+ _addMessageToSource: function(msg)
+ {
+ var row = this.sourceRow(msg.line);
+ if (!row)
+ return;
+
+ var doc = this.views.source.frameElement.contentDocument;
+ var cell = row.getElementsByTagName("td")[1];
+
+ var errorDiv = cell.lastChild;
+ if (!errorDiv || errorDiv.nodeName.toLowerCase() !== "div" || !errorDiv.hasStyleClass("webkit-html-message-bubble")) {
+ errorDiv = doc.createElement("div");
+ errorDiv.className = "webkit-html-message-bubble";
+ cell.appendChild(errorDiv);
+ }
+
+ var imageURL;
+ switch (msg.level) {
+ case WebInspector.ConsoleMessage.MessageLevel.Error:
+ errorDiv.addStyleClass("webkit-html-error-message");
+ imageURL = "Images/errorIcon.png";
+ break;
+ case WebInspector.ConsoleMessage.MessageLevel.Warning:
+ errorDiv.addStyleClass("webkit-html-warning-message");
+ imageURL = "Images/warningIcon.png";
+ break;
+ }
+
+ var lineDiv = doc.createElement("div");
+ lineDiv.className = "webkit-html-message-line";
+ errorDiv.appendChild(lineDiv);
+
+ var image = doc.createElement("img");
+ image.src = imageURL;
+ image.className = "webkit-html-message-icon";
+ lineDiv.appendChild(image);
+
+ lineDiv.appendChild(doc.createTextNode(msg.message));
+ }
+}
+
+WebInspector.SourcePanel.prototype.__proto__ = WebInspector.ResourcePanel.prototype;