Index: chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js |
diff --git a/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js b/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..14786f3510890f433201be9929b2d049cb9a76c8 |
--- /dev/null |
+++ b/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js |
@@ -0,0 +1,100 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+window.assertions = (function() { |
+ |
+// Codes for test results. Must match ExternallyConnectableMessagingTest::Result |
+// in c/b/extensions/extension_messages_apitest.cc. |
+var results = { |
+ OK: 0, |
+ NAMESPACE_NOT_DEFINED: 1, |
+ FUNCTION_NOT_DEFINED: 2, |
+ COULD_NOT_ESTABLISH_CONNECTION_ERROR: 3, |
+ OTHER_ERROR: 4, |
+ INCORRECT_RESPONSE: 5 |
+}; |
+ |
+return { |
+ canConnectAndSendMessages: function(extensionId) { |
+ if (!chrome.runtime) { |
+ reply(results.NAMESPACE_NOT_DEFINED); |
+ return; |
+ } |
+ |
+ if (!chrome.runtime.sendMessage || !chrome.runtime.connect) { |
+ reply(results.FUNCTION_NOT_DEFINED); |
+ return; |
+ } |
+ |
+ // Make the messages sent vaguely complex, but unambiguously JSON-ifiable. |
+ var message = [{'a': {'b': 10}}, 20, 'c\x10\x11']; |
+ |
+ function checkLastError(reply) { |
+ if (!chrome.runtime.lastError) |
+ return true; |
+ var kCouldNotEstablishConnection = |
+ 'Could not establish connection. Receiving end does not exist.'; |
+ if (chrome.runtime.lastError.message == kCouldNotEstablishConnection) |
+ reply(results.COULD_NOT_ESTABLISH_CONNECTION_ERROR); |
+ else |
+ reply(results.OTHER_ERROR); |
+ return false; |
+ } |
+ |
+ function checkResponse(response, reply) { |
+ var responseJson = JSON.stringify(response); |
+ var messageJson = JSON.stringify(message); |
+ if (responseJson == messageJson) |
+ return true; |
+ console.warn('Expected ' + messageJson + ' got ' + responseJson); |
+ reply(results.INCORRECT_RESPONSE); |
+ return false; |
+ } |
+ |
+ function canSendMessage(reply) { |
+ chrome.runtime.sendMessage(extensionId, message, function(response) { |
+ if (checkLastError(reply) && checkResponse(response, reply)) |
+ reply(results.OK); |
+ }); |
+ } |
+ |
+ function canConnectAndSendMessages(reply) { |
+ var port = chrome.runtime.connect(extensionId); |
+ port.postMessage(message, function() { |
+ checkLastError(reply); |
+ }); |
+ port.postMessage(message, function() { |
+ checkLastError(reply); |
+ }); |
+ var pendingResponses = 2; |
+ port.onMessage.addListener(function(response) { |
Jeffrey Yasskin
2013/06/08 00:28:09
Do you need to add this listener before posting yo
not at google - send to devlin
2013/06/08 02:02:33
JS is defined by its single threadedness.
|
+ pendingResponses--; |
+ if (checkLastError(reply) && |
Jeffrey Yasskin
2013/06/08 00:28:09
If the first response produces a lastError, but th
not at google - send to devlin
2013/06/08 02:02:33
Done.
|
+ checkResponse(response, reply) && |
+ pendingResponses == 0) { |
+ reply(results.OK); |
+ } |
+ }); |
+ } |
+ |
+ var done = domAutomationController.send.bind(domAutomationController); |
+ canSendMessage(function(result) { |
+ if (result != results.OK) |
+ done(result); |
+ else |
+ canConnectAndSendMessages(done); |
+ }); |
+ }, |
+ |
+ isDefined: function(name) { |
+ var result = results.OK; |
+ if (!chrome.runtime) |
+ result = results.NAMESPACE_NOT_DEFINED; |
+ else if (!chrome.runtime[name]) |
+ result = results.FUNCTION_NOT_DEFINED; |
+ domAutomationController.send(result); |
+ } |
+}; |
+ |
+}()); // window.assertions |