| Index: chrome/test/data/extensions/api_test/messaging/connect/test.js | 
| diff --git a/chrome/test/data/extensions/api_test/messaging/connect/test.js b/chrome/test/data/extensions/api_test/messaging/connect/test.js | 
| index d76997fd34bccc78feb735d7c6a85a1ca5f24eed..29a870e65f0d226d010700fbb73708ed50350405 100644 | 
| --- a/chrome/test/data/extensions/api_test/messaging/connect/test.js | 
| +++ b/chrome/test/data/extensions/api_test/messaging/connect/test.js | 
| @@ -70,6 +70,7 @@ chrome.test.getConfig(function(config) { | 
| listenOnce(chrome.runtime.onConnect, function(port) { | 
| chrome.test.assertEq({ | 
| tab: testTab, | 
| +          frameId: 0, // Main frame | 
| url: testTab.url, | 
| id: chrome.runtime.id | 
| }, port.sender); | 
| @@ -95,6 +96,7 @@ chrome.test.getConfig(function(config) { | 
| function(request, sender, sendResponse) { | 
| chrome.test.assertEq({ | 
| tab: testTab, | 
| +            frameId: 0, // Main frame | 
| url: testTab.url, | 
| id: chrome.runtime.id | 
| }, sender); | 
| @@ -116,6 +118,51 @@ chrome.test.getConfig(function(config) { | 
| chrome.test.log("sendMessageFromTab: sent first message to tab"); | 
| }, | 
|  | 
| +    // Tests that a message from a child frame has a correct frameId. | 
| +    function sendMessageFromFrameInTab() { | 
| +      var senderFrameUrl = {}; | 
| +      listenForever( | 
| +        chrome.runtime.onMessage, | 
| +        function(request, sender, sendResponse) { | 
| +          // Child frames have a positive frameId. | 
| +          chrome.test.assertTrue(sender.frameId >= 1, | 
| +              'frameId must be positive, but it is ' + sender.frameId); | 
| +          chrome.test.assertFalse(sender.frameId in messageSenders, | 
| +              'frameId ' + sender.frameId + ' was already seen before!'); | 
| +          senderFrameUrl[sender.frameId] = request.frameUrl; | 
| +          delete sender.frameId; | 
| +          chrome.test.assertEq({ | 
| +            tab: testTab, | 
| +            url: request.frameUrl, | 
| +            id: chrome.runtime.id | 
| +          }, sender); | 
| + | 
| +          if (Object.keys(senderFrameUrl).length == 2) { | 
| +            // Now test whether the frameId that we got back makes sense... | 
| +            chrome.webNavigation.getAllFrames({ | 
| +              tabId: testTab.id | 
| +            }, function(details) { | 
| +              var framesFound = 0; | 
| +              details.forEach(function(frame) { | 
| +                var url = senderFrameUrl[frame.frameId]; | 
| +                if (url) { | 
| +                  chrome.test.assertEq(frame.url, url); | 
| +                  ++framesFound; | 
| +                } | 
| +              }); | 
| +              chrome.test.assertEq(framesFound, 2); | 
| +              doneListening(); | 
| +            }); | 
| +          } | 
| +        } | 
| +      ); | 
| + | 
| +      var port = chrome.tabs.connect(testTab.id); | 
| +      port.postMessage({testSendMessageFromFrame: true}); | 
| +      port.disconnect(); | 
| +      chrome.test.log("sendMessageFromFrameInTab: send 1st message to tab"); | 
| +    }, | 
| + | 
| // Tests error handling when sending a request from a content script to an | 
| // invalid extension. | 
| function sendMessageFromTabError() { | 
|  |