aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatěj Cepl <mcepl@redhat.com>2010-09-18 23:32:09 +0200
committerMatěj Cepl <mcepl@redhat.com>2010-09-18 23:32:09 +0200
commit88112016166ac10e7ed2848c9562bed211918748 (patch)
tree0738e884d8c156e42f42fa685f0b3726a0fd1d37
parent91e43addcad1bb62ee54204143698c154e90a638 (diff)
downloadbugzilla-triage-88112016166ac10e7ed2848c9562bed211918748.tar.gz
First working version.
Missing AJAX-style adding an attachment row to the attachment table. Add createDeadLink function, we don't need to use href='#'
-rw-r--r--lib/bzpage.js55
-rw-r--r--lib/rhbzpage.js135
2 files changed, 137 insertions, 53 deletions
diff --git a/lib/bzpage.js b/lib/bzpage.js
index cbaae12..96ad655 100644
--- a/lib/bzpage.js
+++ b/lib/bzpage.js
@@ -99,7 +99,7 @@ var BZPage = function BZPage(win, config) {
if ("killNodes" in config.gJSONData.configData &&
this.hostname in config.gJSONData.configData.killNodes) {
var killConf = config.gJSONData.configData.killNodes[this.hostname];
- util.killNodes(this.doc, killConf[0], killConf[1])
+ util.killNodes(this.doc, killConf[0], killConf[1]);
}
this.setConfigurationButton();
@@ -152,7 +152,7 @@ BZPage.prototype.getRealBugNo = function () {
Request({
url: this.win.location.href+"&ctype=xml",
onComplete: function() {
- if (this.response.status == 200) {
+ if (this.response.status === 200) {
var xmlRepr = this.response.xml;
var bugID = parseInt(xmlRepr.getElementsByTagName("bug_id")[0].textContent, 10);
if (isNaN(bugID)) {
@@ -161,7 +161,7 @@ BZPage.prototype.getRealBugNo = function () {
that.bugNo = bugID;
console.log("The real bug no. is " + bugID);
}
- },
+ }
}).get();
};
@@ -406,6 +406,41 @@ BZPage.prototype.addToCommentsDropdown = function addToCommentsDropdown (pkg, cm
};
/**
+ * Create a A element leadink nowhere, but with listener running a callback on the click
+ *
+ * @param id String with a id to be added to the element
+ * @param text String with a string to be added as a textContent of the element
+ * @param parent Node which is a parent of the object
+ * @param callback Function to be called after clicking on the link
+ * @param params Array with parameters of the callback
+ * @param Boolean breakBefore if there should be a <br> element before.
+ * @return none
+ */
+BZPage.prototype.createDeadLink = function createDeadLink (id, text, parent, callback, params, breakBefore, accesskey) {
+ var that = this;
+ var newAElem = this.doc.createElement("a");
+ params = util.valToArray(params);
+ newAElem.setAttribute("id", id);
+ if (accesskey) {
+ newAElem.setAttribute("accesskey", accesskey);
+ }
+ newAElem.setAttribute("href", "");
+ newAElem.textContent = text;
+
+ newAElem.addEventListener("click", function(evt) {
+ callback.apply(that, params);
+ evt.stopPropagation();
+ evt.preventDefault();
+ }, false);
+
+ if (breakBefore) {
+ parent.appendChild(this.doc.createElement("br"));
+ }
+ parent.appendChild(newAElem);
+};
+
+
+/**
* Generic function to add new button to the page. Actually copies new button
* from the old one (in order to have the same look-and-feel, etc.
*
@@ -456,7 +491,7 @@ BZPage.prototype.createNewButton = function createNewButton (location, after, pk
.createTextNode("\u00A0"), originalLocation);
}
} catch (e if e instanceof TypeError) {
- console.log("cannot find originalLocation element with id " + location);
+ console.error("cannot find originalLocation element with id " + location);
}
};
@@ -500,7 +535,7 @@ BZPage.prototype.generateButtons = function generateButtons () {
BZPage.prototype.setConfigurationButton = function setConfigurationButton () {
var additionalButtons = this.doc.querySelector("#bugzilla-body *.related_actions");
var configurationButtonUI = this.doc.createElement("li");
- configurationButtonUI.innerHTML = "\u00A0-\u00A0<a href='#' id='configurationButton'>"
+ configurationButtonUI.innerHTML = "\u00A0-\u00A0<a href='' id='configurationButton'>"
+ "Triage configuration</a>";
additionalButtons.appendChild(configurationButtonUI);
this.doc.getElementById("configurationButton").addEventListener(
@@ -898,7 +933,7 @@ BZPage.prototype.setUpLogging = function setUpLogging () {
}
var generateTimeSheetUI = this.doc.createElement("li");
- generateTimeSheetUI.innerHTML = "\u00A0-\u00A0<a href='#' id='generateTSButton'>"
+ generateTimeSheetUI.innerHTML = "\u00A0-\u00A0<a href='' id='generateTSButton'>"
+ "Generate TS</a>";
additionalButtons.appendChild(generateTimeSheetUI);
this.doc.getElementById("generateTSButton").addEventListener(
@@ -911,7 +946,7 @@ BZPage.prototype.setUpLogging = function setUpLogging () {
}, false);
var ImportTimeSheetUI = this.doc.createElement("li");
- ImportTimeSheetUI.innerHTML = "\u00A0-\u00A0<a href='#' id='importTSButton'>"
+ ImportTimeSheetUI.innerHTML = "\u00A0-\u00A0<a href='' id='importTSButton'>"
+ "Import TS</a>";
additionalButtons.appendChild(ImportTimeSheetUI);
this.doc.getElementById("importTSButton").addEventListener(
@@ -932,10 +967,12 @@ BZPage.prototype.setUpLogging = function setUpLogging () {
} else {
console.error("File " + jsonPaths + " doesn't exist!");
}
+ evt.stopPropagation();
+ evt.preventDefault();
}, false);
var clearLogsUI = this.doc.createElement("li");
- clearLogsUI.innerHTML = "\u00A0-\u00A0<a href='#' id='clearLogs'>"
+ clearLogsUI.innerHTML = "\u00A0-\u00A0<a href='' id='clearLogs'>"
+ "Clear TS</a>";
additionalButtons.appendChild(clearLogsUI);
var clearLogAElem = this.doc.getElementById("clearLogs");
@@ -944,6 +981,8 @@ BZPage.prototype.setUpLogging = function setUpLogging () {
this.style.color = that.log.EmptyLogsColor;
this.style.fontWeight = "normal";
console.log("this.store wiped out!");
+ evt.stopPropagation();
+ evt.preventDefault();
}, false);
if (this.log.store.length > 0) {
diff --git a/lib/rhbzpage.js b/lib/rhbzpage.js
index fe77b0c..11471f5 100644
--- a/lib/rhbzpage.js
+++ b/lib/rhbzpage.js
@@ -15,7 +15,7 @@ var timer = require("timer");
var selection = require("selection");
var tabs = require("tabs");
var NumberOfFrames = require("bzpage").NumberOfFrames;
-
+var titleParsedAttachment = "Part of the thread where crash happened";
// ====================================================================================
// RHBugzillaPage object
@@ -235,12 +235,13 @@ RHBugzillaPage.prototype.centralCommandDispatch = function(cmdLabel, cmdParams)
* XML-RPC call yet.
*/
RHBugzillaPage.prototype.addAttachment = function addAttachment(data, callback) {
+ console.log("addAttachment // data = " + data + ", callback = " + callback);
var msg = new xrpc.XMLRPCMessage("bugzilla.addAttachment");
var that = this;
msg.addParameter(this.bugNo);
msg.addParameter({
- description: "Interesting part of the thread backtrace where crash happened.",
+ description: titleParsedAttachment,
filename: "parsed-backtrace.txt",
// Isn't this weird ... base64 and text/plain??? FIXME
// and XML-RPC and text/plain?
@@ -258,7 +259,7 @@ RHBugzillaPage.prototype.addAttachment = function addAttachment(data, callback)
var respStr = this.response.text; // bug 270553
respStr = respStr.replace(/^<\?xml\s+version\s*=\s*(["'])[^\1]+\1[^?]*\?>/, ""); // bug 336551
var resp = new XML(respStr);
- console.log("resp = " + resp[0]);
+ console.log("attachID = " + parseInt(resp[0].params.param.value.array.data.value.int, 10))
callback.call(that, parseInt(resp[0], 10));
}
},
@@ -275,6 +276,7 @@ RHBugzillaPage.prototype.addAttachment = function addAttachment(data, callback)
RHBugzillaPage.prototype.pasteBacktraceInComments = function() {
// TODO This paragraph looks suspicous ... what is it?
// Does it belong to this function?
+ var that = this;
var notedLabel = this.doc.querySelector("label[for='newcc']");
while (notedLabel.firstChild) {
var node = notedLabel.removeChild(notedLabel.firstChild);
@@ -287,6 +289,7 @@ RHBugzillaPage.prototype.pasteBacktraceInComments = function() {
var mainTitle = this.doc
.getElementsByClassName("bz_alias_short_desc_container")[0];
+
var abrtButton = this.doc.createElement("a");
abrtButton.setAttribute("accesskey", "a");
abrtButton.setAttribute("href", abrtQueryURL);
@@ -312,15 +315,14 @@ RHBugzillaPage.prototype.pasteBacktraceInComments = function() {
+ x[1];
console.log("attURL = " + attURL);
console.log("this.btSnippet = " + this.btSnippet);
- console.log("btparsed = " + this.idContainsWord("cf_devel_whiteboard", 'btparsed'));
+ console.log("btparsed = " + this.idContainsWord("status_whiteboard", 'btparsed'));
if ((!this.btSnippet) &&
- (!this.idContainsWord("cf_devel_whiteboard", 'btparsed'))) {
+ (!this.idContainsWord("status_whiteboard", 'btparsed'))) {
var that = this;
Request({
url: attURL,
onComplete: function() {
if (this.response.status == 200) {
- console.log("response = " + this.response.text);
that.btSnippet = that.parseBacktrace(this.response.text);
if (that.btSnippet) {
that.addCheckShowLink.call(that,x,that.btSnippet);
@@ -331,14 +333,27 @@ RHBugzillaPage.prototype.pasteBacktraceInComments = function() {
}
}, this);
}
+ // Add "show BT" links
+ console.log("status_whiteboard = " + this.doc.getElementById('status_whiteboard').value);
+ if (this.idContainsWord("status_whiteboard", 'btparsed')) {
+ var ourParsedAtts = this.attachments.filter(function (att) {
+ return (new RegExp(titleParsedAttachment).test(att[0]));
+ });
+ console.log("ourParsedAtts = " + ourParsedAtts.toSource());
+ ourParsedAtts.forEach(function (att) {
+ that.addShowParsedBTLink(att);
+ }, that);
+ }
};
RHBugzillaPage.prototype.showAttachment = function showAttachment(id) {
+ var that = this;
Request({
url: "https://" + this.hostname + "/attachment.cgi?id=" + id,
onComplete: function () {
- var infoWin = this.win.open("", "Check att. " + id,
- "width=640,height=640,status=no,location=no");
+ var infoWin = that.win.open("", "Check att. " + id,
+ "width=640,height=640,status=no,location=no,"+
+ "titlebar=no,scrollbars=yes,resizable=yes");
var doc = infoWin.document;
doc.body.innerHTML = "<pre id='textPre'>"+
this.response.text + "</pre>";
@@ -346,30 +361,72 @@ RHBugzillaPage.prototype.showAttachment = function showAttachment(id) {
}).get();
};
-RHBugzillaPage.prototype.addNewAttachmentRow = function addNewAttachmentRow(oldRow) {
+RHBugzillaPage.prototype.addShowParsedBTLink = function addShowParsedBTLink(att) {
+ var elem = att[4].querySelector("td:last-of-type");
+ this.createDeadLink("showParsedBacktraceWindow-" + att[1], "showBT",
+ elem, this.showAttachment, att[1], true);
+};
+
+/* TODO
+This is the HTML of a row with the full backtrace. We should
+change its clone in addNewAttachmentRow to have correct values.
+
+<tr class="bz_contenttype_text_plain">
+ <td valign="top">
+ <a title="View the content of the attachment" href="attachment.cgi?id=448126" name="a8">
+ <b>Interesting part of the thread backtrace where crash happened.</b></a>
+
+ <span class="bz_attach_extra_info">
+ (1.59 KB,
+ text/plain)
+
+ <br>
+ <a title="Go to the comment associated with the attachment" href="#attach_448126">2010-09-17 17:27 EDT</a>,
+<span class="vcard redhat_user"><a title="Matej Cepl &lt;mcepl@redhat.com&gt;" href="mailto:mcepl@redhat.com" class="email"> <span class="fn">Matej Cepl</span></a>
+</span>
+ </span>
+ </td>
+
+ <td valign="top" class="bz_attach_flags">
+ <i>no flags</i>
+ </td>
+
+ <td valign="top">
+ <a href="attachment.cgi?id=448126&amp;action=edit">Details</a>
+ </td>
+ </tr>
+*/
+
+
+/**
+ * Unfinished ... see above
+ */
+RHBugzillaPage.prototype.addNewAttachmentRow = function addNewAttachmentRow(old) {
var that = this;
- var newTRElem = oldRow.cloneNode(true);
+ var newTRElem = old[4].cloneNode(true);
var elem = newTRElem.querySelector("td:last-of-type");
- elem.innerHTML += "<br/><a id='showBacktrace' href='#'>show BT</a>";
+ elem.innerHTML += "<br/><a id='showBacktrace' href=''>show BT</a>";
elem.getElementById("showBacktrace").addEventListener("click", function(evt) {
- that.showAttachment.call(that,attID);
+ that.showAttachment.call(that, attID);
},false);
oldRow.parentNode.insertBefore(newTRElem,oldRow.nextSibling);
};
-
-RHBugzillaPage.prototype.addCheckShowLink = function addCheckXorgLogLink(oldElem, snippet) {
+/**
+ *
+ */
+RHBugzillaPage.prototype.addCheckShowLink = function addCheckShowLink(oldAtt, snippet) {
var that = this;
- var elem = oldElem[4].querySelector("td:last-of-type");
- elem.innerHTML += "<br/><a id='attachBacktraceActivator' href='#'>check</a>";
- var meAElem = that.doc.getElementById("attachBacktraceActivator");
- meAElem.addEventListener("click", function(x) {
+ var elem = oldAtt[4].querySelector("td:last-of-type");
+ this.createDeadLink("attachBacktraceActivator", "add parsed BT", elem, function(x) {
that.addAttachment.call(that, snippet, function () {
- that.addNewAttachmentRow(oldElem[4]);
+ // that.addNewAttachmentRow(oldAtt);
+ that.addStuffToTextBox("status_whiteboard", "btparsed");
+ // TODO Doesn't work ... it gets into mid-air collision with comment about
+ // the new attachment.
+ // that.doc.forms.namedItem("changeform").submit();
}, false);
- }, false);
- meAElem.parentNode.removeChild(meAElem);
- // this.addStuffToTextBox("status_whiteboard", "btparsed");
+ }, [], true);
};
/**
@@ -390,7 +447,12 @@ RHBugzillaPage.prototype.markBadAttachments = function() {
var titleElement = this.doc
.getElementsByClassName("bz_alias_short_desc_container")[0];
titleElement.style.backgroundColor = "olive";
- titleElement.appendChild(this.createFixAllButton(badAttachments));
+
+ this.createDeadLink("fixAllButton", "Fix all", titleElement, function() {
+ Array.forEach(badAttachments, function(x) {
+ this.fixAttachById(x[1]);
+ }, that);
+ }, [], false, "f");
badAttachments.forEach(function(x, i, a) {
this.addTextLink(x);
}, this);
@@ -541,9 +603,11 @@ RHBugzillaPage.prototype.addCheckXorgLogLink = function addCheckXorgLogLink() {
this.XorgLogAttList.forEach(function (row) {
var elemS = row[4].getElementsByTagName("td");
var elem = elemS[elemS.length - 1];
- elem.innerHTML += "<br/><a href='#'>check</a>";
+ elem.innerHTML += "<br/><a href=''>check</a>";
elem.addEventListener("click", function(x) {
that.analyzeXorgLog(row[1]);
+ evt.stopPropagation();
+ evt.preventDefault();
}, false);
}, this);
}
@@ -813,26 +877,6 @@ RHBugzillaPage.prototype.fixAttachById = function(id, type, email) {
};
/**
- * Create a button for fixing all bad attachments.
- *
- * @param list Array of all bad attachmentss
- * @return button fixing all bad Attachments
- */
-RHBugzillaPage.prototype.createFixAllButton = function(list) {
- var that = this;
- var elem = this.doc.createElement("a");
- elem.setAttribute("href", "");
- elem.setAttribute("accesskey", "f");
- elem.innerHTML = "<b>F</b>ix all";
- elem.addEventListener("click", function() {
- Array.forEach(list, function(x) {
- this.fixAttachById(x[1]);
- }, that);
- }, false);
- return elem;
-};
-
-/**
* Add a link to the bad attachment for fixing it.
*
* @param
@@ -949,8 +993,9 @@ RHBugzillaPage.prototype.parseBacktrace = function(ret) {
i++;
curLine = splitArray[i];
}
+ return outStr;
}
- return outStr;
+ return "";
};
// exports.RHBugzillaPage = apiUtils.publicConstructor(RHBugzillaPage);