elaich
elaich

Reputation: 941

Can't import the nsIDOMGeoGeolocation XPCOM Interface

Using the addon-sdk of firefox I'm following a tutorial about creating reusable modules, the example uses the geolocation API built into Firefox, so the code is simple:

function getCurrentPosition(callback){
    var xpcomGeolocation = Cc["@mozilla.org/geolocation;1"].getService(Ci.nsIDOMGeoGeolocation);
 xpcomGeolocation.getCurrentPosition(callback);
}

var widget = require("sdk/widget").Widget({ 
    id: "whereami",
    label: "Where Am I?",
    contentURL: "http://www.mozilla.org/favicon.ico",
    onClick: function(){
        console.log("clicked!");        
        getCurrentPosition(function(position){
            console.log("latitude: " + position.coords.latitude);
            console.log("longitude: " + position.coords.longitude);
        });
    }
});

When running firefox with the plugin on, clicking the widget give this error:

Message: [Exception... "Component returned failure code: 0x80570018 (NS_ERROR_XPC_BAD_IID) [nsIJSCID.getService]" nsresult: "0x80570018 (NS_ERROR_XPC_BAD_IID)" location: "JS frame :: resource://gre/modules/XPIProvider.jsm -> jar:file:///tmp/tmpTFowYc.mozrunner/extensions/[email protected]!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://jid1-libifbk6zvwaiq-at-jetpack/whereami/lib/main.js :: getCurrentPosition :: line 7" data: no]

Upvotes: 1

Views: 186

Answers (2)

erikvold
erikvold

Reputation: 16528

I think that you just forgot this at the top:

var { Cc, Ci } = require('chrome');

Also there a third party module for geolocation https://github.com/ZER0/geolocation

Upvotes: 0

matagus
matagus

Reputation: 6206

According to docs, it's possible to get an error when importing nsIDGeoGeolocation so you must use Cc["@mozilla.org/geolocation;1"].getService(Ci.nsISupports); instead. Also, you must ask for permission to access geolocation, please see section Prompting for permission in Using geolocation reference.

By the way, as an advice, I think it will be simpler to use navigator.geolocation.getCurrentPosition(successCallback, errorCallback) since it handles prompting for permission for you, but I don't know what are you trying to do beyond this. Just to explain it a little, you could have an addon page data/index.html where you tell the user you are going to prompt him for his geolocation. Besides this, you must have a PageMod that runs a data/script.js for that addon page page, which has access to navigator.geolocation. That content script may communicate with your lib/main.js file so it has access to the user geo location. Somethings like this:

data/index.html:

<html>
  <body>
    <h1>Hello user!</h1>
  </body>
</html>

data/script.js:

var successCallback = function(position) {
    /* this way this script will talk to the pagemod in lib/main.js the user's position */
    self.port.emit("gotGeolocation", position.coords.latitude, position.coords.longitude);
};
navigator.geolocation.getCurrentPosition(successCallback, errorCallback);

lib/main.js:

var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
var tabs = require("sdk/tabs");

pageMod.PageMod({
  /* attach the contentScriptFile to this html page */
  include: data.url("index.html"),
  contentScriptFile: data.url("script.js"),
  onAttach: function(worker) {
    /* listen to the script.js worker "gotGeolocation" message */
    worker.port.on("gotGeolocation", function(latitude, longitude) {
      console.log("latitude:", latitude);
      console.log("longitude:", longitude);
    });
  }
});

/* this will open the index.jtml page and promt the user to access his geo position */
tabs.open(data.url("index.html"));

All this code it's only to better describe the idea, it hasn't been tested and in fact there are some indefinded objects. But I hope to give you an idea of how you can acces navigator.geolocation and pass its coords to the main.js script.

Upvotes: 1

Related Questions