summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
Diffstat (limited to 'chrome')
-rw-r--r--chrome/browser/extensions/extension_browsertests_misc.cc252
-rw-r--r--chrome/test/data/extensions/subscribe_page_action/common.js55
-rw-r--r--chrome/test/data/extensions/subscribe_page_action/options.html78
-rw-r--r--chrome/test/data/extensions/subscribe_page_action/subscribe.html25
-rw-r--r--chrome/test/ui_test_utils.cc26
-rw-r--r--chrome/test/ui_test_utils.h3
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);