Add ICU message format support
[chromium-blink-merge.git] / ios / web / web_state / js / resources / message.js
blobc9fa557b480914bd7d4359fa1c01654e82043738
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Scripts for the message handler.
7 goog.provide('__crWeb.message');
9 goog.require('__crWeb.common');
10 goog.require('__crWeb.messageDynamic');
12 /**
13  * Namespace for this module.
14  */
15 __gCrWeb.message = {};
17 /* Beginning of anonymous object. */
18 (function() {
19   /**
20    * Object to manage queue of messages waiting to be sent to the main
21    * application for immediate processing.
22    * @type {Object}
23    * @private
24    */
25   var immediateMessageQueue_ = {
26     scheme: 'crwebinvokeimmediate',
27     reset: function() {
28       immediateMessageQueue_.queue = [];
29       // Since the array will be JSON serialized, protect against non-standard
30       // custom versions of Array.prototype.toJSON.
31       immediateMessageQueue_.queue.toJSON = null;
32     }
33   };
34   immediateMessageQueue_.reset();
36   /**
37    * Object to manage queue of messages waiting to be sent to the main
38    * application for asynchronous processing.
39    * @type {Object}
40    * @private
41    */
42   var messageQueue_ = {
43     scheme: 'crwebinvoke',
44     reset: function() {
45       messageQueue_.queue = [];
46       // Since the array will be JSON serialized, protect against non-standard
47       // custom versions of Array.prototype.toJSON.
48       messageQueue_.queue.toJSON = null
49     }
50   };
51   messageQueue_.reset();
53   /**
54    * Invokes a command immediately on the Objective-C side.
55    * An immediate command is a special class of command that must be handled at
56    * the earliest opportunity. See the notes in CRWWebController for
57    * restrictions and precautions.
58    * @param {Object} command The command in a JavaScript object.
59    * @private
60    */
61   __gCrWeb.message.invokeOnHostImmediate = function(command) {
62     // If there is no document or body, the command will be silently dropped.
63     if (!document || !document.body)
64       return;
65     immediateMessageQueue_.queue.push(command);
66     sendQueue_(immediateMessageQueue_);
67   };
69   /**
70    * Invokes a command on the Objective-C side.
71    * @param {Object} command The command in a JavaScript object.
72    * @private
73    */
74   __gCrWeb.message.invokeOnHost = function(command) {
75     // Avoid infinite loops in sites that send messages as a side effect
76     // of URL verification (e.g., due to logging in an XHR override).
77     if (window.__gCrWeb_Verifying) {
78       return;
79     }
80     messageQueue_.queue.push(command);
81     sendQueue_(messageQueue_);
82   };
84   /**
85    * Returns the message queue as a string.
86    * @return {string} The current message queue as a JSON string.
87    */
88   __gCrWeb.message.getMessageQueue = function() {
89     var messageQueueString = __gCrWeb.common.JSONStringify(messageQueue_.queue);
90     messageQueue_.reset()
91     return messageQueueString;
92   };
94   /**
95    * Sends both queues if they contain messages.
96    */
97   __gCrWeb.message.invokeQueues = function() {
98     if (immediateMessageQueue_.queue.length > 0)
99       sendQueue_(immediateMessageQueue_);
100     if (messageQueue_.queue.length > 0)
101       sendQueue_(messageQueue_);
102   };
104   function sendQueue_(queueObject) {
105     // Do nothing if windowId has not been set.
106     if (!__gCrWeb.windowIdObject || typeof __gCrWeb.windowId != 'string') {
107       return;
108     }
109     // Some pages/plugins implement Object.prototype.toJSON, which can result
110     // in serializing messageQueue_ to an invalid format.
111     var originalObjectToJSON = Object.prototype.toJSON;
112     if (originalObjectToJSON)
113       delete Object.prototype.toJSON;
114     __gCrWeb.message_dynamic.sendQueue(queueObject);
116     if (originalObjectToJSON) {
117       // Restore Object.prototype.toJSON to prevent from breaking any
118       // functionality on the page that depends on its custom implementation.
119       Object.prototype.toJSON = originalObjectToJSON;
120     }
121   };
122 }());