summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js')
-rw-r--r--comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js88
1 files changed, 88 insertions, 0 deletions
diff --git a/comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js b/comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js
new file mode 100644
index 0000000000..9ed4d4c15b
--- /dev/null
+++ b/comm/mailnews/jsaccount/test/unit/resources/testJaFooUrlComponent.js
@@ -0,0 +1,88 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ One of the goals of JsAccount is to be able to incrementally extend a base
+ implementation, possibly adding a new interface. This code demonstrates
+ a mailnews URL extended for a hypthetical account type "foo".
+*/
+
+const { JSAccountUtils } = ChromeUtils.import(
+ "resource:///modules/jsaccount/JSAccountUtils.jsm"
+);
+const { JaBaseUrl, JaBaseUrlProperties } = ChromeUtils.import(
+ "resource:///modules/jsaccount/JaBaseUrl.jsm"
+);
+
+const ATTACHMENT_QUERY = "part=1.";
+
+var FooUrlProperties = {
+ // Extend the base properties.
+ __proto__: JaBaseUrlProperties,
+
+ contractID: "@mozilla.org/jsaccount/testjafoourl;1",
+ classID: Components.ID("{73F98539-A59F-4F6F-9A72-D83A08646C23}"),
+
+ // Add an additional interface only needed by this custom class.
+ extraInterfaces: [Ci.msgIFooUrl],
+};
+
+// Constructor
+var xpcomFactory = JSAccountUtils.jaFactory(FooUrlProperties, FooUrl);
+
+// Main class.
+function FooUrl(aDelegator, aBaseInterfaces) {
+ // Superclass constructor
+ JaBaseUrl.call(this, aDelegator, aBaseInterfaces);
+
+ // I'm not sure why I have to call this again, as it is called in the
+ // base constructor, but without it this method will not find the
+ // interfaces beyond nsISupports.
+ aBaseInterfaces.forEach(iface => this.cppBase instanceof iface);
+
+ // instance variables
+ this._urlType = -1; // unknown;
+ this._itemId = null;
+ this._hidden = "IAmHidden";
+}
+
+// Extend the base class methods.
+FooUrl.prototype = {
+ // Typical boilerplate to include in all implementations.
+
+ // Extended the JS URL object.
+ __proto__: JaBaseUrl.prototype,
+
+ // Delegate these methods to CPP.
+ _JsPrototypeToDelegate: true,
+
+ // InterfaceRequestor override, needed if extraInterfaces.
+
+ getInterface(iid) {
+ for (let iface of FooUrlProperties.extraInterfaces) {
+ if (iid.equals(iface)) {
+ return this;
+ }
+ }
+ return this.delegator.QueryInterface(iid);
+ },
+
+ // msgIFooUrl implementation
+
+ // Foo id for item.
+ // attribute AString itemId;
+ get itemId() {
+ return this._itemId;
+ },
+ set itemId(aVal) {
+ this._itemId = aVal;
+ },
+
+ // Does this url refer to an attachment?
+ // readonly attribute boolean isAttachment;
+ get isAttachment() {
+ // We look to see if the URL has an attachment query
+ let query = this.QueryInterface(Ci.nsIURL).query;
+ return query && query.includes(ATTACHMENT_QUERY);
+ },
+};