gecko-dev/webtools/bugzilla/js/duplicates.js

154 lines
5.8 KiB
JavaScript

/* 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();
}
};