blob: 4376c12497face3806bdcb382ac1af57f1ed1648 [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]678c0362012-12-05 08:02:4414#include "content/browser/loader/resource_dispatcher_host_impl.h"
[email protected]b3c41c0b2012-03-06 15:48:3215#include "content/browser/renderer_host/render_view_host_impl.h"
[email protected]59f4f2fa2011-03-23 01:00:5516#include "content/common/view_messages.h"
Eric Seckler8652dcd52018-09-20 10:42:2817#include "content/public/browser/browser_task_traits.h"
initial.commit09911bf2008-07-26 23:55:2918
[email protected]fc4616f2012-07-21 01:29:5819namespace content {
[email protected]c63b4d42012-04-26 01:01:0720namespace {
21
22typedef std::map<int, RenderWidgetHelper*> WidgetHelperMap;
scottmg5e65e3a2017-03-08 08:48:4623base::LazyInstance<WidgetHelperMap>::DestructorAtExit g_widget_helpers =
[email protected]c63b4d42012-04-26 01:01:0724 LAZY_INSTANCE_INITIALIZER;
25
26void AddWidgetHelper(int render_process_id,
27 const scoped_refptr<RenderWidgetHelper>& widget_helper) {
[email protected]8607aa92014-03-29 02:01:2228 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]c63b4d42012-04-26 01:01:0729 // We don't care if RenderWidgetHelpers overwrite an existing process_id. Just
30 // want this to be up to date.
31 g_widget_helpers.Get()[render_process_id] = widget_helper.get();
32}
33
34} // namespace
35
[email protected]4566f132009-03-12 01:55:1336RenderWidgetHelper::RenderWidgetHelper()
Ivan Kotenkov2c0d2bb32017-11-01 15:41:2837 : render_process_id_(-1), resource_dispatcher_host_(nullptr) {}
initial.commit09911bf2008-07-26 23:55:2938
39RenderWidgetHelper::~RenderWidgetHelper() {
[email protected]8607aa92014-03-29 02:01:2240 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]90c8b9ca62012-08-31 19:48:0241
42 // Delete this RWH from the map if it is found.
43 WidgetHelperMap& widget_map = g_widget_helpers.Get();
44 WidgetHelperMap::iterator it = widget_map.find(render_process_id_);
45 if (it != widget_map.end() && it->second == this)
46 widget_map.erase(it);
initial.commit09911bf2008-07-26 23:55:2947}
48
[email protected]4566f132009-03-12 01:55:1349void RenderWidgetHelper::Init(
50 int render_process_id,
[email protected]ea114722012-03-12 01:11:2551 ResourceDispatcherHostImpl* resource_dispatcher_host) {
[email protected]4566f132009-03-12 01:55:1352 render_process_id_ = render_process_id;
53 resource_dispatcher_host_ = resource_dispatcher_host;
[email protected]c63b4d42012-04-26 01:01:0754
Eric Seckler8652dcd52018-09-20 10:42:2855 base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO},
56 base::BindOnce(&AddWidgetHelper, render_process_id_,
57 base::WrapRefCounted(this)));
[email protected]4566f132009-03-12 01:55:1358}
59
initial.commit09911bf2008-07-26 23:55:2960int RenderWidgetHelper::GetNextRoutingID() {
lfg052af412015-03-19 16:49:5361 return next_routing_id_.GetNext() + 1;
initial.commit09911bf2008-07-26 23:55:2962}
63
[email protected]c63b4d42012-04-26 01:01:0764// static
65RenderWidgetHelper* RenderWidgetHelper::FromProcessHostID(
66 int render_process_host_id) {
[email protected]8607aa92014-03-29 02:01:2267 DCHECK_CURRENTLY_ON(BrowserThread::IO);
[email protected]c63b4d42012-04-26 01:01:0768 WidgetHelperMap::const_iterator ci = g_widget_helpers.Get().find(
69 render_process_host_id);
70 return (ci == g_widget_helpers.Get().end())? NULL : ci->second;
71}
72
[email protected]0ebf3872008-11-07 21:35:0373void RenderWidgetHelper::CreateNewWidget(int opener_id,
Dave Tapuska1bdf1832017-07-07 18:07:1974 mojom::WidgetPtr widget,
piman5d36dae2015-09-24 22:47:0575 int* route_id) {
initial.commit09911bf2008-07-26 23:55:2976 *route_id = GetNextRoutingID();
Dave Tapuska1bdf1832017-07-07 18:07:1977
Eric Seckler8652dcd52018-09-20 10:42:2878 base::PostTaskWithTraits(
79 FROM_HERE, {BrowserThread::UI},
Dave Tapuska1bdf1832017-07-07 18:07:1980 base::BindOnce(&RenderWidgetHelper::OnCreateWidgetOnUI, this, opener_id,
danakj829cdd142018-09-14 21:13:2781 *route_id, widget.PassInterface()));
initial.commit09911bf2008-07-26 23:55:2982}
83
[email protected]ca5660e2011-02-11 00:51:0984void RenderWidgetHelper::CreateNewFullscreenWidget(int opener_id,
Dave Tapuska1bdf1832017-07-07 18:07:1985 mojom::WidgetPtr widget,
piman5d36dae2015-09-24 22:47:0586 int* route_id) {
[email protected]484955942010-08-19 16:13:1887 *route_id = GetNextRoutingID();
Eric Seckler8652dcd52018-09-20 10:42:2888 base::PostTaskWithTraits(
89 FROM_HERE, {BrowserThread::UI},
Dave Tapuska1bdf1832017-07-07 18:07:1990 base::BindOnce(&RenderWidgetHelper::OnCreateFullscreenWidgetOnUI, this,
91 opener_id, *route_id, widget.PassInterface()));
[email protected]484955942010-08-19 16:13:1892}
93
avib533f5d2015-12-25 03:11:1594void RenderWidgetHelper::OnCreateWidgetOnUI(int32_t opener_id,
95 int32_t route_id,
danakj829cdd142018-09-14 21:13:2796 mojom::WidgetPtrInfo widget_info) {
Dave Tapuska1bdf1832017-07-07 18:07:1997 mojom::WidgetPtr widget;
98 widget.Bind(std::move(widget_info));
[email protected]9f76c1e2012-03-05 15:15:5899 RenderViewHostImpl* host = RenderViewHostImpl::FromID(
100 render_process_id_, opener_id);
initial.commit09911bf2008-07-26 23:55:29101 if (host)
danakj829cdd142018-09-14 21:13:27102 host->CreateNewWidget(route_id, std::move(widget));
initial.commit09911bf2008-07-26 23:55:29103}
[email protected]e68e62fa2009-02-20 02:00:04104
Dave Tapuska1bdf1832017-07-07 18:07:19105void RenderWidgetHelper::OnCreateFullscreenWidgetOnUI(
106 int32_t opener_id,
107 int32_t route_id,
108 mojom::WidgetPtrInfo widget_info) {
109 mojom::WidgetPtr widget;
110 widget.Bind(std::move(widget_info));
[email protected]9f76c1e2012-03-05 15:15:58111 RenderViewHostImpl* host = RenderViewHostImpl::FromID(
112 render_process_id_, opener_id);
[email protected]484955942010-08-19 16:13:18113 if (host)
Dave Tapuska1bdf1832017-07-07 18:07:19114 host->CreateNewFullscreenWidget(route_id, std::move(widget));
[email protected]484955942010-08-19 16:13:18115}
116
[email protected]fc4616f2012-07-21 01:29:58117} // namespace content