| /* 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(/(jar:)?(.*?)duplicates\.(jar!|xul).*/, "$2"); |
| |
| 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(); |
| } |
| }; |