Index: chrome/browser/resources/chromeos/chromevox/common/interframe.js |
diff --git a/chrome/browser/resources/chromeos/chromevox/common/interframe.js b/chrome/browser/resources/chromeos/chromevox/common/interframe.js |
index 5f4b800bf0a842f2b0177494d7bf164cfda819da..1da0d8b5aba0f106fc075eac3260ed539964e685 100644 |
--- a/chrome/browser/resources/chromeos/chromevox/common/interframe.js |
+++ b/chrome/browser/resources/chromeos/chromevox/common/interframe.js |
@@ -41,6 +41,14 @@ cvox.Interframe.IF_MSG_PREFIX = 'cvox.INTERFRAME:'; |
cvox.Interframe.SET_ID = 'cvox.INTERFRAME_SET_ID'; |
/** |
+ * The message used by a child frame to acknowledge an id was set (sent to its |
+ * parent frame. |
+ * @type {string} |
+ * @const |
+ */ |
+cvox.Interframe.ACK_SET_ID = 'cvox.INTERFRAME_ACK_SET_ID'; |
+ |
+/** |
* The ID of this window (relative to its parent farme). |
* @type {number|string|undefined} |
*/ |
@@ -54,6 +62,14 @@ cvox.Interframe.id; |
cvox.Interframe.listeners = []; |
/** |
+ * Maps an id to a function which gets called when a frame first sends an ack |
+ * for a set id msg. |
+ @dict {!Object.<number|string, function()>} |
+ * @private |
+ */ |
+cvox.Interframe.idToCallback_ = {}; |
+ |
+/** |
* Flag for unit testing. When false, skips over iframe.contentWindow check |
* in sendMessageToIframe. This is needed because in the wild, ChromeVox may |
* not have access to iframe.contentWindow due to the same-origin security |
@@ -74,6 +90,12 @@ cvox.Interframe.init = function() { |
cvox.ChromeVoxJSON.parse(suffix)); |
if (message['command'] == cvox.Interframe.SET_ID) { |
cvox.Interframe.id = message['id']; |
+ message['command'] = cvox.Interframe.ACK_SET_ID; |
+ cvox.Interframe.sendMessageToParentWindow(message); |
+ } else if (message['command'] == cvox.Interframe.ACK_SET_ID) { |
+ cvox.Interframe.id = message['id']; |
+ var callback = cvox.Interframe.idToCallback_[cvox.Interframe.id]; |
+ callback(); |
} |
for (var i = 0, listener; listener = cvox.Interframe.listeners[i]; i++) { |
listener(message); |
@@ -196,8 +218,13 @@ cvox.Interframe.sendMessageToParentWindow = function(message) { |
* @param {number|string} id The ID you want to receive in replies from |
* this iframe. |
* @param {HTMLIFrameElement} iframe The iframe to assign. |
+ * @param {function()=} opt_callback Called when a ack msg arrives from the |
+ *frame. |
*/ |
-cvox.Interframe.sendIdToIFrame = function(id, iframe) { |
+cvox.Interframe.sendIdToIFrame = function(id, iframe, opt_callback) { |
+ if (opt_callback) { |
+ cvox.Interframe.idToCallback_[id] = opt_callback; |
+ } |
var message = {'command': cvox.Interframe.SET_ID, 'id': id}; |
cvox.Interframe.sendMessageToIFrame(message, iframe); |
}; |