|
106 | 106 |
|
107 | 107 | function postMessageRequest(options) {
|
108 | 108 |
|
109 |
| - if (!options.window) { |
110 |
| - throw new Error('Expected options.window'); |
111 |
| - } |
112 |
| - |
113 | 109 | if (!options.name) {
|
114 | 110 | throw new Error('Expected options.name');
|
115 | 111 | }
|
116 | 112 |
|
| 113 | + var promise; |
| 114 | + |
| 115 | + if (!options.callback) { |
| 116 | + if (window.Promise) { |
| 117 | + promise = new window.Promise(function (resolve, reject) { |
| 118 | + options.callback = function (err, result) { |
| 119 | + return err ? reject(err) : resolve(result); |
| 120 | + }; |
| 121 | + }); |
| 122 | + } else { |
| 123 | + throw new Error('Expected callback or window.Promise'); |
| 124 | + } |
| 125 | + } |
| 126 | + |
| 127 | + options.respond = once(function(err, response) { |
| 128 | + options.callback(err, response); |
| 129 | + return promise; |
| 130 | + }); |
| 131 | + |
| 132 | + if (!options.window) { |
| 133 | + return options.respond(new Error('Expected options.window')); |
| 134 | + } |
| 135 | + |
117 | 136 | if (mockMode) {
|
118 | 137 | options.window = window;
|
119 | 138 |
|
120 | 139 | } else if (typeof options.window === 'string') {
|
121 | 140 | var el = document.getElementById(options.window);
|
122 | 141 |
|
123 | 142 | if (!el) {
|
124 |
| - throw new Error('Expected options.window ' + options.window + ' to be a valid element id'); |
| 143 | + return options.respond(new Error('Expected options.window ' + options.window + ' to be a valid element id')); |
125 | 144 | }
|
126 | 145 |
|
127 | 146 | if (el.tagName.toLowerCase() !== 'iframe') {
|
128 |
| - throw new Error('Expected options.window ' + options.window + ' to be an iframe'); |
| 147 | + return options.respond(new Error('Expected options.window ' + options.window + ' to be an iframe')); |
129 | 148 | }
|
130 | 149 |
|
131 | 150 | options.window = el.contentWindow;
|
132 |
| - } |
133 |
| - |
134 |
| - options.callback = once(options.callback); |
135 | 151 |
|
136 |
| - var promise; |
137 |
| - |
138 |
| - if (!options.callback && window.Promise) { |
139 |
| - promise = new window.Promise(function(resolve, reject) { |
140 |
| - options.callback = function(err, result) { |
141 |
| - return err ? reject(err) : resolve(result); |
142 |
| - }; |
143 |
| - }); |
| 152 | + if (!options.window) { |
| 153 | + return options.respond(new Error('Expected options.window')); |
| 154 | + } |
144 | 155 | }
|
145 | 156 |
|
146 | 157 | var hash = options.name + '_' + Math.random().toString();
|
147 | 158 | responseHandlers[hash] = options;
|
148 | 159 |
|
149 |
| - options.respond = once(function(err, response) { |
150 |
| - return options.callback(err, response); |
151 |
| - }); |
152 |
| - |
153 |
| - if (!options.window.postMessage) { |
154 |
| - return options.respond(new Error('Target window does not have postMessage handler')); |
155 |
| - } |
156 |
| - |
157 | 160 | if (options.window.closed) {
|
158 | 161 | return options.respond(new Error('Target window is closed'));
|
159 | 162 | }
|
|
0 commit comments