blob: 660b049244396a9cc40957a2882d44a3a1783e1c [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_
#define CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_
#include <map>
#include <string>
#include "base/memory/raw_ptr.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/task/cancelable_task_tracker.h"
#include "components/favicon/core/favicon_service.h"
#include "content/public/browser/url_data_source.h"
class Profile;
namespace base {
class RefCountedMemory;
}
namespace chrome {
enum class FaviconUrlFormat;
struct ParsedFaviconPath;
} // namespace chrome
namespace ui {
class NativeTheme;
}
enum class DefaultFaviconBehavior {
kUseGlobeIcon = 0,
kUseEmptyIcon = 1,
};
// FaviconSource is the gateway between network-level chrome:
// requests for favicons and the history backend that serves these.
// Two possible formats are allowed: chrome://favicon, kept only for backwards
// compatibility for extensions, and chrome://favicon2. Formats are described in
// favicon_url_parser.h.
class FaviconSource : public content::URLDataSource {
public:
// By default, favicons are served via a chrome trusted URL (chrome://). If
// |serve_untrusted| is set to true, favicons will be served via
// chrome-untrusted://. Note that chrome-untrusted:// only supports the
// favicon2 URL format and does not support the legacy URL format.
explicit FaviconSource(Profile* profile,
chrome::FaviconUrlFormat format,
bool serve_untrusted = false);
FaviconSource(const FaviconSource&) = delete;
FaviconSource& operator=(const FaviconSource&) = delete;
~FaviconSource() override;
// content::URLDataSource implementation.
std::string GetSource() override;
void StartDataRequest(
const GURL& url,
const content::WebContents::Getter& wc_getter,
content::URLDataSource::GotDataCallback callback) override;
std::string GetMimeType(const GURL&) override;
bool AllowCaching() override;
bool ShouldReplaceExistingSource() override;
bool ShouldServiceRequest(const GURL& url,
content::BrowserContext* browser_context,
int render_process_id) override;
protected:
// Exposed for testing.
virtual base::RefCountedMemory* LoadIconBytes(float scale_factor,
int resource_id);
raw_ptr<Profile, DanglingUntriaged> profile_;
private:
// Defines the allowed pixel sizes for requested favicons.
enum IconSize { SIZE_16, SIZE_32, SIZE_64, NUM_SIZES };
ui::NativeTheme* GetNativeTheme(
const content::WebContents::Getter& wc_getter);
// Called when favicon data is available from the history backend. If
// |bitmap_result| is valid, returns it to caller using |callback|. Otherwise
// will send appropriate default icon for |size_in_dip| and |scale_factor|.
void OnFaviconDataAvailable(
content::URLDataSource::GotDataCallback callback,
const chrome::ParsedFaviconPath& parsed,
const content::WebContents::Getter& wc_getter,
const favicon_base::FaviconRawBitmapResult& bitmap_result);
// Sends the 16x16 DIP 1x default favicon.
void SendDefaultResponse(
content::URLDataSource::GotDataCallback callback,
const content::WebContents::Getter& wc_getter,
bool force_light_mode = false,
DefaultFaviconBehavior behavior = DefaultFaviconBehavior::kUseGlobeIcon);
// Sends back default favicon or fallback monogram.
void SendDefaultResponse(content::URLDataSource::GotDataCallback callback,
const chrome::ParsedFaviconPath& parsed,
const content::WebContents::Getter& wc_getter);
// Sends the default favicon.
void SendDefaultResponse(content::URLDataSource::GotDataCallback callback,
int size_in_dip,
float scale_factor,
bool dark_mode,
DefaultFaviconBehavior behavior);
chrome::FaviconUrlFormat url_format_;
base::CancelableTaskTracker cancelable_task_tracker_;
bool serve_untrusted_;
base::WeakPtrFactory<FaviconSource> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_UI_WEBUI_FAVICON_SOURCE_H_