Chromium Code Reviews| Index: chrome/test/data/extensions/api_test/settings/split_incognito/background.html |
| diff --git a/chrome/test/data/extensions/api_test/settings/split_incognito/background.html b/chrome/test/data/extensions/api_test/settings/split_incognito/background.html |
| index 1a8fb7bab04d6a499a9aae06143600ddf42e0a0e..54426cde188650d3c3bfb17a7ff5d4cbe0ea0653 100644 |
| --- a/chrome/test/data/extensions/api_test/settings/split_incognito/background.html |
| +++ b/chrome/test/data/extensions/api_test/settings/split_incognito/background.html |
| @@ -1,59 +1,107 @@ |
| <script> |
| - |
| var settings = chrome.experimental.settings; |
| +var assertEq = chrome.test.assertEq; |
| +var inIncognitoContext = chrome.extension.inIncognitoContext; |
| -// A different "waiting" message depending on whether this background page runs |
| -// in incognito mode or not. This is so that the C++ test can differentiate |
| -// between messages. |
| - |
| -// Returns a function that asserts a result is expected. |
| -function assertResultEq(expected) { |
| +// Returns a function that asserts a result is expected then runs a callback. |
| +function assertResultEq(expected, callback) { |
| return function(actual) { |
| chrome.test.assertEq(expected, actual); |
| + callback(); |
| }; |
| } |
| +// Retries a test action in the future. |
| +function retry(name, callback) { |
| + var delayMs = 1000; |
| + console.log("Retrying " + name + " in " + delayMs + "ms"); |
| + setTimeout(function() { |
| + testActions[name](callback); |
| + }, delayMs); |
| +} |
| + |
| +// All notifications received. |
| +var notifications = []; |
| +settings.onChanged.addListener(function(changes) { |
| + changes.forEach(function(change) { |
| + notifications.push(change); |
| + }); |
| +}); |
| + |
| // The test from C++ runs "actions", where each action is defined here. |
| // This allows the test to be tightly controlled between incognito and |
| // non-incognito modes. |
| +// Each function accepts a callback which should be run when the settings |
| +// operation fully completes. |
| var testActions = { |
| - noop: function() { |
| - settings.get("", function() {}); |
| + noop: function(callback) { |
| + settings.get("", callback); |
| + }, |
| + assertEmpty: function(callback) { |
| + settings.get(null, assertResultEq({}, callback)); |
| + }, |
| + assertFoo: function(callback) { |
| + settings.get(null, assertResultEq({foo: "bar"}, callback)); |
| + }, |
| + setFoo: function(callback) { |
| + settings.set({foo: "bar"}, assertResultEq({foo: "bar"}, callback)); |
| + }, |
| + removeFoo: function(callback) { |
| + settings.remove("foo", assertResultEq(undefined, callback)); |
| }, |
| - assertEmpty: function() { |
| - settings.get(null, assertResultEq({})); |
| + clear: function(callback) { |
| + settings.clear(assertResultEq(undefined, callback)); |
| }, |
| - assertFoobar: function() { |
| - settings.get(null, assertResultEq({foo: "bar"})); |
| + assertNoNotifications: function(callback) { |
| + // On Windows, the notifications seem to be unpredicably delivered, so poll |
| + // until they arrive (or the test times out). |
| + if (notifications.length !== 0) { |
| + retry("assertNoNotifications", callback); |
|
Matt Perry
2011/10/12 17:23:01
Polling is almost always a bad idea in tests. Can
|
| + return; |
| + } |
| + callback(); |
| }, |
| - setFoobar: function() { |
| - settings.set({foo: "bar"}, assertResultEq({foo: "bar"})); |
| + clearNotifications: function(callback) { |
| + notifications = []; |
| + callback(); |
| }, |
| - removeFoo: function() { |
| - settings.remove("foo", assertResultEq(undefined)); |
| + assertAddFooNotification: function(callback) { |
| + // Ditto. |
| + if (notifications.length !== 1) { |
| + retry("assertAddFooNotification", callback); |
| + return; |
| + } |
| + assertEq("foo", notifications[0].key); |
| + assertEq(undefined, notifications[0].oldValue); |
| + assertEq("bar", notifications[0].newValue); |
| + callback(); |
| }, |
| - clear: function() { |
| - settings.clear(assertResultEq(undefined)); |
| + assertDeleteFooNotification: function(callback) { |
| + // Ditto. |
| + if (notifications.length !== 1) { |
| + retry("assertDeleteFooNotification", callback); |
| + return; |
| + } |
| + assertEq("foo", notifications[0].key); |
| + assertEq("bar", notifications[0].oldValue); |
| + assertEq(undefined, notifications[0].newValue); |
| + callback(); |
| } |
| }; |
| // The only test we run. Runs "actions" (as defined above) until told |
| // to stop (when the message has isFinalAction set to true). |
| function testEverything() { |
| - var waiting = chrome.extension.inIncognitoContext ? |
| - "waiting_incognito" : "waiting"; |
| - function runTestAction(messageJson) { |
| - var message = JSON.parse(messageJson); |
| - testActions[message.action](); |
| - if (message.isFinalAction) { |
| - chrome.test.succeed(); |
| - return; |
| - } |
| - chrome.test.sendMessage(waiting, runTestAction); |
| + function next() { |
| + var waiting = inIncognitoContext ? "waiting_incognito" : "waiting"; |
| + chrome.test.sendMessage(waiting, function(messageJson) { |
| + var message = JSON.parse(messageJson); |
| + var action = testActions[message.action]; |
| + action(message.isFinalAction ? chrome.test.succeed : next); |
| + }); |
| } |
| - chrome.test.sendMessage(waiting, runTestAction); |
| + next(); |
| } |
| chrome.test.runTests([testEverything]); |
| - |
| </script> |