Fix for bug 77699 and bug 71503: fix javascript errors in quicksearch and improve IE5 compatibility

Patch by Stephan Lee <slee@uk.bnsmc.com> and Andreas Franke <afranke@ags.uni-sb.de>
parent 635e37bb
...@@ -12,6 +12,46 @@ ...@@ -12,6 +12,46 @@
// //
// Created by // Created by
// Andreas Franke <afranke@mathweb.org> // Andreas Franke <afranke@mathweb.org>
//
// Contributors:
// Stephen Lee <slee@uk.bnsmc.com>
// variable below should be initialised according to whether
// browser is IE 5.0 or earlier, but should be false for IE 5.5
var is_IE5=(navigator.appVersion.search(/MSIE 5.0/g)>0);
// Bodge to get round IE5 not understanding "undefined", "shift" and "unshift"
var no_result=is_IE5?"---":undefined;
function do_unshift(l, s) {
if(is_IE5) {
l.length = l.length + 1;
for (var i=l.length-1; i>0; i--) {
l[i] = l[i-1];
}
l[0] = s;
return l.length;
}
else {
return l.unshift(s);
}
}
function do_shift(l) {
if(is_IE5) {
var l0=l[0];
for (var i=0; i<l.length-1; i++) {
l[i] = l[i+1];
}
l.length = l.length - 1;
return l0;
}
else {
return l.shift();
}
}
function go_to (url) { function go_to (url) {
document.location.href = url; document.location.href = url;
...@@ -19,7 +59,7 @@ function go_to (url) { ...@@ -19,7 +59,7 @@ function go_to (url) {
} }
function map(l, f) { function map(l, f) {
l1 = new Array(); var l1 = new Array();
for (var i=0; i<l.length; i++) { for (var i=0; i<l.length; i++) {
l1[i] = f(l[i]); l1[i] = f(l[i]);
} }
...@@ -38,7 +78,7 @@ function member(s, l) { ...@@ -38,7 +78,7 @@ function member(s, l) {
function add(s, l) { function add(s, l) {
if (! member(s, l)) { if (! member(s, l)) {
l.unshift(s); do_unshift(l,s);
} }
} }
...@@ -141,7 +181,7 @@ function findIndex(array,value) { ...@@ -141,7 +181,7 @@ function findIndex(array,value) {
function mapField(fieldname) { function mapField(fieldname) {
var i = findIndex(f1,fieldname); var i = findIndex(f1,fieldname);
if (i >= 0) return f2[i]; if (i >= 0) return f2[i];
return undefined; return no_result;
} }
// `keywords' is defined externally // `keywords' is defined externally
...@@ -165,14 +205,14 @@ function is_severity(str) { ...@@ -165,14 +205,14 @@ function is_severity(str) {
// `product_exceptions' is defined externally // `product_exceptions' is defined externally
function match_product(str) { function match_product(str) {
s = str.toLowerCase(); var s = str.toLowerCase();
return (s.length > 2) && (! member(s,product_exceptions)); return (s.length > 2) && (! member(s,product_exceptions));
} }
// `component_exceptions are defined externally // `component_exceptions are defined externally
function match_component(str) { function match_component(str) {
s = str.toLowerCase(); var s = str.toLowerCase();
return (s.length > 2) && (! member(s,component_exceptions)); return (s.length > 2) && (! member(s,component_exceptions));
} }
...@@ -222,27 +262,62 @@ function make_query_URL(url, input, searchLong) { ...@@ -222,27 +262,62 @@ function make_query_URL(url, input, searchLong) {
status_and_resolution = ""; status_and_resolution = "";
charts = ""; charts = "";
var searchURL = url; //bugzilla + "buglist.cgi"; // declare all variables used in this function
var abort = false;
var searchURL = url; // bugzilla + "buglist.cgi" (or "query.cgi")
var abort = false; // global flag, checked upon return
var i,j,k,l; // index counters used in 'for' loops
var parts,input2; // escape "quoted" parts of input
var word; // array of words
// (space-separated parts of input2)
var alternative; // array of parts of an element of 'word'
// (separated by '|', sometimes by comma)
var comma_separated_words; // array of parts of an element of 'alternative'
var w; // current element of one of these arrays:
// word, alternative, comma_separated_words
var w0; // first element of 'word'
var prefixes; // comma-separated parts of w0
// (prefixes of status/resolution values)
var expr; // used for 'priority' support
var n,separator; // used for 'votes' support
var colon_separated_parts, fields,values,field;
// used for generic fields:values notation
var chart,and,or; // counters used in add_chart
var negation; // boolean flag used in add_chart
// `statuses_open' and `statuses_resolved' are defined externally
var statusOpen = statuses_open;
var statusResolved = statuses_resolved;
var statusAll = statusOpen.concat(statusResolved);
// `resolutions' is defined externally
var bug_status = statusOpen.slice().reverse(); //reverse is just cosmetic
var resolution = new Array();
// escape everything between quotes: "foo bar" --> "foo%20bar" // escape everything between quotes: "foo bar" --> "foo%20bar"
var parts = input.split('"'); parts = input.split('"');
if ((parts.length % 2) != 1) { if ((parts.length % 2) != 1) {
alert('Unterminated quote'); alert('Unterminated quote');
abort = true; abort = true;
return undefined; return no_result;
} }
for (var i=1; i<parts.length; i+=2) { for (i=1; i<parts.length; i+=2) {
parts[i] = escape(parts[i]); parts[i] = escape(parts[i]);
} }
var input2 = parts.join('"'); input2 = parts.join('"');
// abort if there are still brackets // abort if there are still brackets
if (input2.match(/[(]|[\)]/)) { if (input2.match(/[(]|[\)]/)) {
alert('Brackets (...) are not supported.\n' + alert('Brackets (...) are not supported.\n' +
'Use quotes "..." for values that contain special characters.'); 'Use quotes "..." for values that contain special characters.');
abort = true; abort = true;
return undefined; return no_result;
} }
// translate " AND "," OR "," NOT " to space,comma,dash // translate " AND "," OR "," NOT " to space,comma,dash
...@@ -251,20 +326,11 @@ function make_query_URL(url, input, searchLong) { ...@@ -251,20 +326,11 @@ function make_query_URL(url, input, searchLong) {
input2 = input2.replace(/[\s]+NOT[\s]+/g," -"); input2 = input2.replace(/[\s]+NOT[\s]+/g," -");
// now split into words at space positions // now split into words at space positions
var word = input2.split(/[\s]+/); word = input2.split(/[\s]+/);
// determine bug_status and resolution // determine bug_status and resolution
// the first word may contain relevant info // the first word may contain relevant info
// `statuses_open' and `statuses_resolved' are defined externally
var statusOpen = statuses_open;
var statusResolved = statuses_resolved;
var statusAll = statusOpen.concat(statusResolved);
// `resolutions' is defined externally
var bug_status = statusOpen.slice().reverse(); //reverse is just cosmetic
var resolution = new Array();
// This function matches the given prefixes against the given statuses and // This function matches the given prefixes against the given statuses and
// resolutions. Matched statuses are added to bug_status, matched // resolutions. Matched statuses are added to bug_status, matched
// resolutions are added to resolution. Returns true iff some matches // resolutions are added to resolution. Returns true iff some matches
...@@ -292,24 +358,24 @@ function make_query_URL(url, input, searchLong) { ...@@ -292,24 +358,24 @@ function make_query_URL(url, input, searchLong) {
if (word[0] == "ALL") { if (word[0] == "ALL") {
// special case: search for bugs regardless of status // special case: search for bugs regardless of status
addAll(statusResolved,bug_status); addAll(statusResolved,bug_status);
word.shift(); do_shift(word);
} else if (word[0] == "OPEN") { } else if (word[0] == "OPEN") {
// special case: search for open bugs only // special case: search for open bugs only
word.shift(); do_shift(word);
} else if (word[0].match("^[+][A-Z]+(,[A-Z]+)*$")) { } else if (word[0].match("^[+][A-Z]+(,[A-Z]+)*$")) {
// e.g. +DUP,FIX // e.g. +DUP,FIX
w0 = word.shift(); w0 = do_shift(word);
prefixes = w0.substring(1).split(","); prefixes = w0.substring(1).split(",");
if (! matchPrefixes(prefixes,statusResolved,resolutions)) { if (! matchPrefixes(prefixes,statusResolved,resolutions)) {
word.unshift(w0); do_unshift(word,w0);
} }
} else if (word[0].match("^[A-Z]+(,[A-Z]+)*$")) { } else if (word[0].match("^[A-Z]+(,[A-Z]+)*$")) {
// e.g. NEW,ASSI,REOP,FIX // e.g. NEW,ASSI,REOP,FIX
bug_status = new Array(); // reset bug_status = new Array(); // reset
w0 = word.shift(); w0 = do_shift(word);
prefixes = w0.split(","); prefixes = w0.split(",");
if (! matchPrefixes(prefixes,statusAll,resolutions)) { if (! matchPrefixes(prefixes,statusAll,resolutions)) {
word.unshift(w0); do_unshift(word,w0);
bug_status = statusOpen.reverse(); //reset to default bug_status bug_status = statusOpen.reverse(); //reset to default bug_status
} }
} else { } else {
...@@ -320,7 +386,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -320,7 +386,7 @@ function make_query_URL(url, input, searchLong) {
} }
if (resolution.length > 0) { if (resolution.length > 0) {
resolution = resolution.reverse(); resolution = resolution.reverse();
resolution.unshift("---"); do_unshift(resolution,"---");
addAll(statusResolved,bug_status); addAll(statusResolved,bug_status);
} }
bug_status = bug_status.reverse(); bug_status = bug_status.reverse();
...@@ -336,11 +402,11 @@ function make_query_URL(url, input, searchLong) { ...@@ -336,11 +402,11 @@ function make_query_URL(url, input, searchLong) {
// end of bug_status & resolution stuff // end of bug_status & resolution stuff
var chart = 0; chart = 0;
var and = 0; and = 0;
var or = 0; or = 0;
var negation = false; negation = false;
function negate_comparison_type(type) { function negate_comparison_type(type) {
switch(type) { switch(type) {
...@@ -351,6 +417,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -351,6 +417,7 @@ function make_query_URL(url, input, searchLong) {
// e.g. "greaterthan" // e.g. "greaterthan"
alert("Can't negate comparison type: `" + type + "'"); alert("Can't negate comparison type: `" + type + "'");
abort = true; abort = true;
return "dummy";
} }
} }
...@@ -379,7 +446,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -379,7 +446,7 @@ function make_query_URL(url, input, searchLong) {
} }
} }
for (var i=0; i<word.length; i++, chart++) { for (i=0; i<word.length; i++, chart++) {
w = word[i]; w = word[i];
...@@ -392,7 +459,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -392,7 +459,7 @@ function make_query_URL(url, input, searchLong) {
switch (w[0]) { switch (w[0]) {
case "+": case "+":
alternative = w.substring(1).split(/[|,]/); alternative = w.substring(1).split(/[|,]/);
for (var j=0; j<alternative.length; j++) for (j=0; j<alternative.length; j++)
add_chart("short_desc","substring",alternative[j]); add_chart("short_desc","substring",alternative[j]);
break; break;
case "#": case "#":
...@@ -403,14 +470,14 @@ function make_query_URL(url, input, searchLong) { ...@@ -403,14 +470,14 @@ function make_query_URL(url, input, searchLong) {
break; break;
case ":": case ":":
alternative = w.substring(1).split(","); alternative = w.substring(1).split(",");
for ( var j=0; j<alternative.length; j++) { for (j=0; j<alternative.length; j++) {
add_chart("product","substring",alternative[j]); add_chart("product","substring",alternative[j]);
add_chart("component","substring",alternative[j]); add_chart("component","substring",alternative[j]);
} }
break; break;
case "@": case "@":
alternative = w.substring(1).split(","); alternative = w.substring(1).split(",");
for ( var j=0; j<alternative.length; j++) for (j=0; j<alternative.length; j++)
add_chart("assigned_to","substring",alternative[j]); add_chart("assigned_to","substring",alternative[j]);
break; break;
case "[": case "[":
...@@ -422,7 +489,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -422,7 +489,7 @@ function make_query_URL(url, input, searchLong) {
break; break;
default: default:
alternative=w.split("|"); alternative=w.split("|");
for (var j=0; j<alternative.length; j++) { for (j=0; j<alternative.length; j++) {
w=alternative[j]; w=alternative[j];
...@@ -434,18 +501,18 @@ function make_query_URL(url, input, searchLong) { ...@@ -434,18 +501,18 @@ function make_query_URL(url, input, searchLong) {
} }
// generic field1,field2,field3:value1,value2 notation // generic field1,field2,field3:value1,value2 notation
if (w.match("^[^:]+[:][^:\/][^:]*$")) { if (w.match("^[^:]+[:][^:\/][^:]*$")) {
parts = w.split(":"); colon_separated_parts = w.split(":");
fields = parts[0].split(/[,]+/); fields = colon_separated_parts[0].split(/[,]+/);
values = parts[1].split(/[,]+/); values = colon_separated_parts[1].split(/[,]+/);
for (var k=0; k<fields.length; k++) { for (k=0; k<fields.length; k++) {
field = mapField(fields[k]); field = mapField(fields[k]);
if (field == undefined) { if (field == no_result) {
alert("`"+fields[k]+"'"+ alert("`"+fields[k]+"'"+
" is not a valid field name."); " is not a valid field name.");
abort = true; abort = true;
return undefined; return no_result;
} else { } else {
for (var l=0; l<values.length; l++) { for (l=0; l<values.length; l++) {
add_chart(field,"substring",values[l]); add_chart(field,"substring",values[l]);
} }
} }
...@@ -453,7 +520,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -453,7 +520,7 @@ function make_query_URL(url, input, searchLong) {
continue; continue;
} }
comma_separated_words=w.split(/[,]+/); comma_separated_words=w.split(/[,]+/);
for (var k=0; k<comma_separated_words.length; k++) { for (k=0; k<comma_separated_words.length; k++) {
w=comma_separated_words[k]; w=comma_separated_words[k];
// platform // platform
...@@ -531,7 +598,7 @@ function make_query_URL(url, input, searchLong) { ...@@ -531,7 +598,7 @@ function make_query_URL(url, input, searchLong) {
if (abort == false) { if (abort == false) {
return searchURL; return searchURL;
} else { } else {
return undefined; return no_result;
} }
} }
...@@ -542,7 +609,7 @@ function unique_id () { ...@@ -542,7 +609,7 @@ function unique_id () {
function ShowURL(mode) { function ShowURL(mode) {
var input = document.f.id.value; var input = document.f.id.value;
var searchURL = make_query_URL(bugzilla+"buglist.cgi", input, false); var searchURL = make_query_URL(bugzilla+"buglist.cgi", input, false);
if (searchURL != undefined) { if (searchURL != no_result) {
var pieces = searchURL.replace(/[\?]/g,"\n?").replace(/[\&]/g,"\n&"); var pieces = searchURL.replace(/[\?]/g,"\n?").replace(/[\&]/g,"\n&");
if (mode == "alert") { if (mode == "alert") {
alert(pieces); alert(pieces);
...@@ -601,7 +668,7 @@ function Search(url, input, searchLong) { ...@@ -601,7 +668,7 @@ function Search(url, input, searchLong) {
return; return;
} }
var searchURL = make_query_URL(url, inputstring, searchLong); var searchURL = make_query_URL(url, inputstring, searchLong);
if (searchURL != undefined) { if (searchURL != no_result) {
go_to(searchURL); go_to(searchURL);
//window.open(searchURL, "other" ); //window.open(searchURL, "other" );
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment