Index: chrome/test/data/extensions/api_test/executescript/removed_frames/test.js |
diff --git a/chrome/test/data/extensions/api_test/executescript/removed_frames/test.js b/chrome/test/data/extensions/api_test/executescript/removed_frames/test.js |
index e46195c0ff8eca6d1896e3acd2fd9f8d5f2a3781..32c8af3f9b7b5e12107b255564821d2d3d589810 100644 |
--- a/chrome/test/data/extensions/api_test/executescript/removed_frames/test.js |
+++ b/chrome/test/data/extensions/api_test/executescript/removed_frames/test.js |
@@ -7,14 +7,25 @@ |
// cleaned up, but, realistically, doesn't matter. |
function ResponseCounter() { |
this.responsesReceived = 0; |
- chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) { |
+ this.expectedResponses = -1; |
+ var listenerFunction = function(request, sender, sendResponse) { |
if (request == 'fail') { |
- chrome.test.fail(); |
+ chrome.test.fail('Received bad message'); |
} else { |
chrome.test.assertEq('complete', request); |
++this.responsesReceived; |
+ chrome.test.assertTrue(this.responsesReceived <= this.expectedResponses); |
+ if (this.responsesReceived == this.expectedResponses && |
+ this.doneCallback) { |
+ this.removeListener(); |
+ this.doneCallback(); |
+ } |
} |
- }.bind(this)); |
+ }.bind(this); |
+ this.removeListener = function() { |
+ chrome.runtime.onMessage.removeListener(listenerFunction); |
+ } |
+ chrome.runtime.onMessage.addListener(listenerFunction); |
} |
var waitForCommittedAndRun = function(functionToRun, numCommits, url) { |
@@ -35,10 +46,10 @@ chrome.test.getConfig(function(config) { |
'/extensions/api_test/executescript/removed_frames/outer.html'; |
// Regression tests for crbug.com/500574. |
chrome.test.runTests([ |
- function() { |
+ function testInjectAndDeleteIframeFromMainFrame() { |
waitForCommittedAndRun(injectAndDeleteIframeFromMainFrame, 2, url); |
}, |
- function() { |
+ function testInjectAndDeleteIframeFromIframe() { |
waitForCommittedAndRun(injectAndDeleteIframeFromIframe, 2, url); |
} |
]); |
@@ -48,6 +59,11 @@ function injectAndDeleteIframeFromMainFrame(counter, tabId) { |
// Inject code into each frame. If it's the parent frame, it removes the child |
// frame from the DOM (invalidating it). The child frame's code shouldn't |
// finish executing, since it's been removed. |
+ counter.expectedResponses = 1; |
+ counter.doneCallback = function() { |
+ chrome.test.assertEq(1, counter.responsesReceived); |
+ chrome.test.succeed(); |
+ }; |
var injectFrameCode = [ |
'if (window === window.top) {', |
' iframe = document.getElementsByTagName("iframe")[0];', |
@@ -57,16 +73,17 @@ function injectAndDeleteIframeFromMainFrame(counter, tabId) { |
].join('\n'); |
chrome.tabs.executeScript( |
tabId, |
- {code: injectFrameCode, allFrames: true, runAt: 'document_idle'}, |
- function() { |
- chrome.test.assertEq(1, counter.responsesReceived); |
- chrome.test.succeed(); |
- }); |
+ {code: injectFrameCode, allFrames: true, runAt: 'document_idle'}); |
}; |
function injectAndDeleteIframeFromIframe(counter, tabId) { |
// Inject code into each frame. Have the child frame remove itself, deleting |
// the frame while it's still executing. |
+ counter.expectedResponses = 2; |
+ counter.doneCallback = function() { |
+ chrome.test.assertEq(2, counter.responsesReceived); |
+ chrome.test.succeed(); |
+ }; |
var injectFrameCode = [ |
'if (window.self !== window.top) {', |
' var iframe = window.top.document.getElementsByTagName("iframe")[0];', |
@@ -85,11 +102,5 @@ function injectAndDeleteIframeFromIframe(counter, tabId) { |
{code: injectFrameCode, allFrames: true, runAt: 'document_idle'}); |
chrome.tabs.executeScript( |
tabId, |
- {code: injectFrameCode, allFrames: true, runAt: 'document_idle'}, |
- function() { |
- // Script execution, all other things equal, should happen in the order it |
- // was received, so we only need a check in the second callback. |
- chrome.test.assertEq(2, counter.responsesReceived); |
- chrome.test.succeed(); |
- }); |
+ {code: injectFrameCode, allFrames: true, runAt: 'document_idle'}); |
} |