| /******************************************************************************* |
| * Copyright (c) 2012, 2019 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| //--------------------------------------------------------------------- |
| // |
| // JDT UI Bugzilla Add-on for Bugzilla at bugs.eclipse.org. |
| // For a longer description, see http://www.eclipse.org/jdt/ui/dev.php#scripts |
| // |
| // This is a Greasemonkey user script. To install it, you need |
| // Greasemonkey: http://www.greasespot.net/ |
| // Then restart Firefox and revisit this script. |
| // |
| // To uninstall, go to Add-ons > User Scripts, |
| // select "JDT UI Bugzilla Add-On", and click Remove. |
| // |
| // -------------------------------------------------------------------- |
| // |
| // ==UserScript== |
| // @name JDT UI Bugzilla Add-On |
| // @namespace http://www.eclipse.org/jdt/ui |
| // @description Script to tune Bugzilla for JDT UI |
| // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js |
| // Broken by Greasemonkey 4 (resource is not available on file system, so it can't be edited locally): @grant GM_getResourceText |
| // @grant GM_xmlhttpRequest |
| // @grant GM.xmlHttpRequest |
| // @run-at document-start |
| // @resource config https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.config.js |
| // @downloadURL https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js |
| // @updateURL https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js |
| // @version 1.20210105T1032 |
| |
| // @include https://bugs.eclipse.org/bugs/show_bug.cgi* |
| // @include https://bugs.eclipse.org/bugs/process_bug.cgi |
| // @include https://bugs.eclipse.org/bugs/attachment.cgi* |
| // @include https://bugs.eclipse.org/bugs/enter_bug.cgi* |
| // @include https://bugs.eclipse.org/bugs/post_bug.cgi* |
| // @include https://bugs.eclipse.org/bugs/query.cgi* |
| // @include https://bugs.eclipse.org/bugs/buglist.cgi* |
| // @include https://bugs.eclipse.org/bugs/show_activity.cgi* |
| // @include https://bugs.eclipse.org/bugs/report.cgi* |
| // |
| // Test install for new Bugzilla versions: |
| // @include https://bugs.eclipse.org/bugstest/* |
| // |
| // IBM-internal: |
| // @include https://bugs.ottawa.ibm.com/* |
| // |
| // Locally saved query.cgi (requires about:config setting greasemonkey.fileIsGreaseable = true): |
| // @include file://*/Search%20for%20bugs.htm* |
| // ==/UserScript== |
| |
| // --- Configurable options -------------------------------------------- |
| // These values can be overridden in your local jdtbugzilla.config.js. |
| // Steps in Firefox: |
| // - Greasemonkey > Manage User Scripts |
| // - open context menu on "JDT UI Bugzilla Add-On" |
| // - choose "Show Containing Folder" |
| // - edit jdtbugzilla.config.js |
| |
| // Add as many milestones as you like: |
| var target_milestones= ["4.19 M3", "4.19", "BETA J16"]; |
| |
| // Indexes into target_milestones to be used for "Fixed (in <TM>)" links |
| var main_target_milestones= [0/*, 2*/]; |
| |
| // Add "<name>", "<email>" pairs for people you frequently CC: |
| var ccs= [ |
| "DM", "daniel_megert@ch.ibm.com", |
| "MK", "markus.kell.r@gmail.com", |
| "NG", "noopur_gupta@in.ibm.com", |
| "KP", "kalyan_prasad@in.ibm.com", |
| "SS", "sarika.sinha@in.ibm.com", |
| "JA", "jarthana@in.ibm.com", |
| "MP", "manpalat@in.ibm.com", |
| "VC", "Vikas.Chandra@in.ibm.com", |
| "LS", "lshanmug@in.ibm.com", |
| "SL", "sravankumarl@in.ibm.com", |
| "NM", "niraj.modi@in.ibm.com", |
| ]; |
| var ccs_req= [ |
| "DM", "daniel_megert@ch.ibm.com", |
| "NG", "noopur_gupta@in.ibm.com", |
| "KP", "kalyan_prasad@in.ibm.com", |
| ]; |
| // Add "<name>", "<email>" pairs for people you frequently assign bugs to: |
| var assignees= ccs; |
| |
| // Add "<name>", "<email>" pairs for people you frequently use as flag requestees: |
| var requestees= ccs_req; |
| |
| // Add "<name>", "<string>" pairs for template strings that you frequently insert into the comment field (e.g. repo URLs): |
| var commentTemplates= [ |
| "Fixed with ", "Fixed with ", |
| "jdt.ui", "http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=", |
| "platform.text", "http://git.eclipse.org/c/platform/eclipse.platform.text.git/commit/?id=", |
| "platform.common", "http://git.eclipse.org/c/platform/eclipse.platform.common.git/commit/?id=", |
| "platform.ui", "http://git.eclipse.org/c/platform/eclipse.platform.ui.git/commit/?id=", |
| "platform.team", "http://git.eclipse.org/c/platform/eclipse.platform.team.git/commit/?id=", |
| "pde.ui", "http://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=", |
| "equinox.bundles", "http://git.eclipse.org/c/equinox/rt.equinox.bundles.git/commit/?id=", |
| ]; |
| |
| // Add "<name>", "<string>" pairs for template strings that you frequently insert into the comment field (e.g. repo URLs). |
| // Nested arrays are used to group items line-wise. |
| var commentTemplates2= [ |
| ["Fixed with ", "Fixed with "], |
| [ |
| "eclipse.jdt", "http://git.eclipse.org/c/jdt/eclipse.jdt.git/commit/?id=", |
| ".core", "http://git.eclipse.org/c/jdt/eclipse.jdt.core.git/commit/?id=", |
| ".debug", "http://git.eclipse.org/c/jdt/eclipse.jdt.debug.git/commit/?id=", |
| ".ui", "http://git.eclipse.org/c/jdt/eclipse.jdt.ui.git/commit/?id=", |
| ],[ |
| "eclipse.pde.build", "http://git.eclipse.org/c/pde/eclipse.pde.build.git/commit/?id=", |
| "...ui", "http://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=", |
| ],[ |
| "eclipse.platform", "http://git.eclipse.org/c/platform/eclipse.platform.git/commit/?id=", |
| ".common", "http://git.eclipse.org/c/platform/eclipse.platform.common.git/commit/?id=", |
| ".debug", "http://git.eclipse.org/c/platform/eclipse.platform.debug.git/commit/?id=", |
| ".images", "http://git.eclipse.org/c/platform/eclipse.platform.images.git/commit/?id=", |
| ],[ |
| ".releng", "http://git.eclipse.org/c/platform/eclipse.platform.releng.git/commit/?id=", |
| "..aggregator", "http://git.eclipse.org/c/platform/eclipse.platform.releng.aggregator.git/commit/?id=", |
| ".resources", "http://git.eclipse.org/c/platform/eclipse.platform.resources.git/commit/?id=", |
| ".runtime", "http://git.eclipse.org/c/platform/eclipse.platform.runtime.git/commit/?id=", |
| ],[ |
| ".swt", "http://git.eclipse.org/c/platform/eclipse.platform.swt.git/commit/?id=", |
| ".swt.binaries", "http://git.eclipse.org/c/platform/eclipse.platform.swt.binaries.git/commit/?id=", |
| ".team", "http://git.eclipse.org/c/platform/eclipse.platform.team.git/commit/?id=", |
| ],[ |
| ".text", "http://git.eclipse.org/c/platform/eclipse.platform.text.git/commit/?id=", |
| ".ua", "http://git.eclipse.org/c/platform/eclipse.platform.ua.git/commit/?id=", |
| ".ui", "http://git.eclipse.org/c/platform/eclipse.platform.ui.git/commit/?id=", |
| ],[ |
| "rt.equinox.binaries", "http://git.eclipse.org/c/equinox/rt.equinox.binaries.git/commit/?id=", |
| "...bundles", "http://git.eclipse.org/c/equinox/rt.equinox.bundles.git/commit/?id=", |
| "...framework", "http://git.eclipse.org/c/equinox/rt.equinox.framework.git/commit/?id=", |
| "...p2", "http://git.eclipse.org/c/equinox/rt.equinox.p2.git/commit/?id=", |
| ],[ |
| "www.eclipse.org/eclipse", "http://git.eclipse.org/c/www.eclipse.org/eclipse.git/commit/?id=", |
| "/news", "http://git.eclipse.org/c/www.eclipse.org/eclipse/news.git/commit/?id=", |
| "../jdt", "http://git.eclipse.org/c/www.eclipse.org/jdt.git/commit/?id=", |
| ]]; |
| |
| // Add Products and Components to which you frequently move bugs: |
| var moveProducts= [ "Platform", "JDT", "PDE", "Equinox" ]; |
| var moveComponents= [ "Core", "Debug", "Doc", "SWT", "Text", "UI" ]; |
| |
| // Add quick platform links ("<name>", "<hardware>", "<os>" triplets): |
| var platforms= [ |
| "Win7", "PC", "Windows 7", |
| "Linux", "PC", "Linux", |
| "Mac", "PC", "Mac OS X", |
| ]; |
| |
| // Add quick version links on the search page (<version> for exact version, <version*> for prefix match): |
| var queryVersions= [ "3.*", "4.*"]; |
| |
| // Add quick classifications links on the search page (<name>", ["<classification1>", "<classification2>", ...], ["<product1>", "<product2>", ...] triplets): |
| var queryClassifications= [ |
| "E", ["Eclipse"], ["JDT", "PDE", "Platform"], |
| " & ", ["Eclipse", "RT"], ["Equinox", "JDT", "PDE", "Platform"], |
| "RT", ["RT"], ["Equinox"], |
| ]; |
| |
| // Add quick product links on the search page ("<name>", "<Classification>", ["<product1>", "<product2>", ...] triplets): |
| var queryProducts= [ |
| "EGit", "Technology", ["EGit"], |
| " & ", "Technology", ["EGit", "JGit"], |
| "JGit", "Technology", ["JGit"], |
| ]; |
| |
| // Add quick component links on the search page ("<name>", ["<component1>", "<component2>", ...] pairs): |
| var queryComponents= [ |
| "UI", ["UI"], |
| " & IDE", ["UI", "IDE"], |
| ]; |
| |
| // Add tags to categorize bugs within a component: |
| var categories= new Array(); |
| categories["Text"]= [ |
| "[api]", |
| "[BiDi]", |
| "[block selection]", |
| "[breadcrumb]", |
| "[compare]", |
| "[content assist]", |
| "[correction]", |
| "[dnd]", |
| "[encoding]", |
| "[find/replace]", |
| "[formatting]", |
| "[Graphics]", |
| "[help]", |
| "[hovering]", |
| "[implementation]", |
| "[javadoc]", |
| "[key binding]", |
| "[language family]", |
| "[linked mode]", |
| "[navigation]", |
| "[painting]", |
| "[preferences]", |
| "[printing]", |
| "[projection]", |
| "[quick diff]", |
| "[RCP]", |
| "[reconciling]", |
| "[rulers]", |
| "[save actions]", |
| "[spell checking]", |
| "[syntax highlighting]", |
| "[templates]", |
| "[templates view]", |
| "[typing]", |
| "[validateEdit]", |
| "[wording]", |
| ]; |
| categories["Text"].url= "http://www.eclipse.org/eclipse/platform-text/development/bug-annotation.htm"; |
| |
| categories["JDT"]= [ |
| "[16]", |
| "[15]", |
| "[14]", |
| "[13]", |
| "[12]", |
| "[11]", |
| "[10]", |
| "[9]", |
| "[1.8]", |
| "[1.7]", |
| "[5.0]", |
| "[actions]", |
| "[api]", |
| "[ast rewrite]", |
| "[BiDi]", |
| "[browsing]", |
| "[build path]", |
| "[call hierarchy]", |
| "[ccp]", |
| "[change method signature]", |
| "[clean up]", |
| "[code mining]", |
| "[code style]", |
| "[code templates]", |
| "[common navigator]", |
| "[compare]", |
| "[convert anonymous]", |
| "[convert local]", |
| "[create on paste]", |
| "[dnd]", |
| "[encapsulate field]", |
| "[expand selection]", |
| "[expressions]", |
| "[extract constant]", |
| "[extract interface]", |
| "[extract local]", |
| "[extract method]", |
| "[extract superclass]", |
| "[generalize type]", |
| "[generate constructor]", |
| "[generate delegate]", |
| "[getter setter]", |
| "[Graphics]", |
| "[hashcode/equals]", |
| "[imports on paste]", |
| "[infer type arguments]", |
| "[inline]", |
| "[introduce factory]", |
| "[introduce indirection]", |
| "[introduce parameter]", |
| "[jar exporter]", |
| "[javadoc wizard]", |
| "[JUnit]", |
| "[JUnit 5]", |
| "[ltk]", |
| "[mark occurrence]", |
| "[migrate jar]", |
| "[move member type]", |
| "[move method]", |
| "[move static members]", |
| "[nls tooling]", |
| "[open type]", |
| "[organize imports]", |
| "[override method]", |
| "[package explorer]", |
| "[plan item]", |
| "[preferences]", |
| "[pull up]", |
| "[push down]", |
| "[quick assist]", |
| "[quick fix]", |
| "[refactoring]", |
| "[rename]", |
| "[render]", |
| "[reorg]", |
| "[search]", |
| "[surround with try/catch]", |
| "[toString]", |
| "[type hierarchy]", |
| "[type wizards]", |
| "[use supertype]", |
| "[working sets]", |
| ]; |
| categories["JDT"].url= "http://www.eclipse.org/jdt/ui/doc/bug-annotation.php"; |
| |
| var assignToSymbol = "☚"; //BLACK LEFT POINTING INDEX |
| //var assignToSymbol = "◁"; //White triangle left |
| //var assignToSymbol = "◀"; //Black triangle left |
| //var assignToSymbol = "⌘"; //PLACE OF INTEREST SIGN |
| //var assignToSymbol = ":="; |
| //var assignToSymbol = "↰"; //Upwards Arrow With Tip Leftwards |
| //var assignToSymbol = "✍"; //WRITING HAND |
| //var assignToSymbol = "✎"; //LOWER RIGHT PENCIL |
| //var assignToSymbol = "💻"; //Computer |
| //var assignToSymbol = "⇱"; //North west arrow to corner |
| //var assignToSymbol = "◆"; //Black diamond |
| //var assignToSymbol = "👈"; //Left white hand pointing index (not available on Ubuntu up to 14.04) |
| // // not supported: |
| //var assignToSymbol = "⏺"; //Black Circle for Record |
| //var assignToSymbol = "🡄"; //Leftwards Heavy Arrow |
| //var assignToSymbol = "🡼"; //Wide-Headed North West Heavy Barb Arrow |
| //var assignToSymbol = "🢄"; //Wide-Headed North West Very Heavy Barb Arrow |
| |
| var searchSymbol = "🔎"; //RIGHT-POINTING MAGNIFYING GLASS |
| // Fix bad "emoticon" icon in FF 50: |
| // https://bugzilla.mozilla.org/show_bug.cgi?id=1231701 Use EmojiOne by default |
| // https://bugzilla.mozilla.org/show_bug.cgi?id=1321586 How to go back to previous emoji set |
| var searchSymbolStyle = "font-family: Segoe UI Emoji, Segoe UI Symbol, sans-serif;" |
| |
| // Various CSS fixes: |
| var css = |
| // Fix baseline of labels: |
| ".field_label { padding-top: .25em; padding-bottom: .3em; }\n" |
| // Fix colors in title: |
| + "#titles a { color: #039 ! important; }\n" |
| + "#titles a:visited { color: #636 ! important; }\n" |
| + "#titles a:hover { color: #333 ! important; }\n" |
| + "#titles a:active { color: #000 ! important; }\n" |
| + "#titles { background-color: #C0C0C0; color: #000000; }\n" |
| // Decrease height of title: |
| + "#titles { padding-top: 0.3em; padding-bottom: 0.3em; }\n" |
| + "#titles span { padding-top: 0em ! important; padding-bottom: 0em ! important; }\n" |
| // Fix color of comment number: |
| + ".bz_comment_number { color: #65379c; }\n" |
| // Fix bg color of enhancements in bug lists, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=331415 : |
| + ".bz_enhancement { background-color: #FFFFFF ! important; }\n" |
| + ".bz_row_odd { background-color: #F7F7F7 ! important; }\n" |
| |
| // Don't wrap headers in bug lists, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=333392#c4 : |
| + "tr.bz_buglist_header th a { white-space: nowrap; }\n" |
| // Remove disgusting underlines: |
| + "td.bz_short_desc_column a { text-decoration: none; }\n" |
| + "td.bz_short_desc_column a:hover { text-decoration: underline; }\n" |
| // Highlight row background on hover: |
| // + "tr.bz_bugitem:hover { background-color: #CCCCFF; ! important }" // doesnt work, since other rules are more important... |
| |
| // Fix attachments table width: |
| + "#attachment_table { width: auto ! important; }\n" |
| // Make "Show Obsolete" more prominent: |
| + ".bz_attach_view_hide { font-weight: bold ! important; color: red ! important; }\n" |
| // Always show vertical scroll bar for Description field (gives proper wrapping-preview for short comments): |
| + "#comment { overflow-y:scroll; }\n" |
| // Render <button> like <input>: |
| + "button { font-family: Verdana, sans-serif; font-size: small; }\n" |
| // Make auto-complete drop-downs look like drop-downs: |
| + ".yui-ac-content { box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.8); }\n" |
| // Don't fill whole line with email field on bug page (Bugzilla sets to 100% which makes quick links wrap): |
| + ".bz_userfield { width: 300px; }\n" |
| |
| // Search field dimensions: |
| + ".search_field_grid select { height: 19ex ! important; width: 12em ! important; }\n" |
| + ".search_field_grid { margin-top: 0em; }\n" |
| + ".search_email_fields { width: 365px; }\n" |
| + "#field_label_short_desc { width: auto; }\n" |
| // Don't waste another line for Search > Bugs numbered: |
| + "#bug_id_container .field_help { display:inline; }\n" |
| |
| // Don't show "Add Me to the CC List" button in "Possible Duplicates" on enter_bug.cgi: |
| + ".yui-dt-col-update_token { display: none; }\n" |
| |
| // De-colorize CLA flags until hovered, and fix baseline: (partially fixed via bug 498088 comment 14) |
| + ".cla_dec { filter: sepia(1); opacity: 0.33; vertical-align: bottom; }\n" |
| + ".cla_dec:hover { filter: none; opacity: 1.0; }\n" |
| |
| // "See Also" list: Avoid jagged "Remove" checkboxes and move them out of the way |
| + "#field_container_see_also ul li:hover { background-color:#F4F4F4 }\n" |
| + "#field_container_see_also ul li:hover label { background-color:#F4F4F4 }\n" |
| + "#field_container_see_also ul li label { position:absolute; right:16px; background-color:white }\n" |
| |
| // CSS for "toggle wide comments" |
| + ".wide { width: 100%; }\n" |
| |
| // Fix to hide horizontal scroll bar in quoted comments |
| + ".bz_comment_text span.quote { overflow: visible; }\n" |
| |
| // Fix font of <select> elements: |
| // Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1123654 / https://bugzilla.mozilla.org/show_bug.cgi?id=1194055 |
| // Firefox 40 changed the default font for <select> to the OS default font ("Tahoma" for me), but not using the OS default font size. |
| // Firefox <= 39 used "MS Sans Serif". Tahoma 10 is very ugly. Let's just inherit the page font: |
| + "select { font-family: inherit; }\n" |
| |
| // Fix for "See Also" bug references with huge unbreakable summary (bug 511841 referring to bug 511743): |
| + ".bug_urls { max-width: 45em; overflow-wrap: break-word; }\n" |
| |
| ; |
| |
| // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith#Polyfill for Chromium 37 on Ubuntu 12.04: |
| if (!String.prototype.startsWith) { |
| String.prototype.startsWith = function(searchString, position){ |
| position = position || 0; |
| return this.substr(position, searchString.length) === searchString; |
| }; |
| } |
| |
| // Features like short bug links (https://bugs.eclipse.org/123456), quick links for product, component, target milestone, etc. only |
| // make sense in the main Eclipse Bugzilla install. Disable them in other Bugzillas, where the rest of the script still works fine. |
| var isBugsEclipseOrg= location.href.startsWith("https://bugs.eclipse.org/bugs/"); |
| |
| // --- /Configurable options ------------------------------------------ |
| |
| // Broken by Greasemonkey 4: |
| //if (typeof GM_getResourceText !== "undefined") { // GM_getResourceText is not available in Google Chrome, so let's go with the defaults. |
| // var config = GM_getResourceText("config"); |
| // eval(config); |
| //} |
| |
| //----------- Functions: |
| function hideElem(id) { |
| var elem= document.getElementById(id); |
| if (elem) { |
| elem.setAttribute("class", "bz_default_hidden"); |
| } |
| return elem; |
| } |
| |
| function showElem(id) { |
| var elem= document.getElementById(id); |
| if (elem) { |
| elem.removeAttribute("class"); |
| } |
| return elem; |
| } |
| |
| function fixCheckboxField(containerId, inputId, labelText) { |
| hideElem(containerId); |
| var inputIdElem= showElem(inputId); |
| if (inputIdElem) { |
| inputIdElem.removeChild(inputIdElem.getElementsByTagName("br")[0]); |
| inputIdElem.getElementsByTagName("label")[0].textContent= labelText; |
| inputIdElem.firstElementChild.setAttribute("style", "margin-right: 1em"); |
| } |
| } |
| |
| function addLink(name, href, parentElem, tooltip, separator) { |
| // console.debug(name + "," + href + "," + tooltip + "," + separator); |
| var linkElem= document.createElement("a"); |
| linkElem.href= href; |
| linkElem.innerHTML= name; |
| if (tooltip) { |
| linkElem.title= tooltip; |
| } |
| if (parentElem.hasChildNodes()) { |
| if (separator == false) { |
| //nop |
| } else if (typeof separator == "string") { |
| parentElem.appendChild(document.createTextNode(separator)); |
| } else { |
| parentElem.appendChild(document.createTextNode(" | ")); |
| } |
| } |
| parentElem.appendChild(linkElem); |
| return linkElem; |
| } |
| |
| function addMultiLink(name, onClick, onModifierClick, parentElem, tooltip, separator) { |
| var linkElem= document.createElement("a"); |
| var href= 'javascript:' |
| + 'var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;' |
| + 'if (modClick) {' |
| + onModifierClick |
| + '} else {' |
| + onClick |
| + '}' |
| + 'return false;'; |
| linkElem.setAttribute("onmouseup", href); |
| linkElem.setAttribute("onclick", "return false;"); // blocks Ctrl+Click from opening a new tab (but not middle-click) |
| linkElem.href= "javascript:void('Modifier+Click to toggle')"; |
| linkElem.innerHTML= name; |
| if (tooltip) { |
| linkElem.title= tooltip; |
| } |
| if (parentElem.hasChildNodes() && !(separator == false)) { |
| parentElem.appendChild(document.createTextNode(" | ")); |
| } |
| parentElem.appendChild(linkElem); |
| } |
| |
| function addStatusLink(name, status, resolution, parentElem) { |
| var href= 'javascript:document.getElementById("bug_status").value="' + status + '";'; |
| href += 'showHideStatusItems("",["",""]);'; |
| if (resolution) { |
| href += 'document.getElementById("resolution").value="' + resolution + '";'; |
| } |
| href += 'document.getElementById("assigned_to").focus();' |
| + 'document.getElementById("assigned_to").select();' |
| + 'void(0);'; |
| addLink(name, href, parentElem); |
| } |
| |
| var addOldAssigneeAsCcScript= |
| 'var assignee= document.getElementById("assigned_to").value;' |
| + 'var newccElem= document.getElementById("newcc");' |
| + 'if (assignee.search(/(?:inbox|triaged)@eclipse.org/i) == -1' // don't copy inbox |
| + ' && assignee.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)' // don't copy incomplete addresses |
| + ' && !newccElem.value.includes(assignee)) {' // don't copy if already there |
| + ' newccElem.value= assignee + ", " + newccElem.value;' |
| + ' newccElem.focus();' |
| + ' newccElem.selectionStart= 0;' |
| + ' newccElem.selectionEnd= assignee.length + 2;' |
| + '}'; |
| |
| function getAssigneeLinkScript(email) { |
| return 'javascript:' |
| + addOldAssigneeAsCcScript |
| + 'assignTo("' + email + '");' |
| + 'void(0);'; |
| } |
| |
| function addAssigneeLink(name, email, parentElem) { |
| var href= getAssigneeLinkScript(email); |
| addLink(name, href, parentElem, email); |
| } |
| |
| function addCcLink(name, email, parentElem, fieldName) { |
| var href= 'javascript:document.getElementById("' + fieldName + '").value="' + email + ', " + document.getElementById("' + fieldName + '").value;' |
| + 'document.getElementById("' + fieldName + '").focus();' |
| + 'document.getElementById("' + fieldName + '").selectionStart= 0;' |
| + 'document.getElementById("' + fieldName + '").selectionEnd= ' + (email.length + 2) + ';' |
| + 'void(0);'; |
| addLink(name, href, parentElem, email); |
| } |
| |
| function addRequesteeLink(name, email, parentElem, fieldId) { |
| var href= 'javascript:document.getElementById("' + fieldId + '").value="' + email + '";' |
| + 'document.getElementById("' + fieldId + '").focus();' |
| + 'void(0);'; |
| addLink(name, href, parentElem, email); |
| } |
| |
| function addProductLink(name, parentElem) { |
| var href= 'javascript:' |
| + addOldAssigneeAsCcScript |
| + 'document.getElementById("product").value="' + name + '";' |
| + 'document.getElementById("set_default_assignee").checked= true;' |
| + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";' |
| + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "bold");' |
| + 'document.getElementById("product").focus();' |
| + 'void(0);'; |
| addLink(name, href, parentElem); |
| } |
| |
| function addComponentLink(name, parentElem) { |
| var href= 'javascript:' |
| + addOldAssigneeAsCcScript |
| + 'document.getElementById("component").value="' + name + '";' |
| + 'document.getElementById("set_default_assignee").checked= true;' |
| + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "bold");' |
| + 'document.getElementById("component").focus();' |
| + 'void(0);'; |
| addLink(name, href, parentElem); |
| } |
| |
| function addPlatformLink(parentElem, name, hardware, os) { |
| var href= 'javascript:document.getElementById("rep_platform").value="' + hardware + '";' |
| + 'document.getElementById("op_sys").value="' + os + '";' |
| + 'void(0);'; |
| addLink(name, href, parentElem); |
| } |
| |
| function addSearch_email_fieldsLinks(emailElemName, myMail) { |
| var emailElem= document.getElementById(emailElemName); |
| if (emailElem) { |
| emailElem.setAttribute("style", "width: 100%"); |
| var emailtypeElems= emailElem.parentNode.getElementsByTagName("select"); |
| if (!(emailtypeElems && emailtypeElems[0])) { // intermediate <div id="email1_autocomplete" class="yui-ac"> |
| emailtypeElems= emailElem.parentNode.parentNode.getElementsByTagName("select"); |
| emailElem.parentNode.setAttribute("style", "width: 100%"); |
| } |
| if (emailtypeElems && emailtypeElems[0]) { |
| var emailtypeElem= emailtypeElems[0]; |
| |
| var sp= document.createElement("span"); |
| emailtypeElem.parentNode.insertBefore(sp, emailtypeElem.nextElementSibling); |
| if (myMail) { |
| addEmailLink("me", myMail, emailElemName, sp); |
| } |
| for (var i= 0; i < ccs.length; i= i+2) { |
| addEmailLink(ccs[i], ccs[i + 1], emailElemName, sp); |
| } |
| emailtypeElem.parentNode.insertBefore(document.createElement("br"), emailtypeElem.nextElementSibling.nextElementSibling); |
| |
| } |
| |
| // Add "None" and "All" links after "Any of:" labels: |
| var sp= document.createElement("span"); |
| sp.style.marginLeft= ".5em"; |
| emailElem.parentNode.insertBefore(sp, emailElem.parentNode.firstElementChild); |
| var noneHref= 'javascript:' |
| + 'var emailElem= document.getElementById("' + emailElemName + '");' |
| + 'var allInputs= emailElem.parentNode.parentNode.getElementsByTagName("input");' |
| + 'for (var i= 0; i < allInputs.length; i++) {' |
| + ' var inputElem= allInputs[i];' |
| + ' if (inputElem.type == "checkbox") {' |
| + ' inputElem.checked= false;' |
| + ' }' |
| + '}' |
| + 'void(0);'; |
| addLink("∅", noneHref, sp, "select none", false); |
| var allHref= 'javascript:' |
| + 'var emailElem= document.getElementById("' + emailElemName + '");' |
| + 'var allInputs= emailElem.parentNode.parentNode.getElementsByTagName("input");' |
| + 'for (var i= 0; i < allInputs.length; i++) {' |
| + ' var inputElem= allInputs[i];' |
| + ' if (inputElem.type == "checkbox") {' |
| + ' inputElem.checked= true;' |
| + ' }' |
| + '}' |
| + 'void(0);'; |
| addLink("All", allHref, sp, null, true); |
| } |
| } |
| |
| function addEmailLink(name, email, emailElemName, parentElem) { |
| var href= 'javascript:document.getElementsByName("' + emailElemName + '")[0].value="' + email + '";' |
| + 'document.getElementsByName("' + emailElemName + '")[0].focus();' |
| + 'void(0);'; |
| addLink(name, href, parentElem, email); |
| } |
| |
| function addFromDateLink(parentElem, value, name) { |
| if (!name) |
| name = value; |
| var href= 'javascript:document.getElementById("chfieldfrom").value="' + value + '";' |
| + 'document.getElementById("chfieldfrom").focus();' |
| + 'void(0);'; |
| addLink(name, href, parentElem); |
| } |
| |
| function addFixedInTargetLink(parentElem, target_milestone) { |
| var href= 'javascript:document.getElementById("target_milestone").value="' + target_milestone + '";' |
| + 'document.getElementById("bug_status").value="RESOLVED";' |
| + 'document.getElementById("resolution").value="FIXED";' |
| + 'showHideStatusItems("", ["",""]);' |
| + 'document.getElementById("assigned_to").focus();' |
| + 'document.getElementById("assigned_to").select();'; |
| + 'void(0);'; |
| addLink("(in " + target_milestone + ")", href, parentElem); |
| } |
| |
| function addTargetLink(parentElem, milestone) { |
| var onModifierClick= |
| 'if (!document.getElementById("assigned_to")) {' |
| + 'var target_milestoneElem= document.getElementById("target_milestone");' |
| + 'target_milestoneOptions= target_milestoneElem.options;' |
| + 'for (var i= 0; i < target_milestoneOptions.length; i++) {' |
| + 'if (target_milestoneOptions[i].text == "' + milestone + '") target_milestoneOptions[i].selected= !target_milestoneOptions[i].selected;' |
| + '}' |
| + '}'; |
| |
| var onClick= |
| 'var target_milestoneElem= document.getElementById("target_milestone");' |
| + 'target_milestoneElem.value="' + milestone + '";' |
| + 'target_milestoneElem.focus();'; |
| |
| addMultiLink(milestone, onClick, onModifierClick, parentElem); |
| } |
| |
| function createFieldLabelClearAndQuickLinkSpan(fieldLabelElem, fieldId) { |
| fieldLabelElem.firstElementChild.firstElementChild.setAttribute("style", "display: inline;"); |
| fieldLabelElem.setAttribute("style", "text-align: left;"); |
| |
| var spanElem= document.createElement("span"); |
| // spanElem.style.marginLeft= ".5em"; |
| spanElem.style.fontWeight= "normal"; |
| var href= 'javascript:var fieldElem= document.getElementById("' + fieldId + '");' |
| + 'fieldElem.selectedIndex= -1;' |
| + 'fieldElem.focus();' |
| + 'bz_fireEvent(fieldElem, "change");;' |
| + 'void(0);'; |
| addLink("∅", href, spanElem, "select none", false); |
| spanElem.appendChild(document.createTextNode(" ")); |
| |
| fieldLabelElem.firstElementChild.appendChild(spanElem); |
| return spanElem; |
| } |
| |
| function addQueryClassificationsLink(parentElem, classifications, products, name) { |
| var href= 'javascript:var classificationElem= document.getElementById("classification");' |
| + ' classificationElem.selectedIndex= -1;' |
| + ' var classificationOptions= document.getElementById("classification").options;'; |
| |
| for (var i = 0; i < classifications.length; i++) { |
| href += 'for (var i = 0; i < classificationOptions.length; i++) {' |
| + ' if (classificationOptions[i].text == "' + classifications[i] + '") classificationOptions[i].selected= true' |
| + '}'; |
| } |
| href += 'bz_fireEvent(classificationElem, "change");' |
| + 'var productElem= document.getElementById("product");' |
| if (products.length > 0) { |
| href += 'productElem.value="' + products[0] + '";'; |
| for (var i = 0; i < products.length; i++) { |
| href += 'var productOptions= productElem.options;' |
| + 'for (var i = 0; i < productOptions.length; i++) {' |
| + ' if (productOptions[i].text == "' + products[i] + '") productOptions[i].selected= true' |
| + '}'; |
| } |
| href += 'bz_fireEvent(productElem, "change");'; |
| } |
| href+= 'void(0);'; |
| addLink(name, href, parentElem, classifications, false); |
| } |
| |
| function addQueryProductsLink(parentElem, classification, products, name) { |
| var href= 'javascript:var classificationElem= document.getElementById("classification");' |
| + 'classificationElem.value="' + classification + '";' |
| + 'bz_fireEvent(classificationElem, "change");' |
| + 'var productElem= document.getElementById("product");' |
| + 'productElem.value="' + products[0] + '";'; |
| |
| for (var i = 0; i < products.length; i++) { |
| href += 'var productOptions= productElem.options;' |
| + 'for (var i = 0; i < productOptions.length; i++) {' |
| + ' if (productOptions[i].text == "' + products[i] + '") productOptions[i].selected= true' |
| + '}'; |
| } |
| href += 'bz_fireEvent(productElem, "change");' |
| + 'void(0);'; |
| addLink(name, href, parentElem, products, false); |
| } |
| |
| function addQueryComponentsLink(parentElem, components, name) { |
| var href= 'javascript:document.getElementById("component").selectedIndex= -1;' |
| + ' var componentOptions= document.getElementById("component").options;'; |
| |
| for (var i = 0; i < components.length; i++) { |
| href += 'for (var i = 0; i < componentOptions.length; i++) {' |
| + ' if (componentOptions[i].text == "' + components[i] + '") componentOptions[i].selected= true' |
| + '}'; |
| } |
| href += 'void(0);'; |
| addLink(name, href, parentElem, components, false); |
| } |
| |
| function addQueryStatusesLink(parentElem, statuses, name) { |
| var onClick= |
| 'document.getElementById("bug_status").selectedIndex= -1;' |
| + 'var bug_statusOptions= document.getElementById("bug_status").options;'; |
| for (var i = 0; i < statuses.length; i++) { |
| onClick+= |
| 'for (var i = 0; i < bug_statusOptions.length; i++) {' |
| + ' if (bug_statusOptions[i].text == "' + statuses[i] + '") bug_statusOptions[i].selected= true;' |
| + '};'; |
| } |
| |
| var onModifierClick= |
| 'var bug_statusOptions= document.getElementById("bug_status").options;'; |
| for (var i = 0; i < statuses.length; i++) { |
| onModifierClick+= |
| 'for (var i = 0; i < bug_statusOptions.length; i++) {' |
| + ' if (bug_statusOptions[i].text == "' + statuses[i] + '") bug_statusOptions[i].selected= !bug_statusOptions[i].selected;' |
| + '};'; |
| } |
| |
| addMultiLink(name, onClick, onModifierClick, parentElem, null, false); |
| } |
| |
| function addQueryVersionsLink(parentElem, version) { |
| var onClick= 'javascript:document.getElementById("version").selectedIndex= -1;' |
| + ' var versionOptions= document.getElementById("version").options;' |
| + 'for (var i = 0; i < versionOptions.length; i++) {'; |
| |
| if (version.charAt(version.length - 1) == "*") |
| onClick += 'if (versionOptions[i].text.substring(0, ' + (version.length - 2) + ') == "' + version.substring(0, version.length - 2) + '") versionOptions[i].selected= true;'; |
| else |
| onClick += 'if (versionOptions[i].text == "' + version + '") versionOptions[i].selected= true;'; |
| |
| onClick += '}' |
| +'void(0);'; |
| |
| |
| var onModifierClick= 'javascript:var versionOptions= document.getElementById("version").options;' |
| + 'for (var i = 0; i < versionOptions.length; i++) {'; |
| |
| if (version.charAt(version.length - 1) == "*") |
| onModifierClick += 'if (versionOptions[i].text.substring(0, ' + (version.length - 2) + ') == "' + version.substring(0, version.length - 2) + '") versionOptions[i].selected= !versionOptions[i].selected;'; |
| else |
| onModifierClick += 'if (versionOptions[i].text == "' + version + '") versionOptions[i].selected= !versionOptions[i].selected;'; |
| |
| onModifierClick += '}' |
| +'void(0);'; |
| |
| |
| addMultiLink(version, onClick, onModifierClick, parentElem); |
| } |
| |
| function addQueryOSLink(parentElem, oses, name) { |
| var onClick= |
| 'document.getElementById("op_sys").selectedIndex= -1;' |
| + 'var op_sysOptions= document.getElementById("op_sys").options;'; |
| for (var i = 0; i < oses.length; i++) { |
| onClick+= |
| 'for (var i = 0; i < op_sysOptions.length; i++) {' |
| + ' if (op_sysOptions[i].text.indexOf("' + oses[i] + '") == 0) op_sysOptions[i].selected= true;' |
| + '};'; |
| } |
| |
| var onModifierClick= |
| 'var op_sysOptions= document.getElementById("op_sys").options;'; |
| for (var i = 0; i < oses.length; i++) { |
| onModifierClick+= |
| 'for (var i = 0; i < op_sysOptions.length; i++) {' |
| + ' if (op_sysOptions[i].text.indexOf("' + oses[i] + '") == 0) op_sysOptions[i].selected= !op_sysOptions[i].selected;' |
| + '};'; |
| } |
| |
| addMultiLink(name, onClick, onModifierClick, parentElem, null, true); |
| } |
| |
| function setOptionSize(elementId, size) { |
| var elem= document.getElementById(elementId); |
| if (elem) { |
| elem.setAttribute("size", size); |
| } |
| } |
| |
| function setAccessKey(elementId, key) { |
| var elem= document.getElementById(elementId); |
| if (elem) { |
| elem.setAttribute("accesskey", key); |
| } |
| } |
| |
| function createCategoriesChooser(component, categories) { |
| var categoriesElem= document.createElement("select"); |
| categoriesElem.setAttribute("name", ""); // empty name => field will not be submitted with enclosing form |
| categoriesElem.setAttribute("onchange", |
| "var form= document.changeform;" + |
| "if (!form) { form= document.queryform; }" + |
| "if (!form) { form= document.Create; }" + |
| "if (this.value[0] != '[') {" + |
| " if (this.value == '-- clear categories --') {" + |
| " form.short_desc.value= form.short_desc.value.replace(/^(\\[[\\w \\.]*\\]\\s*)+/, '');" + |
| " }" + |
| " return;" + |
| "}" + |
| "var cat= this.value.substring(1);" + |
| "var regex= /^\s*\\[([\\w \\.]*)\\]/y;" + |
| "var match;" + |
| "var lastEnd= 0;" + |
| "while (true) {" + |
| " match= regex.exec(form.short_desc.value);" + |
| " if (match == null || match[1].localeCompare(cat, 'en', {sensitivity: \"base\"}) > 0) {" + |
| " var space= (match == null && lastEnd == 0) ? ' ' : '';" + |
| " form.short_desc.value= form.short_desc.value.substring(0, lastEnd) + this.value + space + form.short_desc.value.substring(lastEnd);" + |
| " return;" + |
| " } else {" + |
| " lastEnd= regex.lastIndex;" + |
| " }" + |
| "}" |
| ); |
| var allCategories= [ |
| "-- " + component + " category --", |
| "-- clear categories --" |
| ]; |
| allCategories= allCategories.concat(categories); |
| for (var k= 0; k < allCategories.length; k++) { |
| var newOption= document.createElement("option"); |
| var categoriesName= allCategories[k]; |
| newOption.setAttribute("value", categoriesName); |
| newOption.innerHTML = categoriesName.substring(1, categoriesName.length - 1); |
| categoriesElem.appendChild(newOption); |
| } |
| return categoriesElem; |
| } |
| |
| function createCategoryChoosers() { |
| var choosers= document.createElement("span"); |
| for (var component in categories) { |
| addLink(component + ":", categories[component].url, choosers); |
| choosers.appendChild(document.createTextNode(" ")); |
| choosers.appendChild(createCategoriesChooser(component, categories[component])); |
| } |
| return choosers; |
| } |
| |
| function createCommentTemplateLinks() { |
| return createCommentTemplates2Links(); |
| /* |
| // Add links to help enter a URL to a Git commit: |
| var pElem= document.createElement("p"); |
| pElem.style.marginLeft= "1em"; |
| pElem.style.lineHeight= "2em"; |
| pElem.appendChild(document.createElement("br")); |
| for (var i = 0; i < commentTemplates.length; i+= 2) { |
| var aElem= document.createElement("a"); |
| aElem.appendChild(document.createTextNode(commentTemplates[i])); |
| aElem.href='javascript:var cElem=document.getElementById("comment");' |
| + 'var s= cElem.selectionStart;var e= cElem.selectionEnd;' |
| + 'var url= "' + commentTemplates[i + 1] + '";' |
| + 'cElem.value= cElem.value.substring(0, s) + url + cElem.value.substring(e, cElem.value.length);' |
| + 'cElem.focus();cElem.selectionStart= s + url.length;cElem.selectionEnd= cElem.selectionStart;' |
| + 'void(0);'; |
| aElem.title= "Insert comment template at caret"; |
| pElem.appendChild(aElem); |
| pElem.appendChild(document.createElement("br")); |
| } |
| return pElem; |
| */ |
| } |
| |
| function createCommentTemplates2Links() { |
| // Add links to help enter a URL to a Git commit: |
| var pElem= document.createElement("p"); |
| pElem.style.marginLeft= "1em"; |
| pElem.style.lineHeight= "2em"; |
| for (var i = 0; i < commentTemplates2.length; i++) { |
| var commentTemplates2group= commentTemplates2[i]; |
| if (commentTemplates2group[0].startsWith(".")) { |
| var spanElem= document.createElement("span"); |
| spanElem.style.marginLeft= "1em"; |
| pElem.appendChild(spanElem); |
| } |
| for (var j = 0; j < commentTemplates2group.length; j+= 2) { |
| var aElem= document.createElement("a"); |
| aElem.appendChild(document.createTextNode(commentTemplates2group[j])); |
| var ref= commentTemplates2group[j + 1]; |
| aElem.href= ref.replace(/commit\/\?id=$/, "log/"); |
| aElem.setAttribute('onclick', 'if (event.ctrlKey || event.metaKey) { return true; }' |
| + 'var cElem=document.getElementById("comment");' |
| + 'var s= cElem.selectionStart;var e= cElem.selectionEnd;' |
| + 'var url= "' + commentTemplates2group[j + 1] + '";' |
| + 'cElem.value= cElem.value.substring(0, s) + url + cElem.value.substring(e, cElem.value.length);' |
| + 'cElem.focus();cElem.selectionStart= s + url.length;cElem.selectionEnd= cElem.selectionStart;' |
| + 'return false;'); |
| aElem.title= "Click: Insert commit link at caret\nCtrl+/Middle-Click: Open log link in new tab"; |
| pElem.appendChild(aElem); |
| pElem.appendChild(document.createTextNode(" ")); |
| } |
| pElem.appendChild(document.createElement("br")); |
| } |
| return pElem; |
| } |
| |
| function setCommitElemNameTitleShortcut(commitElem) { |
| commitElem.setAttribute("title", window.navigator.platform.match("Mac") ? "[Command+S]" : "[Ctrl+S]"); |
| commitElem.innerHTML= "Sa<u>v</u>e Changes"; |
| commitElem.setAttribute("accesskey", "v"); |
| } |
| |
| function createScript(script) { |
| var scriptElem= document.createElement("script"); |
| scriptElem.type= "text/javascript"; |
| scriptElem.innerHTML= script; |
| return scriptElem; |
| } |
| |
| function escapeHtml(text) { |
| if (typeof text === "boolean") { |
| return text; |
| } if (typeof text != "string") { |
| return ""; |
| } |
| var r = { |
| '&': '&', |
| '<': '<', |
| '>': '>', |
| '"': '"', |
| "'": ''' |
| }; |
| return text.replace(/[&<>"']/g, function(i) { return r[i]; }); |
| } |
| |
| function getAppendGerritStatusFunction(link) { |
| return function (res) { |
| var myElem= document.createElement("a"); |
| myElem.href= link.href; |
| myElem.style.marginLeft= "1em"; |
| |
| var jsonText= res.responseText.substr(5); |
| var json= JSON.parse(jsonText); |
| myElem.textContent= escapeHtml(json.status) |
| + (json.mergeable ? " (mergeable) " : " ") |
| + escapeHtml(json.project) |
| + " [" + escapeHtml(json.branch) + "]" |
| ; |
| myElem.title= |
| "Owner: " + escapeHtml(json.owner.name) + "<" + escapeHtml(json.owner.email) + ">\n" |
| + "Updated: " + escapeHtml(json.updated) + "\n" |
| + "Branch: " + escapeHtml(json.branch) + "\n" |
| + "Change-Id: " + escapeHtml(json.change_id) + "\n" |
| + "Subject: " + escapeHtml(json.subject) + "\n" |
| ; |
| // myElem.title+= jsonText; |
| |
| link.parentNode.insertBefore(myElem, link.nextSibling); |
| }; |
| } |
| |
| function addSaveShortcutCtrlS(form) { |
| var scriptElem= createScript( |
| 'document.addEventListener("keydown", function(e) {\n' |
| + ' if ((window.navigator.platform.match("Mac") ? e.metaKey : e.ctrlKey) && e.keyCode == 83) {\n' |
| + ' e.preventDefault();\n' |
| + ' document.getElementById("' + form + '").submit();\n' |
| + ' }\n' |
| + '}, false);\n' |
| ); |
| document.getElementsByTagName("head")[0].appendChild(scriptElem); |
| } |
| |
| //----------- |
| |
| //----------- Start the real work |
| |
| function main() { // GM 1.0 belches for "return" outside of function, see http://www.greasespot.net/2012/08/greasemonkey-10-release.html |
| |
| console.log("Running jdtbugzilla.user.js on " + window.location + ", title: " + document.title); |
| |
| // Don't run in frames or iframes: |
| if (window.top != window.self) { |
| return; |
| } |
| |
| var isLocalQuery = window.location.pathname.match(/\/Search%20for%20bugs\.htm/i); |
| |
| // Remove Eclipse ads: |
| // old school: |
| var bannerElem= document.getElementById("banner"); |
| if (bannerElem) { |
| bannerElem.parentNode.removeChild(bannerElem); |
| } else { |
| // for solstice (bug 437404): |
| var headerElems= document.evaluate("//header[@role='banner']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); |
| for (var i = 0; i < headerElems.snapshotLength; i++) { |
| var headerElem= headerElems.snapshotItem(i); |
| headerElem.parentNode.removeChild(headerElem); |
| } |
| } |
| var headerIconsElem= document.getElementById("header-icons"); |
| if (headerIconsElem) { |
| headerIconsElem.parentNode.removeChild(headerIconsElem); |
| } |
| |
| // Identify ourselves: |
| var headerElem= document.getElementById("common_links"); |
| if (!headerElem) { // Bugzilla < 5.0 |
| headerElem= document.getElementById("header"); |
| } |
| if (headerElem && headerElem.lastElementChild) { |
| var ver= ""; |
| if (typeof GM_info !== "undefined") { |
| ver= GM_info.script.version; |
| } |
| console.log(ver); |
| if (isLocalQuery) { |
| headerElem.lastElementChild.innerHTML += |
| ' <span class="separator">| </span><li>not <a href="https://bugs.eclipse.org/bugs/query.cgi">live</a>!</li>'; |
| } else { |
| headerElem.lastElementChild.innerHTML += |
| '<span class="separator">| </span><li><a href="https://www.eclipse.org/jdt/ui/scripts/jdtbugzilla.user.js" ' |
| + 'title="Page tweaked by jdtbugzilla.user.js ' + ver + '" >Tweaked</a>!</li>'; |
| } |
| } |
| |
| var headElem= document.getElementsByTagName("head")[0]; |
| if (headElem) { |
| // Various CSS fixes: |
| var styleElem= document.createElement("style"); |
| styleElem.type= "text/css"; |
| styleElem.innerHTML = css; |
| headElem.appendChild(styleElem); |
| |
| if (isLocalQuery) { |
| // Set a base href to make <form method="post" action="buglist.cgi" id="queryform" ...> work in a local copy of the search page: |
| var baseElem= document.createElement("base"); |
| baseElem.href= "http://bugs.eclipse.org/bugs/"; |
| headElem.appendChild(baseElem); |
| return; // early return |
| } |
| } |
| |
| // Add "Hide" link to info message, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=333403 |
| // The "Hide" link stores the last hidden message in localStorage => Only hides this exact message in this browser. |
| // To show it again, execute localStorage.clear(); in a bug page. |
| var messageElem= document.getElementById("message"); |
| if (messageElem && messageElem.textContent) { |
| var key= "message.suppressed"; |
| var msgString= JSON.stringify(messageElem.textContent); |
| if (localStorage[key] == msgString) { |
| messageElem.parentNode.removeChild(messageElem); |
| } else { |
| messageElem.appendChild(document.createTextNode(" ")); |
| // Don't rename hideMessageElem to hideElem. JavaScript is a "language" from hell. See function hideElem(). |
| var hideMessageElem= addLink("Hide", "javascript:void(0)", messageElem, "Hide this message\n\nLast hidden message: " + localStorage[key], false); |
| hideMessageElem.setAttribute("onclick" , "localStorage['" + key + "']='" + msgString + "';this.parentNode.parentNode.removeChild(this.parentNode);return false;"); |
| } |
| } |
| |
| // Add shortcut to set Platform to All/All: |
| var rep_platformElem= document.getElementById("rep_platform"); |
| var op_sysElem= document.getElementById("op_sys"); |
| if (rep_platformElem && op_sysElem && ! window.location.pathname.match(/.*query\.cgi/)) { |
| var platformLinkSpanElem= document.createElement("span"); |
| platformLinkSpanElem.style.marginLeft= "1em"; |
| op_sysElem.parentNode.insertBefore(platformLinkSpanElem, op_sysElem.nextSibling); |
| |
| var href= 'javascript:document.getElementById("rep_platform").value="All";' |
| + 'document.getElementById("op_sys").value="All";' |
| + 'void(0);'; |
| addLink("All", href, platformLinkSpanElem); |
| |
| for (var i= 0; i < platforms.length; i+= 3) { |
| addPlatformLink(platformLinkSpanElem, platforms[i], platforms[i+1], platforms[i+2]); |
| } |
| } |
| |
| var noWrapLinesRegex = /^(\s*(?:\[\w+\]\s*)?(?:at \S+(?:\(Native Method\)|\(Unknown Source\))?|- locked <0x[0-9a-fA-F]+> \(a \S+))$/m; |
| |
| // Fix the "Comment" field size (too small on the "Attachment Details" page, |
| // default cols=80 is too narrow for proper wrapping preview): |
| var commentElem= document.getElementById("comment"); |
| if (commentElem) { |
| commentElem.setAttribute("rows", "10"); |
| commentElem.setAttribute("cols", "81"); |
| commentElem.setAttribute("onFocus", "this.rows=25"); |
| |
| // Fix line wrapping for links in reply comments, see https://bugzilla.mozilla.org/show_bug.cgi?id=810801 : |
| |
| // This script is a copy of the original wrapReplyText function in comments.js |
| // (with string delimiters regularized to ' , \ replaced by \\, and surrounded with '+ "' ... '\n"'): |
| |
| // TODO: should not wrap at the space between "bug 1234". |
| // Fix idea: instead of cutting hard, use a regex like this: |
| // ^.{0,80}\s(?<![Bb]ug\s)(?!\s*\d+) |
| // Note that this still wouldn't completely fix "bug 1234 comment 1". |
| var script= "" |
| + "function wrapReplyText(text) {\n" |
| + " // This is -3 to account for '\\n> '\n" |
| + " var maxCol = BUGZILLA.constant.COMMENT_COLS - 3;\n" |
| + " var text_lines = text.replace(/[\\s\\n]+$/, '').split('\\n');\n" |
| + " var wrapped_lines = new Array();\n" |
| + "\n" |
| + " for (var i = 0; i < text_lines.length; i++) {\n" |
| + " var paragraph = text_lines[i];\n" |
| + " // Don't wrap already-quoted text.\n" |
| + " if (paragraph.indexOf('>') == 0) {\n" |
| + " wrapped_lines.push('> ' + paragraph);\n" |
| + " continue;\n" |
| + " }\n" |
| // avoid wrapping noWrapLinesRegex: |
| + " if (paragraph.match(" + noWrapLinesRegex + ")) {\n" |
| + " wrapped_lines.push('> ' + paragraph);\n" |
| + " continue;\n" |
| + " }\n" |
| // END avoid wrapping noWrapLinesRegex. |
| + "\n" |
| + " var replace_lines = new Array();\n" |
| + " while (paragraph.length > maxCol) {\n" |
| + " var testLine = paragraph.substring(0, maxCol);\n" |
| + " var pos = testLine.search(/\\s\\S*$/);\n" |
| + "\n" |
| + " if (pos < 1) {\n" |
| // fix: |
| + " if (paragraph.length > maxCol) {\n" |
| + " pos = maxCol + paragraph.substring(maxCol).search(/\\s\\S*/);\n" |
| + " if (pos == maxCol - 1) pos = paragraph.length;\n" |
| + " } else {\n" |
| + " pos = maxCol;\n" |
| + " }\n" |
| //+ " // Try to find some ASCII punctuation that's reasonable\n" |
| //+ " // to break on.\n" |
| //+ " var punct = '\\\\-\\\\./,!;:';\n" |
| //+ " var punctRe = new RegExp('[' + punct + '][^' + punct + ']+$');\n" |
| //+ " pos = testLine.search(punctRe) + 1;\n" |
| //+ " // Try to find some CJK Punctuation that's reasonable\n" |
| //+ " // to break on.\n" |
| //+ " if (pos == 0)\n" |
| //+ " pos = testLine.search(/[\\u3000\\u3001\\u3002\\u303E\\u303F]/) + 1;\n" |
| //+ " // If we can't find any break point, we simply break long\n" |
| //+ " // words. This makes long, punctuation-less CJK text wrap,\n" |
| //+ " // even if it wraps incorrectly.\n" |
| //+ " if (pos == 0) pos = maxCol;\n" |
| + " }\n" |
| + "\n" |
| + " var wrapped_line = paragraph.substring(0, pos);\n" |
| + " replace_lines.push(wrapped_line);\n" |
| + " paragraph = paragraph.substring(pos);\n" |
| + " // Strip whitespace from the start of the line\n" |
| + " paragraph = paragraph.replace(/^\\s+/, '');\n" |
| + " }\n" |
| + " replace_lines.push(paragraph);\n" |
| + " wrapped_lines.push('> ' + replace_lines.join('\\n> '));\n" |
| + " }\n" |
| + " return wrapped_lines.join('\\n') + '\\n\\n';\n" |
| + "}\n" |
| ; |
| commentElem.parentNode.appendChild(createScript(script)); |
| } |
| |
| // Loop over <label>s: |
| var labels= document.getElementsByTagName("label"); |
| for (var i= 0; i < labels.length; i++) { |
| var labelElem= labels[i]; |
| var forAtt= labelElem.getAttribute("for"); |
| // Another Commit button on top of Additional Comments field |
| if (forAtt == "comment" && labelElem.nextSibling) { |
| var commitElem= document.createElement("button"); |
| commitElem.setAttribute("type", "submit"); |
| commitElem.setAttribute("class", "knob-buttons"); |
| setCommitElemNameTitleShortcut(commitElem); |
| // Caveat: attachment.cgi is used for 3 purposes: add new, edit details, result after adding. |
| // Of course, the "comment" area is implemented differently on each page... |
| labelElem.parentNode.insertBefore(commitElem, labelElem.nextElementSibling); |
| |
| // Remove label as clickable area for Security_Advisories checkbox on "Verify Version, Component, Target Milestone" page: |
| } else if (forAtt == "group_15") { |
| labelElem.removeAttribute("for"); |
| |
| // Add common "from" dates: |
| } else if (forAtt == "chfieldfrom") { |
| addFromDateLink(labelElem, "2h"); |
| addFromDateLink(labelElem, "1ds", "today"); |
| addFromDateLink(labelElem, "1d"); |
| addFromDateLink(labelElem, "2d"); |
| addFromDateLink(labelElem, "1w"); |
| addFromDateLink(labelElem, "1m"); |
| addFromDateLink(labelElem, "3m"); |
| addFromDateLink(labelElem, "1y"); |
| |
| // Bug 367944: Bug fields doc doesn't describe severity any more: |
| } else if (forAtt == "priority" || forAtt == "bug_severity") { |
| labelElem.setAttribute("title", |
| "- blocker: blocks development and/or testing work\n" |
| + "- critical: crashes, loss of data, severe memory leak\n" |
| + "- major: major loss of function\n" |
| + "- normal: regular issue, some loss of functionality under specific circumstances\n" |
| + "- minor: minor loss of function, or other problem where easy workaround is present\n" |
| + "- trivial: cosmetic problem like misspelled words or misaligned text\n" |
| + "- enhancement: request for enhancement"); |
| var field_help_linkElems= labelElem.getElementsByClassName("field_help_link"); |
| if (field_help_linkElems.length > 0) { |
| field_help_linkElems[0].removeAttribute("title"); |
| } |
| } |
| } |
| |
| // Add quick links for requestee fields: |
| var requesteeElems= document.getElementsByClassName("requestee"); |
| for (var i = 0; i < requesteeElems.length; i++) { |
| var requesteeElem= requesteeElems[i]; |
| for (var j= 0; j < requestees.length; j= j+2) { |
| addRequesteeLink(requestees[j], requestees[j + 1], requesteeElem.parentNode, requesteeElem.id); |
| } |
| } |
| |
| //----------- Page-specific fixes: |
| |
| if (window.location.pathname.match(/.*enter_bug\.cgi/)) { |
| process_enter_bug(); |
| } else if (window.location.pathname.match(/.*query\.cgi/)) { |
| process_query(); |
| } else if (window.location.pathname.match(/.*buglist\.cgi/)) { |
| process_buglist(); |
| } else { // For all result pages: |
| process_result_pages(); |
| } |
| |
| |
| function process_enter_bug() { |
| // Remove empty <td colspan="2"> </td>, <th> </th>, and <td colspan="3" class="comment">We've made a guess at your...: |
| var os_guess_noteElem= document.getElementById("os_guess_note"); |
| if (os_guess_noteElem) { |
| os_guess_noteElem.parentNode.parentNode.removeChild(os_guess_noteElem.parentNode); |
| } |
| |
| // Add shortcuts to search Product: |
| var field_container_productElem= document.getElementById("field_container_product"); |
| var productElem= document.getElementsByName("product")[0]; |
| if (field_container_productElem && productElem) { |
| var queryLink= addLink(searchSymbol, "query.cgi" |
| + "?product=" + productElem.value |
| , field_container_productElem, "Search in this product", " | ("); |
| queryLink.style= searchSymbolStyle; |
| addLink("1w", "buglist.cgi" |
| + "?product=" + productElem.value |
| + "&chfieldfrom=1w" |
| , field_container_productElem, "Changed in the last 7 days"); |
| field_container_productElem.appendChild(document.createTextNode(")")); |
| |
| // Add shortcuts to search Component: |
| var field_label_componentElem= document.getElementById("field_label_component"); |
| var componentElem= document.getElementById("component"); |
| if (field_label_componentElem && componentElem) { |
| var spanElem = document.createElement("span"); |
| spanElem.setAttribute("style" , "font-weight:normal;"); |
| |
| field_label_componentElem.appendChild(spanElem); |
| |
| spanElem.appendChild(document.createTextNode("(")); |
| |
| queryLink= addLink(searchSymbol, "query.cgi?product=" + productElem.value |
| + "&component=" + componentElem.value, spanElem, "Search in selected component", false); |
| queryLink.setAttribute("id", "queryLink"); |
| queryLink.style= searchSymbolStyle; |
| |
| var changedLink= addLink("1w", "buglist.cgi?product=" + productElem.value |
| + "&component=" + componentElem.value |
| + "&chfieldfrom=1w", spanElem, "Changed in the last 7 days"); |
| changedLink.setAttribute("id", "changedLink"); |
| spanElem.appendChild(document.createTextNode(")")); |
| |
| componentElem.setAttribute("onchange", |
| "set_assign_to();" |
| |
| + "document.getElementById('queryLink').href=\"query.cgi" |
| + "?product=" + productElem.value |
| + "&component=\"+document.getElementById('component').value;" |
| |
| + "document.getElementById('changedLink').href=\"buglist.cgi" |
| + "?product=" + productElem.value |
| + "&component=\"+document.getElementById('component').value+\"" |
| + "&chfieldfrom=1w\";" |
| ); |
| } |
| } |
| |
| // Add another Commit button after Subject): |
| var short_descElems= document.getElementsByName("short_desc"); |
| if (short_descElems.length > 0) { |
| var commitElem= document.createElement("button"); |
| commitElem.setAttribute("type", "submit"); |
| commitElem.setAttribute("tabindex", "99"); |
| commitElem.innerHTML= "S<u>u</u>bmit Bug"; |
| commitElem.setAttribute("accesskey", "u"); |
| var space= document.createTextNode(" "); |
| short_descElems[0].parentNode.insertBefore(space, short_descElems[0].nextSibling); |
| short_descElems[0].parentNode.insertBefore(commitElem, space.nextSibling); |
| short_descElems[0].size= 76; |
| |
| commitElem.setAttribute("title", window.navigator.platform.match("Mac") ? "[Command+S]" : "[Ctrl+S]"); |
| addSaveShortcutCtrlS("Create"); |
| |
| // Set initial focus: |
| short_descElems[0].focus(); |
| |
| var summaryTr= short_descElems[0].parentNode.parentNode; |
| |
| // Move "Possible Duplicates" after "Description": |
| var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container"); |
| var commentElem= document.getElementById("comment"); |
| if (possible_duplicates_containerElem && commentElem) { |
| commentElem.parentNode.parentNode.parentNode.insertBefore(possible_duplicates_containerElem, commentElem.parentNode.parentNode.nextSibling); |
| // Add links to help enter a URL to a Git commit: |
| // commentElem.parentNode.setAttribute("colspan", "2"); |
| // var td= document.createElement("td"); |
| // td.appendChild(createCommentTemplateLinks()); |
| // commentElem.parentNode.parentNode.insertBefore(td, commentElem.parentNode.nextSibling); |
| } |
| |
| |
| // // Move "Possible Duplicates" before "Summary": |
| // var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container"); |
| // if (possible_duplicates_containerElem) { |
| // summaryTr.parentNode.insertBefore(possible_duplicates_containerElem, summaryTr); |
| // } |
| |
| // // Move "Possible Duplicates" to the right of the "Description": |
| // var possible_duplicates_containerElem= document.getElementById("possible_duplicates_container"); |
| // var commentElem= document.getElementById("comment"); |
| // if (possible_duplicates_containerElem && commentElem) { |
| // possible_duplicates_containerElem.setAttribute("style", "display: inline;"); |
| // |
| // var tableElem= document.createElement("table"); |
| // tableElem.setAttribute("style", "display: inline;"); |
| // tableElem.appendChild(possible_duplicates_containerElem) |
| // |
| // possible_duplicates_containerElem.removeChild(possible_duplicates_containerElem.firstElementChild); |
| // commentElem.parentNode.removeChild(commentElem.parentNode.getElementsByTagName("br")[0]); |
| // commentElem.parentNode.appendChild(tableElem); |
| // } |
| |
| // Add bug categories choosers: |
| var tr= document.createElement("tr"); |
| tr.appendChild(document.createElement("th")); |
| var td= document.createElement("td"); |
| td.setAttribute("colspan", "3"); |
| td.appendChild(createCategoryChoosers()); |
| tr.appendChild(td); |
| |
| summaryTr.parentNode.insertBefore(tr, summaryTr); |
| } |
| |
| var ccElems= document.getElementsByName("cc"); |
| if (ccElems.length > 0) { |
| var ccElem= ccElems[0]; |
| // Add shortcut cc links: |
| for (var i= 0; i < ccs.length; i= i+2) { |
| addCcLink(ccs[i], ccs[i + 1], ccElem.parentNode, "cc"); |
| } |
| // inserted cc links should not wrap: |
| ccElem.parentNode.setAttribute("style", "white-space:nowrap;"); |
| // fix width: (default is 100%, which would make the CC links overflow into flags table) |
| ccElem.setAttribute("style", "width: 300px"); |
| } |
| } |
| |
| |
| function process_query() { |
| var myMail; |
| |
| // Loop over <a>s: |
| var anchors= document.getElementsByTagName("a"); |
| for (var i= 0; i < anchors.length; i++) { |
| var aElem= anchors[i]; |
| var aElemHref= aElem.getAttribute("href"); |
| if (!aElemHref) |
| continue; |
| |
| if (aElemHref == "index.cgi?logout=1") { |
| myMail= aElem.nextSibling.textContent.trim(); |
| } |
| } |
| |
| // // Fix "'Edit Search' on bug list does not fill in 'Comment' field": https://bugs.eclipse.org/bugs/show_bug.cgi?id=288654 |
| // var longdescRegex= /.*&longdesc=([^\&]+)&.*/; |
| // if (location.search.match(longdescRegex)) { |
| // var match= window.location.search.replace(longdescRegex, "$1"); |
| // var longdescElem= document.getElementById("longdesc"); |
| // longdescElem.value= decodeURIComponent(match); |
| // } |
| |
| // // Use GET for search, not POST (makes queries bookmarkable, avoids "do you want to resend?" messages, may fail for complex queries): |
| // var queryformElem= document.getElementsByName("queryform"); |
| // if (queryformElem.length > 0) { |
| // queryformElem[0].method= "get"; |
| // } |
| |
| // Add "Generate Report" button to Search page: |
| var searchElem= document.getElementById("Search"); |
| if (searchElem) { |
| var generateElem= document.createElement("input"); |
| generateElem.value= "Generate Report"; |
| generateElem.type= "submit"; |
| generateElem.style.marginLeft = "2em"; |
| generateElem.setAttribute("onclick", "" |
| + "var formElem= document.forms['queryform'];" |
| + "var input= document.createElement('input');" |
| + "input.type= 'hidden';" |
| + "input.name= 'x_axis_field';" |
| + "input.value= 'product';" |
| + "formElem.appendChild(input);" |
| |
| + "input= document.createElement('input');" |
| + "input.type= 'hidden';" |
| + "input.name= 'y_axis_field';" |
| + "input.value= 'component';" |
| + "formElem.appendChild(input);" |
| |
| + "input= document.createElement('input');" |
| + "input.type= 'hidden';" |
| + "input.name= 'query_format';" |
| + "input.value= 'report-table';" |
| + "formElem.appendChild(input);" |
| |
| + "input= document.createElement('input');" |
| + "input.type= 'hidden';" |
| + "input.name= 'format';" |
| + "input.value= 'table';" |
| + "formElem.appendChild(input);" |
| |
| + "input= document.createElement('input');" |
| + "input.type= 'hidden';" |
| + "input.name= 'action';" |
| + "input.value= 'wrap';" |
| + "formElem.appendChild(input);" |
| |
| + "formElem.action= 'report.cgi';" |
| + "return true;"); |
| |
| searchElem.parentNode.appendChild(generateElem); |
| } |
| |
| |
| // Remove spam headers: |
| var search_helpElem= document.getElementById("search_help"); |
| if (search_helpElem) { |
| search_helpElem.parentNode.removeChild(search_helpElem); |
| } |
| var titlesElem= document.getElementById("titles"); |
| if (titlesElem) { |
| titlesElem.parentNode.removeChild(titlesElem); |
| } |
| |
| // Reduce tabs size: |
| var tabsElems= document.getElementsByClassName("tabs"); |
| if (tabsElems.length > 0) { |
| tabsElems[0].setAttribute("cellpadding", "3"); |
| } |
| |
| // Remove section headers and expand contents: |
| var bz_section_titleElems= document.evaluate("//div[@class='bz_section_title']", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); |
| for (var i = 0; i < bz_section_titleElems.snapshotLength; i++) { |
| var bz_section_titleElem= bz_section_titleElems.snapshotItem(i); |
| bz_section_titleElem.parentNode.replaceChild(document.createElement("hr"), bz_section_titleElem); |
| } |
| |
| var bz_search_sectionElems= document.evaluate("//div[contains(@class,'bz_search_section')] | //ul[contains(@class,'bz_search_section')]", document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); |
| for (var i = 0; i < bz_search_sectionElems.snapshotLength; i++) { |
| var bz_search_sectionElem= bz_search_sectionElems.snapshotItem(i); |
| bz_search_sectionElem.setAttribute("style", "display: block ! important;"); |
| } |
| |
| // Add bug categories choosers: |
| var Search_topElem= document.getElementById("Search_top"); |
| if (Search_topElem) { |
| var choosers= createCategoryChoosers(); |
| choosers.style.paddingLeft = "1em"; |
| Search_topElem.parentNode.insertBefore(choosers, Search_topElem.nextElementSibling); |
| } |
| |
| // Add target milestone links: |
| var targetElem= document.getElementById("field_label_target_milestone"); |
| if (targetElem && isBugsEclipseOrg) { |
| // targetElem.firstElementChild.firstElementChild.textContent = "Target M:"; |
| var targetLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(targetElem, "target_milestone"); |
| for (var i= 0; i < target_milestones.length; i++) { |
| addTargetLink(targetLinkSpanElem, target_milestones[i]); |
| } |
| addTargetLink(targetLinkSpanElem, "---"); |
| |
| var sep= targetLinkSpanElem.childNodes[6]; |
| if (sep) { |
| targetLinkSpanElem.replaceChild(document.createElement("br"), sep); |
| } |
| } |
| |
| // Add quick classification links: |
| var classificationElem= document.getElementById("field_label_classification"); |
| if (classificationElem && isBugsEclipseOrg) { |
| var classificationLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(classificationElem, "classification"); |
| for (var i= 0; i < queryClassifications.length; i= i+3) { |
| addQueryClassificationsLink(classificationLinkSpanElem, queryClassifications[i+1], queryClassifications[i+2], queryClassifications[i]); |
| } |
| } |
| |
| // Add quick product links: |
| var productElem= document.getElementById("field_label_product"); |
| if (productElem && isBugsEclipseOrg) { |
| var productLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(productElem, "product"); |
| for (var i= 0; i < queryProducts.length; i= i+3) { |
| addQueryProductsLink(productLinkSpanElem, queryProducts[i+1], queryProducts[i+2], queryProducts[i]); |
| } |
| } |
| |
| // Add quick component links: |
| var componentElem= document.getElementById("field_label_component"); |
| if (componentElem && isBugsEclipseOrg) { |
| var componentLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(componentElem, "component"); |
| for (var i= 0; i < queryComponents.length; i= i+2) { |
| addQueryComponentsLink(componentLinkSpanElem, queryComponents[i+1], queryComponents[i]); |
| } |
| } |
| |
| // Add open/closed links: |
| var bug_statusElem= document.getElementById("field_label_bug_status"); |
| if (bug_statusElem) { |
| var statusLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(bug_statusElem, "bug_status"); |
| addQueryStatusesLink(statusLinkSpanElem, new Array("UNCONFIRMED", "NEW", "ASSIGNED", "REOPENED"), " Open"); |
| statusLinkSpanElem.appendChild(document.createTextNode(" ")); |
| addQueryStatusesLink(statusLinkSpanElem, new Array("RESOLVED", "VERIFIED", "CLOSED"), "Closed"); |
| } |
| |
| // Add "Resolution: not FIXED" link: |
| var resolutionElem= document.getElementById("field_label_resolution"); |
| if (resolutionElem) { |
| var resolutionLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(resolutionElem, "resolution"); |
| |
| var href= 'javascript:' |
| + ' var resolutionOptions= document.getElementById("resolution").options;' |
| + 'for (var i = 0; i < resolutionOptions.length; i++) {' |
| + ' if (resolutionOptions[i].text != "FIXED") resolutionOptions[i].selected= true;' |
| + '};' |
| + 'void(0);'; |
| addLink("¬FIXED", href, resolutionLinkSpanElem, null, false); |
| } |
| |
| // Add quick links to detailed bug info fields: |
| var versionElem= document.getElementById("field_label_version"); |
| if (versionElem) { |
| var versionLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(versionElem, "version"); |
| for (var i= 0; i < queryVersions.length; i++) { |
| addQueryVersionsLink(versionLinkSpanElem, queryVersions[i]); |
| } |
| } |
| var bug_severityElem= document.getElementById("field_label_bug_severity"); |
| if (bug_severityElem) { |
| createFieldLabelClearAndQuickLinkSpan(bug_severityElem, "bug_severity"); |
| } |
| var priorityElem= document.getElementById("field_label_priority"); |
| if (priorityElem) { |
| createFieldLabelClearAndQuickLinkSpan(priorityElem, "priority"); |
| } |
| var rep_platformElem= document.getElementById("field_label_rep_platform"); |
| if (rep_platformElem) { |
| createFieldLabelClearAndQuickLinkSpan(rep_platformElem, "rep_platform"); |
| } |
| var op_sysElem= document.getElementById("field_label_op_sys"); |
| if (op_sysElem) { |
| var op_sysLinkSpanElem= createFieldLabelClearAndQuickLinkSpan(op_sysElem, "op_sys"); |
| addQueryOSLink(op_sysLinkSpanElem, new Array("Mac OS X"), "Mac"); |
| addQueryOSLink(op_sysLinkSpanElem, new Array("AIX", "HP-UX", "Linux", "Solaris", "Unix"), "*nix"); |
| addQueryOSLink(op_sysLinkSpanElem, new Array("Windows"), "W"); |
| } |
| |
| |
| // Increase option list sizes to avoid scrolling (these are probably not used any more): |
| setOptionSize("classification", 6); |
| setOptionSize("product", 6); |
| setOptionSize("component", 6); |
| setOptionSize("version", 6); |
| setOptionSize("target_milestone", 6); |
| |
| setOptionSize("bug_status", 8); |
| setOptionSize("resolution", 8); |
| setOptionSize("bug_severity", 8); |
| setOptionSize("priority", 8); |
| setOptionSize("rep_platform", 8); |
| setOptionSize("op_sys", 8); |
| |
| setOptionSize("chfield", 5); |
| |
| // Add shortcut email links: |
| addSearch_email_fieldsLinks("email1", myMail); |
| addSearch_email_fieldsLinks("email2", myMail); |
| addSearch_email_fieldsLinks("email3", myMail); |
| |
| // Fix layout of date fields: |
| var history_filter_sectionElem= document.getElementById("history_filter_section"); |
| if (history_filter_sectionElem) { |
| history_filter_sectionElem.lastElementChild.setAttribute("style", "width: auto"); |
| } |
| |
| // Fix label height: |
| styleElem.innerHTML= styleElem.innerHTML |
| + ".field_label { line-height: 1.3em ! important; }\n" |
| + ".search_field_row { line-height: auto ! important; }\n"; |
| |
| // Add accesskeys: |
| // ("c" is broken in Bugzilla, see https://bugzilla.mozilla.org/show_bug.cgi?id=1299141 ) |
| setAccessKey("target_milestone", "g"); |
| setAccessKey("chfieldfrom", "b"); |
| setAccessKey("Search_top", "q"); |
| |
| // Add tooltip for shortcut for "Search" buttons: |
| if (searchElem) { |
| searchElem.setAttribute("title", "[Accesskey+Q]"); |
| } |
| var Search_topElem= document.getElementById("Search_top"); |
| if (Search_topElem) { |
| Search_topElem.setAttribute("title", "[Accesskey+Q]"); |
| //addSaveShortcutCtrlS("queryform"); |
| } |
| } |
| |
| |
| function process_buglist() { |
| // Add access key to Edit Query: |
| var bz_query_editElems= document.getElementsByClassName("bz_query_edit"); |
| if (bz_query_editElems.length > 0) { |
| var bz_query_editElem= bz_query_editElems[0]; |
| var aElem= bz_query_editElem.childNodes[1]; |
| aElem.setAttribute("accesskey", "e"); |
| aElem.firstChild.replaceData(0, 1, ""); |
| var mnemonic= document.createElement("b"); |
| mnemonic.appendChild(document.createTextNode("E")); |
| aElem.insertBefore(mnemonic, aElem.firstChild); |
| |
| } |
| |
| // Add target milestone links (for "Change Several Bugs at Once"): |
| var targetElem= document.getElementById("target_milestone"); |
| if (targetElem && isBugsEclipseOrg) { |
| var targetLinkSpanElem= document.createElement("span"); |
| targetLinkSpanElem.style.marginLeft= ".5em"; |
| targetLinkSpanElem.style.fontWeight= "normal"; |
| targetElem.parentNode.appendChild(targetLinkSpanElem); |
| for (var i= 0; i < target_milestones.length; i++) { |
| addTargetLink(targetLinkSpanElem, target_milestones[i]); |
| } |
| addTargetLink(targetLinkSpanElem, "---"); |
| } |
| |
| // Turn bug link into short link: |
| if (isBugsEclipseOrg) { |
| var bz_id_columnElems= document.getElementsByClassName("bz_id_column"); |
| for (var i = 0; i < bz_id_columnElems.length; i++) { |
| var aElem= bz_id_columnElems[i].firstElementChild; |
| aElem.href= "../" + aElem.textContent; |
| } |
| } |
| |
| // Add "Create buglist" functionality in "Change Several Bugs at Once" form: |
| var lastElem= document.getElementById("check_all"); |
| if (lastElem) { |
| var spaceElem= document.createTextNode("\n"); |
| lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling); |
| lastElem= spaceElem; |
| |
| var invertElem= document.createElement("input"); |
| invertElem.type= "button"; |
| invertElem.value= "Invert"; |
| invertElem.name= "check_invert"; |
| invertElem.setAttribute("onclick", "javascript:" |
| + "var inputs= document.getElementsByTagName('input');\n" |
| + "for (var i= 0; i < inputs.length; i++) {\n" |
| + " if (inputs[i].type === 'checkbox' && inputs[i].name.substr(0, 3) == 'id_') {\n" |
| + " inputs[i].checked= !inputs[i].checked == true;\n" |
| + " }\n" |
| + "}\n" |
| + "void(0);"); |
| lastElem.parentNode.insertBefore(invertElem, lastElem.nextSibling); |
| lastElem= invertElem; |
| |
| spaceElem= document.createTextNode("\n"); |
| lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling); |
| lastElem= spaceElem; |
| |
| var updateElem= document.createElement("a"); |
| updateElem.innerHTML= "Update buglist link (checked bugs) ->"; |
| updateElem.href= "javascript:void(0);"; |
| updateElem.setAttribute("onclick", "updateBuglistLink();"); |
| |
| lastElem.parentNode.insertBefore(updateElem, lastElem.nextSibling); |
| lastElem= updateElem; |
| |
| spaceElem= document.createTextNode("\n"); |
| lastElem.parentNode.insertBefore(spaceElem, lastElem.nextSibling); |
| lastElem= spaceElem; |
| |
| var buglistLinkElem= document.createElement("input"); |
| buglistLinkElem.type= "text"; |
| buglistLinkElem.size= 100; |
| buglistLinkElem.style= "width: auto"; |
| buglistLinkElem.id= "buglistLink"; |
| |
| lastElem.parentNode.insertBefore(buglistLinkElem, lastElem.nextSibling); |
| |
| var scriptElem= createScript( |
| "function updateBuglistLink(init) {\n" |
| + "var inputs= document.getElementsByTagName('input');\n" |
| + "var bugs= '';\n" |
| + "for (var i= 0; i < inputs.length; i++) {\n" |
| + " var input= inputs[i];\n" |
| + " if (input.type == 'checkbox' && input.name.substr(0, 3) == 'id_' && (init || input.checked)) {\n" |
| + " bugs += input.name.substr(3) + ',';\n" |
| + " }\n" |
| + "}\n" |
| + "var buglistLinkElem= document.getElementById('buglistLink');\n" |
| + "buglistLinkElem.value= 'https://bugs.eclipse.org/bugs/buglist.cgi?bug_id=' + bugs;\n" |
| + "if (!init) {\n" |
| + " buglistLinkElem.select();\n" |
| + "}\n" |
| + "void(0);\n" |
| + "}\n" |
| + "updateBuglistLink(true);\n" |
| ); |
| lastElem.parentNode.appendChild(scriptElem); |
| } |
| } |
| |
| function process_result_pages() { |
| var bugId; |
| var myMail; |
| |
| // Rewrite header for direct copy/paste as CVS comment ("Bug xxx: Summary"): |
| var titleElem= document.getElementById("title"); |
| if (titleElem) { |
| var changeformElem= document.getElementById("changeform"); |
| if (changeformElem) { |
| bugId= changeformElem.elements["id"].value; |
| var short_desc_nonedit_displayElem= document.getElementById("short_desc_nonedit_display"); |
| if (short_desc_nonedit_displayElem) { |
| // Render bug link as short link: |
| var bugLink= document.createElement("a"); |
| bugLink.href= (isBugsEclipseOrg ? "../" : "show_bug.cgi?id=") + bugId; |
| bugLink.appendChild(document.createTextNode("Bug " + bugId)); |
| |
| var bugElem= document.createElement("p"); |
| bugElem.appendChild(bugLink); |
| bugElem.appendChild(document.createTextNode(": " + short_desc_nonedit_displayElem.textContent)); |
| |
| if (titleElem.firstElementChild) { // Bugzilla < 5.0 |
| titleElem.replaceChild(bugElem, titleElem.firstElementChild); |
| } else { |
| titleElem.replaceChild(bugElem, titleElem.firstChild); |
| } |
| |
| // emergency workaround for Bug 508888: Bugzilla page rendering is broken |
| if (headElem) { |
| var titleTag= document.getElementsByTagName("title")[0]; |
| if (titleTag && titleTag.textContent == "") { |
| titleTag.textContent= "Bug " + bugId + " - " + short_desc_nonedit_displayElem.textContent; |
| } |
| } |
| |
| |
| // Hack to stitch header to top, so that it is also visible when scrolled down: |
| // Better solution would be to use absolute positioning and only have a scroll-y on the bugzilla-body div: |
| // http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/ |
| var tableElem= document.getElementById("titles"); |
| tableElem.setAttribute("style", "position:fixed; top:0px; left:0px; right:0px; z-index:1000;"); |
| // leave some space behind the fixed table: |
| var spacerElem= document.createElement("div"); |
| spacerElem.appendChild(document.createTextNode("...")); |
| tableElem.parentNode.insertBefore(spacerElem, tableElem); |
| |
| var subtitleElem= document.getElementById("subtitle"); |
| if (subtitleElem) { |
| subtitleElem.textContent= ""; |
| |
| // Add a convenient Commit button to the fixed header: |
| var commitElem= document.createElement("button"); |
| commitElem.setAttribute("type", "submit"); |
| commitElem.setAttribute("class", "knob-buttons"); |
| commitElem.setAttribute("style", "margin: -3px 14px"); |
| commitElem.setAttribute("form", "changeform"); |
| setCommitElemNameTitleShortcut(commitElem); |
| var tdElem= document.createElement("td"); |
| tdElem.appendChild(commitElem); |
| subtitleElem.parentNode.insertBefore(tdElem, null); |
| } |
| |
| // Fix vscroll when jumping to hash locations (accommodate for fixed header table): |
| var bodyElem= document.getElementsByTagName("body")[0]; |
| if (headElem && bodyElem) { |
| var scriptElem= createScript( |
| "function locationHashChanged() {\n" |
| + " var off= - document.getElementById('titles').offsetHeight - 3;\n" |
| + " console.log(off);\n" |
| + " window.scrollBy(0, off);\n" |
| + "}\n" |
| ); |
| headElem.appendChild(scriptElem); |
| bodyElem.setAttribute("onhashchange", "locationHashChanged();"); |
| //TODO: Maybe the pageshow event would also work if the location hash did not change (e.g. on second click to hash link): |
| // http://www.whatwg.org/specs/web-apps/current-work/multipage/history.html#event-pageshow |
| } |
| } |
| |
| // Add bug categories choosers: |
| var short_descElem= document.getElementById("short_desc"); |
| if (short_descElem) { |
| // Insert before summary: |
| // var short_desc_divElem= short_descElem.parentNode.parentNode.parentNode.parentNode.parentNode; |
| // short_desc_divElem.parentNode.insertBefore(createCategoryChoosers(), short_desc_divElem); |
| |
| // Insert after summary: |
| var choosers= createCategoryChoosers(); |
| choosers.insertBefore(document.createTextNode(" "), choosers.firstChild); |
| short_descElem.setAttribute("style", "width: 53%;"); |
| short_descElem.parentNode.insertBefore(choosers, short_descElem.nextSibling); |
| var summaryElem= document.getElementById("summary"); |
| if (summaryElem) { |
| summaryElem.setAttribute("style", "width: 100%;"); // necessary for process_bug.cgi, dont ask... |
| summaryElem.parentNode.parentNode.setAttribute("style", "width: 99%;"); // fix horizonal scrollbars |
| } |
| } |
| } |
| } |
| |
| var confirm_product_changeElem= document.getElementsByName("confirm_product_change")[0]; |
| if (confirm_product_changeElem) { |
| var productElem= document.getElementsByName("product")[0]; |
| var componentElem= document.getElementsByName("component")[0]; |
| if (productElem && componentElem) { |
| addLink("Descriptions", "https://bugs.eclipse.org/bugs/describecomponents.cgi?product=" + productElem.value, |
| componentElem.parentNode.firstElementChild); |
| } |
| } |
| |
| headElem.appendChild( |
| createScript( |
| 'function assignTo(email) {\n' |
| + 'document.getElementById("assigned_to").value= email;\n' |
| + 'document.getElementById("set_default_assignee").checked= false;\n' |
| + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";\n' |
| + 'YAHOO.util.Dom.setStyle(document.getElementById("set_default_assignee_label"), "font-weight", "normal");\n' |
| + 'document.getElementById("assigned_to").focus();\n' |
| + '}\n' |
| ) |
| ); |
| |
| // Loop over <a>s: |
| var anchors= document.getElementsByTagName("a"); |
| var diffRegex = /attachment\.cgi\?id=(\d+)&action=diff/; |
| var commentIdRegex= /^c(\d+)$/; // c42 |
| var commentRegex= /^show_bug\.cgi\?id=(\d+)#c(\d+)$/; |
| var bugrefRegex = /show_bug\.cgi\?id=(\d+)/; |
| var gerritRegex = /https:\/\/git\.eclipse\.org\/r\/(?:#\/c\/)?(\d+(?:\/.*)?)/; |
| // https://git.eclipse.org/c/pde/eclipse.pde.ui.git/commit/?id=d609946a67b70c2afbdfe936f9883720e6e2d489 |
| var gitRegex = /https:\/\/git\.eclipse\.org\/c\/([^?]+)\.git\/commit\/\?.*id=([0-9a-f]{7})[0-9a-f]+/; |
| var lastComment; |
| for (var i= 0; i < anchors.length; i++) { |
| var aElem= anchors[i]; |
| var aElemHref= aElem.getAttribute("href"); |
| if (!aElemHref) |
| continue; |
| |
| // Fix attachment link (revert the new Bugzilla 3.6 "feature" that shows fancy patch viewer but kills copy/paste of patch into Eclipse): |
| if (aElem.name.substr(0, 7) == "attach_" && aElemHref.match(diffRegex)) { |
| aElem.setAttribute("href", aElemHref.replace(diffRegex, "attachment.cgi?id=$1")); |
| |
| // Add [diff] after [details] in attachment references: |
| var diffElem= document.createElement("a"); |
| diffElem.textContent= "[diff]"; |
| diffElem.href= aElemHref.replace(diffRegex, "attachment.cgi?id=$1&action=diff"); |
| aElem.parentNode.appendChild(document.createTextNode(" ")); |
| aElem.parentNode.appendChild(diffElem); |
| i+= 2; //skip [details] and new anchor |
| |
| // Change "Comment 42" to ">bug 170000 comment 42<" (simplifies copy/paste of reference): |
| } else if (aElemHref.match(commentRegex) && aElem.parentNode.getAttribute("class") == "bz_comment_number") { |
| aElem.textContent= "comment " + commentIdRegex.exec(aElem.parentNode.parentNode.parentNode.id)[1]; |
| |
| var pre= document.createTextNode("bug " + bugId + " "); |
| aElem.parentNode.insertBefore(pre, aElem); |
| lastComment= aElem; |
| |
| // Fix the Status "Edit" link |
| } else if (aElemHref == "#add_comment" && aElem.parentNode.getAttribute("id") == "static_bug_status") { |
| aElem.setAttribute("href", "#bug_status"); |
| |
| // Modifier+click on [-] to toggle wide comments |
| } else if (aElem.getAttribute("class") == "bz_collapse_comment") { |
| var commentId= commentIdRegex.exec(aElem.parentNode.parentNode.parentNode.id)[1]; |
| var action= |
| 'var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;' |
| + 'if (modClick) {' |
| + ' toggle_wide_comment_display(' + commentId + '); return false;' |
| + '} else {' |
| + aElem.getAttribute("onclick") |
| + '}' |
| + 'return false;'; |
| aElem.setAttribute("onclick", action); |
| aElem.title="Toggle comment display (Modifier+click to toggle wide)"; |
| |
| // Remove link in bug header to allow easy copying of bug number: |
| } else if (aElemHref.match(bugrefRegex)) { |
| if (aElem.parentNode.getAttribute("class") == "bz_alias_short_desc_container edit_form") { |
| var pre= document.createTextNode("bug " + bugId); |
| aElem.parentNode.insertBefore(pre, aElem); |
| aElem.parentNode.removeChild(aElem); |
| |
| // Show title of "See Also" bugs: |
| } else if (aElem.parentNode.parentNode.parentNode.id == "field_container_see_also" |
| && aElem.getAttribute("class") && aElem.getAttribute("class").includes("bz_bug_link")) { |
| var myElem= document.createElement("span"); |
| myElem.style.marginLeft= "1em"; |
| myElem.textContent= aElem.title; |
| myElem.title= aElem.title; |
| aElem.parentNode.insertBefore(myElem, aElem.nextSibling); |
| } |
| |
| // Turn "Add comment" link into a button: |
| } else if (aElem.parentNode.getAttribute("class") == "bz_add_comment") { |
| var buttonElem= document.createElement("button"); |
| buttonElem.setAttribute("onclick", aElem.getAttribute("onclick")); |
| buttonElem.textContent= aElem.textContent + "..."; |
| aElem.parentNode.replaceChild(buttonElem, aElem); |
| |
| } else if (aElem.getAttribute("class") == "email" && aElem.firstElementChild) { |
| var email= aElemHref.substr(7); |
| // Add "envelope" mail link, containing "name <email_address>" (e.g. to copy-paste as Git author) |
| var fullElem= aElem.cloneNode(); |
| fullElem.innerHTML= "✉"; //ENVELOPE |
| fullElem.style.textDecoration="none"; |
| var fullEmail= aElem.firstElementChild.textContent + " <" + email + ">"; |
| fullElem.title= fullEmail; |
| aElem.title= email; |
| fullElem.setAttribute("href", "mailto:" + fullEmail); |
| |
| aElem.parentNode.insertBefore(fullElem, aElem.nextSibling.nextSibling); |
| aElem.parentNode.insertBefore(document.createTextNode(" "), fullElem.nextSibling); |
| |
| i+= 1; // skip new link |
| |
| var nextNode= fullElem.nextElementSibling; // ECA | Friend | null! |
| |
| // Add "assign to" link (unless already assigned) |
| var assigned_toElem= document.getElementById("assigned_to"); |
| if (assigned_toElem && assigned_toElem.value != email) { |
| var assignToElem= aElem.cloneNode(); |
| assignToElem.innerHTML+= assignToSymbol; |
| assignToElem.style.textDecoration="none"; |
| assignToElem.title= "Assign to " + aElem.title; |
| assignToElem.setAttribute("href", getAssigneeLinkScript(email)); |
| |
| fullElem.parentNode.insertBefore(assignToElem, nextNode); |
| fullElem.parentNode.insertBefore(document.createTextNode(" "), nextNode); |
| |
| i+= 1; // skip new link |
| } |
| |
| // add link to search for changes by this user in the last week |
| var changesElem= addLink(searchSymbol, "buglist.cgi?chfieldfrom=1w" |
| + "&email1=" + email + "&emailassigned_to1=1&emailcc1=1&emaillongdesc1=1&emailqa_contact1=1&emailreporter1=1&emailtype1=exact&order=Last Changed" |
| , fullElem.parentNode, "Changes by this user in the last 7 days", false); |
| changesElem.setAttribute("style", "text-decoration: none; " + searchSymbolStyle); |
| fullElem.parentNode.insertBefore(changesElem, nextNode); |
| fullElem.parentNode.insertBefore(document.createTextNode(" "), nextNode); |
| i+= 1; // skip new link |
| |
| // Dim glaring icon for "Bug 429346: Link to editing bugzilla config from bugzilla" |
| } else if (aElemHref == "https://dev.eclipse.org/committers/bugs/bugz_manager.php") { |
| aElem.setAttribute("class", "cla_dec"); |
| |
| // Store user's email address |
| } else if (aElemHref == "index.cgi?logout=1") { |
| myMail= aElem.nextSibling.textContent.trim(); |
| |
| // Add accesskey |
| } else if (aElem.textContent == "Expand All Comments") { |
| aElem.innerHTML= "E<b>x</b>pand All Comments"; |
| aElem.setAttribute("accesskey", "x"); |
| |
| // Improve link rendering for https://bugs.eclipse.org/434841#c37 |
| } else if (aElem.textContent.match(/\s*Gerrit Change\s*/) && aElemHref.match(gerritRegex)) { |
| var changeId= gerritRegex.exec(aElemHref)[1]; |
| aElem.textContent = "r/" + changeId; |
| |
| // Lazily load/append Gerrit status: |
| // can't use XMLHttpRequest due to Cross-Origin Request blocking (Same Origin Policy) |
| if (typeof GM.xmlHttpRequest !== "undefined") { |
| GM.xmlHttpRequest({ |
| method: "GET", |
| url: "https://git.eclipse.org/r/changes/" + changeId + "?o=DETAILED_ACCOUNTS", |
| onload: getAppendGerritStatusFunction(aElem) |
| }); |
| } |
| |
| } else if (aElem.textContent.match(/\s*Git Commit\s*/) && aElemHref.match(gitRegex)) { |
| var match= gitRegex.exec(aElemHref); |
| aElem.textContent = match[2]; |
| |
| var label= document.createElement("span"); |
| label.style.marginLeft= "1.5em"; |
| label.textContent= "(" + match[1] + ")"; |
| aElem.parentNode.insertBefore(label, aElem.nextSibling); |
| |
| // Show resolved bugs in dependency tree: |
| } else if (aElemHref.match(/showdependencytree\.cgi\?id=\d+&hide_resolved=1/)) { |
| aElem.setAttribute("href", aElemHref.substr(0, aElemHref.length - 1) + "0"); |
| |
| } else if (document.getElementById("product") && document.getElementById("component")) { // e.g. not in attachment.cgi?id=*&action=edit |
| // Add "Clone This Bug (in <originating project>)": |
| if (aElem.textContent == "Clone This Bug") { |
| var cloneElem= aElem.cloneNode(); |
| var product= document.getElementById("product").value; |
| cloneElem.textContent= "(in " + product + ")"; |
| cloneElem.href= aElem.href + "&product=" + product; |
| aElem.parentNode.insertBefore(cloneElem, aElem.nextSibling); |
| aElem.parentNode.insertBefore(document.createTextNode(" "), cloneElem); |
| |
| // Add "New (in <originating project>)": |
| } else if (aElemHref == "enter_bug.cgi") { |
| var cloneElem= aElem.cloneNode(); |
| var component= document.getElementById("component").value; |
| var product= document.getElementById("product").value; |
| cloneElem.textContent= "(in " + product + "/" + component + ")"; |
| cloneElem.href= aElem.href + "?product=" + product + "&component=" + component; |
| aElem.parentNode.insertBefore(cloneElem, aElem.nextSibling); |
| aElem.parentNode.insertBefore(document.createTextNode(" "), cloneElem); |
| } |
| // insert more general stuff further up (not here; previous "else if" was pretty broad...) |
| } |
| |
| // // Show obsolete attachments initially: |
| // if (aElem.getAttribute("onclick") == "return toggle_display(this);") { |
| // aElem.setAttribute("name", "toggle_display"); // have to give this a name so we can refer to it from the embedded script afterwards |
| // var scriptElem= document.createElement("script"); |
| // scriptElem.type="text/javascript"; |
| // scriptElem.innerHTML= 'toggle_display(document.anchors["toggle_display"]);'; |
| // aElem.parentNode.insertBefore(scriptElem, aElem.nextSibling) |
| // } |
| } |
| |
| // add "Jump to my last comment" and "Jump to last comment and Reload" links in header: |
| if (lastComment) { |
| var header_addl_infoElems= document.getElementsByClassName("header_addl_info"); |
| if (header_addl_infoElems[0]) { |
| // original text: Last modified: 2015-11-09 11:15:40 CET |
| var newHTML= '<a href="#">Top</a> ' |
| + '(<a href="javascript:scroll_to_my_last_comment();void(0);" title="Jump to my last comment">My</a>) ' |
| + '<a href="' + lastComment.href + '" title="Jump to last comment">Last</a> ' |
| + '<a href="' + lastComment.href + '" ' |
| + 'onclick="var modClick= event.shiftKey || event.ctrlKey || event.altKey || event.metaKey || event.button == 1;' |
| + 'if (!modClick) { window.location.href=\'' + lastComment.href + '\';window.location.reload(false);}" ' |
| + 'title="Jump to last comment and Reload">modified 🔃</a>' |
| + header_addl_infoElems[0].innerHTML.substr(13); |
| header_addl_infoElems[0].innerHTML= newHTML; |
| } |
| } |
| |
| // Edit summary: |
| if (!hideElem("summary_alias_container")) { // Bugzilla < 5.0 |
| hideElem("summary_container"); |
| } |
| if (!showElem("summary_alias_input")) { // Bugzilla < 5.0 |
| showElem("summary_input"); |
| } |
| |
| // Move alias field to bug id line: |
| var aliasElem= document.getElementById("alias"); |
| var summary_alias_inputElem= document.getElementById("summary_alias_input"); |
| if (aliasElem && summary_alias_inputElem) { |
| var aliasTrElem= aliasElem.parentNode.parentNode; |
| var spacer= document.createTextNode(" "); |
| summary_alias_inputElem.parentNode.insertBefore(spacer, summary_alias_inputElem.previousElementSibling); |
| var table= document.createElement("table"); |
| table.setAttribute("style", "display: inline; vertical-align: -5px"); |
| table.appendChild(aliasTrElem); |
| summary_alias_inputElem.parentNode.insertBefore(table, summary_alias_inputElem.previousElementSibling); |
| } |
| |
| // Edit CC list (already badly hacked on bugs.eclipse.org, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=334083 ): |
| hideElem("cc_edit_area_showhide_container"); |
| var cc_edit_areaElem= showElem("cc_edit_area"); |
| if (cc_edit_areaElem) { |
| cc_edit_areaElem.removeChild(cc_edit_areaElem.getElementsByTagName("br")[0]); |
| } |
| |
| setOptionSize("cc", 8); |
| |
| // Add shortcut cc links: |
| // ... with auto-complete: |
| var newcc_autocompleteElem= document.getElementById("newcc_autocomplete"); |
| if (newcc_autocompleteElem) { |
| var addDiv= newcc_autocompleteElem.parentNode.firstElementChild; |
| for (var i= 0; i < ccs.length; i= i+2) { |
| addCcLink(ccs[i], ccs[i + 1], addDiv, "newcc"); |
| } |
| } |
| |
| // ... without auto-complete (https://bugs.eclipse.org/386744): |
| var newccElem= document.getElementById("newcc"); |
| if (newccElem) { |
| var addDiv= newccElem.parentNode.firstElementChild; |
| for (var i= 0; i < ccs.length; i= i+2) { |
| addCcLink(ccs[i], ccs[i + 1], addDiv, "newcc"); |
| } |
| |
| var ccElem= document.getElementById("cc"); |
| if (ccElem) { |
| // Add "(^ edit)" to CC list: |
| var eHref= 'javascript:' |
| + 'var newccElem= document.getElementById("newcc");' |
| + 'var ccElem= document.getElementById("cc");' |
| + 'var ccElems= ccElem.children;' |
| + 'var email= "";' |
| + 'for (var i= 0; i < ccElems.length; i++) {' |
| + ' if (ccElems[i].selected || ccElem.selectedOptions.length == 0) {' |
| + ' if (email.length != 0) {' |
| + ' email += ", ";' |
| + ' }' |
| + ' email += ccElems[i].value;' |
| + ' }' |
| + '}' |
| + 'var endWithComma= newccElem.value.length != 0;' |
| + 'if (endWithComma) {' |
| + ' email += ", ";' |
| + '}' |
| + 'newccElem.value= email + newccElem.value;' |
| + 'newccElem.focus();' |
| + 'newccElem.selectionStart= 0;' |
| + 'newccElem.selectionEnd= email.length - (endWithComma ? 2 : 0);' |
| + 'void(0);'; |
| |
| var eLinkElem= document.createElement("a"); |
| eLinkElem.href= eHref; |
| eLinkElem.style= "vertical-align:top"; |
| eLinkElem.innerHTML= "(^ edit)"; |
| eLinkElem.title= "Copy selected CCs to editable/copyable field"; |
| ccElem.parentNode.insertBefore(eLinkElem, ccElem.nextElementSibling); |
| |
| var spaceElem= document.createTextNode(" "); |
| ccElem.parentNode.insertBefore(spaceElem, eLinkElem.nextSibling); |
| |
| // Add "Assign to selected CC" to CC list: |
| var aHref= 'javascript:' |
| + 'var ccElem= document.getElementById("cc");' |
| + 'var ccElems= ccElem.children;' |
| + 'var email;' |
| + 'for (var i= 0; i < ccElems.length; i++) {' |
| + ' if (ccElems[i].selected || ccElem.selectedOptions.length == 0) {' |
| + ' email = ccElems[i].value;' |
| + ' break;' |
| + ' }' |
| + '}' |
| + 'if (email) {' |
| + ' assignTo(email);' |
| + '}' |
| + 'void(0);'; |
| |
| var aLinkElem= document.createElement("a"); |
| aLinkElem.href= aHref; |
| aLinkElem.style= "vertical-align:top"; |
| aLinkElem.innerHTML= assignToSymbol; |
| aLinkElem.style.textDecoration="none"; |
| aLinkElem.title= "Assign to selected CC"; |
| ccElem.parentNode.insertBefore(aLinkElem, spaceElem.nextElementSibling); |
| } |
| } |
| |
| // Edit see_also: |
| hideElem("container_showhide_see_also"); |
| showElem("container_see_also"); |
| |
| // Edit & rearrange Assignee & QA: |
| fixCheckboxField("bz_assignee_edit_container", "bz_assignee_input", "Default Ass."); |
| fixCheckboxField("bz_qa_contact_edit_container", "bz_qa_contact_input", "Default QA"); |
| |
| var set_default_assigneeElem= document.getElementById("set_default_assignee"); |
| if (set_default_assigneeElem) { |
| set_default_assigneeElem.setAttribute("onclick", addOldAssigneeAsCcScript); |
| } |
| |
| // Fix Product & Component (lose focus on change): |
| var classificationElem= document.getElementById("classification"); |
| var productElem= document.getElementById("product"); |
| var componentElem= document.getElementById("component"); |
| if (classificationElem && productElem) { |
| productElem.setAttribute("onchange", "window.setTimeout(function() {" |
| + "document.getElementById('product').focus();" |
| + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";' |
| + "}, 10)" |
| ); |
| |
| var productsLinkSpanElem= document.createElement("span"); |
| productsLinkSpanElem.style.marginLeft= "1em"; |
| productElem.parentNode.insertBefore(productsLinkSpanElem, productElem.nextSibling); |
| if (isBugsEclipseOrg) { |
| // Add shortcuts to set Product: |
| for (var i= 0; i < moveProducts.length; i++) { |
| addProductLink(moveProducts[i], productsLinkSpanElem); |
| } |
| productsLinkSpanElem.appendChild(document.createTextNode(" | ")); |
| } else { |
| productsLinkSpanElem.appendChild(document.createTextNode(" ")); |
| } |
| // Add shortcut to search Product: |
| addLink(searchSymbol, "query.cgi" |
| + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value |
| + "&product=" + productElem.options[productElem.selectedIndex].value |
| , productsLinkSpanElem, "Search in this product", " (").style= searchSymbolStyle; |
| addLink("1w", "buglist.cgi" |
| + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value |
| + "&product=" + productElem.options[productElem.selectedIndex].value |
| + "&chfieldfrom=1w" |
| , productsLinkSpanElem, "Changed in the last 7 days"); |
| productsLinkSpanElem.appendChild(document.createTextNode(")")); |
| } |
| |
| if (classificationElem && productElem && componentElem) { |
| componentElem.setAttribute("onchange", "window.setTimeout(function() {" |
| + "document.getElementById('component').focus();" |
| + 'document.getElementById("addselfcc") != null ? document.getElementById("addselfcc").checked= true : "";' |
| + "}, 10)" |
| ); |
| |
| var componentsLinkSpanElem= document.createElement("span"); |
| componentsLinkSpanElem.style.marginLeft= "1em"; |
| componentElem.parentNode.insertBefore(componentsLinkSpanElem, componentElem.nextSibling); |
| if (isBugsEclipseOrg) { |
| // Add shortcuts to set Component: |
| for (var i= 0; i < moveComponents.length; i++) { |
| addComponentLink(moveComponents[i], componentsLinkSpanElem); |
| } |
| componentsLinkSpanElem.appendChild(document.createTextNode(" | ")); |
| } else { |
| componentsLinkSpanElem.appendChild(document.createTextNode(" ")); |
| } |
| // Add shortcut to search Component: |
| addLink(searchSymbol, "query.cgi" |
| + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value |
| + "&product=" + productElem.options[productElem.selectedIndex].value |
| + "&component=" + componentElem.options[componentElem.selectedIndex].value |
| , componentsLinkSpanElem, "Search in this component", " (").style= searchSymbolStyle; |
| addLink("1w", "buglist.cgi" |
| + "?classification=" + classificationElem.options[classificationElem.selectedIndex].value |
| + "&product=" + productElem.options[productElem.selectedIndex].value |
| + "&component=" + componentElem.options[componentElem.selectedIndex].value |
| + "&chfieldfrom=1w" |
| , componentsLinkSpanElem, "Changed in the last 7 days"); |
| componentsLinkSpanElem.appendChild(document.createTextNode(")")); |
| } |
| |
| // Copy QA and Assignee to the right (read-only): |
| var assigneeCopy, qaCopy; |
| var bz_assignee_edit_containerElem= document.getElementById("bz_assignee_edit_container"); |
| if (bz_assignee_edit_containerElem) { |
| var spans= bz_assignee_edit_containerElem.getElementsByTagName("span"); |
| for (var i= 0; i < spans.length; i++) { |
| var spanElem= spans[i]; |
| if (spanElem.getAttribute("class") == "vcard") { |
| assigneeCopy= spanElem.cloneNode(true); |
| } |
| } |
| } |
| var bz_qa_contact_edit_containerElem= document.getElementById("bz_qa_contact_edit_container"); |
| if (bz_qa_contact_edit_containerElem) { |
| var spans= bz_qa_contact_edit_containerElem.getElementsByTagName("span"); |
| for (var i= 0; i < spans.length; i++) { |
| var spanElem= spans[i]; |
| if (spanElem.getAttribute("class") == "vcard") { |
| qaCopy= spanElem.cloneNode(true); |
| } |
| } |
| } |
| |
| var bz_show_bug_column_2Elem= document.getElementById("bz_show_bug_column_2"); |
| if (bz_show_bug_column_2Elem) { |
| var trs= bz_show_bug_column_2Elem.getElementsByTagName("tr"); |
| if (qaCopy) { |
| var qaTr= document.createElement("tr"); |
| |
| var qaTdLabel= document.createElement("td"); |
| qaTdLabel.setAttribute("class", "field_label"); |
| qaTdLabel.innerHTML= "<b>QA Contact</b>:"; |
| qaTr.appendChild(qaTdLabel); |
| |
| var qaTdValue= document.createElement("td"); |
| qaTdValue.appendChild(qaCopy); |
| qaTr.appendChild(qaTdValue); |
| |
| if (trs.length > 0) { |
| trs[1].parentNode.insertBefore(qaTr, trs[1]); |
| } |
| } |
| if (assigneeCopy) { |
| var assigneeTr= document.createElement("tr"); |
| |
| var assigneeTdLabel= document.createElement("td"); |
| assigneeTdLabel.setAttribute("class", "field_label"); |
| assigneeTdLabel.innerHTML= "<b>Assignee</b>:"; |
| assigneeTr.appendChild(assigneeTdLabel); |
| |
| var assigneeTdValue= document.createElement("td"); |
| assigneeTdValue.appendChild(assigneeCopy); |
| assigneeTr.appendChild(assigneeTdValue); |
| |
| if (trs.length > 0) { |
| trs[1].parentNode.insertBefore(assigneeTr, trs[1]); |
| } |
| } |
| } |
| |
| // Add accesskeys: |
| setAccessKey("bug_status", "t"); |
| setAccessKey("resolution", "r"); |
| setAccessKey("target_milestone", "m"); |
| |
| // Add shortcut target milestone links: |
| var targetElem= document.getElementById("target_milestone"); |
| if (targetElem && isBugsEclipseOrg) { |
| var targetLinkSpanElem= document.createElement("span"); |
| targetLinkSpanElem.style.marginLeft= "1em"; |
| targetElem.parentNode.insertBefore(targetLinkSpanElem, targetElem.nextSibling); |
| for (var i= 0; i < target_milestones.length; i++) { |
| addTargetLink(targetLinkSpanElem, target_milestones[i]); |
| } |
| addTargetLink(targetLinkSpanElem, "---"); |
| } |
| |
| // Move Status to right spot: |
| var statusElem= document.getElementById("status"); |
| var bz_assignee_inputElem= document.getElementById("bz_assignee_input"); |
| if (statusElem && bz_assignee_inputElem) { |
| var statusTRElem= statusElem.parentNode.parentNode; |
| var bz_assignee_inputTRElem= bz_assignee_inputElem.parentNode.parentNode; |
| bz_assignee_inputTRElem.parentNode.insertBefore(statusTRElem, bz_assignee_inputTRElem); |
| |
| // Add shortcut status links: |
| var dup_id_discoverableElem= document.getElementById("dup_id_discoverable"); |
| var statusLinksDivElem= document.createElement("div"); |
| dup_id_discoverableElem.parentNode.insertBefore(statusLinksDivElem, dup_id_discoverableElem.nextSibling); |
| |
| var bug_statusElem= document.getElementById("bug_status"); |
| if (dup_id_discoverableElem && bug_statusElem) { |
| var firstStatus= bug_statusElem.options[0].value; |
| var secondStatus= bug_statusElem.options[1].value; |
| if ((firstStatus == "NEW" || firstStatus == "ASSIGNED" || firstStatus == "REOPENED") && secondStatus != "RESOLVED") { |
| addStatusLink("NEW", "NEW", "", statusLinksDivElem); |
| addStatusLink("ASSIGNED", "ASSIGNED", "", statusLinksDivElem); |
| } else { |
| addStatusLink("REOPENED", "REOPENED", "", statusLinksDivElem); |
| addStatusLink("VERIFIED", "VERIFIED", null, statusLinksDivElem); |
| } |
| |
| addStatusLink("FIXED", "RESOLVED", "FIXED", statusLinksDivElem); |
| // Add shortcut target milestone link: |
| for (var i = 0; i < main_target_milestones.length; i++) { |
| var targetLinkSpanElem= document.createElement("span"); |
| targetLinkSpanElem.style.marginLeft= ".5em"; |
| statusLinksDivElem.appendChild(targetLinkSpanElem); |
| addFixedInTargetLink(targetLinkSpanElem, target_milestones[main_target_milestones[i]]); |
| } |
| |
| addStatusLink("INVALID", "RESOLVED", "INVALID", statusLinksDivElem); |
| addStatusLink("WONTFIX", "RESOLVED", "WONTFIX", statusLinksDivElem); |
| addStatusLink("WORKSFORME", "RESOLVED", "WORKSFORME", statusLinksDivElem); |
| addStatusLink("NOT_ECLIPSE", "RESOLVED", "NOT_ECLIPSE", statusLinksDivElem); |
| } |
| |
| // Add shortcut assignee links: |
| if (myMail) { |
| addAssigneeLink("me", myMail, bz_assignee_inputElem); |
| } |
| for (var i= 0; i < assignees.length; i= i+2) { |
| addAssigneeLink(assignees[i], assignees[i + 1], bz_assignee_inputElem); |
| } |
| } |
| |
| // Add JDT UI Java 16 root bug to 'Blocks' |
| var blocksLabel= document.getElementById("field_label_blocked"); |
| if (blocksLabel) { |
| var rootBugButton= document.createElement("button"); |
| var rootTextElem = document.createTextNode("UI16"); |
| rootBugButton.appendChild(rootTextElem); |
| rootBugButton.style.marginLeft= "1em"; |
| |
| rootBugButton.addEventListener('click', function() { |
| var blockedElem= document.getElementById("blocked"); |
| if (blockedElem) { |
| blockedElem.value += 568025; |
| } |
| }); |
| |
| var trElem= blocksLabel.parentNode; |
| var tdElem= document.createElement("td"); |
| tdElem.appendChild(rootBugButton); |
| trElem.appendChild(tdElem); |
| } |
| |
| // Add JDT Core Java 16 root bug to 'Blocks' |
| var blocksLabel= document.getElementById("field_label_blocked"); |
| if (blocksLabel) { |
| var rootBugButton= document.createElement("button"); |
| var rootTextElem = document.createTextNode("CORE16"); |
| rootBugButton.appendChild(rootTextElem); |
| //rootBugButton.style.marginLeft= "1em"; |
| |
| rootBugButton.addEventListener('click', function() { |
| var blockedElem= document.getElementById("blocked"); |
| if (blockedElem) { |
| blockedElem.value += 565620; |
| } |
| }); |
| |
| var trElem= blocksLabel.parentNode; |
| var tdElem= document.createElement("td"); |
| tdElem.appendChild(rootBugButton); |
| trElem.appendChild(tdElem); |
| } |
| |
| // Add a convenient Commit button: |
| var bz_qa_contact_inputElem= document.getElementById("bz_qa_contact_input"); |
| if (bz_qa_contact_inputElem) { |
| var commitElem= document.createElement("button"); |
| commitElem.setAttribute("type", "submit"); |
| setCommitElemNameTitleShortcut(commitElem); |
| commitElem.style.marginLeft= "1em"; |
| bz_qa_contact_inputElem.appendChild(commitElem); |
| |
| addSaveShortcutCtrlS("changeform"); |
| } |
| |
| // Edit attachment details: |
| if (document.getElementById("attachment_information_read_only")) { |
| location.assign("javascript:toggle_attachment_details_visibility();void(0)"); |
| } |
| |
| // Move "Expand / Collapse All" away to avoid interfering with selections in the comments section: |
| var bz_collapse_expand_commentsElems= document.getElementsByClassName("bz_collapse_expand_comments"); |
| if (bz_collapse_expand_commentsElems.length > 0) { |
| var bz_group_visibility_sectionElems= document.getElementsByClassName("bz_group_visibility_section"); |
| if (bz_group_visibility_sectionElems.length > 0) { |
| bz_collapse_expand_commentsElems[0].setAttribute("style", "padding-top: 4em;"); |
| bz_group_visibility_sectionElems[0].parentNode.appendChild(bz_collapse_expand_commentsElems[0]); |
| } else { |
| var add_commentElem= document.getElementById("add_comment"); |
| if (add_commentElem) { |
| var tdRightOfadd_commentElem= add_commentElem.parentNode.nextElementSibling; |
| var spacer= document.createElement("div"); |
| spacer.setAttribute("style", "padding-top: 9em"); |
| tdRightOfadd_commentElem.appendChild(spacer); |
| tdRightOfadd_commentElem.appendChild(bz_collapse_expand_commentsElems[0]); |
| } |
| } |
| |
| // Add "Collapse All Before My Last" (Alt+Shift+E) and "Jump To My Last" (Alt+Shift+Y) |
| var scriptElem= document.createElement("script"); |
| scriptElem.type= "text/javascript"; |
| scriptElem.innerHTML= |
| "function collapse_all_comments_before_my_last() {\n" + |
| "var comments = YAHOO.util.Dom.getElementsByClassName('bz_comment_text');\n" + |
| "var i = comments.length - 1;\n" + |
| "var scrollTarget;\n" + |
| "for (; i >= 0; i--) {\n" + |
| " var comment = comments[i];\n" + |
| " if (!comment)\n" + |
| " continue;\n" + |
| " \n" + |
| " var emailElems= comment.parentNode.getElementsByClassName('email');\n" + |
| " if (emailElems[emailElems.length - 1].title == '" + myMail + "') {\n" + |
| " scrollTarget= emailElems[emailElems.length - 1];\n" + |
| " i--;\n" + |
| " break;\n" + |
| " };\n" + |
| "}\n" + |
| "for (; i >= 0; i--) {\n" + |
| " var comment = comments[i];\n" + |
| " if (!comment)\n" + |
| " continue;\n" + |
| " \n" + |
| " var id = comments[i].id.match(/\\d*$/);\n" + |
| " var link = document.getElementById('comment_link_' + id);\n" + |
| " collapse_comment(link, comment);\n" + |
| "}\n" + |
| "if (scrollTarget) {\n" + |
| " scrollTarget.scrollIntoView(true);\n" + |
| " locationHashChanged();\n" + |
| "};\n" + |
| "}\n" + |
| |
| "function scroll_to_my_last_comment() {\n" + |
| "var comments = YAHOO.util.Dom.getElementsByClassName('bz_comment');\n" + |
| "var i = comments.length - 1;\n" + |
| "var scrollTargetId;\n" + |
| "for (; i >= 0; i--) {\n" + |
| " var comment = comments[i];\n" + |
| " if (!comment)\n" + |
| " continue;\n" + |
| " \n" + |
| " var emailElems= comment.getElementsByClassName('email');\n" + |
| " if (emailElems[0].title == '" + myMail + "') {\n" + |
| " scrollTargetId= comment.id;\n" + |
| " i--;\n" + |
| " break;\n" + |
| " };\n" + |
| "}\n" + |
| "if (scrollTargetId) {\n" + |
| " window.location.hash= scrollTargetId;\n" + |
| "};\n" + |
| "}\n" + |
| |
| // Click "Collapse All Before My Last": |
| // + "collapse_all_comments_before_my_last();\n" // turned out to be inconvenient |
| ""; |
| headElem.appendChild(scriptElem); |
| |
| var aElem= document.createElement("a"); |
| aElem.href= "javascript:void(0);"; |
| aElem.innerHTML= "Collaps<b>e</b> All Before My Last"; |
| aElem.setAttribute("accesskey", "e"); |
| aElem.setAttribute("onclick","javascript:collapse_all_comments_before_my_last();\nreturn false;"); |
| |
| var liElem= document.createElement("li"); |
| liElem.appendChild(aElem); |
| bz_collapse_expand_commentsElems[0].appendChild(liElem); |
| |
| liElem.appendChild(document.createTextNode(" (")) |
| aElem= document.createElement("a"); |
| aElem.href= "javascript:void(0);"; |
| aElem.innerHTML= "Jump To M<b>y</b> Last"; |
| aElem.setAttribute("accesskey", "y"); |
| aElem.setAttribute("onclick","javascript:scroll_to_my_last_comment();\nreturn false;"); |
| liElem.appendChild(aElem); |
| liElem.appendChild(document.createTextNode(")")) |
| |
| |
| // Add links to help enter a URL to a Git commit: |
| // bz_collapse_expand_commentsElems[0].parentNode.appendChild(createCommentTemplateLinks()); |
| } |
| |
| // Script for "toggle wide comments": |
| var scriptElem= createScript( |
| "function toggle_wide_comment_display (comment_id) {\n"+ |
| " var comment = document.getElementById('comment_text_' + comment_id);\n" + |
| " var re = new RegExp(/\\bwide\\b/);\n" + |
| " if (comment.className.match(re))\n" + |
| " unwiden_comment(comment);\n" + |
| " else\n" + |
| " widen_comment(comment);\n" + |
| "}\n" + |
| "function widen_comment(comment) {\n"+ |
| " YAHOO.util.Dom.addClass(comment, 'wide');\n"+ |
| "}\n"+ |
| "\n"+ |
| "function unwiden_comment(comment) {\n"+ |
| " YAHOO.util.Dom.removeClass(comment, 'wide');\n"+ |
| "}\n"+ |
| "" |
| ); |
| headElem.appendChild(scriptElem); |
| |
| // Don't wrap lines that match noWrapLinesRegex: (alternative to bug 446727: Increase line length to 140chars in Bugzilla) |
| var bz_comment_textElems= document.getElementsByClassName("bz_comment_text"); |
| for (var i= 0; i < bz_comment_textElems.length; i++) { |
| var childNodesElems= bz_comment_textElems[i].childNodes; |
| for (var j= 0; j < childNodesElems.length; j++) { |
| var child= childNodesElems[j]; |
| if (child.nodeType == 3 /*text*/) { |
| var split= child.textContent.split(noWrapLinesRegex); |
| if (split.length > 1) { |
| for (var k= 0; k < split.length; k+= 2) { |
| var span= document.createTextNode(split[k]); |
| child.parentNode.insertBefore(span, child); |
| |
| var span= document.createElement("span"); |
| span.textContent= split[k + 1]; |
| span.style= "white-space: pre"; |
| child.parentNode.insertBefore(span, child); |
| } |
| child.parentNode.removeChild(child); |
| } |
| } |
| } |
| } |
| } |
| |
| console.log("jdtbugzilla.user.js done."); |
| } // main() |
| |
| |
| if (document.getElementById("jdtbugzilla")) { |
| // Workaround for https://github.com/greasemonkey/greasemonkey/issues/3012 : |
| // Script runs twice for Content-Type: multipart/x-mixed-replace |
| return; |
| } |
| |
| var headElem= document.getElementsByTagName("head")[0]; |
| if (headElem) { |
| var styleElem= document.createElement("style"); |
| styleElem.type= "text/css"; |
| styleElem.id= "jdtbugzilla"; |
| styleElem.innerHTML = css; |
| headElem.appendChild(styleElem); |
| } |
| |
| document.addEventListener('DOMContentLoaded', function() { |
| //page has been loaded, run DOM interactive parts (aka "@run-at document-end") here: |
| main(); |
| }, true); |