summaryrefslogtreecommitdiffstats
path: root/mobile/android/components/geckoview/ShareDelegate.jsm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--mobile/android/components/geckoview/ShareDelegate.jsm82
1 files changed, 82 insertions, 0 deletions
diff --git a/mobile/android/components/geckoview/ShareDelegate.jsm b/mobile/android/components/geckoview/ShareDelegate.jsm
new file mode 100644
index 0000000000..1e3a133953
--- /dev/null
+++ b/mobile/android/components/geckoview/ShareDelegate.jsm
@@ -0,0 +1,82 @@
+/* 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/. */
+"use strict";
+
+var EXPORTED_SYMBOLS = ["ShareDelegate"];
+
+const { GeckoViewUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/GeckoViewUtils.sys.mjs"
+);
+
+const lazy = {};
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ GeckoViewPrompter: "resource://gre/modules/GeckoViewPrompter.sys.mjs",
+});
+
+const domBundle = Services.strings.createBundle(
+ "chrome://global/locale/dom/dom.properties"
+);
+
+const { debug, warn } = GeckoViewUtils.initLogging("ShareDelegate");
+
+class ShareDelegate {
+ init(aParent) {
+ this._openerWindow = aParent;
+ }
+
+ get openerWindow() {
+ return this._openerWindow;
+ }
+
+ async share(aTitle, aText, aUri) {
+ const ABORT = 2;
+ const FAILURE = 1;
+ const SUCCESS = 0;
+
+ const msg = {
+ type: "share",
+ title: aTitle,
+ text: aText,
+ uri: aUri ? aUri.displaySpec : null,
+ };
+ const prompt = new lazy.GeckoViewPrompter(this._openerWindow);
+ const result = await new Promise(resolve => {
+ prompt.asyncShowPrompt(msg, resolve);
+ });
+
+ if (!result) {
+ // A null result is treated as a dismissal in GeckoViewPrompter.
+ throw new DOMException(
+ domBundle.GetStringFromName("WebShareAPI_Aborted"),
+ "AbortError"
+ );
+ }
+
+ const res = result && result.response;
+ switch (res) {
+ case FAILURE:
+ throw new DOMException(
+ domBundle.GetStringFromName("WebShareAPI_Failed"),
+ "DataError"
+ );
+ case ABORT: // Handle aborted attempt and invalid responses the same.
+ throw new DOMException(
+ domBundle.GetStringFromName("WebShareAPI_Aborted"),
+ "AbortError"
+ );
+ case SUCCESS:
+ return;
+ default:
+ throw new DOMException("Unknown error.", "UnknownError");
+ }
+ }
+}
+
+ShareDelegate.prototype.classID = Components.ID(
+ "{1201d357-8417-4926-a694-e6408fbedcf8}"
+);
+ShareDelegate.prototype.QueryInterface = ChromeUtils.generateQI([
+ "nsISharePicker",
+]);