diff options
Diffstat (limited to 'chrome/browser/extensions')
-rw-r--r-- | chrome/browser/extensions/extension_messages_unittest.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_messages_unittest.cc b/chrome/browser/extensions/extension_messages_unittest.cc index 7da3f38..7bf402f 100644 --- a/chrome/browser/extensions/extension_messages_unittest.cc +++ b/chrome/browser/extensions/extension_messages_unittest.cc @@ -147,3 +147,72 @@ TEST_F(RenderViewTest, ExtensionMessagesOnConnect) { ASSERT_TRUE(IPC::ReadParam(alert_msg, &iter, &alert_param)); EXPECT_EQ(L"disconnected: 24", alert_param.a); } + +// Tests that we don't send the disconnect message until all ports have +// disconnected. +TEST_F(RenderViewTest, ExtensionMessagesDisconnect) { + LoadHTML("<body></body>"); + ExecuteJavaScript( + "chrome.self.onConnect.addListener(function (port) {" + " port.onMessage.addListener(function(msg, p) {" + " if (msg.disconnect) port.disconnect();" + " });" + "});" + "var iframe1 = document.createElement('iframe');" + "var iframe2 = document.createElement('iframe');" + "var src = 'javascript:" + " chrome.self.onConnect.addListener(function(port) {" + " port.postMessage(\"onconnect\");" + " port.onMessage.addListener(function(p) { alert(\"NOTREACHED\"); });" + " port.disconnect();" + " });';" + "iframe1.src = src;" + "iframe2.src = src;" + "document.body.appendChild(iframe1);" + "document.body.appendChild(iframe2);"); + + render_thread_.sink().ClearMessages(); + + // Simulate a new connection being opened. The two child frames should + // disconnect immediately, but we shouldn't get a disconnect message until + // all 3 frames disconnect. + const int kPortId = 0; + const std::string kPortName = "testName"; + DispatchOnConnect(kPortId, kPortName, "null"); + + // Verify that we handled the new connection by posting a message. + const IPC::Message* post_msg = + render_thread_.sink().GetFirstMessageMatching( + ViewHostMsg_ExtensionPostMessage::ID); + ASSERT_TRUE(post_msg); + ViewHostMsg_ExtensionPostMessage::Param post_params; + ViewHostMsg_ExtensionPostMessage::Read(post_msg, &post_params); + EXPECT_EQ("\"onconnect\"", post_params.b); + + // Simulate sending a message. + render_thread_.sink().ClearMessages(); + DispatchOnMessage("{\"val\": 42}", kPortId); + + // If we get an alert box, then the iframes failed to disconnect properly. + const IPC::Message* alert_msg = + render_thread_.sink().GetFirstMessageMatching( + ViewHostMsg_RunJavaScriptMessage::ID); + ASSERT_FALSE(alert_msg); + + // We should not get a disconnect message yet, since the toplevel frame didn't + // disconnect. + const IPC::Message* disconnect_msg = + render_thread_.sink().GetFirstMessageMatching( + ViewHostMsg_ExtensionCloseChannel::ID); + ASSERT_FALSE(disconnect_msg); + + // Disconnect the port in the top frame. + render_thread_.sink().ClearMessages(); + DispatchOnMessage("{\"disconnect\": true}", kPortId); + + // Now we should have a disconnect message. + disconnect_msg = + render_thread_.sink().GetUniqueMessageMatching( + ViewHostMsg_ExtensionCloseChannel::ID); + ASSERT_TRUE(disconnect_msg); +} |