2 * (C) Copyright 2008 Jeremy Maitin-Shepard
4 * Portions of this file are derived from the "Open in Browser" extension,
5 * (C) Copyright 2006 Sylvain Pasche.
7 * Use, modification, and distribution are subject to the terms specified in the
12 * This module was inspired by the "Open in Browser" extension by Sylvain
13 * Pasche, available at <http://www.spasche.net/openinbrowser/>.
15 * This module implements (in a somewhat hacky way) overriding of the
16 * server-specified mime type for specified URLs. It works by registering an
17 * observer for the "http-on-examine-response" and
18 * "http-on-examine-merged-response" topics and changes the response MIME type
19 * of the nsIHTTPChannel object passed as the subject, as well as clearing any
20 * "Content-disposition" header.
22 * Unfortunately, due to the design, this hack does not work for FTP.
27 let EXAMINE_TOPIC = "http-on-examine-response";
28 let EXAMINE_MERGED_TOPIC = "http-on-examine-merged-response";
32 let timeout = 10000; // 10000 milliseconds = 10 seconds
36 // uri must be an instance of nsIURI
37 function can_override_mime_type_for_uri(uri) {
38 return uri.schemeIs("http") || uri.schemeIs("https");
41 let clear_override = function(uri_string) {
42 delete table[uri_string];
45 if (table_size == 0) {
46 observer_service.removeObserver(observer, EXAMINE_TOPIC);
47 observer_service.removeObserver(observer, EXAMINE_MERGED_TOPIC);
52 observe: function (subject, topic, data) {
53 if (topic != EXAMINE_TOPIC && topic != EXAMINE_MERGED_TOPIC)
56 subject.QueryInterface(Ci.nsIHttpChannel);
58 var uri_string = subject.originalURI.spec;
59 var obj = table[uri_string];
65 subject.contentType = obj.mime_type;
67 // drop content-disposition header
68 subject.setResponseHeader("Content-Disposition", "", false);
70 clear_override(uri_string);
76 // uri must be an instance of nsIURI and can_override_mime_type_for_uri must
77 // return true for the passed uri.
79 // mime_type must be a string
80 function override_mime_type_for_next_load(uri, mime_type) {
81 yield cache_entry_clear(CACHE_SESSION_HTTP, uri);
83 var obj = table[uri.spec];
89 obj = { mime_type: mime_type };
91 obj.timer = call_after_timeout(function () {
92 clear_override(uri.spec);
95 if (table_size == 1) {
96 observer_service.addObserver(observer, EXAMINE_TOPIC, false);
97 observer_service.addObserver(observer, EXAMINE_MERGED_TOPIC, false);
99 table[uri.spec] = obj;
102 provide("mime-type-override");