summaryrefslogtreecommitdiffstats
path: root/js
diff options
context:
space:
mode:
authormyk%mozilla.org <>2002-11-05 10:53:59 +0100
committermyk%mozilla.org <>2002-11-05 10:53:59 +0100
commit6a64cd597b36411fa01d681c693786750b68c92c (patch)
treed24789dab5efebdaa47c0f1c8936428f15be9935 /js
parent952d1ad687cb0ad29188c71fab2ad40e5ec984ba (diff)
downloadbugzilla-6a64cd597b36411fa01d681c693786750b68c92c.tar.gz
bugzilla-6a64cd597b36411fa01d681c693786750b68c92c.tar.xz
Fix for bug 156548: XUL implementation of duplicates report.
Diffstat (limited to 'js')
-rw-r--r--js/duplicates.js153
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();
+ }
+};