blob: 2390d72b83f393bed619ef331f076633206850f5 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2021 The Chromium Authors
Sreeja Kamishetty9e1d0e732021-05-27 18:20:092// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/renderer_host/page_impl.h"
6
Matt Falkenhagenf78c2192021-07-24 02:01:437#include "base/barrier_closure.h"
Sky Malice3774b002022-10-21 19:18:408#include "base/feature_list.h"
Dominic Farolino5c606c12021-12-18 09:40:149#include "base/i18n/character_encoding.h"
Lingqi Chidcf722442021-09-02 01:47:1910#include "base/trace_event/optional_trace_event.h"
Sky Malice3774b002022-10-21 19:18:4011#include "cc/base/features.h"
Peilin Wangae08e26e2024-06-10 20:55:3012#include "cc/input/browser_controls_offset_tags_info.h"
Jeremy Roman4bd173d2021-06-17 00:05:4413#include "content/browser/manifest/manifest_manager_host.h"
Dave Tapuska9c9afe82021-06-22 19:07:4514#include "content/browser/renderer_host/frame_tree_node.h"
Jeremy Roman2d8dfe132021-07-06 20:51:2615#include "content/browser/renderer_host/page_delegate.h"
Julie Jeongeun Kim9e204512021-06-24 07:28:5416#include "content/browser/renderer_host/render_frame_host_delegate.h"
Sreeja Kamishetty9e1d0e732021-05-27 18:20:0917#include "content/browser/renderer_host/render_frame_host_impl.h"
Lingqi Chidcf722442021-09-02 01:47:1918#include "content/browser/renderer_host/render_frame_proxy_host.h"
Jeremy Roman2d8dfe132021-07-06 20:51:2619#include "content/browser/renderer_host/render_view_host_delegate.h"
Matt Falkenhagenf78c2192021-07-24 02:01:4320#include "content/browser/renderer_host/render_view_host_impl.h"
Camillia Smith Barnes385a2e92024-04-16 17:49:4021#include "content/public/browser/content_browser_client.h"
Aman Verma39fe0492024-06-17 14:07:0122#include "content/public/browser/peak_gpu_memory_tracker_factory.h"
Jeremy Roman2d8dfe132021-07-06 20:51:2623#include "content/public/browser/render_view_host.h"
Camillia Smith Barnes385a2e92024-04-16 17:49:4024#include "content/public/common/content_client.h"
Peilin Wangae08e26e2024-06-10 20:55:3025#include "services/viz/public/mojom/compositing/offset_tag.mojom.h"
Camillia Smith Barnesddaf5b12023-01-24 00:06:3226#include "third_party/blink/public/common/features.h"
Sreeja Kamishetty0be3b1b2021-08-12 17:04:1527#include "third_party/blink/public/common/loader/loader_constants.h"
Camillia Smith Barnes385a2e92024-04-16 17:49:4028#include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
Julie Jeongeun Kim33ef6a202022-03-22 09:46:1129#include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
Camillia Smith Barnes385a2e92024-04-16 17:49:4030#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h"
Jeremy Roman2d8dfe132021-07-06 20:51:2631#include "third_party/perfetto/include/perfetto/tracing/traced_value.h"
Sreeja Kamishetty9e1d0e732021-05-27 18:20:0932
33namespace content {
Jeremy Roman2d8dfe132021-07-06 20:51:2634
35PageImpl::PageImpl(RenderFrameHostImpl& rfh, PageDelegate& delegate)
Lingqi Chidcf722442021-09-02 01:47:1936 : main_document_(rfh),
37 delegate_(delegate),
Camillia Smith Barnesddaf5b12023-01-24 00:06:3238 text_autosizer_page_info_({0, 0, 1.f}) {
39 if (base::FeatureList::IsEnabled(
Camillia Smith Barnes477a3112023-02-28 19:06:3040 blink::features::kSharedStorageSelectURLLimit)) {
41 select_url_overall_budget_ = static_cast<double>(
42 blink::features::kSharedStorageSelectURLBitBudgetPerPageLoad.Get());
Camillia Smith Barnes74552232023-10-02 18:50:0743 select_url_max_bits_per_site_ = static_cast<double>(
44 blink::features::kSharedStorageSelectURLBitBudgetPerSitePerPageLoad
Camillia Smith Barnes477a3112023-02-28 19:06:3045 .Get());
46 }
Camillia Smith Barnesddaf5b12023-01-24 00:06:3247}
Sreeja Kamishetty9e1d0e732021-05-27 18:20:0948
Sreeja Kamishetty1b5c1432021-06-25 11:32:5949PageImpl::~PageImpl() {
50 // As SupportsUserData is a base class of PageImpl, Page members will be
51 // destroyed before running ~SupportsUserData, which would delete the
52 // associated PageUserData objects. Avoid this by calling ClearAllUserData
53 // explicitly here to ensure that the PageUserData destructors can access
54 // associated Page object.
55 ClearAllUserData();
Adithya Srinivasana5795b92023-12-20 22:35:2256
57 // If we still have a PeakGpuMemoryTracker, then the loading it was observing
58 // never completed. Cancel its callback so that we don't report partial
59 // loads to UMA.
60 CancelLoadingMemoryTracker();
Sreeja Kamishetty1b5c1432021-06-25 11:32:5961}
Sreeja Kamishetty9e1d0e732021-05-27 18:20:0962
Arthur Sonzognic686e8f2024-01-11 08:36:3763const std::optional<GURL>& PageImpl::GetManifestUrl() const {
Sreeja Kamishetty7c91ab22021-06-03 13:29:5264 return manifest_url_;
65}
66
Jeremy Roman4bd173d2021-06-17 00:05:4467void PageImpl::GetManifest(GetManifestCallback callback) {
68 ManifestManagerHost* manifest_manager_host =
Julie Jeongeun Kim33ef6a202022-03-22 09:46:1169 ManifestManagerHost::GetOrCreateForPage(*this);
Jeremy Roman4bd173d2021-06-17 00:05:4470 manifest_manager_host->GetManifest(std::move(callback));
71}
72
Julie Jeongeun Kimda529922023-01-13 02:59:5973bool PageImpl::IsPrimary() const {
Kevin McNeef1b0f0b2024-09-17 21:49:4174 return main_document_->IsInPrimaryMainFrame();
Dave Tapuska9c9afe82021-06-22 19:07:4575}
76
Julie Jeongeun Kim9e204512021-06-24 07:28:5477void PageImpl::UpdateManifestUrl(const GURL& manifest_url) {
78 manifest_url_ = manifest_url;
79
80 // If |main_document_| is not active, the notification is sent on the page
81 // activation.
Ali Hijazid87307d2022-11-07 20:15:0382 if (!main_document_->IsActive())
Julie Jeongeun Kim9e204512021-06-24 07:28:5483 return;
84
Ali Hijazid87307d2022-11-07 20:15:0385 main_document_->delegate()->OnManifestUrlChanged(*this);
Julie Jeongeun Kim9e204512021-06-24 07:28:5486}
87
Jeremy Roman2d8dfe132021-07-06 20:51:2688void PageImpl::WriteIntoTrace(perfetto::TracedValue context) {
89 auto dict = std::move(context).WriteDictionary();
Ali Hijazid87307d2022-11-07 20:15:0390 dict.Add("main_document", *main_document_);
Jeremy Roman2d8dfe132021-07-06 20:51:2691}
92
Miyoung Shinfa182e472021-09-03 12:39:3293base::WeakPtr<Page> PageImpl::GetWeakPtr() {
94 return weak_factory_.GetWeakPtr();
95}
96
Yao Xiaoc7224362022-02-16 08:21:4097base::WeakPtr<PageImpl> PageImpl::GetWeakPtrImpl() {
98 return weak_factory_.GetWeakPtr();
99}
100
Kevin McNee3183a7792021-11-09 21:03:36101bool PageImpl::IsPageScaleFactorOne() {
Kevin McNeec4325ba2022-04-08 23:18:23102 return GetPageScaleFactor() == 1.f;
Kevin McNee3183a7792021-11-09 21:03:36103}
104
Takashi Toyoshima6c58bbd2023-05-19 09:41:35105const std::string& PageImpl::GetContentsMimeType() const {
106 return contents_mime_type_;
107}
108
Arthur Sonzognic686e8f2024-01-11 08:36:37109void PageImpl::SetResizableForTesting(std::optional<bool> resizable) {
Sonja5f1ab742023-11-09 14:48:36110 SetResizable(resizable);
111}
112
Arthur Sonzognic686e8f2024-01-11 08:36:37113void PageImpl::SetResizable(std::optional<bool> resizable) {
Sonja5f1ab742023-11-09 14:48:36114 resizable_ = resizable;
115 delegate_->OnCanResizeFromWebAPIChanged();
116}
117
Arthur Sonzognic686e8f2024-01-11 08:36:37118std::optional<bool> PageImpl::GetResizable() {
Sonja5f1ab742023-11-09 14:48:36119 return resizable_;
120}
121
Jeremy Roman2d8dfe132021-07-06 20:51:26122void PageImpl::OnFirstVisuallyNonEmptyPaint() {
123 did_first_visually_non_empty_paint_ = true;
Ali Hijazid87307d2022-11-07 20:15:03124 delegate_->OnFirstVisuallyNonEmptyPaint(*this);
Jeremy Roman2d8dfe132021-07-06 20:51:26125}
126
Arthur Sonzognic686e8f2024-01-11 08:36:37127void PageImpl::OnThemeColorChanged(const std::optional<SkColor>& theme_color) {
Jeremy Roman2d8dfe132021-07-06 20:51:26128 main_document_theme_color_ = theme_color;
Ali Hijazid87307d2022-11-07 20:15:03129 delegate_->OnThemeColorChanged(*this);
Jeremy Roman2d8dfe132021-07-06 20:51:26130}
131
Aaron Krajeski628c58c2023-04-04 16:24:12132void PageImpl::DidChangeBackgroundColor(SkColor4f background_color,
Jeremy Roman2d8dfe132021-07-06 20:51:26133 bool color_adjust) {
Aaron Krajeski628c58c2023-04-04 16:24:12134 // TODO(aaronhk): This should remain an SkColor4f
135 main_document_background_color_ = background_color.toSkColor();
Ali Hijazid87307d2022-11-07 20:15:03136 delegate_->OnBackgroundColorChanged(*this);
Jeremy Roman2d8dfe132021-07-06 20:51:26137 if (color_adjust) {
138 // <meta name="color-scheme" content="dark"> may pass the dark canvas
139 // background before the first paint in order to avoid flashing the white
140 // background in between loading documents. If we perform a navigation
141 // within the same renderer process, we keep the content background from the
142 // previous page while rendering is blocked in the new page, but for cross
143 // process navigations we would paint the default background (typically
144 // white) while the rendering is blocked.
Ali Hijazid87307d2022-11-07 20:15:03145 main_document_->GetRenderWidgetHost()->GetView()->SetContentBackgroundColor(
Aaron Krajeski628c58c2023-04-04 16:24:12146 background_color.toSkColor());
Jeremy Roman2d8dfe132021-07-06 20:51:26147 }
148}
149
Michael Bai19f17a302021-12-08 04:08:33150void PageImpl::DidInferColorScheme(
151 blink::mojom::PreferredColorScheme color_scheme) {
152 main_document_inferred_color_scheme_ = color_scheme;
Ali Hijazid87307d2022-11-07 20:15:03153 delegate_->DidInferColorScheme(*this);
Michael Bai19f17a302021-12-08 04:08:33154}
155
Julie Jeongeun Kimd4597df12022-11-11 02:44:51156void PageImpl::NotifyPageBecameCurrent() {
157 if (!IsPrimary())
158 return;
159 delegate_->NotifyPageBecamePrimary(*this);
160}
161
Jeremy Roman2d8dfe132021-07-06 20:51:26162void PageImpl::SetContentsMimeType(std::string mime_type) {
163 contents_mime_type_ = std::move(mime_type);
164}
165
Lingqi Chidcf722442021-09-02 01:47:19166void PageImpl::OnTextAutosizerPageInfoChanged(
167 blink::mojom::TextAutosizerPageInfoPtr page_info) {
168 OPTIONAL_TRACE_EVENT0("content", "PageImpl::OnTextAutosizerPageInfoChanged");
169
Dave Tapuska2cf1f532022-08-10 15:30:49170 // Keep a copy of `page_info` in case we create a new `blink::WebView` before
171 // the next update, so that the PageImpl can tell the newly created
172 // `blink::WebView` about the autosizer info.
Lingqi Chidcf722442021-09-02 01:47:19173 text_autosizer_page_info_.main_frame_width = page_info->main_frame_width;
174 text_autosizer_page_info_.main_frame_layout_width =
175 page_info->main_frame_layout_width;
176 text_autosizer_page_info_.device_scale_adjustment =
177 page_info->device_scale_adjustment;
178
179 auto remote_frames_broadcast_callback = base::BindRepeating(
180 [](const blink::mojom::TextAutosizerPageInfo& page_info,
181 RenderFrameProxyHost* proxy_host) {
182 DCHECK(proxy_host);
183 proxy_host->GetAssociatedRemoteMainFrame()->UpdateTextAutosizerPageInfo(
184 page_info.Clone());
185 },
186 text_autosizer_page_info_);
187
Ali Hijazid87307d2022-11-07 20:15:03188 main_document_->frame_tree()
Lingqi Chidcf722442021-09-02 01:47:19189 ->root()
190 ->render_manager()
191 ->ExecuteRemoteFramesBroadcastMethod(
192 std::move(remote_frames_broadcast_callback),
Sharon Yang6b5313432023-03-24 05:07:57193 main_document_->GetSiteInstance()->group());
Lingqi Chidcf722442021-09-02 01:47:19194}
195
Matt Falkenhagenf78c2192021-07-24 02:01:43196void PageImpl::SetActivationStartTime(base::TimeTicks activation_start) {
Takashi Toyoshima881f4d72023-11-09 05:07:43197 CHECK(!activation_start_time_);
198 activation_start_time_ = activation_start;
Matt Falkenhagenf78c2192021-07-24 02:01:43199}
200
Takashi Toyoshima881f4d72023-11-09 05:07:43201void PageImpl::Activate(
202 ActivationType type,
Vladimir Levin48d51002023-02-27 17:23:27203 StoredPage::RenderViewHostImplSafeRefSet& render_view_hosts,
Arthur Sonzognic686e8f2024-01-11 08:36:37204 std::optional<blink::ViewTransitionState> view_transition_state,
Takashi Toyoshima881f4d72023-11-09 05:07:43205 base::OnceCallback<void(base::TimeTicks)> completion_callback) {
206 TRACE_EVENT1("navigation", "PageImpl::Activate", "activation_type", type);
Lingqi Chief8657c2023-06-08 08:40:31207
Takashi Toyoshima881f4d72023-11-09 05:07:43208 // SetActivationStartTime() should be called first as the value is used in
209 // the callback below.
210 CHECK(activation_start_time_.has_value());
211
212 base::OnceClosure did_activate_render_views = base::BindOnce(
213 &PageImpl::DidActivateAllRenderViewsForPrerenderingOrPreview,
214 weak_factory_.GetWeakPtr(), std::move(completion_callback));
Matt Falkenhagenf78c2192021-07-24 02:01:43215
216 base::RepeatingClosure barrier = base::BarrierClosure(
217 render_view_hosts.size(), std::move(did_activate_render_views));
Takashi Toyoshima881f4d72023-11-09 05:07:43218 bool view_transition_state_consumed = false;
Dave Tapuskac3e58352022-09-28 19:05:27219 for (const auto& rvh : render_view_hosts) {
Vladimir Levin48d51002023-02-27 17:23:27220 auto params = blink::mojom::PrerenderPageActivationParams::New();
221
Vladimir Levin48d51002023-02-27 17:23:27222 if (main_document_->GetRenderViewHost() == &*rvh) {
Takashi Toyoshima881f4d72023-11-09 05:07:43223 // For prerendering activation, send activation_start only to the
224 // RenderViewHost for the main frame to avoid sending the info
225 // cross-origin. Only this RenderViewHost needs the info, as we expect the
226 // other RenderViewHosts are made for cross-origin iframes which have not
227 // yet loaded their document. To the renderer, it just looks like an
228 // ongoing navigation is happening in the frame and has not yet committed.
229 // These RenderViews still need to know about activation so their
230 // documents are created in the non-prerendered state once their
231 // navigation is committed.
232 params->activation_start = *activation_start_time_;
233 // Note that there cannot be a use-after-move since the if condition
234 // should be true at most once.
235 CHECK(!view_transition_state_consumed);
Vladimir Levin48d51002023-02-27 17:23:27236 params->view_transition_state = std::move(view_transition_state);
Takashi Toyoshima881f4d72023-11-09 05:07:43237 view_transition_state_consumed = true;
238 } else if (type == ActivationType::kPreview) {
239 // For preview activation, send activation_start to all RenderViewHosts
240 // as preview loads cross-origin subframes under the capability control,
241 // and activation_start time is meaningful there.
242 params->activation_start = *activation_start_time_;
Vladimir Levin48d51002023-02-27 17:23:27243 }
Matt Falkenhagenf78c2192021-07-24 02:01:43244
Takashi Toyoshima881f4d72023-11-09 05:07:43245 // For preview activation, there is no way to activate the previewed page
246 // other than with a user action, or testing only methods.
Hiroki Nakagawaab53cd22022-04-13 19:18:02247 params->was_user_activated =
Takashi Toyoshima881f4d72023-11-09 05:07:43248 (main_document_->frame_tree_node()
249 ->has_received_user_gesture_before_nav() ||
250 type == ActivationType::kPreview)
Hiroki Nakagawaab53cd22022-04-13 19:18:02251 ? blink::mojom::WasActivatedOption::kYes
252 : blink::mojom::WasActivatedOption::kNo;
Hiroki Nakagawaab53cd22022-04-13 19:18:02253 rvh->ActivatePrerenderedPage(std::move(params), barrier);
Matt Falkenhagenf78c2192021-07-24 02:01:43254 }
255
256 // Prepare each RenderFrameHostImpl in this Page for activation.
Ali Hijazid87307d2022-11-07 20:15:03257 main_document_->ForEachRenderFrameHostIncludingSpeculative(
Kevin McNee4d35f5a2024-07-09 16:39:38258 [](RenderFrameHostImpl* rfh) {
Takashi Toyoshima881f4d72023-11-09 05:07:43259 rfh->RendererWillActivateForPrerenderingOrPreview();
Daniel Cheng982f2b22022-08-25 23:46:16260 });
Matt Falkenhagenf78c2192021-07-24 02:01:43261}
262
Sreeja Kamishetty81fbeefb2021-08-12 07:21:41263void PageImpl::MaybeDispatchLoadEventsOnPrerenderActivation() {
264 DCHECK(IsPrimary());
265
Sreeja Kamishetty0be3b1b2021-08-12 17:04:15266 // Dispatch LoadProgressChanged notification on activation with the
267 // prerender last load progress value if the value is not equal to
268 // blink::kFinalLoadProgress, whose notification is dispatched during call
269 // to DidStopLoading.
270 if (load_progress() != blink::kFinalLoadProgress)
Ali Hijazid87307d2022-11-07 20:15:03271 main_document_->DidChangeLoadProgress(load_progress());
Sreeja Kamishetty0be3b1b2021-08-12 17:04:15272
Sreeja Kamishetty49783302022-01-28 17:52:25273 // Dispatch PrimaryMainDocumentElementAvailable before dispatching following
274 // load complete events.
275 if (is_main_document_element_available())
Ali Hijazid87307d2022-11-07 20:15:03276 main_document_->MainDocumentElementAvailable(uses_temporary_zoom_level());
Sreeja Kamishettycd5560912021-11-22 11:54:53277
Ali Hijazid87307d2022-11-07 20:15:03278 main_document_->ForEachRenderFrameHost(
Daniel Cheng982f2b22022-08-25 23:46:16279 &RenderFrameHostImpl::MaybeDispatchDOMContentLoadedOnPrerenderActivation);
Sreeja Kamishetty81fbeefb2021-08-12 07:21:41280
281 if (is_on_load_completed_in_main_document())
Ali Hijazid87307d2022-11-07 20:15:03282 main_document_->DocumentOnLoadCompleted();
Sreeja Kamishetty81fbeefb2021-08-12 07:21:41283
Ali Hijazid87307d2022-11-07 20:15:03284 main_document_->ForEachRenderFrameHost(
Daniel Cheng982f2b22022-08-25 23:46:16285 &RenderFrameHostImpl::MaybeDispatchDidFinishLoadOnPrerenderActivation);
Sreeja Kamishetty81fbeefb2021-08-12 07:21:41286}
287
Takashi Toyoshima881f4d72023-11-09 05:07:43288void PageImpl::DidActivateAllRenderViewsForPrerenderingOrPreview(
289 base::OnceCallback<void(base::TimeTicks)> completion_callback) {
Lingqi Chief8657c2023-06-08 08:40:31290 TRACE_EVENT0("navigation",
291 "PageImpl::DidActivateAllRenderViewsForPrerendering");
292
Matt Falkenhagenf78c2192021-07-24 02:01:43293 // Tell each RenderFrameHostImpl in this Page that activation finished.
Hiroki Nakagawaf98d009a2023-03-16 02:26:10294 main_document_->ForEachRenderFrameHostIncludingSpeculative(
295 [this](RenderFrameHostImpl* rfh) {
296 if (&rfh->GetPage() != this) {
297 return;
298 }
299 rfh->RendererDidActivateForPrerendering();
300 });
Takashi Toyoshima881f4d72023-11-09 05:07:43301 CHECK(activation_start_time_.has_value());
302 std::move(completion_callback).Run(*activation_start_time_);
Matt Falkenhagenf78c2192021-07-24 02:01:43303}
304
Sreeja Kamishetty1b5c1432021-06-25 11:32:59305RenderFrameHost& PageImpl::GetMainDocumentHelper() {
Ali Hijazid87307d2022-11-07 20:15:03306 return *main_document_;
Sreeja Kamishetty1b5c1432021-06-25 11:32:59307}
308
309RenderFrameHostImpl& PageImpl::GetMainDocument() const {
Ali Hijazid87307d2022-11-07 20:15:03310 return *main_document_;
Sreeja Kamishetty1b5c1432021-06-25 11:32:59311}
312
Peilin Wangae08e26e2024-06-10 20:55:30313void PageImpl::UpdateBrowserControlsState(
314 cc::BrowserControlsState constraints,
315 cc::BrowserControlsState current,
316 bool animate,
317 const std::optional<cc::BrowserControlsOffsetTagsInfo>& offset_tags_info) {
Alison Gale47d1537d2024-04-19 21:31:46318 // TODO(crbug.com/40159655): Asking for the LocalMainFrame interface
Yoshisato Yanagisawad016d62d32021-10-15 04:38:55319 // before the RenderFrame is created is racy.
Nasko Oskov8b04f402022-05-26 23:29:56320 if (!GetMainDocument().IsRenderFrameLive())
Yoshisato Yanagisawad016d62d32021-10-15 04:38:55321 return;
322
Sky Malice3774b002022-10-21 19:18:40323 if (base::FeatureList::IsEnabled(
324 features::kUpdateBrowserControlsWithoutProxy)) {
325 GetMainDocument().GetRenderWidgetHost()->UpdateBrowserControlsState(
Peilin Wangae08e26e2024-06-10 20:55:30326 constraints, current, animate, offset_tags_info);
Sky Malice3774b002022-10-21 19:18:40327 } else {
328 GetMainDocument().GetAssociatedLocalMainFrame()->UpdateBrowserControlsState(
Peilin Wangae08e26e2024-06-10 20:55:30329 constraints, current, animate, offset_tags_info);
Sky Malice3774b002022-10-21 19:18:40330 }
Yoshisato Yanagisawad016d62d32021-10-15 04:38:55331}
332
Kevin McNeec4325ba2022-04-08 23:18:23333float PageImpl::GetPageScaleFactor() const {
334 return GetMainDocument().GetPageScaleFactor();
335}
336
Dominic Farolino5c606c12021-12-18 09:40:14337void PageImpl::UpdateEncoding(const std::string& encoding_name) {
338 if (encoding_name == last_reported_encoding_)
339 return;
340 last_reported_encoding_ = encoding_name;
341
342 canonical_encoding_ =
343 base::GetCanonicalEncodingNameByAliasName(encoding_name);
344}
345
Yoshisato Yanagisawa8ae0d112022-04-20 01:49:30346void PageImpl::NotifyVirtualKeyboardOverlayRect(
347 const gfx::Rect& keyboard_rect) {
Alison Gale81f4f2c72024-04-22 19:33:31348 // TODO(crbug.com/40222405): send notification to outer frames if
Yoshisato Yanagisawa8ae0d112022-04-20 01:49:30349 // needed.
David Bokand6e44055b2022-09-21 03:58:08350 DCHECK_EQ(virtual_keyboard_mode(),
351 ui::mojom::VirtualKeyboardMode::kOverlaysContent);
Yoshisato Yanagisawa8ae0d112022-04-20 01:49:30352 GetMainDocument().GetAssociatedLocalFrame()->NotifyVirtualKeyboardOverlayRect(
353 keyboard_rect);
354}
355
David Bokand6e44055b2022-09-21 03:58:08356void PageImpl::SetVirtualKeyboardMode(ui::mojom::VirtualKeyboardMode mode) {
357 if (virtual_keyboard_mode_ == mode)
358 return;
359
360 virtual_keyboard_mode_ = mode;
361
Ali Hijazid87307d2022-11-07 20:15:03362 delegate_->OnVirtualKeyboardModeChanged(*this);
David Bokand6e44055b2022-09-21 03:58:08363}
364
Yoshisato Yanagisawa668f8442022-04-20 04:45:58365base::flat_map<std::string, std::string> PageImpl::GetKeyboardLayoutMap() {
366 return GetMainDocument().GetRenderWidgetHost()->GetKeyboardLayoutMap();
367}
368
Camillia Smith Barnes385a2e92024-04-16 17:49:40369blink::SharedStorageSelectUrlBudgetStatus
370PageImpl::CheckAndMaybeDebitSelectURLBudgets(const net::SchemefulSite& site,
371 double bits_to_charge) {
Camillia Smith Barnes477a3112023-02-28 19:06:30372 if (!select_url_overall_budget_) {
373 // The limits are not enabled.
Camillia Smith Barnes385a2e92024-04-16 17:49:40374 return blink::SharedStorageSelectUrlBudgetStatus::kSufficientBudget;
Camillia Smith Barnes9d70e5ae82023-01-18 19:25:24375 }
376
Camillia Smith Barnes385a2e92024-04-16 17:49:40377 // Return insufficient if there is insufficient overall budget.
Camillia Smith Barnes477a3112023-02-28 19:06:30378 if (bits_to_charge > select_url_overall_budget_.value()) {
Camillia Smith Barnes385a2e92024-04-16 17:49:40379 GetContentClient()->browser()->LogWebFeatureForCurrentPage(
380 &GetMainDocument(),
381 blink::mojom::WebFeature::
382 kSharedStorageAPI_SelectURLOverallPageloadBudgetInsufficient);
383 return blink::SharedStorageSelectUrlBudgetStatus::
384 kInsufficientOverallPageloadBudget;
Camillia Smith Barnes574d4d42023-01-10 18:57:47385 }
386
Camillia Smith Barnes74552232023-10-02 18:50:07387 DCHECK(select_url_max_bits_per_site_);
Camillia Smith Barnes477a3112023-02-28 19:06:30388
Camillia Smith Barnes74552232023-10-02 18:50:07389 // Return false if the max bits per site is set to a value smaller than the
Camillia Smith Barnes477a3112023-02-28 19:06:30390 // current bits to charge.
Camillia Smith Barnes74552232023-10-02 18:50:07391 if (bits_to_charge > select_url_max_bits_per_site_.value()) {
Camillia Smith Barnes385a2e92024-04-16 17:49:40392 return blink::SharedStorageSelectUrlBudgetStatus::
393 kInsufficientSitePageloadBudget;
Camillia Smith Barnes477a3112023-02-28 19:06:30394 }
395
Camillia Smith Barnes385a2e92024-04-16 17:49:40396 // Charge the per-site budget or return insufficient if there is not enough.
Camillia Smith Barnes74552232023-10-02 18:50:07397 auto it = select_url_per_site_budget_.find(site);
398 if (it == select_url_per_site_budget_.end()) {
399 select_url_per_site_budget_[site] =
400 select_url_max_bits_per_site_.value() - bits_to_charge;
Camillia Smith Barnes477a3112023-02-28 19:06:30401 } else if (bits_to_charge > it->second) {
Camillia Smith Barnes74552232023-10-02 18:50:07402 // There is insufficient per-site budget remaining.
Camillia Smith Barnes385a2e92024-04-16 17:49:40403 return blink::SharedStorageSelectUrlBudgetStatus::
404 kInsufficientSitePageloadBudget;
Camillia Smith Barnes477a3112023-02-28 19:06:30405 } else {
406 it->second -= bits_to_charge;
407 }
408
409 // Charge the overall budget.
410 select_url_overall_budget_.value() -= bits_to_charge;
Camillia Smith Barnes385a2e92024-04-16 17:49:40411 return blink::SharedStorageSelectUrlBudgetStatus::kSufficientBudget;
Camillia Smith Barnes574d4d42023-01-10 18:57:47412}
413
Adithya Srinivasana5795b92023-12-20 22:35:22414void PageImpl::TakeLoadingMemoryTracker(NavigationRequest* request) {
415 CHECK(IsPrimary());
416 loading_memory_tracker_ = request->TakePeakGpuMemoryTracker();
417}
418
419void PageImpl::ResetLoadingMemoryTracker() {
420 CHECK(IsPrimary());
421 if (loading_memory_tracker_) {
422 loading_memory_tracker_.reset();
423 }
424}
425
426void PageImpl::CancelLoadingMemoryTracker() {
427 if (loading_memory_tracker_) {
428 loading_memory_tracker_->Cancel();
429 loading_memory_tracker_.reset();
430 }
431}
432
Adithya Srinivasanec6b3f92024-01-09 16:31:01433void PageImpl::SetLastCommitParams(
434 mojom::DidCommitProvisionalLoadParamsPtr commit_params) {
435 CHECK(GetMainDocument().IsOutermostMainFrame());
436 last_commit_params_ = std::move(commit_params);
437}
438
439mojom::DidCommitProvisionalLoadParamsPtr PageImpl::TakeLastCommitParams() {
440 CHECK(GetMainDocument().IsOutermostMainFrame());
441 return std::move(last_commit_params_);
442}
443
Sreeja Kamishetty9e1d0e732021-05-27 18:20:09444} // namespace content