diff options
Diffstat (limited to 'bugzillaBugTriage.js')
-rw-r--r-- | bugzillaBugTriage.js | 937 |
1 files changed, 527 insertions, 410 deletions
diff --git a/bugzillaBugTriage.js b/bugzillaBugTriage.js index 0d323e6..673da77 100644 --- a/bugzillaBugTriage.js +++ b/bugzillaBugTriage.js @@ -1,74 +1,50 @@ // Released under the MIT/X11 license // http://www.opensource.org/licenses/mit-license.php - -// https://bugzilla.redhat.com/show_bug.cgi?id=451951 -// - -// EXAMPLE OF THE WORKING JETPACK FUNCTION!!! -//jetpack.future.import("pageMods"); - -//var callback = function(document) { -// jetpack.statusBar.append({ -// html: "BOOM<i>!</i>", -// width: 45, -// onReady: function(widget) { -// console.log("Boom!"); -// }, -// }); -//}; -//var options = {}; -//options.matches = [ -// "https://bugzilla.redhat.com/show_bug.cgi*", -// "https://bugzilla.redhat.com/process_bug.cgi"]; -//jetpack.pageMods.add(callback, options); -// Interesting JEPs -// https://wiki.mozilla.org/Labs/Jetpack/JEP/10 -- clipboard access -// https://wiki.mozilla.org/Labs/Jetpack/JEP/17 -- page mods +jetpack.future.import("pageMods"); +jetpack.future.import("storage.simple"); // ************* FUNCTIONS ******************** /* EXTERNAL FUNCTIONS */ + /** - * split URI into array + * This function creates a new anchor element and uses location properties (inherent) + * to get the desired URL data. Some String operations are used (to normalize results + * across browsers). + * originally from http://snipplr.com/view.php?codeview&id=12659 * - * @param str string with the URL - * @return array with parsed URL + * @param url String with URL + * @return object with parameters set * - * parseUri 1.2.1 - * originally from http://blog.stevenlevithan.com/archives/parseuri - * (c) 2007 Steven Levithan <stevenlevithan.com> - * MIT License */ -function parseUri (str) { - var o = parseUri.options, - m = o.parser[o.strictMode ? "strict" : "loose"].exec(str), - uri = {}, - i = 14; - - while (i--) { - uri[o.key[i]] = m[i] || ""; - } - - uri[o.q.name] = {}; - uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) { - if ($1) uri[o.q.name][$1] = $2; - }); - - return uri; -}; +function parseURL(url) { + var a = jetpack.tabs.focused.contentDocument.createElement('a'); + a.href = url; + return { + source: url, + protocol: a.protocol.replace(':',''), + host: a.hostname, + port: a.port, + query: a.search, + params: (function(){ + var ret = {}, + seg = a.search.replace(/^\?/,'').split('&'), + len = seg.length, i = 0, s; + for (;i<len;i++) { + if (!seg[i]) { continue; } + s = seg[i].split('='); + ret[s[0]] = s[1]; + } + return ret; + })(), + file: (a.pathname.match(/\/([^\/?#]+)$/i) || [,''])[1], + hash: a.hash.replace('#',''), + path: a.pathname.replace(/^([^\/])/,'/$1'), + relative: (a.href.match(/tp:\/\/[^\/]+(.+)/) || [,''])[1], + segments: a.pathname.replace(/^\//,'').split('/') + }; +} -parseUri.options = { - strictMode: false, - key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], - q: { - name: "queryKey", - parser: /(?:^|&)([^&=]*)=?([^&]*)/g - }, - parser: { - strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ - } -}; /** * Clean the string from spaces around @@ -77,78 +53,12 @@ parseUri.options = { * @return string which was cleaned * */ -function strip(str) { - return str.replace(/^\s*(.*)\s*$/,"$1"); -} - -/** - * Primitive version of sprintf - * @param string with the format of the result and - * @param list of parameters - * @return string with the format applied - * - * Call as - * format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear"); - * originally from - * http://www.sitepoint.com/blogs/2008/11/11/arguments-a-javascript-oddity/ - * FIXME needs testing and debugging - */ -function format(string) { - var args = arguments; - var pattern = new RegExp("%([1-" + arguments.length + "])", "g"); - return String(string).replace(pattern, function(match, index) { - return args[index]; - }); -} - -/** - * escape input string so that it could be used in URLs - * @param clearString - * @return string decoded so that it is safe for URLs - */ -function URLEncode (clearString) { - var output = ''; - var x = 0; - clearString = clearString.toString(); - var regex = /(^[a-zA-Z0-9_.]*)/; - while (x < clearString.length) { - var match = regex.exec(clearString.substr(x)); - if (match != null && match.length > 1 && match[1] != '') { - output += match[1]; - x += match[1].length; - } else { - if (clearString[x] == ' ') - output += '+'; - else { - var charCode = clearString.charCodeAt(x); - var hexVal = charCode.toString(16); - output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase(); - } - x++; - } - } var output = ''; - var x = 0; - clearString = clearString.toString(); - var regex = /(^[a-zA-Z0-9_.]*)/; - while (x < clearString.length) { - var match = regex.exec(clearString.substr(x)); - if (match != null && match.length > 1 && match[1] != '') { - output += match[1]; - x += match[1].length; - } else { - if (clearString[x] == ' ') - output += '+'; - else { - var charCode = clearString.charCodeAt(x); - var hexVal = charCode.toString(16); - output += '%' + ( hexVal.length < 2 ? '0' : '' ) + hexVal.toUpperCase(); - } - x++; - } - } - return output; - - return output; +function trim(str,cleanRE) { + var re = RegExp("^\\s*(.*)\\s*$"); + if (cleanRE) { + re = RegExp(cleanRE); + } + return str.replace(re,"$1"); } /** @@ -163,11 +73,11 @@ function filterByRegexp(list,chosingMark) { if (list.length > 0) { chosenPair = list.filter( function(pair){ - return RegExp(pair['regexp']).test(chosingMark); + return RegExp(pair['regexp'],"i").test(chosingMark); }); }; if (chosenPair.length > 0) { - return strip(chosenPair[0]['addr']).toLowerCase(); + return trim(chosenPair[0]['addr']); } else { return ""; } @@ -176,6 +86,7 @@ function filterByRegexp(list,chosingMark) { /** * Converts attributes value of the given list of elements to the * Javascript list. + * * @param list array of elements * @return array of values */ @@ -183,14 +94,10 @@ function valuesToList(list) { var outL = []; var member = ""; - for (var i = 0; i < list.length; i++) { - // FIXME how to say hasAttribute in jQuery? - if(list[i].hasAttribute("value")) { - // FIXME getAttribute in jQuery - member = list[i].getAttribute("value"); - member = member.replace(/\s*(.*)\s*/,"$1"); - outL[outL.length] = member; - } + for (var element in list) { + if (element.hasAttribute("value")) { + outL[outL.length] = trim(element.getAttribute("value")); + } } return outL; } @@ -212,11 +119,11 @@ function isInList(mbr,list) { * @return string with the content of the clipboard or "" if empty. * originally from * https://developer.mozilla.org/en/Using_the_Clipboard - * + * */ -// FIXME to-be-replaced by +// TODO to-be-replaced by // var contents = jetpack.clipboard.get(); -unsafeWindow.getClipboard = function() { +function getClipboardText() { this.netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect'); var clip = Components.classes["@mozilla.org/widget/clipboard;1"].getService(Components.interfaces.nsIClipboard); @@ -226,49 +133,30 @@ unsafeWindow.getClipboard = function() { if (!trans) return false; trans.addDataFlavor("text/unicode"); - clip.getData(trans, clip.kGlobalClipboard); + clip.getData(trans, clip.kGlobalClipboard); - var str = new Object(); - var strLength = new Object(); + var str = new Object(); + var strLength = new Object(); trans.getTransferData("text/unicode", str, strLength); if (str) - str = str.value.QueryInterface(Components.interfaces.nsISupportsString); + str = str.value.QueryInterface(Components.interfaces.nsISupportsString); if (str) pastetext = str.data.substring(0, strLength.value / 2); return pastetext; }; - function getClipboardText() { - return unsafeWindow.getClipboard(); - } - -/** - * Compatibility layer for Firefox <3.1 which doesn't have native JSON support - * - * @param str string with the JSON data - * @return object - */ -//FIXME get rid of this ... user just has to have FF > 3.1 -function jsonParse(str) { - if (JSON) { - return JSON.parse(str); - } else { - return(eval('(' + str + ')')); - } -} - /* Bugzilla functions.*/ /** * add Fedora Bug zapper's signature to the comment of the current bug */ function addSignature(evt) { - var cmntText = document.getElementById("comment"); - if ((signatureFedoraString.length > 0) && (strip(cmntText.value).length > 0)) { - cmntText.value = strip(cmntText.value) + signatureFedoraString; + var cmntText = $("#comment",document); + if ((signatureFedoraString.length > 0) && (trim(cmntText.value).length > 0)) { + cmntText.value = trim(cmntText.value) + signatureFedoraString; } } @@ -278,14 +166,12 @@ function addSignature(evt) { * @return None */ function clickMouse(target) { - var localEvent = document.createEvent("MouseEvents"); + var localEvent = jetpack.tabs.focused.contentDocument.createEvent("MouseEvents"); localEvent.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); target.dispatchEvent(localEvent); } -// ****************************************** - /** * Parse the row with the attachment * @param <tr> element to be parsed @@ -301,23 +187,23 @@ function parseAttachmentLine(inElem) { var size = Number(); var id = Number(); + // FIXME we should skip obsolete attachments + inElem.normalize(); // getting name of the attachment var bElem = inElem.getElementsByTagName("b")[0]; - name = strip(bElem.textContent); + name = trim(bElem.textContent); // getting id var aElem = inElem.getElementsByTagName("a")[0]; id = parseInt(aElem.getAttribute("href").replace(/^.*attachment.cgi\?id=/,""),10); //getting MIME type and size - // not sure whether the following is possible, otherwise - // I would have to get first span element var spanElems = inElem.getElementsByClassName("bz_attach_extra_info")[0]; var roundedText = spanElems.innerHTML; - var stringArray = strip(roundedText.replace(/^\s*\((.*)\s*KB,\s*$/,"$1")); + var stringArray = trim(roundedText.replace(/^\s*\((.*)\s*KB,\s*$/,"$1")); size = parseInt(stringArray,10); MIMEtype = roundedText.split("\n")[2].replace(/^\s*(.*)\)\s*$/,"$1"); @@ -325,16 +211,6 @@ function parseAttachmentLine(inElem) { } /** - * Get the attachments table of the bug - * - * @return attachments table - */ -function getAttTable() { - var tempList = document.getElementById("attachment_table"); - return(tempList); -} - -/** * Get list of attachments to the bug * * @return array of attachments @@ -351,12 +227,214 @@ function getAttachments(attTable) { return(attList); } -/* - * old - * long_desc=Xpress%20200&bug_status=NEW&bug_status=ASSIGNED - * new - * long_desc_type=substring&long_desc=Xpress%20200&bug_status=NEW&bug_status=ASSIGNED - */ +function isOctetStream(element, index, array) { + var inArray = ["application/octet-stream","text/x-log"]; + return(inArray.indexOf(element[2]) != -1); +} + +function fixAttachments(){ + var aTable = $("#attachment_table",document); + var attachmentsList = getAttachments(aTable); + var badAttachments = attachmentsList.filter(isOctetStream); + + if (badAttachments.length>0) { + var titleElement = $(".bz_alias_short_desc_container:first",document); + titleElement.css("background-color","olive"); + titleElement.append(createFixAllButton(badAttachments)); + for(var i=0;i<badAttachments.length;i++) { + addTextLink(badAttachments[i]); + } + } +} + +function groupIDs(manStr,cardStrID) { +// console.log("RegExpArr = " + chipIDsGroupings.toSource() + ", hledam = " + manStr + "," + cardStrID); + var outStr = filterByRegexp(chipIDsGroupings,manStr+","+cardStrID); + if (outStr.length == 0) { + outStr = "UNGROUPED_" + manStr+"/"+cardStrID; + } + return outStr; +} + +/** + * Given PCI IDs for manufacturer and card ID return chipset string + * + * @param manufacturerNo string with manufacturer PCI ID + * @param cardNo string with card PCI ID + * + * @return array with chip string and optinoal variants + */ +function checkChipStringFromID(manufacturerNo,cardNo) { + console.log("This is the card ID: " + cardNo + " manufactured by " + manufacturerNo); + var soughtID = (manufacturerNo+","+cardNo).toUpperCase(); + var outList = PCI_ID_Array[soughtID]; + console.log("nalezeno = " + outList.toSource()); + if (outList) { + return outList; + } else { + return ""; + } +} + +/** + * Given line to be parsed, find out which chipset it is and fill in the whiteboard + * + * @param iLine string with the whole unparsed "interesting line" + * @param driverStr string with the driver name + * @return None + */ +function fillInWhiteBoard(iLine,driverStr) { + var outStr = ""; + var cardIDStr = ""; + var cardIDArr = Array(); + + console.log("driverStr = " + driverStr); + console.log("iLine: " + iLine); + + chipSwitchboard: + if (driverStr == "RADEON") { + var cardID = iLine.replace(ATIgetIDRE,"$1"); + cardIDArr = checkChipStringFromID("1002",cardID); + if (cardIDArr.length > 0) { + cardIDStr = cardIDArr[0]; + if (cardIDArr[1]) { + optionStr = cardIDArr[1]; + outStr = groupIDs(driverStr,cardIDStr)+"/" + optionStr; + console.log("cardIDArr = " + cardIDArr.toSource() + ", outStr = "+outStr); + } else { + outStr = groupIDs(driverStr,cardIDStr); + optionStr = ""; + } + console.log("found IDs: " + cardIDStr + "," + optionStr); + } else { + outStr = "**** FULLSTRING: " + iLine; + } + } else { + // Intel Corporation, NVIDIA + cardIDArr = manuChipStrs.filter(function (el, ind, arr) { + return RegExp(el[0],"i").test(iLine); + }); + console.log("cardIDArr = " + cardIDArr.toSource()); + if (cardIDArr && (cardIDArr.length > 0)) { + cardIDArr = cardIDArr[0]; + } else { + outStr = iLine; + break chipSwitchboard; + } + // cardIDArr [0] = RE, [1] = ("RADEON","INTEL","NOUVEAU"), [2] = manu PCIID + iLine = trim(iLine.replace(RegExp(cardIDArr[0],"i"),"")); + // FIXME is this necessary? Let's try without it + // outStr = iLine.replace(/^\W*(\w*).*$/,"$1"); + // nVidia developers opted-out from grouping + if (driverStr == "INTEL") { + outStr = groupIDs(cardIDArr[1],iLine); + } else { + outStr = iLine; + } + } + console.log("result = " + outStr); + var whiteboardInput = $("#status_whiteboard",document); + var attachedText = trim("card_"+outStr); + if (whiteboardInput.value.length == 0) { + whiteboardInput.value = attachedText; + } else { + whiteboardInput.value += ", " + attachedText; + } +} + +/** + * Insert "Fill In" button to the status whiteboard + * @param interestLine string with the interesting part of the Chipset: line + * @param driverString string with name of the driver ("INTEL", "RADEON", "NOUVEAU", + * etc.) + * @return none + */ +function fillInAddButton(interestLine,driverString) { + var newButt = originalButton.cloneNode(true); + var whiteboardInput = $("#status_whiteboard",document); + + newButt.setAttribute("id","chipmagic"); + newButt.setAttribute("value","Fill In"); + newButt.addEventListener('click',function (evt) { + fillInWhiteBoard(interestLine,driverString); + },true); + newButt.setAttribute("type","button"); + whiteboardInput.parentNode.appendChild(newButt); + whiteboardInput.parentNode.insertBefore(jetpack.tabs.focused.contentDocument.createTextNode("\u00A0"),newButt); +} + +/** + * Recursive function to run Get attached Xorg.0.log, parse it and find the value of chip + * @return None + */ +function fillInChipMagicProcessAtts(ret) { + if (ret) { + if (ret.status != 200) { + alert([ret.status,ret.statusText,ret.responseHeaders, + ret.responseText]); + throw "XMLHttpRequest got return code " + ret.status; + } + console.log('fetched ' + ret.finalUrl); + var interestingLineArr = ret.responseText.split("\n").filter(function (v,i,a) { + return ChipsetRE.test(v); + }); + console.log("interestingLineArr = " + interestingLineArr.toSource()); + if (interestingLineArr.length >0) { + // Process and exit + // .replace(ChipsetRE,"$1\t$2").split("\t") + var interestingArray = ChipsetRE.exec(interestingLineArr[0]); + console.log("interesting array = " + interestingArray.toSource()); + interestingLine = trim(interestingArray[2].replace(/[\s"]+/g," ")); + console.log("interesting line = " + interestingLine); + fillInAddButton(interestingLine,interestingArray[1].toUpperCase()); + console.log("XMLHttpRequest done!"); + return; + } + } + + if (XorgLogAttList[XorgLogAttListIndex]) { + var XorgLogAttID = XorgLogAttList[XorgLogAttListIndex][1]; + var attURL = "https://bugzilla.redhat.com/attachment.cgi?id="+XorgLogAttID; + XMLHttpRequest({ + method: 'GET', + url: attURL, + headers: { + 'User-agent': 'Mozilla/4.0 (compatible) Greasemonkey getXorgLog', + 'Accept': 'text/plain', + 'Content-type': 'text/xml' + }, + onload:fillInChipMagicProcessAtts + }); + XorgLogAttListIndex++; + } else { + console.log("No more Xorg.0.log attachments!"); + } +} + +/** + * Get attached Xorg.0.log, parse it and find the value of chip. + * Does not fill the whiteboard itself, just adds button to do so, so that + * slow XMLHttpRequest is done in advance. + * @param none + * @return none + */ +function fillInChipMagic() { + var XorgLogURL = ""; + var XorgLogAttID = ""; + var XorgLogFound = false; + + // Find out Xorg.0.log attachment URL + XorgLogAttList = attachmentsList.filter(function (value, index, array) { + // Xorg.0.log must be text, otherwise we cannot parse it + return (RegExp("[xX].*log").test(value[0]) && /text/.test(value[2])); + }); + console.log("XorgLogAttList = " + XorgLogAttList.toSource()); + if (XorgLogAttList.length == 0) { + console.log("No Xorg.0.log attachments found.") + return; + } + fillInChipMagicProcessAtts(); +} /** * Opens a new tab with a query for the given text in the selected component @@ -364,6 +442,11 @@ function getAttachments(attTable) { * @param component string with the component name (maybe latter regexp?) * @param product (optional) string with the product name * @return None + * + * old + * long_desc=Xpress%20200&bug_status=NEW&bug_status=ASSIGNED + * new + * long_desc_type=substring&long_desc=Xpress%20200&bug_status=NEW&bug_status=ASSIGNED */ function queryInNewTab(text,component,product) { // Optional parameter @@ -372,10 +455,10 @@ function queryInNewTab(text,component,product) { } var url = "https://bugzilla.redhat.com/buglist.cgi?query_format=advanced"; if (product) { - url += "&product="+product; + url += "&product="+product; } if (component) { - url += "&component="+component; + url += "&component="+component; } if (text) { url += "&long_desc_type=substring&long_desc="+ text.replace(" ","%20"); @@ -384,13 +467,13 @@ function queryInNewTab(text,component,product) { window.open(url); } -function queryForSelection() { +function queryForSelection(component) { var text = window.getSelection().toString(); if (text.length < 1) { text = getClipboardText(); }; if (text.length > 0) { - queryInNewTab(text, component); + queryInNewTab(text, getComponent()); } } @@ -404,7 +487,7 @@ function queryForSelection() { */ function sendRequest(url,data,method,callback) { //$.rpc(url, dataType, onLoadCallback, version); - GM_xmlhttpRequest({ + XMLHttpRequest({ method: method, url: url, headers: { @@ -420,7 +503,7 @@ function sendRequest(url,data,method,callback) { /** * Callback function for the XMLRPC request * - * @param ret object with xmlhttprequest response + * @param ret object with XMLHttpRequest response * with attributes: * + status -- int return code * + statusText @@ -460,6 +543,11 @@ function fixAttachById(id,type) { reqCounter++; } +/** + * Callback function for "Fix all attachments" button + * @param list Array of + * @return none + */ function fixAllAttachments(list) { var tmpElem = {}; @@ -470,7 +558,7 @@ function fixAllAttachments(list) { } function createFixAllButton(list) { - var aElem = document.createElement("a"); + var aElem = jetpack.tabs.focused.contentDocument.createElement("a"); aElem.setAttribute("href",""); aElem.addEventListener('click', function(event) {fixAllAttachments(list);}, @@ -498,9 +586,6 @@ function getTextAllLink(table,list) { vAllElem = tElem; } } -// tdElement.parentNode.insertBefore(tElem,tdElement.nextSibling); -// tdElement.parentNode.insertBefore(document.createElement("td"), -// tdElement.nextSibling); } function addTextLink(row) { @@ -509,18 +594,13 @@ function addTextLink(row) { var tElem = {}; var t2Elem = {}; - curElem.parentNode.appendChild(document.createTextNode(" ")); - t2Elem = document.createTextNode("Text"); - tElem = document.createElement("a"); - tElem.setAttribute("href",""); - tElem.addEventListener('click', + tElem = $(" <a href=''>Text</a>").bind("click", function(event) { fixAttachById(row[1],"text/plain"); - }, - true); + }); tElem.appendChild(t2Elem); - curElem.parentNode.appendChild(document.createElement("br")); - curElem.parentNode.appendChild(tElem); + $(curElem).parent().append("<br>"); + $(curElem).parent().append(tElem); } function isOctetStream(element, index, array) { @@ -566,13 +646,13 @@ function findNextSiblingByTagName(startElement,tagName,forward) { * @return none */ function selectOption(id,label) { - var selectElement = document.getElementById(id); + var selectElement = jetpack.tabs.focused.contentDocument.getElementById(id); var values = selectElement.options; for (var i = 0; i < values.length; i++) { values[i].normalize(); if (values[i].text.search(label) != -1) { values[i].selected = true; - var intEvent = document.createEvent("HTMLEvents"); + var intEvent = jetpack.tabs.focused.contentDocument.createEvent("HTMLEvents"); intEvent.initEvent("change", true, true); selectElement.dispatchEvent(intEvent); break; @@ -586,7 +666,7 @@ function selectOption(id,label) { * @return string component of the bug */ function getComponent() { - return strip(document.getElementById("component").value); + return $.trim($("#component",document).attr("value")); } /** @@ -595,7 +675,7 @@ function getComponent() { * @return string product the bug belongs to */ function getProduct() { - var productSelect = document.getElementById("product"); + var productSelect = $("#product",document); var index = productSelect.selectedIndex; return productSelect.options[index].value; } @@ -606,7 +686,7 @@ function getProduct() { * @return string revision of the product the bug belongs to */ function getVersion() { - var versionSelect = document.getElementById("version"); + var versionSelect = $("#version",document); if (versionSelect) { var index = versionSelect.selectedIndex; return versionSelect.options[index].value; @@ -616,48 +696,13 @@ function getVersion() { } /** - * Returns owner of the bug. - * - * @return string with the email address of the assignee. - */ -function getAssignedTo() { - var assigneeEditContainer = document.getElementById("bz_assignee_edit_container").getElementsByClassName("fn")[0]; - return strip(assigneeEditContainer.textContent).toLowerCase(); -} - -/** - * Returns reporter of the bug. - * - * @return string with the email address of the reporter. - */ -function getReporter() { - var reportedSpanTag = document.getElementById("bz_show_bug_column_2").getElementsByClassName("fn")[0]; - return reportedSpanTag.textContent; -} - -/** * Returns the number of the current bug * * @return int with the bug number */ function getBugNo() { - var title = strip(document.getElementById("title").getElementsByTagName("p")[0].innerHTML); - var bugNo = eval(title.split(" ")[1]); - return bugNo; -} - -/** - * Returns list of people getting CC of all bug messages. - * - * @return array with the all members of the CC list. - */ -function getCCList() { - var selectRef = document.getElementsByName("cc"); - if (selectRef.length>0) { - return valuesToList(selectRef[0]); - } else { - return []; - } + var title = $.trim($("#title > p:first",document).html()); + return eval(title.split(" ")[1]); } /** @@ -666,16 +711,16 @@ function getCCList() { * * @return string email address to be on CC list. */ -function getCCMaintainer() { - return filterByRegexp(AddrArray,component); +function getCCMaintainer(addrs) { + return filterByRegexp(addrs,getComponent()).toLowerCase(); } /** - * Returns default assignee for the bug's component + * Returns default assignee for the bug's component * @return string with the default assignee for given component */ function getDefaultAssignee() { - return filterByRegexp(defAssigneeList,getComponent()); + return filterByRegexp(defAssigneeList,getComponent()).toLowerCase(); } /** @@ -684,14 +729,29 @@ function getDefaultAssignee() { * or because it is not a RHEL bug). */ function getIssueTracker() { - var interestingElement = document.getElementById("cf_issuetracker"); + var interestingElement = $("#cf_issuetracker",document); if (interestingElement) { - return strip(interestingElement.value); + return trim(interestingElement.value); } else { return ""; } } - + +/** + * Is this bug Xorg bug? + * @return boolean + */ +function isXorgBug() { + return maintCCAddr == "xgl-maint@redhat.com"; +} + +/** + * Is this bug RHEL bug? + * @return boolean + */ +function isRHELBug() { + return getProduct().search(/Red Hat Enterprise Linux/) != -1; +} /** * Add accesskey to the particular element @@ -734,13 +794,13 @@ function setBranding(brand,version,its) { } // Comment each of the following lines to get only partial branding - document.body.style.background = brandColor; - document.getElementById("titles").style.background = brandColor; + jetpack.tabs.focused.contentDocument.body.style.background = brandColor; + $("#titles",document).style.background = brandColor; // Make background-color of the body of bug salmon pink // for security bugs. if (hasKeyword("Security")) { - var divBody = document.getElementById("bugzilla-body"); + var divBody = $("#bugzilla-body",document); divBody.style.backgroundImage = "none"; divBody.style.backgroundColor = SalmonPink; } @@ -748,7 +808,7 @@ function setBranding(brand,version,its) { // we should make visible whether maintCCAddr is in CCList if (isInList(maintCCAddr, CCList)) { - var switchCCEdit=document.getElementById("cc_edit_area_showhide"); + var switchCCEdit=$("#cc_edit_area_showhide",document); //switchCCEdit.textContent = "*"+switchCCEdit.textContent; switchCCEdit.style.color = "navy"; switchCCEdit.style.fontWeight = "bolder"; @@ -786,12 +846,12 @@ function addNewButton(originalLocation,newId,newLabel,commentString,nState,secPa newButton.setAttribute("value",newLabel); var commStr = ""; if (msgStrs[commentString]) { - commStr = msgStrs[commentString]; + commStr = msgStrs[commentString]; } newButton.addEventListener('click',function (evt) { generalPurposeCureForAllDisease(commStr, nState, secPar); },true); - var textNode = document.createTextNode("\u00A0"); + var textNode = jetpack.tabs.focused.contentDocument.createTextNode("\u00A0"); originalLocation.parentNode.insertBefore(textNode,originalLocation); originalLocation.parentNode.insertBefore(newButton,textNode); } @@ -805,7 +865,7 @@ function addNewButton(originalLocation,newId,newLabel,commentString,nState,secPa * Checks for the existing keywords. */ function addKeyword(str) { - var kwd = document.getElementById('keywords'); + var kwd = jetpack.tabs.focused.contentDocument.getElementById('keywords'); if (kwd.value.length == 0) { kwd.value = str; }else{ @@ -821,10 +881,10 @@ function addKeyword(str) { * */ function hasKeyword(str) { - var kwd = strip(document.getElementById('keywords').value); + var kwd = trim(jetpack.tabs.focused.contentDocument.getElementById('keywords').value); return (RegExp(str).test(kwd)); } - + /** * Add XGL to the CC list @@ -840,7 +900,7 @@ function changeOwnerHandler(evt) { if (!isInList(maintCCAddr, CCList)) { addToCC(maintCCAddr); } - var setDefaultAssigneeCheckbox = document.getElementById("set_default_assignee"); + var setDefaultAssigneeCheckbox = $("#set_default_assignee",document); setDefaultAssigneeCheckbox.checked = false; selectOption("bug_status", "ASSIGNED"); } @@ -852,7 +912,7 @@ function changeOwnerHandler(evt) { * @return none */ function setNeedinfoReporter() { - var checkbox = document.getElementById("needinfo"); + var checkbox = $("#needinfo",document); checkbox.click(); selectOption("needinfo_role", "reporter"); } @@ -864,7 +924,7 @@ function setNeedinfoReporter() { * @return none */ function addTextToComment(string2BAdded) { - var commentTextarea = document.getElementById("comment"); + var commentTextarea = $("#comment",document); // don't remove the current content of the comment box, // just behave accordingly @@ -881,13 +941,13 @@ function addTextToComment(string2BAdded) { * @return none */ function addToCC(address) { - var sel = document.getElementById("newcc"); + var sel = $("#newcc",document); sel.value = address; } /** * Generalized function for all actions - * + * * @param addString string to be added as new comment * @param nextState string signifying next state of the bug (whatever is in Bugzilla + "NEEDINFO" meaning NEEDINFO(Reporter)) @@ -899,7 +959,7 @@ function generalPurposeCureForAllDisease(addString,nextState,secondParameter) { if (addString.length >0) { addTextToComment(addString); } - + if (nextState == "CLOSED") { if (secondParameter == "UPSTREAM") { addClosingUpstream(); @@ -911,8 +971,8 @@ function generalPurposeCureForAllDisease(addString,nextState,secondParameter) { throw("Missing resolution for CLOSED status."); } } - - // Now closing bugs is done, what about the rest? + + // Now closing bugs is done, what about the rest? if (nextState == "NEEDINFO") { setNeedinfoReporter(); } else if (nextState == "ADDKEYWORD") { @@ -928,11 +988,11 @@ function generalPurposeCureForAllDisease(addString,nextState,secondParameter) { } else if (nextState.length >0) { selectOption("bug_status", nextState); } - + if (secondParameter == "ADDSELFCC") { - document.getElementById("addselfcc").checked = true; + $("#addselfcc",document).checked = true; } else if (secondParameter == "NODEFAULTASSIGNEE") { - document.getElementById("set_default_assignee").checked = false; + $("#set_default_assignee",document).checked = false; } } @@ -976,28 +1036,28 @@ function getWholeURL(selectValue,bugID) { * @return none */ function addClosingUpstream() { - var externalRefs = document.getElementById("external_bugs_table"); + var externalRefs = $("#external_bugs_table",document); var refs = externalRefs.getElementsByTagName("tr"); // that's a bad id, if there is a one. - var inputBox = document.getElementById("inputbox"); + var inputBox = $("#inputbox",document); var externalBugID = 0; - var externalHost = ""; var wholeURL = ""; // Fix missing ID on the external_id SELECT - document.getElementsByName("external_id")[0].id = "external_id"; + jetpack.tabs.focused.contentDocument.getElementsByName("external_id")[0].id = "external_id"; if (inputBox.value.match(/^http.*/)) { wholeURL = inputBox.value; - var IBURLArr = parseUri(wholeURL); - externalHost = IBURLArr.host; - externalBugID = parseInt(IBURLArr.queryKey["id"]); + var IBURLArr = parseURL(wholeURL); + console.log("IBURLArr = " + IBURLArr.toSource()); + externalBugID = parseInt(IBURLArr.params["id"]); inputBox.value = externalBugID; - var bugzillaName = getBugzillaName(externalHost); + var bugzillaName = getBugzillaName(IBURLArr.host); selectOption("external_id", bugzillaName); + console.log("externalBugID = " + externalBugID); } else if (!isNaN(inputBox.value)) { externalBugID = parseInt(inputBox.value); - var bugzillaID = document.getElementById("external_id").value; + var bugzillaID = $("#external_id",document).value; wholeURL = getWholeURL(bugzillaID,externalBugID); } else { // no inputBox.value -- maybe there is an external bug from @@ -1031,9 +1091,9 @@ function swapXGLMainToCCListHandler(evt) { addToCC(maintCCAddr); } if (isInList(login, CCList)) { - var selBox = document.getElementById("cc"); + var selBox = $("#cc",document); selBox[myAddrIndex].selected = true; - document.getElementById("removecc").checked = true; + $("#removecc",document).checked = true; } evt.stopPropagation(); evt.preventDefault(); @@ -1045,7 +1105,7 @@ function swapXGLMainToCCListHandler(evt) { * @param bugNo */ function fixAllHrefs(bugNo) { - var AList = document.getElementsByTagName("a"); + var AList = jetpack.tabs.focused.contentDocument.getElementsByTagName("a"); var curA; var hrefStr = ""; var reProcess = RegExp(""); @@ -1075,15 +1135,18 @@ function generateToolBar(anchor,array) { } /** - * make sure that prefs.js contain password for bugzilla + * make sure that prefs.js contain password for bugzilla * @return None */ function checkPrivateValues() { - var password = GM_getValue("BZpassword",""); - if (password == "") { - password = prompt("Enter your Bugzilla password",""); - GM_setValue("BZpassword",password); - } + var password = ""; + if (myStorage.BZpassword) { + password = myStorage.BZpassword; + } + if (password == "") { + password = prompt("Enter your Bugzilla password",""); + myStorage.BZpassword = password; + } } /** @@ -1093,17 +1156,17 @@ function checkPrivateValues() { function getLogin() { var tmpElement = {}; var tmpText = ""; - var divHeaderElement = document.getElementById("header"); + var divHeaderElement = $("#header",document); var headerLiElements = divHeaderElement.getElementsByTagName("ul")[0].getElementsByTagName("li"); var loginLIElement = headerLiElements[headerLiElements.length-1]; - var loginText = strip(loginLIElement.lastChild.textContent); + var loginText = trim(loginLIElement.lastChild.textContent); return loginText; } /** * Main executable functioning actually building all buttons on the page -- separated into function, so that - * it could be called from onload method of the GM_XMLHTTPRequest. + * it could be called from onload method of the XMLHttpRequest. * @param jsonList Array created from JSON * @return none */ @@ -1119,7 +1182,7 @@ function buildButtons(above,below) { //---------------------------------------------- //Generate a list of <input> elements in the page var IBList = []; - var IBRawList = document.getElementsByTagName("input"); + var IBRawList = jetpack.tabs.focused.contentDocument.getElementsByTagName("input"); for (var i=0;i<IBRawList.length;i++) { if ((IBRawList[i].hasAttribute("type")) && (IBRawList[i].getAttribute("type")=="submit")) { @@ -1135,8 +1198,8 @@ function buildButtons(above,below) { "","ASSIGNED","NODEFAULTASSIGNEE"); // BUTTONS ABOVE THE COMMENT BOX - var textCommentElement = document.getElementById("comment"); - var brElement = document.createElement("br"); + var textCommentElement = $("#comment",document); + var brElement = jetpack.tabs.focused.contentDocument.createElement("br"); textCommentElement.parentNode.insertBefore(brElement,textCommentElement); //var brElement = findNextSiblingByTagName(textCommentElement,"BR",false); var insertAfterElement = brElement; @@ -1149,7 +1212,7 @@ function buildButtons(above,below) { // framework if (queryButtonAvailable){ // Add query search button - var privateCheckbox = document.getElementById("newcommentprivacy"); + var privateCheckbox = $("#newcommentprivacy",document); var newPosition = privateCheckbox.nextSibling.nextSibling.nextSibling; var newButt = originalButton.cloneNode(true); newButt.setAttribute("id","newqueryintab"); @@ -1159,14 +1222,21 @@ function buildButtons(above,below) { },true); newButt.setAttribute("type","button"); newPosition.parentNode.insertBefore(newButt,newPosition); - newPosition.parentNode.insertBefore(document.createTextNode("\u00A0"),newButt); + newPosition.parentNode.insertBefore(jetpack.tabs.focused.contentDocument.createTextNode("\u00A0"),newButt); + } + if ((chipIDsGroupings.length >0) && isXorgBug()) { + // Add find chip magic button + var whiteboardInput = $("#status_whiteboard",document); + if (whiteboardInput.value.search(/card_/) == -1) { + fillInChipMagic(); + } } // Add setting default assignee var defAssignee = getDefaultAssignee(); if ((defAssignee.length > 0) && (defAssignee != owner)) { - var divAssigned = document.getElementById("bz_assignee_edit_container"); - var divAssignedInput = document.getElementById("assigned_to"); - var divAssignedActiveCheckbox = document.getElementById("bz_assignee_edit_action"); + var divAssigned = $("#bz_assignee_edit_container",document); + var divAssignedInput = $("#assigned_to",document); + var divAssignedActiveCheckbox = $("#bz_assignee_edit_action",document); newButt = originalButton.cloneNode(true); newButt.setAttribute("id","setdefaultassigneebutton"); newButt.setAttribute("value","Def. Assignee"); @@ -1178,31 +1248,41 @@ function buildButtons(above,below) { },true); newButt.setAttribute("type","button"); divAssigned.appendChild(newButt); - newButt.parentNode.insertBefore(document.createTextNode("\u00A0"),newButt); + newButt.parentNode.insertBefore(jetpack.tabs.focused.contentDocument.createTextNode("\u00A0"),newButt); } - var curComponentElement = document.getElementById("component"); + var curComponentElement = $("#component",document); curComponentElement.addEventListener('change', function(event) { //FIXME We screw up default assignee value for unknown components var assignee = getDefaultAssignee(); if (assignee.length > 0) { - clickMouse(document.getElementById("bz_assignee_edit_action")); - document.getElementById("assigned_to").value = assignee; - document.getElementById("set_default_assignee").checked = false; + clickMouse($("#bz_assignee_edit_action",document)); + $("#assigned_to",document).value = assignee; + $("#set_default_assignee",document).checked = false; } },false); } // ****************** STATIC DATA ************************* - var XMLRPCurl = "https://bugzilla.redhat.com/xmlrpc.cgi"; +var myStorage = jetpack.storage.simple; // CONFIGURE: The easiest method how to set up the configuration // value is to uncomment the following line with proper URL as // the second parameter. Then reload the bug page and comment out // again. //GM_setValue("JSONURL","URL-somewhere-with-your-JSON"); -var jsonDataURL = GM_getValue("JSONURL","http://mcepl.fedorapeople.org/scripts/BugZappers_data.json"); -var debug = GM_getValue("debug",false); +var jsonDataURL = ""; +myStorage.JSONURL = "http://barstool.build.redhat.com/~mcepl/RH_Data.json"; +if (myStorage.JSONURL) { + jsonDataURL = myStorage.JSONURL +} +if (!jsonDataURL) { + jsonDataURL = "http://mcepl.fedorapeople.org/scripts/BugZappers_data.json"; +} +console.log("jsonDataURL = " + jsonDataURL); +var PCIIDsURL = "http://mcepl.fedorapeople.org/scripts/drm_pciids.json"; +//var debug = GM_getValue("debug",false); +var debug = true; var reqCounter = 0; var msgStrs = {}; @@ -1211,105 +1291,142 @@ var FedoraColor = "#002867"; var RawhideColor = "#007700"; // or "green" var RHITColor = "#660066"; var SalmonPink = "#FFE0B0"; - -// Initialize data from remote URL -var XMLHTTPRequestDone = false; -var hashBugzillaName = Array(); -var hashBugzillaWholeURL = Array(); -var defAssigneeList = Array(); -var signatureFedoraString = ""; -var queryButtonAvailable = false; -var AddrArray = Array(); -GM_xmlhttpRequest({ +var CommentRe = RegExp("^\\s*#"); +var BlankLineRe = RegExp("^\\s*$"); +var ChipsetRE = RegExp("^\\(--\\) ([A-Za-z]+)\\([0-9]?\\): Chipset: (.*)$"); +var ATIgetIDRE = RegExp("^.*\\(ChipID = 0x([0-9a-fA-F]+)\\).*$"); +var PCI_ID_Array = Array(); + +// For identification of graphics card +var manuChipStrs = [ + ["ATI Radeon","ATI","1002"], + ["ATI Mobility Radeon","ATI","1002"], + ["Intel Corporation","INTEL","8086"], + ["NVIDIA","NV","10de"] +]; +var backTranslateManufacturerPCIID = [{ + regexp: "ATI Technologies Inc", + addr: "1002" + },{ + regexp: "Intel Corporation", + addr: "8086" + },{ + regexp: "nVidia Corporation", + addr: "10de" +}]; + +// Get card translation table +XMLHttpRequest({ + // anything called inside of this Request cannot have variables set in MAIN method: 'GET', - url: jsonDataURL, + url: PCIIDsURL, onload: function(response) { - var data = jsonParse(response.responseText); - msgStrs = data['strings']; - signatureFedoraString = data['signature']; - hashBugzillaName = data['bugzillalabelNames']; - hashBugzillaWholeURL = data['bugzillaIDURLs']; - // [{'regexp to match component':'email address of an universal maintainer'}, ...] - AddrArray = data['CCmaintainer'], - defAssigneeList = data['defaultAssignee'], - queryButtonAvailable = data['queryButton']; - buildButtons(data['topRow'],data['bottomRow']); - if (signatureFedoraString.length > 0) { - console.logs("yes, add signature listener"); - // (or a form named "changeform") - document.forms[1].addEventListener("submit",addSignature,true); - } - - + PCI_ID_Array = JSON.parse(response.responseText); } }); -// ******************** MAIN ********************* - -function main(document) { - // FOR DEBUGGING ONLY!!! - if (debug) { - console.log("signatureFedoraString = " + signatureFedoraString); - var urlWarning = document.createElement("span"); - urlWarning.appendChild(document.createTextNode(jsonDataURL)); - urlWarning.style.fontSize = "x-small"; - var urlWarningParent = document.getElementById("bz_field_status"); - urlWarningParent.appendChild(urlWarning); - } - - // *** collect information about the bug - var bugNo = getBugNo(); - var reporter = getReporter(); - var owner = getAssignedTo(); - var CCList = getCCList(); - var product = getProduct(); - var version = getVersion(); - var issueTracker = getIssueTracker(); - var maintCCAddr = getCCMaintainer(); - var component = getComponent(); - checkPrivateValues(); - - var login = getLogin(); - var password = GM_getValue("BZpassword"); - - //*** set the main environment - setBranding(product,version,issueTracker); - - // fix process.cgi HREFs so that to avoid confusion on IRC - if (document.location.href.search(/process.cgi/) != -1) { - fixAllHrefs(bugNo); - } - - // ---------------------------------------------- - // fix attachments - var aTable = getAttTable(); - var badAttachments = getAttachments(aTable).filter(isOctetStream); - - if (badAttachments.length>0) { - var titleElement = $("bz_alias_short_desc_container"); - titleElement.style.backgroundColor = "olive"; - titleElement.appendChild(createFixAllButton(badAttachments)); - for(var i=0;i<badAttachments.length;i++) { - addTextLink(badAttachments[i]); - } - } - - var originalButton = document.getElementById("commit"); // source button to be copied from - originalButton.setAttribute("accesskey",'s'); - originalButton.setAttribute("value","Submit"); +// ******************** MAIN ********************* +function main() { + var hashBugzillaName = Array(); + var hashBugzillaWholeURL = Array(); + var defAssigneeList = Array(); + var signatureFedoraString = ""; + // TODO we should have an array SpecialFlags instead of multiple Boolean variables + var queryButtonAvailable = false; + var chipIDsGroupings = Array(); + var AddrArray = Array(); + // Initialize data from remote URL + var XMLHttpRequestDone = false; + var XorgLogAttList = Array(); + var XorgLogAttListIndex = 0; + + // Get JSON configuration data + XMLHttpRequest({ + // anything called inside of this Request cannot have variables set in MAIN + method: 'GET', + url: jsonDataURL, + onload: function(response) { + var data = JSON.parse(response.responseText); + msgStrs = data['strings']; + signatureFedoraString = data['signature']; + hashBugzillaName = data['bugzillalabelNames']; + hashBugzillaWholeURL = data['bugzillaIDURLs']; + AddrArray = data['CCmaintainer']; + defAssigneeList = data['defaultAssignee']; + queryButtonAvailable = data['queryButton']; + chipIDsGroupings = data['chipIDsGroupings']; + buildButtons(data['topRow'],data['bottomRow']); + if (signatureFedoraString.length > 0) { + // (or a form named "changeform") + document.forms[1].addEventListener("submit",addSignature,true); + } + } + }); + + // FOR DEBUGGING ONLY!!! + if (debug) { + //console.log("signatureFedoraString = " + signatureFedoraString); + $("#bz_field_status",document).append("<span inline='font-size:x-small'>"+jsonDataURL+"</span>"); + } + + // *** collect information about the bug + // var bugNo = getBugNo(); + console.log("BBB"); + var bugNo = $("#title > p:first",document).text(); + console.log("BBB"); + console.log(bugNo); + var reporter = $('#bz_show_bug_column_2 > .fn:first',document).text(); + var owner = $.trim($("#bz_assignee_edit_container > .fn:first",document).text()).toLowerCase(); + var CCList = $("select[name*='cc']:first > *[value]",document); + console.log(typeof(CCList)); + var product = getProduct(); + var version = getVersion(); + var issueTracker = getIssueTracker(); + var maintCCAddr = getCCMaintainer(AddrArray); + var component = getComponent(); + + checkPrivateValues(); + + var login = getLogin(); + var password = myStorage.BZpassword; + + //*** set the main environment + setBranding(product,version,issueTracker); + + // fix process.cgi HREFs so that to avoid confusion on IRC + if (document.location.href.search(/process.cgi/) != -1) { + fixAllHrefs(bugNo); + } + + fixAttachments(); + + var originalButton = document.getElementById("commit"); // source button to be copied from + originalButton.setAttribute("accesskey",'s'); + originalButton.setAttribute("value","Submit"); } -// @require jquery.rpc.js +// https://bugzilla.redhat.com/show_bug.cgi?id=451951 +// -jetpack.future.import("pageMods"); -jetpack.tabs.focused.contentDocument.write("<script type='text/javascript'>$.getScript('http://mcepl.fedorapeople.org/scripts/jquery.rpc.js');</script>",function() { -console.log("jquery.rpc.js loaded"); -}); +// Interesting JEPs +// https://wiki.mozilla.org/Labs/Jetpack/JEP/10 -- clipboard access +// https://wiki.mozilla.org/Labs/Jetpack/JEP/17 -- page mods +var callback = function(document) { + jetpack.statusBar.append({ + onReady: function(widget) { + console.log("Boom!"); + main(); + }, + }); +}; var options = {}; options.matches = [ - "https://bugzilla.redhat.com/show_bug.cgi*", - "https://bugzilla.redhat.com/process_bug.cgi"]; -jetpack.pageMods.add(main, options); -jetpack.tabs.focused. -$('#header').css('backgroundColor','red') + "https://bugzilla.redhat.com/show_bug.cgi*", + "https://bugzilla.redhat.com/process_bug.cgi"]; +jetpack.pageMods.add(callback, options); + + +Chyba: document is not defined +Zdrojový soubor: file:///home/matej/Dokumenty/projekty/triage/jetpack/bugzillaBugTriage.js +Řádek: 1369 |