| Index: chrome/test/data/extensions/api_test/tabs/on_updated/test.html
 | 
| diff --git a/chrome/test/data/extensions/api_test/tabs/on_updated/test.html b/chrome/test/data/extensions/api_test/tabs/on_updated/test.html
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..284c6f74f5c5a7df2f595e39405d683c1172973a
 | 
| --- /dev/null
 | 
| +++ b/chrome/test/data/extensions/api_test/tabs/on_updated/test.html
 | 
| @@ -0,0 +1,112 @@
 | 
| +<script>
 | 
| +// Description
 | 
| +
 | 
| +var expectedEventData;
 | 
| +var capturedEventData;
 | 
| +var shouldIgnore;
 | 
| +
 | 
| +function expect(data, ignoreFunc) {
 | 
| +  expectedEventData = data;
 | 
| +  capturedEventData = [];
 | 
| +  shouldIgnore = ignoreFunc;
 | 
| +}
 | 
| +
 | 
| +function checkExpectations() {
 | 
| +  if (capturedEventData.length < expectedEventData.length) {
 | 
| +    return;
 | 
| +  }
 | 
| +  chrome.test.assertEq(JSON.stringify(expectedEventData),
 | 
| +      JSON.stringify(capturedEventData));
 | 
| +  chrome.test.succeed();
 | 
| +}
 | 
| +
 | 
| +var getURL = chrome.extension.getURL;
 | 
| +
 | 
| +chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
 | 
| +  console.log('---onUpdated: ' + info.status + ', ' + info.url);
 | 
| +  if (shouldIgnore && shouldIgnore(info)) {
 | 
| +    return;
 | 
| +  }
 | 
| +  capturedEventData.push(info);
 | 
| +  checkExpectations();
 | 
| +});
 | 
| +
 | 
| +chrome.test.runTests([
 | 
| +  function browserThenRendererInitiated() {
 | 
| +    // Note that a.html will set it's location.href to b.html, creating a
 | 
| +    // renderer-initiated navigation.
 | 
| +    expect([
 | 
| +      { status: 'loading', url: getURL('browserThenRendererInitiated/a.html') },
 | 
| +      { status: 'complete' },
 | 
| +      { status: 'loading', url: getURL('browserThenRendererInitiated/b.html') },
 | 
| +      { status: 'complete' },
 | 
| +    ]);
 | 
| +
 | 
| +    chrome.tabs.create({ url: getURL('browserThenRendererInitiated/a.html') });    
 | 
| +  },
 | 
| +
 | 
| +  function newTab() {
 | 
| +    // Test for crbug.com/27208.
 | 
| +    expect([
 | 
| +      { status: 'loading', url: 'chrome://newtab/' },
 | 
| +      { status: 'complete' }
 | 
| +    ]);
 | 
| +
 | 
| +    chrome.tabs.create({ url: 'chrome://newtab/' });    
 | 
| +  },
 | 
| +
 | 
| +  /*
 | 
| +  // TODO(rafaelw) -- This is disabled because this test is flakey.
 | 
| +  function updateDuringCreateCallback() {
 | 
| +    // Test for crbug.com/27204.
 | 
| +    // We have to ignore anything that comes before the about:blank loading
 | 
| +    // status.
 | 
| +    var ignore = true;
 | 
| +    expect([
 | 
| +      { status: 'loading', url: 'about:blank' },
 | 
| +      { status: 'complete' }
 | 
| +    ], function(info) {
 | 
| +      if (info.status === 'loading' && info.url === 'about:blank') {
 | 
| +        ignore = false;
 | 
| +      }
 | 
| +      return ignore;
 | 
| +    });
 | 
| +
 | 
| +    chrome.tabs.create({ url: 'chrome://newtab/' }, function(tab) {
 | 
| +      chrome.tabs.update(tab.id, { url: 'about:blank' });
 | 
| +    });
 | 
| +  }, */
 | 
| +
 | 
| +  function iframeNavigated() {
 | 
| +    // The sequence of events goes like this:
 | 
| +    // -a.html starts loading
 | 
| +    // -while a.html is loading, iframe1.html (in it's onload) navigates to
 | 
| +    // iframe2.html. This causes the page to continue to be in the loading state
 | 
| +    //  so the 'complete' status doesn't fire.
 | 
| +    // -iframe2.html does a setTimeout to navigate itself to iframe3.html. This
 | 
| +    // allows the page to stop loading and the 'complete' status to fire, but
 | 
| +    // when the timeout fires, the pages goes back into the loading state
 | 
| +    // which causes the new status: 'loading' event to fire without having
 | 
| +    // changed the url.
 | 
| +    expect([
 | 
| +      { status: 'loading', url: getURL('iframeNavigated/a.html') },
 | 
| +      { status: 'complete' },
 | 
| +      { status: 'loading' },
 | 
| +      { status: 'complete' },
 | 
| +    ]);
 | 
| +
 | 
| +    chrome.tabs.create({ url: getURL('iframeNavigated/a.html') });    
 | 
| +  },
 | 
| +  
 | 
| +  function internalAnchorNavigated() {
 | 
| +    expect([
 | 
| +      { status: 'loading', url: getURL('internalAnchorNavigated/a.html') },
 | 
| +      { status: 'complete' },
 | 
| +      { status: 'loading', url: getURL('internalAnchorNavigated/a.html#b') },
 | 
| +      { status: 'complete' },
 | 
| +    ]);
 | 
| +
 | 
| +    chrome.tabs.create({ url: getURL('internalAnchorNavigated/a.html') });    
 | 
| +  }
 | 
| +]);
 | 
| +</script>
 | 
| 
 |