wahyd4/ocelots

View on GitHub
include.js

Summary

Maintainability
F
5 days
Test Coverage
/**
 * Uncompressed source can be found at https://login.persona.org/include.orig.js
 *
 * 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/. */

(function () {
    var a = function () {
        function e(a) {
            return Array.isArray ? Array.isArray(a) : a.constructor.toString().indexOf("Array") != -1
        }

        function d(a, c, d) {
            var e = b[c][d];
            for (var f = 0; f < e.length; f++)e[f].win === a && e.splice(f, 1);
            b[c][d].length === 0 && delete b[c][d]
        }

        function c(a, c, d, e) {
            function f(b) {
                for (var c = 0; c < b.length; c++)if (b[c].win === a)return!0;
                return!1
            }

            var g = !1;
            if (c === "*")for (var h in b) {
                if (!b.hasOwnProperty(h))continue;
                if (h === "*")continue;
                if (typeof b[h][d] == "object") {
                    g = f(b[h][d]);
                    if (g)break
                }
            } else b["*"] && b["*"][d] && (g = f(b["*"][d])), !g && b[c] && b[c][d] && (g = f(b[c][d]));
            if (g)throw"A channel is already bound to the same window which overlaps with origin '" + c + "' and has scope '" + d + "'";
            typeof b[c] != "object" && (b[c] = {}), typeof b[c][d] != "object" && (b[c][d] = []), b[c][d].push({win:a, handler:e})
        }

        "use strict";
        var a = Math.floor(Math.random() * 1000001), b = {}, f = {}, g = function (a) {
            try {
                var c = JSON.parse(a.data);
                if (typeof c != "object" || c === null)throw"malformed"
            } catch (a) {
                return
            }
            var d = a.source, e = a.origin, g, h, i;
            if (typeof c.method == "string") {
                var j = c.method.split("::");
                j.length == 2 ? (g = j[0], i = j[1]) : i = c.method
            }
            typeof c.id != "undefined" && (h = c.id);
            if (typeof i == "string") {
                var k = !1;
                if (b[e] && b[e][g])for (var l = 0; l < b[e][g].length; l++)if (b[e][g][l].win === d) {
                    b[e][g][l].handler(e, i, c), k = !0;
                    break
                }
                if (!k && b["*"] && b["*"][g])for (var l = 0; l < b["*"][g].length; l++)if (b["*"][g][l].win === d) {
                    b["*"][g][l].handler(e, i, c);
                    break
                }
            } else typeof h != "undefined" && f[h] && f[h](e, i, c)
        };
        window.addEventListener ? window.addEventListener("message", g, !1) : window.attachEvent && window.attachEvent("onmessage", g);
        return{build:function (b) {
            var g = function (a) {
                if (b.debugOutput && window.console && window.console.log) {
                    try {
                        typeof a != "string" && (a = JSON.stringify(a))
                    } catch (c) {
                    }
                    console.log("[" + j + "] " + a)
                }
            };
            if (!window.postMessage)throw"jschannel cannot run this browser, no postMessage";
            if (!window.JSON || !window.JSON.stringify || !window.JSON.parse)throw"jschannel cannot run this browser, no JSON parsing/serialization";
            if (typeof b != "object")throw"Channel build invoked without a proper object argument";
            if (!b.window || !b.window.postMessage)throw"Channel.build() called without a valid window argument";
            if (window === b.window)throw"target window is same as present window -- not allowed";
            var h = !1;
            if (typeof b.origin == "string") {
                var i;
                b.origin === "*" ? h = !0 : null !== (i = b.origin.match(/^https?:\/\/(?:[-a-zA-Z0-9_\.])+(?::\d+)?/)) && (b.origin = i[0].toLowerCase(), h = !0)
            }
            if (!h)throw"Channel.build() called with an invalid origin";
            if (typeof b.scope != "undefined") {
                if (typeof b.scope != "string")throw"scope, when specified, must be a string";
                if (b.scope.split("::").length > 1)throw"scope may not contain double colons: '::'"
            }
            var j = function () {
                var a = "", b = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
                for (var c = 0; c < 5; c++)a += b.charAt(Math.floor(Math.random() * b.length));
                return a
            }(), k = {}, l = {}, m = {}, n = !1, o = [], p = function (a, b, c) {
                var d = !1, e = !1;
                return{origin:b, invoke:function (b, d) {
                    if (!m[a])throw"attempting to invoke a callback of a nonexistent transaction: " + a;
                    var e = !1;
                    for (var f = 0; f < c.length; f++)if (b === c[f]) {
                        e = !0;
                        break
                    }
                    if (!e)throw"request supports no such callback '" + b + "'";
                    t({id:a, callback:b, params:d})
                }, error:function (b, c) {
                    e = !0;
                    if (!m[a])throw"error called for nonexistent message: " + a;
                    delete m[a], t({id:a, error:b, message:c})
                }, complete:function (b) {
                    e = !0;
                    if (!m[a])throw"complete called for nonexistent message: " + a;
                    delete m[a], t({id:a, result:b})
                }, delayReturn:function (a) {
                    typeof a == "boolean" && (d = a === !0);
                    return d
                }, completed:function () {
                    return e
                }}
            }, q = function (a, b, c) {
                return window.setTimeout(function () {
                    if (l[a]) {
                        var d = "timeout (" + b + "ms) exceeded on method '" + c + "'";
                        (1, l[a].error)("timeout_error", d), delete l[a], delete f[a]
                    }
                }, b)
            }, r = function (a, c, d) {
                if (typeof b.gotMessageObserver == "function")try {
                    b.gotMessageObserver(a, d)
                } catch (h) {
                    g("gotMessageObserver() raised an exception: " + h.toString())
                }
                if (d.id && c) {
                    if (k[c]) {
                        var i = p(d.id, a, d.callbacks ? d.callbacks : []);
                        m[d.id] = {};
                        try {
                            if (d.callbacks && e(d.callbacks) && d.callbacks.length > 0)for (var j = 0; j < d.callbacks.length; j++) {
                                var n = d.callbacks[j], o = d.params, q = n.split("/");
                                for (var r = 0; r < q.length - 1; r++) {
                                    var s = q[r];
                                    typeof o[s] != "object" && (o[s] = {}), o = o[s]
                                }
                                o[q[q.length - 1]] = function () {
                                    var a = n;
                                    return function (b) {
                                        return i.invoke(a, b)
                                    }
                                }()
                            }
                            var t = k[c](i, d.params);
                            !i.delayReturn() && !i.completed() && i.complete(t)
                        } catch (h) {
                            var u = "runtime_error", v = null;
                            typeof h == "string" ? v = h : typeof h == "object" && (h && e(h) && h.length == 2 ? (u = h[0], v = h[1]) : typeof h.error == "string" && (u = h.error, h.message ? typeof h.message == "string" ? v = h.message : h = h.message : v = ""));
                            if (v === null)try {
                                v = JSON.stringify(h), typeof v == "undefined" && (v = h.toString())
                            } catch (w) {
                                v = h.toString()
                            }
                            i.error(u, v)
                        }
                    }
                } else d.id && d.callback ? !l[d.id] || !l[d.id].callbacks || !l[d.id].callbacks[d.callback] ? g("ignoring invalid callback, id:" + d.id + " (" + d.callback + ")") : l[d.id].callbacks[d.callback](d.params) : d.id ? l[d.id] ? (d.error ? (1, l[d.id].error)(d.error, d.message) : d.result !== undefined ? (1, l[d.id].success)(d.result) : (1, l[d.id].success)(), delete l[d.id], delete f[d.id]) : g("ignoring invalid response: " + d.id) : c && k[c] && k[c](null, d.params)
            };
            c(b.window, b.origin, typeof b.scope == "string" ? b.scope : "", r);
            var s = function (a) {
                typeof b.scope == "string" && b.scope.length && (a = [b.scope, a].join("::"));
                return a
            }, t = function (a, c) {
                if (!a)throw"postMessage called with null message";
                var d = n ? "post  " : "queue ";
                g(d + " message: " + JSON.stringify(a));
                if (!c && !n)o.push(a); else {
                    if (typeof b.postMessageObserver == "function")try {
                        b.postMessageObserver(b.origin, a)
                    } catch (e) {
                        g("postMessageObserver() raised an exception: " + e.toString())
                    }
                    b.window.postMessage(JSON.stringify(a), b.origin)
                }
            }, u = function (a, c) {
                g("ready msg received");
                if (n)throw"received ready message while in ready state.  help!";
                c === "ping" ? j += "-R" : j += "-L", v.unbind("__ready"), n = !0, g("ready msg accepted."), c === "ping" && v.notify({method:"__ready", params:"pong"});
                while (o.length)t(o.pop());
                typeof b.onReady == "function" && b.onReady(v)
            }, v = {unbind:function (a) {
                if (k[a]) {
                    if (delete k[a])return!0;
                    throw"can't delete method: " + a
                }
                return!1
            }, bind:function (a, b) {
                if (!a || typeof a != "string")throw"'method' argument to bind must be string";
                if (!b || typeof b != "function")throw"callback missing from bind params";
                if (k[a])throw"method '" + a + "' is already bound!";
                k[a] = b;
                return this
            }, call:function (b) {
                if (!b)throw"missing arguments to call function";
                if (!b.method || typeof b.method != "string")throw"'method' argument to call must be string";
                if (!b.success || typeof b.success != "function")throw"'success' callback missing from call";
                var c = {}, d = [], e = function (a, b) {
                    if (typeof b == "object")for (var f in b) {
                        if (!b.hasOwnProperty(f))continue;
                        var g = a + (a.length ? "/" : "") + f;
                        typeof b[f] == "function" ? (c[g] = b[f], d.push(g), delete b[f]) : typeof b[f] == "object" && e(g, b[f])
                    }
                };
                e("", b.params);
                var g = {id:a, method:s(b.method), params:b.params};
                d.length && (g.callbacks = d), b.timeout && q(a, b.timeout, s(b.method)), l[a] = {callbacks:c, error:b.error, success:b.success}, f[a] = r, a++, t(g)
            }, notify:function (a) {
                if (!a)throw"missing arguments to notify function";
                if (!a.method || typeof a.method != "string")throw"'method' argument to notify must be string";
                t({method:s(a.method), params:a.params})
            }, destroy:function () {
                d(b.window, b.origin, typeof b.scope == "string" ? b.scope : ""), window.removeEventListener ? window.removeEventListener("message", r, !1) : window.detachEvent && window.detachEvent("onmessage", r), n = !1, k = {}, m = {}, l = {}, b.origin = null, o = [], g("channel destroyed"), j = ""
            }};
            v.bind("__ready", u), setTimeout(function () {
            }, 0);
            return v
        }}
    }();
    WinChan = function () {
        function i() {
            var b = window.location, c = window.opener.frames, d = b.protocol + "//" + b.host;
            for (var e = c.length - 1; e >= 0; e--)try {
                if (c[e].location.href.indexOf(d) === 0 && c[e].name === a)return c[e]
            } catch (f) {
            }
            return
        }

        function h(a) {
            /^https?:\/\//.test(a) || (a = window.location.href);
            var b = /^(https?:\/\/[\-_a-zA-Z\.0-9:]+)/.exec(a);
            return b ? b[1] : a
        }

        function g() {
            return window.JSON && window.JSON.stringify && window.JSON.parse && window.postMessage
        }

        function f() {
            try {
                var a = navigator.userAgent;
                return a.indexOf("Fennec/") != -1 || a.indexOf("Firefox/") != -1 && a.indexOf("Android") != -1
            } catch (b) {
            }
            return!1
        }

        function e() {
            var a = -1;
            if (navigator.appName === "Microsoft Internet Explorer") {
                var b = navigator.userAgent, c = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
                c.exec(b) != null && (a = parseFloat(RegExp.$1))
            }
            return a >= 8
        }

        function d(a, b, c) {
            a.detachEvent ? a.detachEvent("on" + b, c) : a.removeEventListener && a.removeEventListener(b, c, !1)
        }

        function c(a, b, c) {
            a.attachEvent ? a.attachEvent("on" + b, c) : a.addEventListener && a.addEventListener(b, c, !1)
        }

        var a = "__winchan_relay_frame", b = "die", j = e();
        return g() ? {open:function (e, g) {
            function q(a) {
                try {
                    var b = JSON.parse(a.data);
                    b.a === "ready" ? m.postMessage(o, l) : b.a === "error" ? g && (g(b.d), g = null) : b.a === "response" && (d(window, "message", q), d(window, "unload", p), p(), g && (g(null, b.d), g = null))
                } catch (c) {
                }
            }

            function p() {
                k && document.body.removeChild(k), k = undefined;
                if (n)try {
                    n.close()
                } catch (a) {
                    m.postMessage(b, l)
                }
                n = m = undefined
            }

            if (!g)throw"missing required callback argument";
            var i;
            e.url || (i = "missing required 'url' parameter"), e.relay_url || (i = "missing required 'relay_url' parameter"), i && setTimeout(function () {
                g(i)
            }, 0), e.window_name || (e.window_name = null);
            if (!e.window_features || f())e.window_features = undefined;
            var k, l = h(e.url);
            if (l !== h(e.relay_url))return setTimeout(function () {
                g("invalid arguments: origin of url and relay_url must match")
            }, 0);
            var m;
            j && (k = document.createElement("iframe"), k.setAttribute("src", e.relay_url), k.style.display = "none", k.setAttribute("name", a), document.body.appendChild(k), m = k.contentWindow);
            var n = window.open(e.url, e.window_name, e.window_features);
            m || (m = n);
            var o = JSON.stringify({a:"request", d:e.params});
            c(window, "unload", p), c(window, "message", q);
            return{close:p, focus:function () {
                if (n)try {
                    n.focus()
                } catch (a) {
                }
            }}
        }} : {open:function (a, b, c, d) {
            setTimeout(function () {
                d("unsupported browser")
            }, 0)
        }}
    }();
    var b = function () {
        function l() {
            return c
        }

        function k() {
            c = g() || h() || i() || j();
            return!c
        }

        function j() {
            if (!(window.JSON && window.JSON.stringify && window.JSON.parse))return"JSON_NOT_SUPPORTED"
        }

        function i() {
            if (!a.postMessage)return"POSTMESSAGE_NOT_SUPPORTED"
        }

        function h() {
            try {
                var b = "localStorage"in a && a.localStorage !== null;
                if (b)a.localStorage.setItem("test", "true"), a.localStorage.removeItem("test"); else return"LOCALSTORAGE_NOT_SUPPORTED"
            } catch (c) {
                return"LOCALSTORAGE_DISABLED"
            }
        }

        function g() {
            return f()
        }

        function f() {
            var a = e(), b = a > -1 && a < 8;
            if (b)return"BAD_IE_VERSION"
        }

        function e() {
            var a = -1;
            if (b.appName == "Microsoft Internet Explorer") {
                var c = b.userAgent, d = new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");
                d.exec(c) != null && (a = parseFloat(RegExp.$1))
            }
            return a
        }

        function d(c, d) {
            b = c, a = d
        }

        var a = window, b = navigator, c;
        return{setTestEnv:d, isSupported:k, getNoSupportReason:l}
    }();
    navigator.id || (navigator.id = {});
    if (!navigator.id.request || navigator.id._shimmed) {
        var c = "https://login.persona.org", d = navigator.userAgent, e = d.indexOf("Fennec/") != -1 || d.indexOf("Firefox/") != -1 && d.indexOf("Android") != -1, f = e ? undefined : "menubar=0,location=1,resizable=1,scrollbars=1,status=0,dialog=1,minimizable=1,width=700,height=375", g, h = {login:null, logout:null, ready:null}, i, j = undefined;

        function k(a) {
            a !== !0;
            if (j === undefined)j = a; else if (j != a)throw new Error("you cannot combine the navigator.id.watch() API with navigator.id.getVerifiedEmail() or navigator.id.get()this site should instead use navigator.id.request() and navigator.id.watch()")
        }

        var l, m = !1, n = b.isSupported();

        function o(a) {
            document.addEventListener ? document.addEventListener("DOMContentLoaded", function b() {
                document.removeEventListener("DOMContentLoaded", b), a()
            }, !1) : document.attachEvent && document.readyState && document.attachEvent("onreadystatechange", function c() {
                var b = document.readyState;
                if (b === "loaded" || b === "complete" || b === "interactive")document.detachEvent("onreadystatechange", c), a()
            })
        }

        function p() {
            if (!!n) {
                var b = window.document;
                if (!b.body) {
                    m || (o(p), m = !0);
                    return
                }
                try {
                    if (!l) {
                        var d = b.createElement("iframe");
                        d.style.display = "none", b.body.appendChild(d), d.src = c + "/communication_iframe", l = a.build({window:d.contentWindow, origin:c, scope:"mozid_ni", onReady:function () {
                            l.call({method:"loaded", success:function () {
                                h.ready && h.ready()
                            }, error:function () {
                            }})
                        }}), l.bind("logout", function (a, b) {
                            h.logout && h.logout()
                        }), l.bind("login", function (a, b) {
                            h.login && h.login(b)
                        }), q(i) && l.notify({method:"loggedInUser", params:i})
                    }
                } catch (e) {
                    l = undefined
                }
            }
        }

        function q(a) {
            return typeof a != "undefined"
        }

        function r(a) {
            try {
                console.warn(a)
            } catch (b) {
            }
        }

        function s(a, b) {
            if (q(a[b])) {
                r(b + " has been deprecated");
                return!0
            }
        }

        function t(a, b, c) {
            if (q(a[b]) && q(a[c]))throw new Error("you cannot supply *both* " + b + " and " + c);
            s(a, b) && (a[c] = a[b], delete a[b])
        }

        function u(a) {
            if (typeof a == "object") {
                if (a.onlogin && typeof a.onlogin != "function" || a.onlogout && typeof a.onlogout != "function" || a.onready && typeof a.onready != "function")throw new Error("non-function where function expected in parameters to navigator.id.watch()");
                if (!a.onlogin)throw new Error("'onlogin' is a required argument to navigator.id.watch()");
                if (!a.onlogout)throw new Error("'onlogout' is a required argument to navigator.id.watch()");
                h.login = a.onlogin || null, h.logout = a.onlogout || null, h.ready = a.onready || null, t(a, "loggedInEmail", "loggedInUser"), i = a.loggedInUser, p()
            }
        }

        var v;

        function w() {
            var a = v;
            a === "request" && (h.ready ? a = "watch_with_onready" : a = "watch_without_onready");
            return a
        }

        function x(a) {
            s(a, "requiredEmail"), t(a, "tosURL", "termsOfService"), t(a, "privacyURL", "privacyPolicy"), a.termsOfService && !a.privacyPolicy && r("termsOfService ignored unless privacyPolicy also defined"), a.privacyPolicy && !a.termsOfService && r("privacyPolicy ignored unless termsOfService also defined"), a.rp_api = w(), v = null;
            if (g)try {
                g.focus()
            } catch (d) {
            } else {
                if (!b.isSupported()) {
                    var e = b.getNoSupportReason(), i = "unsupported_dialog";
                    e === "LOCALSTORAGE_DISABLED" && (i = "cookies_disabled"), g = window.open(c + "/" + i, null, f);
                    return
                }
                l && l.notify({method:"dialog_running"}), g = WinChan.open({url:c + "/sign_in", relay_url:c + "/relay", window_features:f, window_name:"__persona_dialog", params:{method:"get", params:a}}, function (b, c) {
                    l && (!b && c && c.email && l.notify({method:"loggedInUser", params:c.email}), l.notify({method:"dialog_complete"})), g = undefined;
                    if (!b && c && c.assertion)try {
                        h.login && h.login(c.assertion)
                    } catch (d) {
                    }
                    if (b === "client closed window" || !c)a && a.oncancel && a.oncancel(), delete a.oncancel
                })
            }
        }

        navigator.id = {request:function (a) {
            if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
            a = a || {}, k(!1), v = "request", a.returnTo || (a.returnTo = document.location.pathname);
            return x(a)
        }, watch:function (a) {
            if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
            k(!1), u(a)
        }, logout:function (a) {
            if (this != navigator.id)throw new Error("all navigator.id calls must be made on the navigator.id object");
            p(), l && l.notify({method:"logout"}), typeof a == "function" && (r("navigator.id.logout callback argument has been deprecated."), setTimeout(a, 0))
        }, get:function (a, b) {
            var c = {};
            b = b || {}, c.privacyPolicy = b.privacyPolicy || undefined, c.termsOfService = b.termsOfService || undefined, c.privacyURL = b.privacyURL || undefined, c.tosURL = b.tosURL || undefined, c.siteName = b.siteName || undefined, c.siteLogo = b.siteLogo || undefined, v = v || "get";
            s(b, "silent") ? a && setTimeout(function () {
                a(null)
            }, 0) : (k(!0), u({onlogin:function (b) {
                a && (a(b), a = null)
            }, onlogout:function () {
            }}), c.oncancel = function () {
                a && (a(null), a = null), h.login = h.logout = h.ready = null
            }, x(c))
        }, getVerifiedEmail:function (a) {
            r("navigator.id.getVerifiedEmail has been deprecated"), k(!0), v = "getVerifiedEmail", navigator.id.get(a)
        }, _shimmed:!0}
    }
})()