blob: 219c0a0b1ec34c2018e37646b2d44d4abbff10e9 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2012 The Chromium Authors
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]1d8a3d1f2011-02-19 07:11:525#include "content/browser/renderer_host/render_widget_helper.h"
initial.commit09911bf2008-07-26 23:55:296
Daniel Cheng5b8c1c9f2022-04-13 18:55:437#include "base/check_op.h"
Avi Drissmanadac21992023-01-11 23:46:398#include "base/functional/bind.h"
9#include "base/functional/callback_helpers.h"
[email protected]c63b4d42012-04-26 01:01:0710#include "base/lazy_instance.h"
Eric Seckler8652dcd52018-09-20 10:42:2811#include "content/public/browser/browser_task_traits.h"
David Sanders5d79e402022-03-16 19:25:5712#include "content/public/browser/browser_thread.h"
initial.commit09911bf2008-07-26 23:55:2913
[email protected]fc4616f2012-07-21 01:29:5814namespace content {
[email protected]c63b4d42012-04-26 01:01:0715namespace {
16
17typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap;
scottmg5e65e3a2017-03-08 08:48:4618base::LazyInstance<WidgetHelperMap>::DestructorAtExit g_widget_helpers =
[email protected]c63b4d42012-04-26 01:01:0719 LAZY_INSTANCE_INITIALIZER;
20
21void AddWidgetHelper(int render_process_id,
22 const scoped_refptr<RenderWidgetHelper>& widget_helper) {
[email protected]8607aa92014-03-29 02:01:2223 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]c63b4d42012-04-26 01:01:0724 // We don't care if RenderWidgetHelpers overwrite an existing process_id. Just
25 // want this to be up to date.
26 g_widget_helpers.Get()[render_process_id] = widget_helper.get();
27}
28
29} // namespace
30
Chris Hamilton6c60a832021-02-19 20:35:4631RenderWidgetHelper::FrameTokens::FrameTokens(
Dave Tapuska9291eff2023-12-08 17:06:3732 int32_t routing_id,
Daniel Cheng284c38942022-09-22 23:30:3433 const base::UnguessableToken& devtools_frame_token,
34 const blink::DocumentToken& document_token)
Dave Tapuska9291eff2023-12-08 17:06:3735 : routing_id(routing_id),
Daniel Cheng284c38942022-09-22 23:30:3436 devtools_frame_token(devtools_frame_token),
37 document_token(document_token) {}
Chris Hamilton6c60a832021-02-19 20:35:4638
39RenderWidgetHelper::FrameTokens::FrameTokens(const FrameTokens& other) =
40 default;
41
42RenderWidgetHelper::FrameTokens& RenderWidgetHelper::FrameTokens::operator=(
43 const FrameTokens& other) = default;
44
45RenderWidgetHelper::FrameTokens::~FrameTokens() = default;
46
John Abd-El-Malek0e82fe7f2019-07-27 00:06:2947RenderWidgetHelper::RenderWidgetHelper() : render_process_id_(-1) {}
initial.commit09911bf2008-07-26 23:55:2948
49RenderWidgetHelper::~RenderWidgetHelper() {
[email protected]8607aa92014-03-29 02:01:2250 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]90c8b9ca62012-08-31 19:48:0251
52 // Delete this RWH from the map if it is found.
53 WidgetHelperMap& widget_map = g_widget_helpers.Get();
jdoerrie55ec69d2018-10-08 13:34:4654 auto it = widget_map.find(render_process_id_);
[email protected]90c8b9ca62012-08-31 19:48:0255 if (it != widget_map.end() && it->second == this)
56 widget_map.erase(it);
initial.commit09911bf2008-07-26 23:55:2957}
58
John Abd-El-Malek0e82fe7f2019-07-27 00:06:2959void RenderWidgetHelper::Init(int render_process_id) {
[email protected]4566f132009-03-12 01:55:1360 render_process_id_ = render_process_id;
[email protected]c63b4d42012-04-26 01:01:0761
Gabriel Charettee7cdc5cd2020-05-27 23:35:0562 GetIOThreadTaskRunner({})->PostTask(
63 FROM_HERE, base::BindOnce(&AddWidgetHelper, render_process_id_,
Sami Kyostila8e4d5a92019-08-02 12:45:0564 base::WrapRefCounted(this)));
[email protected]4566f132009-03-12 01:55:1365}
66
initial.commit09911bf2008-07-26 23:55:2967int RenderWidgetHelper::GetNextRoutingID() {
Daniel Cheng5b8c1c9f2022-04-13 18:55:4368 int next_routing_id = next_routing_id_.GetNext();
Dave Tapuska3b10dd52023-11-02 19:19:5469 // Routing IDs are also used for `FrameSinkId` values from the browser.
70 // The must be in the range of [0, INT_MAX] as the renderer generates
71 // the rest of the range.
72 CHECK_LT(next_routing_id, std::numeric_limits<int32_t>::max());
Daniel Cheng5b8c1c9f2022-04-13 18:55:4373 return next_routing_id + 1;
initial.commit09911bf2008-07-26 23:55:2974}
75
Dave Tapuska9291eff2023-12-08 17:06:3776bool RenderWidgetHelper::TakeStoredDataForFrameToken(
77 const blink::LocalFrameToken& frame_token,
78 int32_t& routing_id,
Daniel Cheng284c38942022-09-22 23:30:3479 base::UnguessableToken& devtools_frame_token,
80 blink::DocumentToken& document_token) {
Dave Tapuska4e60c232020-11-05 15:49:3281 base::AutoLock lock(frame_token_map_lock_);
Dave Tapuska9291eff2023-12-08 17:06:3782 auto iter = frame_storage_map_.find(frame_token);
83 if (iter == frame_storage_map_.end()) {
Dave Tapuska4e60c232020-11-05 15:49:3284 return false;
Dave Tapuska9291eff2023-12-08 17:06:3785 }
86 routing_id = iter->second.routing_id;
Dave Tapuska4e60c232020-11-05 15:49:3287 devtools_frame_token = iter->second.devtools_frame_token;
Daniel Cheng284c38942022-09-22 23:30:3488 document_token = iter->second.document_token;
Dave Tapuska9291eff2023-12-08 17:06:3789 frame_storage_map_.erase(iter);
Dave Tapuska4e60c232020-11-05 15:49:3290 return true;
91}
92
93void RenderWidgetHelper::StoreNextFrameRoutingID(
94 int32_t routing_id,
Chris Hamilton6c60a832021-02-19 20:35:4695 const blink::LocalFrameToken& frame_token,
Daniel Cheng284c38942022-09-22 23:30:3496 const base::UnguessableToken& devtools_frame_token,
97 const blink::DocumentToken& document_token) {
Dave Tapuska4e60c232020-11-05 15:49:3298 base::AutoLock lock(frame_token_map_lock_);
99 bool result =
Dave Tapuska9291eff2023-12-08 17:06:37100 frame_storage_map_
101 .emplace(frame_token, FrameTokens(routing_id, devtools_frame_token,
102 document_token))
Dave Tapuska4e60c232020-11-05 15:49:32103 .second;
104 DCHECK(result);
105}
106
[email protected]fc4616f2012-07-21 01:29:58107} // namespace content