blob: d711d4e47897bfadd15686825ec0ac1765f426d4 [file] [log] [blame]
[email protected]9f4f3322012-01-18 22:29:561// Copyright (c) 2012 The Chromium Authors. All rights reserved.
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
[email protected]037edb52011-11-15 21:14:067#include "base/bind.h"
[email protected]0a9d452d2011-12-10 02:39:198#include "base/bind_helpers.h"
[email protected]c63b4d42012-04-26 01:01:079#include "base/lazy_instance.h"
[email protected]2025d002012-11-14 20:54:3510#include "base/posix/eintr_wrapper.h"
Eric Seckler8652dcd52018-09-20 10:42:2811#include "base/task/post_task.h"
[email protected]34b99632011-01-01 01:01:0612#include "base/threading/thread.h"
[email protected]3a7b66d2012-04-26 16:34:1613#include "base/threading/thread_restrictions.h"
[email protected]b3c41c0b2012-03-06 15:48:3214#include "content/browser/renderer_host/render_view_host_impl.h"
[email protected]59f4f2fa2011-03-23 01:00:5515#include "content/common/view_messages.h"
Eric Seckler8652dcd52018-09-20 10:42:2816#include "content/public/browser/browser_task_traits.h"
initial.commit09911bf2008-07-26 23:55:2917
[email protected]fc4616f2012-07-21 01:29:5818namespace content {
[email protected]c63b4d42012-04-26 01:01:0719namespace {
20
21typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap;
scottmg5e65e3a2017-03-08 08:48:4622base::LazyInstance<WidgetHelperMap>::DestructorAtExit g_widget_helpers =
[email protected]c63b4d42012-04-26 01:01:0723 LAZY_INSTANCE_INITIALIZER;
24
25void AddWidgetHelper(int render_process_id,
26 const scoped_refptr<RenderWidgetHelper>& widget_helper) {
[email protected]8607aa92014-03-29 02:01:2227 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]c63b4d42012-04-26 01:01:0728 // We don't care if RenderWidgetHelpers overwrite an existing process_id. Just
29 // want this to be up to date.
30 g_widget_helpers.Get()[render_process_id] = widget_helper.get();
31}
32
33} // namespace
34
John Abd-El-Malek0e82fe7f2019-07-27 00:06:2935RenderWidgetHelper::RenderWidgetHelper() : render_process_id_(-1) {}
initial.commit09911bf2008-07-26 23:55:2936
37RenderWidgetHelper::~RenderWidgetHelper() {
[email protected]8607aa92014-03-29 02:01:2238 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]90c8b9ca62012-08-31 19:48:0239
40 // Delete this RWH from the map if it is found.
41 WidgetHelperMap& widget_map = g_widget_helpers.Get();
jdoerrie55ec69d2018-10-08 13:34:4642 auto it = widget_map.find(render_process_id_);
[email protected]90c8b9ca62012-08-31 19:48:0243 if (it != widget_map.end() && it->second == this)
44 widget_map.erase(it);
initial.commit09911bf2008-07-26 23:55:2945}
46
John Abd-El-Malek0e82fe7f2019-07-27 00:06:2947void RenderWidgetHelper::Init(int render_process_id) {
[email protected]4566f132009-03-12 01:55:1348 render_process_id_ = render_process_id;
[email protected]c63b4d42012-04-26 01:01:0749
Sami Kyostila8e4d5a92019-08-02 12:45:0550 base::PostTask(FROM_HERE, {BrowserThread::IO},
51 base::BindOnce(&AddWidgetHelper, render_process_id_,
52 base::WrapRefCounted(this)));
[email protected]4566f132009-03-12 01:55:1353}
54
initial.commit09911bf2008-07-26 23:55:2955int RenderWidgetHelper::GetNextRoutingID() {
lfg052af412015-03-19 16:49:5356 return next_routing_id_.GetNext() + 1;
initial.commit09911bf2008-07-26 23:55:2957}
58
[email protected]c63b4d42012-04-26 01:01:0759// static
60RenderWidgetHelper* RenderWidgetHelper::FromProcessHostID(
61 int render_process_host_id) {
[email protected]8607aa92014-03-29 02:01:2262 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]c63b4d42012-04-26 01:01:0763 WidgetHelperMap::const_iterator ci = g_widget_helpers.Get().find(
64 render_process_host_id);
65 return (ci == g_widget_helpers.Get().end())? NULL : ci->second;
66}
67
[email protected]0ebf3872008-11-07 21:35:0368void RenderWidgetHelper::CreateNewWidget(int opener_id,
Dave Tapuska1bdf1832017-07-07 18:07:1969 mojom::WidgetPtr widget,
piman5d36dae2015-09-24 22:47:0570 int* route_id) {
initial.commit09911bf2008-07-26 23:55:2971 *route_id = GetNextRoutingID();
Dave Tapuska1bdf1832017-07-07 18:07:1972
Sami Kyostila8e4d5a92019-08-02 12:45:0573 base::PostTask(FROM_HERE, {BrowserThread::UI},
74 base::BindOnce(&RenderWidgetHelper::OnCreateWidgetOnUI, this,
75 opener_id, *route_id, widget.PassInterface()));
initial.commit09911bf2008-07-26 23:55:2976}
77
[email protected]ca5660e2011-02-11 00:51:0978void RenderWidgetHelper::CreateNewFullscreenWidget(int opener_id,
Dave Tapuska1bdf1832017-07-07 18:07:1979 mojom::WidgetPtr widget,
piman5d36dae2015-09-24 22:47:0580 int* route_id) {
[email protected]484955942010-08-19 16:13:1881 *route_id = GetNextRoutingID();
Sami Kyostila8e4d5a92019-08-02 12:45:0582 base::PostTask(
Eric Seckler8652dcd52018-09-20 10:42:2883 FROM_HERE, {BrowserThread::UI},
Dave Tapuska1bdf1832017-07-07 18:07:1984 base::BindOnce(&RenderWidgetHelper::OnCreateFullscreenWidgetOnUI, this,
85 opener_id, *route_id, widget.PassInterface()));
[email protected]484955942010-08-19 16:13:1886}
87
avib533f5d2015-12-25 03:11:1588void RenderWidgetHelper::OnCreateWidgetOnUI(int32_t opener_id,
89 int32_t route_id,
danakj829cdd142018-09-14 21:13:2790 mojom::WidgetPtrInfo widget_info) {
Dave Tapuska1bdf1832017-07-07 18:07:1991 mojom::WidgetPtr widget;
92 widget.Bind(std::move(widget_info));
[email protected]9f76c1e2012-03-05 15:15:5893 RenderViewHostImpl* host = RenderViewHostImpl::FromID(
94 render_process_id_, opener_id);
initial.commit09911bf2008-07-26 23:55:2995 if (host)
danakj829cdd142018-09-14 21:13:2796 host->CreateNewWidget(route_id, std::move(widget));
initial.commit09911bf2008-07-26 23:55:2997}
[email protected]e68e62fa2009-02-20 02:00:0498
Dave Tapuska1bdf1832017-07-07 18:07:1999void RenderWidgetHelper::OnCreateFullscreenWidgetOnUI(
100 int32_t opener_id,
101 int32_t route_id,
102 mojom::WidgetPtrInfo widget_info) {
103 mojom::WidgetPtr widget;
104 widget.Bind(std::move(widget_info));
[email protected]9f76c1e2012-03-05 15:15:58105 RenderViewHostImpl* host = RenderViewHostImpl::FromID(
106 render_process_id_, opener_id);
[email protected]484955942010-08-19 16:13:18107 if (host)
Dave Tapuska1bdf1832017-07-07 18:07:19108 host->CreateNewFullscreenWidget(route_id, std::move(widget));
[email protected]484955942010-08-19 16:13:18109}
110
[email protected]fc4616f2012-07-21 01:29:58111} // namespace content