messagecenter.js 8.5 KB

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