#ifndef CONTENT_BROWSER_RENDERER_HOST_PAGE_IMPL_H_
#define CONTENT_BROWSER_RENDERER_HOST_PAGE_IMPL_H_
#include <memory>
#include <set>
#include <vector>
#include "base/memory/raw_ref.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "cc/input/browser_controls_state.h"
#include "content/browser/fenced_frame/fenced_frame_url_mapping.h"
#include "content/browser/renderer_host/stored_page.h"
#include "content/common/content_export.h"
#include "content/public/browser/page.h"
#include "services/metrics/public/cpp/ukm_source.h"
#include "services/metrics/public/cpp/ukm_source_id.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/css/preferred_color_scheme.mojom.h"
#include "third_party/blink/public/mojom/favicon/favicon_url.mojom.h"
#include "third_party/blink/public/mojom/frame/text_autosizer_page_info.mojom.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/base/ime/mojom/virtual_keyboard_types.mojom.h"
#include "url/gurl.h"
namespace content {
class PageDelegate;
class RenderFrameHostImpl;
class CONTENT_EXPORT PageImpl : public Page {
public:
explicit PageImpl(RenderFrameHostImpl& rfh, PageDelegate& delegate);
~PageImpl() override;
const absl::optional<GURL>& GetManifestUrl() const override;
void GetManifest(GetManifestCallback callback) override;
bool IsPrimary() const override;
void WriteIntoTrace(perfetto::TracedValue context) override;
base::WeakPtr<Page> GetWeakPtr() override;
bool IsPageScaleFactorOne() override;
base::WeakPtr<PageImpl> GetWeakPtrImpl();
virtual void UpdateManifestUrl(const GURL& manifest_url);
RenderFrameHostImpl& GetMainDocument() const;
bool is_on_load_completed_in_main_document() const {
return is_on_load_completed_in_main_document_;
}
void set_is_on_load_completed_in_main_document(bool completed) {
is_on_load_completed_in_main_document_ = completed;
}
bool is_main_document_element_available() const {
return is_main_document_element_available_;
}
void set_is_main_document_element_available(bool completed) {
is_main_document_element_available_ = completed;
}
bool uses_temporary_zoom_level() const { return uses_temporary_zoom_level_; }
void set_uses_temporary_zoom_level(bool level) {
uses_temporary_zoom_level_ = level;
}
void OnFirstVisuallyNonEmptyPaint();
bool did_first_visually_non_empty_paint() const {
return did_first_visually_non_empty_paint_;
}
const std::vector<blink::mojom::FaviconURLPtr>& favicon_urls() const {
return favicon_urls_;
}
void set_favicon_urls(std::vector<blink::mojom::FaviconURLPtr> favicon_urls) {
favicon_urls_ = std::move(favicon_urls);
}
void OnThemeColorChanged(const absl::optional<SkColor>& theme_color);
void DidChangeBackgroundColor(SkColor4f background_color, bool color_adjust);
void DidInferColorScheme(blink::mojom::PreferredColorScheme color_scheme);
void NotifyPageBecameCurrent();
absl::optional<SkColor> theme_color() const {
return main_document_theme_color_;
}
absl::optional<SkColor> background_color() const {
return main_document_background_color_;
}
absl::optional<blink::mojom::PreferredColorScheme> inferred_color_scheme()
const {
return main_document_inferred_color_scheme_;
}
void SetContentsMimeType(std::string mime_type);
const std::string& contents_mime_type() { return contents_mime_type_; }
void OnTextAutosizerPageInfoChanged(
blink::mojom::TextAutosizerPageInfoPtr page_info);
blink::mojom::TextAutosizerPageInfo text_autosizer_page_info() const {
return text_autosizer_page_info_;
}
FencedFrameURLMapping& fenced_frame_urls_map() {
return fenced_frame_urls_map_;
}
void set_last_main_document_source_id(ukm::SourceId id) {
last_main_document_source_id_ = id;
}
ukm::SourceId last_main_document_source_id() const {
return last_main_document_source_id_;
}
void SetActivationStartTime(base::TimeTicks activation_start);
void ActivateForPrerendering(
StoredPage::RenderViewHostImplSafeRefSet& render_view_hosts_to_activate,
absl::optional<blink::ViewTransitionState> view_transition_state);
void MaybeDispatchLoadEventsOnPrerenderActivation();
void UpdateBrowserControlsState(cc::BrowserControlsState constraints,
cc::BrowserControlsState current,
bool animate);
float GetPageScaleFactor() const;
void set_load_progress(double load_progress) {
load_progress_ = load_progress;
}
double load_progress() const { return load_progress_; }
void NotifyVirtualKeyboardOverlayRect(const gfx::Rect& keyboard_rect);
void SetVirtualKeyboardMode(ui::mojom::VirtualKeyboardMode mode);
ui::mojom::VirtualKeyboardMode virtual_keyboard_mode() const {
return virtual_keyboard_mode_;
}
const std::string& GetEncoding() { return canonical_encoding_; }
void UpdateEncoding(const std::string& encoding_name);
base::flat_map<std::string, std::string> GetKeyboardLayoutMap();
bool CheckAndMaybeDebitSelectURLBudgets(const url::Origin& origin,
double bits_to_charge);
private:
void DidActivateAllRenderViewsForPrerendering();
RenderFrameHost& GetMainDocumentHelper() override;
bool is_on_load_completed_in_main_document_ = false;
bool is_main_document_element_available_ = false;
bool uses_temporary_zoom_level_ = false;
double load_progress_ = 0.0;
absl::optional<GURL> manifest_url_;
std::vector<blink::mojom::FaviconURLPtr> favicon_urls_;
bool did_first_visually_non_empty_paint_ = false;
absl::optional<SkColor> main_document_theme_color_;
absl::optional<SkColor> main_document_background_color_;
absl::optional<blink::mojom::PreferredColorScheme>
main_document_inferred_color_scheme_;
std::string contents_mime_type_;
FencedFrameURLMapping fenced_frame_urls_map_;
absl::optional<double> select_url_overall_budget_;
absl::optional<double> select_url_max_bits_per_origin_;
base::flat_map<url::Origin, double> select_url_per_origin_budget_;
const raw_ref<RenderFrameHostImpl> main_document_;
ukm::SourceId last_main_document_source_id_ = ukm::kInvalidSourceId;
const raw_ref<PageDelegate> delegate_;
blink::mojom::TextAutosizerPageInfo text_autosizer_page_info_;
absl::optional<base::TimeTicks> activation_start_time_for_prerendering_;
ui::mojom::VirtualKeyboardMode virtual_keyboard_mode_ =
ui::mojom::VirtualKeyboardMode::kUnset;
std::string last_reported_encoding_;
std::string canonical_encoding_;
base::WeakPtrFactory<PageImpl> weak_factory_{this};
};
}
#endif