Add ability to specify per-call error handling
[gssweb.git] / chrome / app / navigator.gss.js
1 console.log('Loading navigator.gss.js - #7');
2
3 /* This file gets injected into the web page verbatim */
4
5
6
7 var GSSEap = (function () 
8   {
9     function GSSEap(config)
10     {
11         // Public attributes
12         this.version = "0.0.1";
13         this.callbacks = {};
14         this.methods = {};
15         this.errors = {};
16         this.appTag = config.appTag || "";
17         this.default_error = config.error || function (major, minor, error, appTag) {
18             console.warn(error);
19         };
20         window.addEventListener("message", this.dispatch_responses.bind(this));
21     }
22     GSSEap.prototype.dispatch_responses = function (event) 
23     {
24         var method;
25         var nonce;
26         var callback;
27         var app_tag;
28         var error;
29
30         /* This message is destined for us only if all the following apply:
31         * - The data.method_name is one of the methods implemented by this
32         *   object
33         * - data.return_values exists
34         * - data.cookies exists
35         * - One of my callbacks matches the nonce in data.cookies.navigator_gss_tag
36         * - One of my methods matches the nonce in data.cookies.navigator_gss_tag
37         *   and that method matches data.method
38         */
39         method = event.data.method;
40         if (
41              (method != "gss_import_name") ||
42              ("undefined" == typeof (event.data.return_values)) ||
43              ("undefined" == typeof (event.data.cookies)))
44         {
45             return;
46         }
47
48         nonce = event.data.cookies.navigator_gss_tag;
49         event.data.cookies.navigator_gss_tag = undefined;
50         callback = this.callbacks[nonce];
51         if ("undefined" == typeof (callback) || this.methods[nonce] != method) {
52             return;
53         }
54
55         // We now know that this message is for us!
56         this.callbacks[nonce] = undefined;
57         app_tag = event.data.cookies.app_tag;
58         error = this.errors[nonce] || this.default_error;
59
60         if (this.gss_error(event.data.return_values.major_status))
61         {
62             var errMsg = "Error during " + method + ": " + 
63               "Major status message: " + 
64               event.data.return_values.errors.major_status_message + 
65               "; Minor status message: " + 
66               event.data.return_values.errors.minor_status_message;
67             error(
68               event.data.return_values.major_status,
69               event.data.return_values.minor_status, 
70               errMsg,
71               app_tag);
72         } else {
73             if ("gss_import_name" == method) 
74             { callback(event.data.return_values, app_tag); }
75             // if( "gss_X" == method ) { callback(event.data.return_values.x, app_tag);}
76         }
77     };
78
79     GSSEap.prototype.import_name = function (params) 
80     {
81         /* variables */
82         var nonce;
83         var name = params.name;
84         var name_type = params.name_type || "{1 2 840 113554 1 2 1 4 }";
85         var callback = params.success;
86         var error = params.error || this.default_error; 
87         var app_tag = params.app_tag || this.appTag;
88
89         /* Erorr checking */
90         // Call an error if we don't have the required parameters.
91         // - name
92         // - success()
93         if ( "undefined" == typeof(name) ||
94              "undefined" == typeof(callback) )
95         {
96           error(-1, -1, 
97             "import_name called missing either name or success callback"
98           );
99           return;
100         }
101         
102         nonce = navigator.generateNonce();
103         this.callbacks[nonce] = callback;
104         this.methods[nonce] = "gss_import_name";
105         this.errors[nonce] = error;
106         window.postMessage({
107             "method":"gss_import_name",
108             "arguments":
109             {
110                 "input_name": name,
111                 "input_name_type": name_type
112             },
113             "cookies":
114             {
115                 "navigator_gss_tag": nonce,
116                 "app_tag": app_tag
117             }
118         }, "*");
119         
120     };
121
122     GSSEap.prototype.gss_error = function (major) 
123     {
124         var callingMask;
125         var routineMask;
126         var mask;
127
128         callingMask = 255 << 24;
129         routineMask = 255 << 16;
130         mask = callingMask | routineMask;
131
132         return (0 != (major & mask));
133     };
134     return GSSEap;
135 })();
136
137 navigator.gss_eap = GSSEap;