| 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..5a8b2692ea2d0d173f65d443357fe3451263408e
|
| --- /dev/null
|
| +++ b/chrome/test/data/extensions/api_test/messaging/externally_connectable/sites/assertions.js
|
| @@ -0,0 +1,129 @@
|
| +// 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_SENDER: 5,
|
| + INCORRECT_RESPONSE_MESSAGE: 6
|
| +};
|
| +
|
| +// 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) {
|
| + // The response will be an echo of both the original message *and* the
|
| + // MessageSender (with the tab field stripped down).
|
| + //
|
| + // First check the sender was correct.
|
| + var incorrectSender = false;
|
| + if (!response.sender.hasOwnProperty('tab')) {
|
| + console.warn('Expected a tab, got none');
|
| + incorrectSender = true;
|
| + }
|
| + if (response.sender.tab.url != document.location.href) {
|
| + console.warn('Expected tab url ' + document.location.href + ' got ' +
|
| + response.sender.tab.url);
|
| + incorrectSender = true;
|
| + }
|
| + if (response.sender.hasOwnProperty('id')) {
|
| + console.warn('Expected no id, got "' + response.sender.id + '"');
|
| + incorrectSender = true;
|
| + }
|
| + if (response.sender.url != document.location.href) {
|
| + console.warn('Expected url ' + document.location.href + ' got ' +
|
| + response.sender.url);
|
| + incorrectSender = true;
|
| + }
|
| + if (incorrectSender) {
|
| + reply(results.INCORRECT_RESPONSE_SENDER);
|
| + return false;
|
| + }
|
| +
|
| + // Check the correct content was echoed.
|
| + var expectedJson = JSON.stringify(message);
|
| + var actualJson = JSON.stringify(response.message);
|
| + if (actualJson == expectedJson)
|
| + return true;
|
| + console.warn('Expected message ' + expectedJson + ' got ' + actualJson);
|
| + reply(results.INCORRECT_RESPONSE_MESSAGE);
|
| + return false;
|
| +}
|
| +
|
| +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;
|
| + }
|
| +
|
| + 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;
|
| + var ok = true;
|
| + port.onMessage.addListener(function(response) {
|
| + pendingResponses--;
|
| + ok = ok && checkLastError(reply) && checkResponse(response, reply);
|
| + if (pendingResponses == 0 && ok)
|
| + 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
|
|
|