Bug 748214 - Cannot use the Geolocation API within the desktop web runtime [r=myk]

Show a prompt asking the user to share or not geolocation info with the option to remember.

--HG--
extra : rebase_source : f6fdf84a3d675ad52e973cd5f4b4d1cf84394fb1
This commit is contained in:
Edward Lee 2012-05-31 10:04:52 -07:00
parent 10977c4e9d
commit 6e85d10954
5 changed files with 103 additions and 0 deletions

View File

@ -647,6 +647,7 @@ bin/components/@DLL_PREFIX@nkgnomevfs@DLL_SUFFIX@
@BINPATH@/webapprt/chrome/webapprt@JAREXT@
@BINPATH@/webapprt/chrome/webapprt.manifest
@BINPATH@/webapprt/components/CommandLineHandler.js
@BINPATH@/webapprt/components/ContentPermission.js
@BINPATH@/webapprt/components/ContentPolicy.js
@BINPATH@/webapprt/components/DirectoryProvider.js
@BINPATH@/webapprt/components/components.manifest

View File

@ -15,3 +15,11 @@ quitApplicationCmdMac.label=Quit %S
# LOCALIZATION NOTE (hideApplicationCmdMac.label): %S will be replaced with
# the name of the webapp.
hideApplicationCmdMac.label=Hide %S
# LOCALIZATION NOTE (geolocation.title): %S will be replaced with the name of
# the webapp.
geolocation.title=%S - Share Location
geolocation.description=Do you want to share your location?
geolocation.sharelocation=Share Location
geolocation.dontshare=Don't Share
geolocation.remember=Remember my choice

View File

@ -0,0 +1,89 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://webapprt/modules/WebappRT.jsm");
function ContentPermission() {}
ContentPermission.prototype = {
classID: Components.ID("{07ef5b2e-88fb-47bd-8cec-d3b0bef11ac4}"),
QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentPermissionPrompt]),
prompt: function(request) {
// Only handle geolocation requests for now
if (request.type != "geolocation") {
return;
}
// Reuse any remembered permission preferences
let result = Services.perms.testExactPermission(request.uri, "geo");
if (result == Ci.nsIPermissionManager.ALLOW_ACTION) {
request.allow();
return;
}
else if (result == Ci.nsIPermissionManager.DENY_ACTION) {
request.cancel();
return;
}
function getChromeWindow(aWindow) {
var chromeWin = aWindow
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindow)
.QueryInterface(Ci.nsIDOMChromeWindow);
return chromeWin;
}
// Display a prompt at the top level
let {name} = WebappRT.config.app.manifest;
let requestingWindow = request.window.top;
let chromeWin = getChromeWindow(requestingWindow);
let bundle = Services.strings.createBundle("chrome://webapprt/locale/webapp.properties");
// Construct a prompt with share/don't and remember checkbox
let remember = {value: false};
let choice = Services.prompt.confirmEx(
chromeWin,
bundle.formatStringFromName("geolocation.title", [name], 1),
bundle.GetStringFromName("geolocation.description"),
// Set both buttons to strings with the cancel button being default
Ci.nsIPromptService.BUTTON_POS_1_DEFAULT |
Ci.nsIPromptService.BUTTON_TITLE_IS_STRING * Ci.nsIPromptService.BUTTON_POS_0 |
Ci.nsIPromptService.BUTTON_TITLE_IS_STRING * Ci.nsIPromptService.BUTTON_POS_1,
bundle.GetStringFromName("geolocation.sharelocation"),
bundle.GetStringFromName("geolocation.dontshare"),
null,
bundle.GetStringFromName("geolocation.remember"),
remember);
// Persist the choice if the user wants to remember
if (remember.value) {
let action = Ci.nsIPermissionManager.ALLOW_ACTION;
if (choice != 0) {
action = Ci.nsIPermissionManager.DENY_ACTION;
}
Services.perms.add(request.uri, "geo", action);
}
// Trigger the selected choice
if (choice == 0) {
request.allow();
}
else {
request.cancel();
}
}
};
const NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentPermission]);

View File

@ -29,6 +29,7 @@ endif # windows
EXTRA_PP_COMPONENTS = \
components.manifest \
CommandLineHandler.js \
ContentPermission.js \
ContentPolicy.js \
DirectoryProvider.js \
$(NULL)

View File

@ -3,6 +3,10 @@ component {6d69c782-40a3-469b-8bfd-3ee366105a4a} CommandLineHandler.js applicati
contract @mozilla.org/webapprt/clh;1 {6d69c782-40a3-469b-8bfd-3ee366105a4a} application=webapprt@mozilla.org
category command-line-handler x-default @mozilla.org/webapprt/clh;1 application=webapprt@mozilla.org
# ContentPermission.js
component {07ef5b2e-88fb-47bd-8cec-d3b0bef11ac4} ContentPermission.js
contract @mozilla.org/content-permission/prompt;1 {07ef5b2e-88fb-47bd-8cec-d3b0bef11ac4}
# ContentPolicy.js
component {75acd178-3d5a-48a7-bd92-fba383520ae6} ContentPolicy.js application=webapprt@mozilla.org
contract @mozilla.org/webapprt/content-policy;1 {75acd178-3d5a-48a7-bd92-fba383520ae6} application=webapprt@mozilla.org