diff options
author | davemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-27 17:26:58 +0000 |
---|---|---|
committer | davemoore@chromium.org <davemoore@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-27 17:26:58 +0000 |
commit | 5019ef1ab7f79f71fffabe14ab7ae9bfcb44daa8 (patch) | |
tree | b2a439da42c4bd6de2b8516428b065bdabaf129f | |
parent | 62e0dbdec1c30c929d7c6148372b153e9b1c1792 (diff) | |
download | chromium_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.cc | 19 | ||||
-rw-r--r-- | chrome/browser/fav_icon_helper.cc | 5 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 3 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 9 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 1 | ||||
-rwxr-xr-x | chrome/test/data/onload_change_favicon.html | 37 |
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 |