Commit 0a6ad030 authored by Becca Hughes's avatar Becca Hughes Committed by Commit Bot

[Media Session] Use fav/touch icons for source icons

Expose the favicon/touch icons as the source icons for
a media session. This will be used by the CrOS lock
screen media controls.

BUG=973993

Change-Id: I056b03c4fa97aab8edb11aa817abef5011ab5e24
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1659508Reviewed-by: default avatarTommy Steimel <steimel@chromium.org>
Commit-Queue: Becca Hughes <beccahughes@chromium.org>
Cr-Commit-Position: refs/heads/master@{#668992}
parent 5a9e7513
......@@ -25,6 +25,7 @@
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_client.h"
#include "content/public/common/favicon_url.h"
#include "media/base/media_content_type.h"
#include "services/media_session/public/cpp/media_image_manager.h"
#include "services/media_session/public/mojom/audio_focus.mojom.h"
......@@ -218,6 +219,40 @@ void MediaSessionImpl::TitleWasSet(NavigationEntry* entry) {
RebuildAndNotifyMetadataChanged();
}
void MediaSessionImpl::DidUpdateFaviconURL(
const std::vector<FaviconURL>& candidates) {
std::vector<media_session::MediaImage> icons;
for (auto& icon : candidates) {
if (icon.icon_sizes.empty() || !icon.icon_url.is_valid())
continue;
// We only want either favicons or the touch icons. There is another type of
// touch icon which is "precomposed". This means it might have rounded
// corners, etc. but it is not predictable so we cannot show them in the UI.
if (icon.icon_type != FaviconURL::IconType::kFavicon &&
icon.icon_type != FaviconURL::IconType::kTouchIcon) {
continue;
}
media_session::MediaImage image;
image.src = icon.icon_url;
image.sizes = icon.icon_sizes;
icons.push_back(image);
}
auto it = images_.find(MediaSessionImageType::kSourceIcon);
if (it != images_.end() && it->second == icons)
return;
images_.insert_or_assign(MediaSessionImageType::kSourceIcon, icons);
observers_.ForAllPtrs(
[this](media_session::mojom::MediaSessionObserver* observer) {
observer->MediaSessionImagesChanged(this->images_);
});
}
bool MediaSessionImpl::AddPlayer(MediaSessionPlayerObserver* observer,
int player_id,
media::MediaContentType media_content_type) {
......
......@@ -135,6 +135,7 @@ class MediaSessionImpl : public MediaSession,
void OnWebContentsFocused(RenderWidgetHost*) override;
void OnWebContentsLostFocus(RenderWidgetHost*) override;
void TitleWasSet(NavigationEntry* entry) override;
void DidUpdateFaviconURL(const std::vector<FaviconURL>& candidates) override;
// MediaSessionService-related methods
......
......@@ -21,6 +21,7 @@
#include "content/browser/media/session/mock_media_session_service_impl.h"
#include "content/public/browser/media_session.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/favicon_url.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/shell/browser/shell.h"
......@@ -2434,3 +2435,91 @@ IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, MetadataWhenFileUrlScheme) {
expected_metadata.artist = base::ASCIIToUTF16("Local File");
observer.WaitForExpectedMetadata(expected_metadata);
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest, UpdateFaviconURL) {
std::vector<gfx::Size> valid_sizes;
valid_sizes.push_back(gfx::Size(100, 100));
valid_sizes.push_back(gfx::Size(200, 200));
std::vector<content::FaviconURL> favicons;
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon1.png"),
content::FaviconURL::IconType::kInvalid, valid_sizes));
favicons.push_back(content::FaviconURL(
GURL(), content::FaviconURL::IconType::kFavicon, valid_sizes));
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon2.png"),
content::FaviconURL::IconType::kFavicon, std::vector<gfx::Size>()));
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon3.png"),
content::FaviconURL::IconType::kFavicon, valid_sizes));
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon4.png"),
content::FaviconURL::IconType::kTouchIcon, valid_sizes));
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon5.png"),
content::FaviconURL::IconType::kTouchPrecomposedIcon, valid_sizes));
media_session_->DidUpdateFaviconURL(favicons);
{
std::vector<media_session::MediaImage> expected_images;
media_session::MediaImage test_image_1;
test_image_1.src = GURL("https://www.example.org/favicon3.png");
test_image_1.sizes = valid_sizes;
expected_images.push_back(test_image_1);
media_session::MediaImage test_image_2;
test_image_2.src = GURL("https://www.example.org/favicon4.png");
test_image_2.sizes = valid_sizes;
expected_images.push_back(test_image_2);
media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
observer.WaitForExpectedImagesOfType(
media_session::mojom::MediaSessionImageType::kSourceIcon,
expected_images);
}
{
media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
media_session_->DidUpdateFaviconURL(std::vector<content::FaviconURL>());
observer.WaitForExpectedImagesOfType(
media_session::mojom::MediaSessionImageType::kSourceIcon,
std::vector<media_session::MediaImage>());
}
}
IN_PROC_BROWSER_TEST_F(MediaSessionImplBrowserTest,
UpdateFaviconURL_ClearOnNavigate) {
std::vector<gfx::Size> valid_sizes;
valid_sizes.push_back(gfx::Size(100, 100));
std::vector<content::FaviconURL> favicons;
favicons.push_back(content::FaviconURL(
GURL("https://www.example.org/favicon1.png"),
content::FaviconURL::IconType::kFavicon, valid_sizes));
media_session_->DidUpdateFaviconURL(favicons);
{
std::vector<media_session::MediaImage> expected_images;
media_session::MediaImage test_image_1;
test_image_1.src = GURL("https://www.example.org/favicon1.png");
test_image_1.sizes = valid_sizes;
expected_images.push_back(test_image_1);
media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
observer.WaitForExpectedImagesOfType(
media_session::mojom::MediaSessionImageType::kSourceIcon,
expected_images);
}
{
media_session::test::MockMediaSessionMojoObserver observer(*media_session_);
NavigateToURL(
shell(), embedded_test_server()->GetURL("example.com", "/title1.html"));
observer.WaitForExpectedImagesOfType(
media_session::mojom::MediaSessionImageType::kSourceIcon,
std::vector<media_session::MediaImage>());
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment