| // Copyright 2009, Google Inc. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // |
| // 1. Redistributions of source code must retain the above copyright notice, |
| // this list of conditions and the following disclaimer. |
| // 2. Redistributions in binary form must reproduce the above copyright notice, |
| // this list of conditions and the following disclaimer in the documentation |
| // and/or other materials provided with the distribution. |
| // 3. Neither the name of Google Inc. nor the names of its contributors may be |
| // used to endorse or promote products derived from this software without |
| // specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED |
| // WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
| // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO |
| // EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
| // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| // Our binary is compiled against different versions of the Gecko SDK for |
| // different versions of Firefox. But we want a single XPI so that users can |
| // switch between versions of Firefox without having to change their Gears |
| // version. |
| |
| // This JavaScript file is detected and loaded by Gecko when our extension is |
| // installed. We then use nsIComponentRegistrar to tell Gecko where our real |
| // components are located, depending on what version of Firefox we detect we are |
| // running in. |
| |
| const Cc = Components.classes; |
| const Ci = Components.interfaces; |
| |
| // Detect which version of our lib we should use. |
| function getLibFileName() { |
| var appInfo = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULAppInfo); |
| var geckoVersion = appInfo.platformVersion.substring(0, 3); |
| |
| if (geckoVersion == "1.8") { |
| return "ff2"; |
| } |
| |
| if (geckoVersion.substring(0, 3) == "1.9") { |
| var firefoxVersion = appInfo.version.substring(0, 3); |
| |
| if (firefoxVersion == "3.0") { |
| if (isFedora()) { |
| return "ff3+"; |
| } |
| return "ff3"; |
| } |
| |
| if (firefoxVersion == "3.5") { |
| return "ff35"; |
| } |
| |
| if (firefoxVersion == "3.6") { |
| return "ff36"; |
| } |
| |
| if (firefoxVersion == "3.7" || firefoxVersion == "4.0") { |
| return "ff40"; |
| } |
| |
| throw "Unsupported Firefox version: " + firefoxVersion; |
| } |
| |
| throw "Unsupported Gecko version: " + geckoVersion; |
| } |
| |
| function getPlatform() { |
| var runtime = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime); |
| |
| if (runtime.OS == "Darwin") { |
| return runtime.OS + "-gcc3"; |
| } |
| |
| return runtime.OS + "_" + runtime.XPCOMABI; |
| } |
| |
| function isFedora() { |
| var navigator = Cc["@mozilla.org/network/protocol;1?name=http"]. |
| getService(Ci.nsIHttpProtocolHandler); |
| |
| return navigator.userAgent.indexOf("Fedora") != -1; |
| } |
| |
| // This function is called by Firefox at installation time. |
| function NSGetModule() { |
| return { |
| registerSelf: function(compMgr, location, loaderStr, type) { |
| var libFile = location.parent.parent; |
| libFile.append("lib"); |
| libFile.append(getPlatform()); |
| libFile.append(getLibFileName()); |
| |
| // Note: we register a directory instead of an individual file because |
| // Gecko will only load components with a specific file name pattern. We |
| // don't want this file to have to know about that. Luckily, if you |
| // register a directory, Gecko will look inside the directory for files |
| // to load. |
| var compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar); |
| compMgr.autoRegister(libFile); |
| } |
| } |
| } |