Dashboard sipadu mbip
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

aui-messaging.js 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. AUI.add('aui-messaging', function(A) {
  2. var Lang = A.Lang,
  3. isString = Lang.isString,
  4. lastHash,
  5. ENV = A.Env,
  6. G_ENV = AUI.Env,
  7. WIN = A.config.win,
  8. LOCATION = WIN.location,
  9. NATIVE_MSG = !!(WIN.postMessage),
  10. TOKEN_CLOSE = '_A=',
  11. TOKEN_OPEN = '=A_',
  12. STR_REGEX_CONTENT = '.*?',
  13. STR_REGEX_TOKEN_OPEN = TOKEN_OPEN + '\\d+&',
  14. REGEX_TOKEN_EXTRACT_HASH = new RegExp(STR_REGEX_TOKEN_OPEN + '(' + STR_REGEX_CONTENT + ')' + TOKEN_CLOSE),
  15. REGEX_TOKEN_REPLACE_HASH = new RegExp(STR_REGEX_TOKEN_OPEN + STR_REGEX_CONTENT + TOKEN_CLOSE);
  16. fnPostMessage = function(message, targetURI, targetFrame) {
  17. if (targetURI) {
  18. if (Lang.isObject(message)) {
  19. message = A.QueryString.stringify(message);
  20. }
  21. try {
  22. targetFrame = A.one(targetFrame);
  23. targetFrame = targetFrame && targetFrame.getDOM().contentWindow;
  24. }
  25. catch (e) {
  26. }
  27. targetFrame = targetFrame || WIN.parent;
  28. if (NATIVE_MSG) {
  29. targetURI = targetURI.replace(/([^:]+:\/\/[^\/?]+).*/, '$1');
  30. targetFrame.postMessage(message, targetURI);
  31. }
  32. else {
  33. var uriPieces = targetURI.split('#');
  34. var uri = uriPieces[1] || '';
  35. // If we reuse a uri that has the token in it,
  36. // let's replace it.
  37. uri = uri.replace(REGEX_TOKEN_REPLACE_HASH, '');
  38. var cacheBreaker = Lang.now() + (++ENV._uidx);
  39. uri = (TOKEN_OPEN + cacheBreaker + '&' + message + TOKEN_CLOSE) + uri;
  40. uriPieces[1] = uri;
  41. targetFrame.location = uriPieces.join('#');
  42. }
  43. }
  44. };
  45. fnReceiveMessage = function(callback, sourceURI, interval) {
  46. if (NATIVE_MSG) {
  47. var previousCallbackWrapper = Messaging._callbackFn;
  48. if (previousCallbackWrapper) {
  49. G_ENV.remove(WIN, 'message', previousCallbackWrapper);
  50. Messaging._callbackFn = null;
  51. }
  52. if (callback) {
  53. var callbackFn = A.rbind(Messaging._validateCallback, Messaging, sourceURI, callback);
  54. Messaging._callbackFn = callbackFn;
  55. G_ENV.add(WIN, 'message', callbackFn);
  56. }
  57. }
  58. else {
  59. var intervalId = Messaging._INTERVAL_ID;
  60. if (intervalId) {
  61. A.clearInterval(intervalId);
  62. Messaging._INTERVAL_ID = null;
  63. }
  64. if (callback) {
  65. if (Lang.isUndefined(interval)) {
  66. interval = 100;
  67. if (Lang.isNumber(sourceURI)) {
  68. interval = sourceURI;
  69. }
  70. }
  71. Messaging._INTERVAL_ID = A.setInterval(Messaging._pollHash, interval, Messaging, callback);
  72. }
  73. }
  74. };
  75. Messaging = {
  76. post: fnPostMessage,
  77. receive: fnReceiveMessage,
  78. _formatEventObject: function(obj) {
  79. var instance = this;
  80. obj.responseData = instance._getResponseData(obj.data);
  81. return obj;
  82. },
  83. _getResponseData: function(data) {
  84. var instance = this;
  85. var responseData = data;
  86. if (responseData && /\w+=\w+/.test(responseData)) {
  87. responseData = A.QueryString.parse(responseData);
  88. }
  89. return responseData;
  90. },
  91. _pollHash: function(callback) {
  92. var instance = Messaging;
  93. var hash = LOCATION.hash;
  94. if (hash != lastHash && REGEX_TOKEN_REPLACE_HASH.test(hash)) {
  95. lastHash = hash;
  96. var data = hash.match(REGEX_TOKEN_EXTRACT_HASH);
  97. data = (data && data[1]) || '';
  98. var obj = {
  99. data: data
  100. };
  101. instance._formatEventObject(obj);
  102. callback.call(Messaging, obj);
  103. }
  104. },
  105. _validateCallback: function(event, sourceURI, callback) {
  106. var instance = Messaging;
  107. var origin = event.origin;
  108. var valid = false;
  109. if (Lang.isFunction(sourceURI)) {
  110. valid = sourceURI(origin);
  111. }
  112. else if (isString(sourceURI)) {
  113. valid = (sourceURI == origin);
  114. }
  115. if (valid) {
  116. instance._formatEventObject(event);
  117. callback.call(Messaging, event);
  118. }
  119. }
  120. };
  121. A.postMessage = fnPostMessage;
  122. A.receiveMessage = fnReceiveMessage;
  123. A.Messaging = Messaging;
  124. }, '@VERSION@' ,{requires:['aui-base','aui-task-manager','querystring'], skinnable:false});