diff options
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/extensions/extension_browsertests_misc.cc | 252 | ||||
-rw-r--r-- | chrome/test/data/extensions/subscribe_page_action/common.js | 55 | ||||
-rw-r--r-- | chrome/test/data/extensions/subscribe_page_action/options.html | 78 | ||||
-rw-r--r-- | chrome/test/data/extensions/subscribe_page_action/subscribe.html | 25 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.cc | 26 | ||||
-rw-r--r-- | chrome/test/ui_test_utils.h | 3 |
6 files changed, 269 insertions, 170 deletions
diff --git a/chrome/browser/extensions/extension_browsertests_misc.cc b/chrome/browser/extensions/extension_browsertests_misc.cc index 1f3f31f..c1f9114 100644 --- a/chrome/browser/extensions/extension_browsertests_misc.cc +++ b/chrome/browser/extensions/extension_browsertests_misc.cc @@ -28,8 +28,8 @@ #include "chrome/test/ui_test_utils.h" #include "net/base/net_util.h" -const std::wstring kSubscribePage = - L"files/extensions/subscribe_page_action/subscribe.html"; +const std::string kSubscribePage = + "chrome-extension://flpjckblglahjimhgaagkpdjdcojkgil/subscribe.html"; const std::wstring kFeedPage = L"files/feeds/feed.html"; const std::wstring kFeedPageMultiRel = L"files/feeds/feed_multi_rel.html"; const std::wstring kNoFeedPage = L"files/feeds/no_feed.html"; @@ -341,11 +341,19 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, TitleLocalizationPageAction) { extension->page_action()->GetTitle(tab_id).c_str()); } -GURL GetFeedUrl(HTTPTestServer* server, const std::wstring& feed_page) { - static GURL base_url = server->TestServerPageW(kSubscribePage); +GURL GetFeedUrl(HTTPTestServer* server, const std::wstring& feed_page, + bool direct_url) { GURL feed_url = server->TestServerPageW(feed_page); - return GURL(base_url.spec() + std::string("?") + feed_url.spec() + - std::string("&synchronous")); + if (direct_url) { + // We navigate directly to the subscribe page for feeds where the feed + // sniffing won't work, in other words, as is the case for malformed feeds. + return GURL(std::string(kSubscribePage) + std::string("?") + + feed_url.spec() + std::string("&synchronous")); + } else { + // Navigate to the feed content (which will cause the extension to try to + // sniff the type and display the subscribe page in another tab. + return GURL(feed_url.spec()); + } } static const wchar_t* jscript_feed_title = @@ -373,139 +381,209 @@ static const wchar_t* jscript_error = L" \"No error\"" L");"; -void GetParsedFeedData(HTTPTestServer* server, - const std::wstring& url, - Browser* browser, - const std::string& expected_feed_title, - const std::string& expected_item_title, - const std::string& expected_item_desc, - const std::string& expected_error) { +// Navigates to a feed page and, if |sniff_xml_type| is set, wait for the +// extension to kick in, detect the feed and redirect to a feed preview page. +// |sniff_xml_type| is generally set to true if the feed is sniffable and false +// for invalid feeds. +void NavigateToFeedAndValidate(HTTPTestServer* server, + const std::wstring& url, + Browser* browser, + bool sniff_xml_type, + const std::string& expected_feed_title, + const std::string& expected_item_title, + const std::string& expected_item_desc, + const std::string& expected_error) { std::string feed_title; std::string item_title; std::string item_desc; std::string error; - ui_test_utils::NavigateToURL(browser, GetFeedUrl(server, url)); + ui_test_utils::NavigateToURL(browser, + GetFeedUrl(server, url, !sniff_xml_type)); + + if (sniff_xml_type) { + // Navigate to the feed will cause the extension to sniff the type and + // create an extra tab showing the feed preview. + TabStripModel* tab_strip = browser->tabstrip_model(); + if (tab_strip->count() == 1) + ui_test_utils::WaitForTabParented(); + } + + TabContents* tab = browser->GetSelectedTabContents(); + + int retries = 10; + while (retries--) { + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( + tab->render_view_host(), + L"", // Title is on the main page, all the rest is in the IFRAME. + jscript_feed_title, &feed_title)); + if (expected_feed_title == feed_title) + break; // We are done. + + // We are testing the actual feed sniffing + redirecting to the preview page + // so we can't pass the 'synchronous' test flag that we use for malformed + // feeds. We also have no signals from the extension telling us when it is + // done parsing the feed, so we need to check periodically. + MessageLoopForUI::current()->PostDelayedTask( + FROM_HERE, new MessageLoop::QuitTask(), 500); + ui_test_utils::RunMessageLoop(); + } + ASSERT_STREQ(expected_feed_title.c_str(), feed_title.c_str()); ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), - L"", // Title is on the main page, all the rest is in the IFRAME. - jscript_feed_title, &feed_title)); - ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), + tab->render_view_host(), L"//html/body/div/iframe[1]", jscript_anchor, &item_title)); + ASSERT_STREQ(expected_item_title.c_str(), item_title.c_str()); + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), + tab->render_view_host(), L"//html/body/div/iframe[1]", jscript_desc, &item_desc)); + ASSERT_STREQ(expected_item_desc.c_str(), item_desc.c_str()); + ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractString( - browser->GetSelectedTabContents()->render_view_host(), + tab->render_view_host(), L"//html/body/div/iframe[1]", jscript_error, &error)); - - EXPECT_STREQ(expected_feed_title.c_str(), feed_title.c_str()); - EXPECT_STREQ(expected_item_title.c_str(), item_title.c_str()); - EXPECT_STREQ(expected_item_desc.c_str(), item_desc.c_str()); - EXPECT_STREQ(expected_error.c_str(), error.c_str()); + ASSERT_STREQ(expected_error.c_str(), error.c_str()); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed1) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed1) { HTTPTestServer* server = StartHTTPServer(); - GetParsedFeedData(server, kValidFeed1, browser(), - "Feed for 'MyFeedTitle'", - "Title 1", - "Desc", - "No error"); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + + NavigateToFeedAndValidate(server, kValidFeed1, browser(), true, + "Feed for MyFeedTitle", + "Title 1", + "Desc", + "No error"); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed2) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed2) { HTTPTestServer* server = StartHTTPServer(); - GetParsedFeedData(server, kValidFeed2, browser(), - "Feed for 'MyFeed2'", - "My item title1", - "This is a summary.", - "No error"); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + + NavigateToFeedAndValidate(server, kValidFeed2, browser(), true, + "Feed for MyFeed2", + "My item title1", + "This is a summary.", + "No error"); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed3) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed3) { HTTPTestServer* server = StartHTTPServer(); - GetParsedFeedData(server, kValidFeed3, browser(), - "Feed for 'Google Code buglist rss feed'", - "My dear title", - "My dear content", - "No error"); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + + NavigateToFeedAndValidate(server, kValidFeed3, browser(), true, + "Feed for Google Code buglist rss feed", + "My dear title", + "My dear content", + "No error"); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed4) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed4) { HTTPTestServer* server = StartHTTPServer(); - GetParsedFeedData(server, kValidFeed4, browser(), - "Feed for 'Title chars <script> %23 stop'", - "Title chars ", - "My dear content", - "No error"); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + + NavigateToFeedAndValidate(server, kValidFeed4, browser(), true, + "Feed for Title chars <script> %23 stop", + "Title chars ", + "My dear content", + "No error"); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed0) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed0) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Try a feed with a link with an onclick handler (before r27440 this would // trigger a NOTREACHED). - GetParsedFeedData(server, kValidFeed0, browser(), - "Feed for 'MyFeedTitle'", - "Title 1", - "Desc VIDEO", - "No error"); + NavigateToFeedAndValidate(server, kValidFeed0, browser(), true, + "Feed for MyFeedTitle", + "Title 1", + "Desc VIDEO", + "No error"); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedValidFeed5) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeed5) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Feed with valid but mostly empty xml. - GetParsedFeedData(server, kValidFeed5, browser(), - "Feed for 'Unknown feed name'", - "element 'anchor_0' not found", - "element 'desc_0' not found", - "This feed contains no entries."); + NavigateToFeedAndValidate(server, kValidFeed5, browser(), true, + "Feed for Unknown feed name", + "element 'anchor_0' not found", + "element 'desc_0' not found", + "This feed contains no entries."); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedInvalidFeed1) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, FLAKY_ParseFeedInvalidFeed1) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Try an empty feed. - GetParsedFeedData(server, kInvalidFeed1, browser(), - "Feed for 'Unknown feed name'", - "element 'anchor_0' not found", - "element 'desc_0' not found", - "Not a valid feed."); + NavigateToFeedAndValidate(server, kInvalidFeed1, browser(), false, + "Feed for Unknown feed name", + "element 'anchor_0' not found", + "element 'desc_0' not found", + "Not a valid feed."); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedInvalidFeed2) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, FLAKY_ParseFeedInvalidFeed2) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Try a garbage feed. - GetParsedFeedData(server, kInvalidFeed2, browser(), - "Feed for 'Unknown feed name'", - "element 'anchor_0' not found", - "element 'desc_0' not found", - "Not a valid feed."); + NavigateToFeedAndValidate(server, kInvalidFeed2, browser(), false, + "Feed for Unknown feed name", + "element 'anchor_0' not found", + "element 'desc_0' not found", + "Not a valid feed."); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, DISABLED_ParseFeedInvalidFeed3) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, FLAKY_ParseFeedInvalidFeed3) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Try a feed that doesn't exist. - GetParsedFeedData(server, L"foo.xml", browser(), - "Feed for 'Unknown feed name'", - "element 'anchor_0' not found", - "element 'desc_0' not found", - "Not a valid feed."); + NavigateToFeedAndValidate(server, L"foo.xml", browser(), false, + "Feed for Unknown feed name", + "element 'anchor_0' not found", + "element 'desc_0' not found", + "Not a valid feed."); } -IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, - DISABLED_ParseFeedValidFeedNoLinks) { +IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, ParseFeedValidFeedNoLinks) { HTTPTestServer* server = StartHTTPServer(); + + ASSERT_TRUE(LoadExtension( + test_data_dir_.AppendASCII("subscribe_page_action"))); + // Valid feed but containing no links. - GetParsedFeedData(server, kValidFeedNoLinks, browser(), - "Feed for 'MyFeedTitle'", - "Title with no link", - "Desc", - "No error"); + NavigateToFeedAndValidate(server, kValidFeedNoLinks, browser(), true, + "Feed for MyFeedTitle", + "Title with no link", + "Desc", + "No error"); } // Tests that an error raised during an async function still fires diff --git a/chrome/test/data/extensions/subscribe_page_action/common.js b/chrome/test/data/extensions/subscribe_page_action/common.js index 7d27ca2..6752ce4 100644 --- a/chrome/test/data/extensions/subscribe_page_action/common.js +++ b/chrome/test/data/extensions/subscribe_page_action/common.js @@ -1,3 +1,7 @@ +// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + // Whether we can modify the list of readers. var storageEnabled = window.localStorage != null; @@ -32,46 +36,23 @@ function isDefaultReader(url) { } /** -* Given the tag, find if there is a __MSG_some__ message in -* innerHTML, and replace it if there is. +* Find an element with |id| and replace the text of it with i18n message with +* |msg| key. */ -function substituteMessagesForTag(tag) { - var elements = document.getElementsByTagName(tag); - if (!elements) - return; - - var message_format = "__MSG_([a-zA-Z0-9_@]+)__"; - for (i = 0; i < elements.length; i++) { - var old_text = elements[i].innerHTML.match(message_format); - if (!old_text) - continue; - - var new_text = chrome.i18n.getMessage(old_text[1]); - elements[i].innerHTML = - elements[i].innerHTML.replace(old_text[0], new_text); +function i18nReplaceImpl(id, msg, attribute) { + var element = document.getElementById(id); + if (element) { + if (attribute) + element.setAttribute(attribute, chrome.i18n.getMessage(msg)); + else + element.innerText = chrome.i18n.getMessage(msg); } } /** -* Given the tag, find if the given attribute has __MSG_some__ message -* and replace it if there is. +* Same as i18nReplaceImpl but provided for convenience for elements that have +* the same id as the i18n message id. */ -function substituteMessagesForTagAttribute(tag, attribute) { - var elements = document.getElementsByTagName(tag); - if (!elements) - return; - - var message_format = "__MSG_([a-zA-Z0-9_@]+)__"; - for (i = 0; i < elements.length; i++) { - var attribute_value = elements[i].getAttribute(attribute); - if (!attribute_value) - return; - - var old_text = attribute_value.match(message_format); - if (!old_text) - continue; - - elements[i].setAttribute( - attribute, chrome.i18n.getMessage(old_text[1])); - } -}
\ No newline at end of file +function i18nReplace(msg) { + i18nReplaceImpl(msg, msg, ''); +} diff --git a/chrome/test/data/extensions/subscribe_page_action/options.html b/chrome/test/data/extensions/subscribe_page_action/options.html index 2366d49..38f13f3 100644 --- a/chrome/test/data/extensions/subscribe_page_action/options.html +++ b/chrome/test/data/extensions/subscribe_page_action/options.html @@ -100,6 +100,10 @@ body>* { padding-right: 10px; } +.urlAssist { + padding-left: 30px; +} + .status { background-color: #FFF18A; } @@ -120,12 +124,6 @@ function main() { document.title = chrome.i18n.getMessage("rss_subscription_edit_dialog_title"); - substituteMessagesForTag("td"); - substituteMessagesForTag("div"); - substituteMessagesForTag("button"); - - substituteMessagesForTagAttribute("input", "value"); - // Make sure the dialog is not visible. document.getElementById('dialogBackground').style.display = "none"; @@ -230,7 +228,8 @@ function editReader(index) { var oldOption = readerListbox.options[editingIndex]; document.getElementById('urlText').value = oldOption.value; document.getElementById('descriptionText').value = - oldOption.text.replace(' (default)', ''); + oldOption.text.replace( + ' ' + chrome.i18n.getMessage("rss_subscription_default"), ''); editingDefault = isDefaultReader(oldOption.value); } @@ -329,18 +328,34 @@ function save() { main(); } +function init() { + i18nReplace('rss_subscription_options'); + i18nReplaceImpl('addReader', 'rss_subscription_add_reader'); + i18nReplaceImpl('editReader', 'rss_subscription_edit_reader'); + i18nReplaceImpl('removeReader', 'rss_subscription_remove_reader'); + i18nReplaceImpl('setDefault', 'rss_subscription_make_default_reader'); + i18nReplaceImpl('resetList', 'rss_subscription_reset_list'); + i18nReplace('rss_subscription_always_use_default'); + i18nReplaceImpl('dialogHeader', 'rss_subscription_edit_dialog_title'); + i18nReplace('rss_subscription_feed_description'); + i18nReplace('rss_subscription_feed_url'); + i18nReplaceImpl('save', 'rss_subscription_save_button', 'value'); + i18nReplaceImpl('rss_subscription_close_button', + 'rss_subscription_close_button', 'value'); + main(); +} </script> </head> -<body onload="main()"> +<body onload="init()"> <table border="0"> <tr> <td valign="top" width="16"> <img src="feed-icon-16x16.png" /> </td> <td valign="middle"> - <strong>__MSG_rss_subscription_options__</strong> + <strong id="rss_subscription_options"></strong> </td> - <td> + <td colspan="2"> </td> </tr> <tr> @@ -349,23 +364,25 @@ function save() { onchange="onSelectionChanged()"></select> </td> <td valign="top"> - <button style="width:100%;" id="addReader" onclick="editReader(-1)"> - __MSG_rss_subscription_add_reader__</button><br /> - <button style="width:100%;" id="editReader" onclick="editReader(0)"> - __MSG_rss_subscription_edit_reader__</button><br /> - <button style="width:100%;" id="removeReader" onclick="removeReader()"> - __MSG_rss_subscription_remove_reader__</button><br /> - <button style="width:100%;" id="setDefault" onclick="setDefault()"> - __MSG_rss_subscription_make_default_reader__</button><br /> - <button style="width:100%;" id="resetList" onclick="resetList()"> - __MSG_rss_subscription_reset_list__</button><br /> + <button style="width:100%;" id="addReader" onclick="editReader(-1)" + ></button><br /> + <button style="width:100%;" id="editReader" onclick="editReader(0)" + ></button><br /> + <button style="width:100%;" id="removeReader" onclick="removeReader()" + ></button><br /> + <button style="width:100%;" id="setDefault" onclick="setDefault()" + ></button><br /> + <button style="width:100%;" id="resetList" onclick="resetList()" + ></button><br /> + </td> + <td style="width: 200px;"> </td> </tr> <tr> - <td colspan="3"> + <td colspan="4"> <input type="checkbox" id="alwaysUseDefault" value="alwaysUseDefault" onchange="toggleFeedPreview()" - >__MSG_rss_subscription_always_use_default__ + ><span id="rss_subscription_always_use_default"></span> </td> </tr> </table> @@ -374,9 +391,7 @@ function save() { <div id="dialogHBackground"> <div id="dialog"> - <div id="dialogHeader"> - __MSG_rss_subscription_edit_dialog_title__ - </div> + <div id="dialogHeader"></div> <div id="dialogBody"> @@ -385,36 +400,31 @@ function save() { </div> <div class="dialogRow"> - <div> - __MSG_rss_subscription_feed_description__ - </div> + <div id="rss_subscription_feed_description"></div> <div> <input type="text" id="descriptionText" onkeyup="validateInput()"> </div> </div> <div class="dialogRow"> - <div> - __MSG_rss_subscription_feed_url__ - </div> + <div id="rss_subscription_feed_url"></div> <div> <input type="text" id="urlText" onkeyup="validateInput()"> </div> </div> <div class="dialogRow"> - <div id="urlAssist"></div> + <div id="urlAssist" class="urlAssist"></div> </div> <div class="dialogRow" id="dialogContentFooter"> <div> <input type="button" id="save" - value="__MSG_rss_subscription_save_button__" onclick="save()"> </div> <div> <input type="button" - value="__MSG_rss_subscription_close_button__" + id="rss_subscription_close_button" onclick="hideDialog()"> </div> </div> diff --git a/chrome/test/data/extensions/subscribe_page_action/subscribe.html b/chrome/test/data/extensions/subscribe_page_action/subscribe.html index f4bccbc..028b03b 100644 --- a/chrome/test/data/extensions/subscribe_page_action/subscribe.html +++ b/chrome/test/data/extensions/subscribe_page_action/subscribe.html @@ -13,10 +13,14 @@ <script> function init() { document.title = - chrome.i18n.getMessage("rss_subscription_default_title"); + chrome.i18n.getMessage("rss_subscription_default_title"); + i18nReplace('rss_subscription_subscribe_using'); + i18nReplace('rss_subscription_subscribe_button'); + i18nReplace('rss_subscription_always_use'); + i18nReplace('rss_subscription_feed_preview'); + i18nReplaceImpl('feedUrl', 'rss_subscription_feed_link', ''); + main(); - substituteMessagesForTag("span"); - substituteMessagesForTag("button"); } </script> </head> @@ -37,15 +41,14 @@ <td align="right" valign="middle"> <div> <span style="white-space: nowrap" - >__MSG_rss_subscription_subscribe_using__</span> + id="rss_subscription_subscribe_using"></span> </div> </td> <td valign="top"> <div style="margin-left:2px"> <select id="readerDropdown" onChange="onSelectChanged()"></select> - <button onclick="navigate();"> - __MSG_rss_subscription_subscribe_button__ - </button><br /> + <button onclick="navigate();" + id="rss_subscription_subscribe_button"></button><br /> </div> </td> </tr> @@ -54,7 +57,7 @@ <td valign="top" colspan="2"> <span id="alwaysUseSpan" style="display:none"><input type="checkbox" id="alwaysUse" value="AlwaysUse" - >__MSG_rss_subscription_always_use__</span> + ><span id="rss_subscription_always_use"></span></span> </td> </tr> </table> @@ -66,10 +69,10 @@ <div class="splitter"> <span class="feedUrlSpan" id="feedUrlSpan"> <span class="feedUrl" - >[ <a id="feedUrl" class="feedUrl" + >[ <a id="feedUrl" class="feedUrl" target="_blank" title="The feed page currently being previewed." - >__MSG_rss_subscription_feed_link__</a> ]</span></span> - <span><b>__MSG_rss_subscription_feed_preview__</b></span> + ></a> ]</span></span> + <span><b id="rss_subscription_feed_preview"></b></span> </div> <div id="items"></div> </body> diff --git a/chrome/test/ui_test_utils.cc b/chrome/test/ui_test_utils.cc index d1cd7d3..fb1ec65 100644 --- a/chrome/test/ui_test_utils.cc +++ b/chrome/test/ui_test_utils.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -259,6 +259,26 @@ class SimpleNotificationObserver : public NotificationObserver { DISALLOW_COPY_AND_ASSIGN(SimpleNotificationObserver); }; +class TabParentedNotificationObserver : public NotificationObserver { + public: + TabParentedNotificationObserver() { + registrar_.Add(this, NotificationType::TAB_PARENTED, + NotificationService::AllSources()); + ui_test_utils::RunMessageLoop(); + } + + virtual void Observe(NotificationType type, + const NotificationSource& source, + const NotificationDetails& details) { + MessageLoopForUI::current()->Quit(); + } + + private: + NotificationRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(TabParentedNotificationObserver); +}; + class LanguageDetectionNotificationObserver : public NotificationObserver { public: explicit LanguageDetectionNotificationObserver(TabContents* tab) { @@ -395,6 +415,10 @@ void WaitForNewTab(Browser* browser) { new_tab_observer(NotificationType::TAB_ADDED, browser); } +void WaitForTabParented() { + TabParentedNotificationObserver new_tab_observer; +} + void WaitForLoadStop(NavigationController* controller) { SimpleNotificationObserver<NavigationController> new_tab_observer(NotificationType::LOAD_STOP, controller); diff --git a/chrome/test/ui_test_utils.h b/chrome/test/ui_test_utils.h index 74482b8..462a9ec 100644 --- a/chrome/test/ui_test_utils.h +++ b/chrome/test/ui_test_utils.h @@ -64,6 +64,9 @@ void WaitForNavigations(NavigationController* controller, // Waits for a new tab to be added to |browser|. void WaitForNewTab(Browser* browser); +// Waits for a tab to be parented. +void WaitForTabParented(); + // Waits for a load stop for the specified |controller|. void WaitForLoadStop(NavigationController* controller); |