messagecenter.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. if (typeof console == 'undefined') console = {
  2. log: function () { }
  3. };
  4. // sniff chrome
  5. var CHROME_5_LOCAL = false;
  6. var CHROME = false;
  7. var SAFARI = false;
  8. var FIREFOX = false;
  9. var WEBKIT = false;
  10. var OS_MAC = false;
  11. var IOS = false;
  12. var ANDROID = false;
  13. var MOBILE_DEVICE = false;
  14. var IE = false;
  15. var IE_10_AND_BELOW = false; //ie 10 and lower
  16. var IE_11_AND_ABOVE = false; //ie 11 and above
  17. var BROWSER_VERSION = 5000;
  18. (function () {
  19. if(!window.$axure) window.$axure = function() {};
  20. var useragent = window.navigator.userAgent;
  21. var edgeRegex = /Edge\/([0-9]+)/g;
  22. var edgeMatch = edgeRegex.exec(useragent);
  23. $axure.browser = { isEdge: Boolean(edgeMatch) };
  24. if(!$axure.browser.isEdge) {
  25. var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g;
  26. var chromeMatch = chromeRegex.exec(useragent);
  27. CHROME = Boolean(chromeMatch);
  28. CHROME_5_LOCAL = chromeMatch &&
  29. Number(chromeMatch[1]) >= 5 &&
  30. location.href.indexOf('file://') >= 0;
  31. }
  32. var safariRegex = /Safari\/([0-9]+)/g;
  33. var safariMatch = safariRegex.exec(useragent);
  34. SAFARI = Boolean(safariMatch) && !CHROME; //because chrome also inserts safari string into user agent
  35. var webkitRegex = /WebKit\//g ;
  36. WEBKIT = Boolean(webkitRegex.exec(useragent));
  37. FIREFOX = useragent.toLowerCase().indexOf('firefox') > -1;
  38. var macRegex = /Mac/g ;
  39. OS_MAC = Boolean(macRegex.exec(window.navigator.platform));
  40. IOS = useragent.match(/iPhone/i) || useragent.match(/iPad/i) || useragent.match(/iPod/i);
  41. ANDROID = useragent.match(/Android/i);
  42. MOBILE_DEVICE = ANDROID || IOS
  43. || navigator.userAgent.match(/webOS/i)
  44. || navigator.userAgent.match(/BlackBerry/i)
  45. || navigator.userAgent.match(/Tablet PC/i)
  46. || navigator.userAgent.match(/Windows Phone/i);
  47. if($.browser) {
  48. if($.browser.msie) IE_10_AND_BELOW = true;
  49. else IE_11_AND_ABOVE = useragent.toLowerCase().indexOf('trident') > -1;
  50. BROWSER_VERSION = $.browser.version;
  51. }
  52. IE = IE_10_AND_BELOW || IE_11_AND_ABOVE;
  53. //Used by sitemap and variables.js getLinkUrl functions so that they know
  54. //whether to embed global variables in URL as query string or hash string
  55. //_shouldSendVars persists the value for sitemap instead of re-checking every time
  56. var _shouldSendVars;
  57. var _shouldSendVarsToServer = function(url) {
  58. if(typeof _shouldSendVars != 'undefined') {
  59. return _shouldSendVars;
  60. }
  61. if(SAFARI || (IE_10_AND_BELOW && BROWSER_VERSION < 10)) {
  62. var urlToCheck = typeof url != 'undefined' ? url : window.location.href;
  63. var serverRegex = /http:\/\/127\.0\.0\.1:[0-9]{5}/g;
  64. var serverMatch = serverRegex.exec(urlToCheck);
  65. var previewRegex = /[0-9]{2}\.[0-9]{2}\.[0-9]{2}/g;
  66. var previewMatch = previewRegex.exec(urlToCheck);
  67. if(Boolean(serverMatch) && Boolean(previewMatch)) {
  68. _shouldSendVars = true;
  69. return _shouldSendVars;
  70. }
  71. }
  72. _shouldSendVars = false;
  73. return _shouldSendVars;
  74. };
  75. $axure.shouldSendVarsToServer = _shouldSendVarsToServer;
  76. })();
  77. (function() {
  78. var _topMessageCenter;
  79. var _messageCenter = {};
  80. var _listeners = [];
  81. var _stateListeners = [];
  82. var _state = {};
  83. var _eventObject = null;
  84. var _queuedMessages = [];
  85. var _initialized = false;
  86. // this is for the non Chrome 5 local scenarios. The "top" message center will dispatch to all the bottom ones
  87. var _childrenMessageCenters = [];
  88. // create $axure if it hasn't been created
  89. if (!window.$axure) window.$axure = function() {};
  90. $axure.messageCenter = _messageCenter;
  91. // isolate scope, and initialize _topMessageCenter.
  92. (function() {
  93. if (!CHROME_5_LOCAL) {
  94. var topAxureWindow = window;
  95. try {
  96. while(topAxureWindow.parent && topAxureWindow.parent !== topAxureWindow
  97. && topAxureWindow.parent.$axure) topAxureWindow = topAxureWindow.parent;
  98. } catch(e) {}
  99. _topMessageCenter = topAxureWindow.$axure.messageCenter;
  100. }
  101. })();
  102. $(window.document).ready(function() {
  103. if (CHROME_5_LOCAL) {
  104. $('body').append("<div id='axureEventReceiverDiv' style='display:none'></div>" +
  105. "<div id='axureEventSenderDiv' style='display:none'></div>");
  106. _eventObject = window.document.createEvent('Event');
  107. _eventObject.initEvent('axureMessageSenderEvent', true, true);
  108. $('#axureEventReceiverDiv').bind('axureMessageReceiverEvent', function () {
  109. var request = JSON.parse($(this).text());
  110. _handleRequest(request);
  111. });
  112. } else {
  113. if (_topMessageCenter != _messageCenter) {
  114. _topMessageCenter.addChildMessageCenter(_messageCenter);
  115. console.log('adding from ' + window.location.toString());
  116. }
  117. }
  118. });
  119. var _handleRequest = function (request) {
  120. // route the request to all the listeners
  121. for(var i = 0; i < _listeners.length; i++) _listeners[i](request.message, request.data);
  122. // now handle the queued messages if we're initializing
  123. if (request.message == 'initialize') {
  124. _initialized = true;
  125. // send all the queued messages and return
  126. for (var i = 0; i < _queuedMessages.length; i++) {
  127. var qRequest = _queuedMessages[i];
  128. _messageCenter.postMessage(qRequest.message, qRequest.data);
  129. }
  130. _queuedMessages = [];
  131. }
  132. // and then handle the set state messages, if necessary
  133. if (request.message == 'setState') {
  134. _state[request.data.key] = request.data.value;
  135. for (var i = 0; i < _stateListeners.length; i++) {
  136. var keyListener = _stateListeners[i];
  137. // if thep passed a null or empty value, always post the message
  138. if (!keyListener.key || keyListener.key == request.data.key) {
  139. keyListener.listener(request.data.key, request.data.value);
  140. }
  141. }
  142. }
  143. };
  144. // -----------------------------------------------------------------------------------------
  145. // This method allows for dispatching messages in the non-chromelocal scenario.
  146. // Each child calls this on _topMessageCenter
  147. // -----------------------------------------------------------------------------------------
  148. _messageCenter.addChildMessageCenter = function(messageCenter) {
  149. _childrenMessageCenters[_childrenMessageCenters.length] = messageCenter;
  150. };
  151. // -----------------------------------------------------------------------------------------
  152. // This method allows for dispatching messages in the non-chromelocal scenario.
  153. // Each child calls this on _topMessageCenter
  154. // -----------------------------------------------------------------------------------------
  155. _messageCenter.dispatchMessage = function(message, data) {
  156. _handleRequest({
  157. message: message,
  158. data: data
  159. });
  160. };
  161. // -----------------------------------------------------------------------------------------
  162. // -----------------------------------------------------------------------------------------
  163. _messageCenter.dispatchMessageRecursively = function(message, data) {
  164. console.log("dispatched to " + window.location.toString());
  165. // dispatch to the top center first
  166. _messageCenter.dispatchMessage(message, data);
  167. $('iframe').each(function(index, frame) {
  168. //try,catch to handle permissions error in FF when loading pages from another domain
  169. try {
  170. if (frame.contentWindow.$axure && frame.contentWindow.$axure.messageCenter) {
  171. frame.contentWindow.$axure.messageCenter.dispatchMessageRecursively(message, data);
  172. }
  173. }catch(e) {}
  174. });
  175. };
  176. var _combineEventMessages = false;
  177. var _compositeEventMessageData = [];
  178. _messageCenter.startCombineEventMessages = function() {
  179. _combineEventMessages = true;
  180. }
  181. _messageCenter.endCombineEventMessages = function () {
  182. _messageCenter.sendCompositeEventMessage();
  183. _combineEventMessages = false;
  184. }
  185. _messageCenter.sendCompositeEventMessage = function () {
  186. _messageCenter.postMessage('axCompositeEventMessage', _compositeEventMessageData);
  187. _compositeEventMessageData = [];
  188. }
  189. _messageCenter.postMessage = function (message, data) {
  190. if(_combineEventMessages) {
  191. if(message == 'axEvent' || message == 'axCase' || message == 'axAction' || message == 'axEventComplete') {
  192. _compositeEventMessageData.push({ 'message': message, 'data': data });
  193. if(_compositeEventMessageData.length >= 10) _messageCenter.sendCompositeEventMessage();
  194. return;
  195. }
  196. }
  197. if(!CHROME_5_LOCAL) {
  198. _topMessageCenter.dispatchMessageRecursively(message, data);
  199. } else {
  200. var request = {
  201. message: message,
  202. data: data
  203. };
  204. if(_initialized) {
  205. var senderDiv = window.document.getElementById('axureEventSenderDiv');
  206. var messageText = JSON.stringify(request);
  207. // console.log('sending event: ' + messageText);
  208. senderDiv.innerText = messageText;
  209. senderDiv.dispatchEvent(_eventObject);
  210. // console.log('event sent');
  211. } else {
  212. _queuedMessages[_queuedMessages.length] = request;
  213. }
  214. }
  215. };
  216. _messageCenter.setState = function(key, value) {
  217. var data = {
  218. key: key,
  219. value: value
  220. };
  221. _messageCenter.postMessage('setState', data);
  222. };
  223. _messageCenter.getState = function(key) {
  224. return _state[key];
  225. };
  226. _messageCenter.addMessageListener = function(listener) {
  227. _listeners[_listeners.length] = listener;
  228. };
  229. _messageCenter.addStateListener = function(key, listener) {
  230. _stateListeners[_stateListeners.length] = {
  231. key: key,
  232. listener: listener
  233. };
  234. };
  235. })();