diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/duplicates.js | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/js/duplicates.js b/js/duplicates.js new file mode 100644 index 000000000..b1e94a8a6 --- /dev/null +++ b/js/duplicates.js @@ -0,0 +1,153 @@ +/* The contents of this file are subject to the Mozilla Public + * License Version 1.1 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS + * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or + * implied. See the License for the specific language governing + * rights and limitations under the License. + * + * The Original Code is the Bugzilla Bug Tracking System. + * + * The Initial Developer of the Original Code is Netscape Communications + * Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All + * Rights Reserved. + * + * Contributor(s): Myk Melez <myk@mozilla.org> + */ + +// When the XUL window finishes loading, load the RDF data into it. +window.addEventListener('load', loadData, false); + +// The base URL of this Bugzilla installation; derived from the page's URL. +var gBaseURL = window.location.href.replace(/duplicates\.(jar!|xul).*/, ""); + +function loadData() +{ + // Loads the duplicates data as an RDF data source, attaches it to the tree, + // and rebuilds the tree to display the data. + + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + // Get the RDF service so we can use it to load the data source. + var rdfService = + Components + .classes["@mozilla.org/rdf/rdf-service;1"] + .getService(Components.interfaces.nsIRDFService); + + // When a bug report loads in the content iframe, a 'load' event bubbles up + // to the browser window, which calls this load handler again, which reloads + // the RDF data, which causes the tree to lose the selection. To prevent + // this, we have to remove this handler. + window.removeEventListener('load', loadData, false); + + // The URL of the RDF file; by default for performance a static file + // generated by collectstats.pl, but a call to duplicates.cgi if the page's + // URL contains parameters (so we can dynamically generate the RDF data + // based on those parameters). + var dataURL = gBaseURL + "data/duplicates.rdf"; + if (window.location.href.search(/duplicates\.xul\?.+/) != -1) + dataURL = window.location.href.replace(/(duplicates\.jar!\/)?duplicates\.xul\?/, "duplicates.cgi?ctype=rdf&"); + + // Get the data source and add it to the XUL tree's database to populate + // the tree with the data. + var dataSource = rdfService.GetDataSource(dataURL); + + // If we're using the static file, add an observer that detects failed loads + // (in case this installation isn't generating the file nightly) and redirects + // to the CGI version when loading of the static version fails. + if (window.location.href.search(/duplicates\.xul\?.+/) == -1) + { + var sink = dataSource.QueryInterface(Components.interfaces.nsIRDFXMLSink); + sink.addXMLSinkObserver(StaticDataSourceObserver); + } + + // Add the data source to the tree, set the tree's "ref" attribute + // to the base URL of the data source, and rebuild the tree. + var resultsTree = document.getElementById('results-tree'); + resultsTree.database.AddDataSource(dataSource); + resultsTree.setAttribute('ref', gBaseURL + "data/duplicates.rdf"); + resultsTree.builder.rebuild(); +} + +function getBugURI() +{ + var tree = document.getElementById('results-tree'); + var index = tree.currentIndex; + + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + var builder = tree.builder.QueryInterface(Components.interfaces.nsIXULTreeBuilder); + var resource = builder.getResourceAtIndex(index); + + return resource.Value; +} + +function loadBugInWindow() +{ + // Loads the selected bug in the browser window, replacing the duplicates report + // with the bug report. + + var bugURI = getBugURI(); + window.location = bugURI; +} + +function loadBugInPane() +{ + // Loads the selected bug in the iframe-based content pane that is part of + // this XUL document. + + var splitter = document.getElementById('report-content-splitter'); + var state = splitter.getAttribute('state'); + if (state != "collapsed") + { + var bugURI = getBugURI(); + var browser = document.getElementById('content-browser'); + browser.setAttribute('src', bugURI); + } +} + +var StaticDataSourceObserver = { + onBeginLoad: function(aSink) { } , + onInterrupt: function(aSink) { } , + onResume: function(aSink) { } , + onEndLoad: function(aSink) + { + // Removes the observer from the data source so it doesn't stay around + // when duplicates.xul is reloaded from scratch. + + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + aSink.removeXMLSinkObserver(StaticDataSourceObserver); + } , + onError: function(aSink, aStatus, aErrorMsg) + { + // Tries the dynamic data source since the static one failed to load. + + netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); + + // Get the RDF service so we can use it to load the data source. + var rdfService = + Components + .classes["@mozilla.org/rdf/rdf-service;1"] + .getService(Components.interfaces.nsIRDFService); + + // Remove the observer from the data source so it doesn't stay around + // when duplicates.xul is reloaded from scratch. + aSink.removeXMLSinkObserver(StaticDataSourceObserver); + + // Remove the static data source from the tree. + var oldDataSource = aSink.QueryInterface(Components.interfaces.nsIRDFDataSource); + var resultsTree = document.getElementById('results-tree'); + resultsTree.database.RemoveDataSource(oldDataSource); + + // Munge the URL to point to the CGI and load the data source. + var dataURL = gBaseURL + "duplicates.cgi?ctype=rdf"; + newDataSource = rdfService.GetDataSource(dataURL); + + // Add the data source to the tree and rebuild the tree with the new data. + resultsTree.database.AddDataSource(newDataSource); + resultsTree.builder.rebuild(); + } +}; |