#ifndef CONTENT_BROWSER_HOST_ZOOM_MAP_IMPL_H_
#define CONTENT_BROWSER_HOST_ZOOM_MAP_IMPL_H_
#include <map>
#include <string>
#include <tuple>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/task/sequenced_task_runner_helpers.h"
#include "base/time/time.h"
#include "content/common/content_export.h"
#include "content/public/browser/global_routing_id.h"
#include "content/public/browser/host_zoom_map.h"
namespace content {
class WebContentsImpl;
class CONTENT_EXPORT HostZoomMapImpl : public HostZoomMap {
public:
HostZoomMapImpl();
HostZoomMapImpl(const HostZoomMapImpl&) = delete;
HostZoomMapImpl& operator=(const HostZoomMapImpl&) = delete;
~HostZoomMapImpl() override;
void CopyFrom(HostZoomMap* copy) override;
double GetZoomLevelForHostAndScheme(const std::string& scheme,
const std::string& host) override;
bool HasZoomLevel(const std::string& scheme,
const std::string& host) override;
ZoomLevelVector GetAllZoomLevels() override;
void SetZoomLevelForHost(const std::string& host, double level) override;
void InitializeZoomLevelForHost(const std::string& host,
double level,
base::Time last_modified) override;
void SetZoomLevelForHostAndScheme(const std::string& scheme,
const std::string& host,
double level) override;
bool UsesTemporaryZoomLevel(const GlobalRenderFrameHostId& rfh_id) override;
void SetNoLongerUsesTemporaryZoomLevel(const GlobalRenderFrameHostId& rfh_id);
void SetTemporaryZoomLevel(const GlobalRenderFrameHostId& rfh_id,
double level) override;
void ClearZoomLevels(base::Time delete_begin, base::Time delete_end) override;
void ClearTemporaryZoomLevel(const GlobalRenderFrameHostId& rfh_id) override;
double GetDefaultZoomLevel() override;
void SetDefaultZoomLevel(double level) override;
base::CallbackListSubscription AddZoomLevelChangedCallback(
ZoomLevelChangedCallback callback) override;
double GetZoomLevelForWebContents(WebContentsImpl* web_contents_impl);
void SetZoomLevelForWebContents(WebContentsImpl* web_contents_impl,
double level);
double GetTemporaryZoomLevel(const GlobalRenderFrameHostId& rfh_id) const;
void SendErrorPageZoomLevelRefresh();
void SetClockForTesting(base::Clock* clock) override;
#if BUILDFLAG(IS_ANDROID)
void SetDefaultZoomLevelPrefCallback(
HostZoomMap::DefaultZoomChangedCallback callback) override;
HostZoomMap::DefaultZoomChangedCallback* GetDefaultZoomLevelPrefCallback();
double GetDesktopSiteZoomScale(bool is_overriding_user_agent);
double GetZoomLevelForHostAndScheme(const std::string& scheme,
const std::string& host,
bool is_overriding_user_agent) override;
void SetSystemFontScaleForTesting(float scale);
#endif
private:
struct ZoomLevel {
double level;
base::Time last_modified;
};
typedef std::map<std::string, ZoomLevel> HostZoomLevels;
typedef std::map<std::string, HostZoomLevels> SchemeHostZoomLevels;
typedef std::map<GlobalRenderFrameHostId, double> TemporaryZoomLevels;
double GetZoomLevelForHost(const std::string& host) const;
void SetZoomLevelForHostInternal(const std::string& host,
double level,
base::Time last_modified);
void SendZoomLevelChange(const std::string& scheme, const std::string& host);
base::RepeatingCallbackList<void(const ZoomLevelChange&)>
zoom_level_changed_callbacks_;
#if BUILDFLAG(IS_ANDROID)
HostZoomMap::DefaultZoomChangedCallback default_zoom_level_pref_callback_;
#endif
HostZoomLevels host_zoom_levels_;
SchemeHostZoomLevels scheme_host_zoom_levels_;
double default_zoom_level_;
TemporaryZoomLevels temporary_zoom_levels_;
raw_ptr<base::Clock> clock_;
#if defined(OHOS_INPUT_EVENTS)
base::Time last_modified_ = base::Time();
#endif
};
}
#endif