summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordavemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-27 17:26:58 +0000
committerdavemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-27 17:26:58 +0000
commit5019ef1ab7f79f71fffabe14ab7ae9bfcb44daa8 (patch)
treeb2a439da42c4bd6de2b8516428b065bdabaf129f
parent62e0dbdec1c30c929d7c6148372b153e9b1c1792 (diff)
downloadchromium_src-5019ef1ab7f79f71fffabe14ab7ae9bfcb44daa8.zip
chromium_src-5019ef1ab7f79f71fffabe14ab7ae9bfcb44daa8.tar.gz
chromium_src-5019ef1ab7f79f71fffabe14ab7ae9bfcb44daa8.tar.bz2
Add support for new webkit capability allowing us to update
favicons when changed via Javascript. BUG=none TEST=BrowserTest.FaviconChange Review URL: http://codereview.chromium.org/1747015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@45713 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/browser_browsertest.cc19
-rw-r--r--chrome/browser/fav_icon_helper.cc5
-rw-r--r--chrome/common/render_messages_internal.h3
-rw-r--r--chrome/renderer/render_view.cc9
-rw-r--r--chrome/renderer/render_view.h1
-rwxr-xr-xchrome/test/data/onload_change_favicon.html37
6 files changed, 74 insertions, 0 deletions
diff --git a/chrome/browser/browser_browsertest.cc b/chrome/browser/browser_browsertest.cc
index 4abc544..ff2b40e 100644
--- a/chrome/browser/browser_browsertest.cc
+++ b/chrome/browser/browser_browsertest.cc
@@ -383,6 +383,25 @@ IN_PROC_BROWSER_TEST_F(BrowserTest, FaviconOfOnloadRedirectToAnchorPage) {
EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
}
+// Test that an icon can be changed from JS.
+IN_PROC_BROWSER_TEST_F(BrowserTest, FaviconChange) {
+ static const FilePath::CharType* kFile =
+ FILE_PATH_LITERAL("onload_change_favicon.html");
+ GURL file_url(ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
+ FilePath(kFile)));
+ ASSERT_TRUE(file_url.SchemeIs(chrome::kFileScheme));
+ ui_test_utils::NavigateToURL(browser(), file_url);
+
+ NavigationEntry* entry = browser()->GetSelectedTabContents()->
+ controller().GetActiveEntry();
+ static const FilePath::CharType* kIcon =
+ FILE_PATH_LITERAL("test1.png");
+ GURL expected_favicon_url(
+ ui_test_utils::GetTestUrl(FilePath(FilePath::kCurrentDirectory),
+ FilePath(kIcon)));
+ EXPECT_EQ(expected_favicon_url.spec(), entry->favicon().url().spec());
+}
+
// TODO(sky): get these to run on a Mac.
#if !defined(OS_MACOSX)
IN_PROC_BROWSER_TEST_F(BrowserTest, PhantomTab) {
diff --git a/chrome/browser/fav_icon_helper.cc b/chrome/browser/fav_icon_helper.cc
index d835b38..cfaae6d5 100644
--- a/chrome/browser/fav_icon_helper.cc
+++ b/chrome/browser/fav_icon_helper.cc
@@ -111,6 +111,11 @@ void FavIconHelper::UpdateFavIcon(NavigationEntry* entry,
void FavIconHelper::UpdateFavIconURL(RenderViewHost* render_view_host,
int32 page_id,
const GURL& icon_url) {
+ // TODO(davemoore) Should clear on empty url. Currently we ignore it.
+ // This appears to be what FF does as well.
+ if (icon_url.is_empty())
+ return;
+
NavigationEntry* entry = GetEntry();
if (!entry)
return;
diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h
index 2396360..2976575 100644
--- a/chrome/common/render_messages_internal.h
+++ b/chrome/common/render_messages_internal.h
@@ -1027,6 +1027,9 @@ IPC_BEGIN_MESSAGES(ViewHost)
// TODO(darin): use a UTF-8 string to reduce data size
IPC_MESSAGE_ROUTED2(ViewHostMsg_UpdateTitle, int32, std::wstring)
+ // Changes the icon url for the page in the UI.
+ IPC_MESSAGE_ROUTED2(ViewHostMsg_UpdateIconURL, int32, GURL)
+
// Change the encoding name of the page in UI when the page has detected
// proper encoding name.
IPC_MESSAGE_ROUTED1(ViewHostMsg_UpdateEncoding,
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 5b62f32..f744ce1 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -2663,6 +2663,15 @@ void RenderView::didReceiveTitle(WebFrame* frame, const WebString& title) {
UpdateEncoding(frame, frame->view()->pageEncoding().utf8());
}
+void RenderView::didChangeIcons(WebFrame* frame) {
+ if (!frame->parent()) {
+ Send(new ViewHostMsg_UpdateFavIconURL(
+ routing_id_,
+ page_id_,
+ frame->favIconURL()));
+ }
+}
+
void RenderView::didFinishDocumentLoad(WebFrame* frame) {
WebDataSource* ds = frame->dataSource();
NavigationState* navigation_state = NavigationState::FromDataSource(ds);
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 95071e6..d8bb27a 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -345,6 +345,7 @@ class RenderView : public RenderWidget,
virtual void didCreateDocumentElement(WebKit::WebFrame* frame);
virtual void didReceiveTitle(
WebKit::WebFrame* frame, const WebKit::WebString& title);
+ virtual void didChangeIcons(WebKit::WebFrame*);
virtual void didFinishDocumentLoad(WebKit::WebFrame* frame);
virtual void didHandleOnloadEvents(WebKit::WebFrame* frame);
virtual void didFailLoad(
diff --git a/chrome/test/data/onload_change_favicon.html b/chrome/test/data/onload_change_favicon.html
new file mode 100755
index 0000000..49a8943
--- /dev/null
+++ b/chrome/test/data/onload_change_favicon.html
@@ -0,0 +1,37 @@
+<html>
+<head>
+<title></title>
+<link rel='icon' href='test.png'>
+<script type='text/javascript' language='javascript'>
+function removeLinkIfExists() {
+ var docHead = document.getElementsByTagName("head")[0];
+ var links = docHead.getElementsByTagName("link");
+ for (var i=0; i<links.length; i++) {
+ var link = links[i];
+ if (link.type=="image/x-icon" && link.rel=="shortcut icon") {
+ docHead.removeChild(link);
+ return; // Assuming only one match at most.
+ }
+ }
+}
+
+function addLink(iconURL) {
+ var docHead = document.getElementsByTagName("head")[0];
+ var link = document.createElement("link");
+ link.type = "image/x-icon";
+ link.rel = "shortcut icon";
+ link.href = iconURL;
+ removeLinkIfExists();
+ docHead.appendChild(link);
+}
+
+function OnLoad() {
+ addLink("test1.png");
+}
+
+</script>
+</head>
+<body onload='OnLoad();'>
+<a name='test'>
+</body>
+</html> \ No newline at end of file