1 // Copyright (c) 2019 The Chromium Embedded Framework Authors. All rights
2 // reserved. Use of this source code is governed by a BSD-style license that
3 // can be found in the LICENSE file.
4
5 #include "libcef/browser/request_context_handler_map.h"
6
7 CefRequestContextHandlerMap::CefRequestContextHandlerMap() = default;
8 CefRequestContextHandlerMap::~CefRequestContextHandlerMap() = default;
9
AddHandler(int render_process_id,int render_frame_id,int frame_tree_node_id,CefRefPtr<CefRequestContextHandler> handler)10 void CefRequestContextHandlerMap::AddHandler(
11 int render_process_id,
12 int render_frame_id,
13 int frame_tree_node_id,
14 CefRefPtr<CefRequestContextHandler> handler) {
15 DCHECK_GE(render_process_id, 0);
16 DCHECK_GE(render_frame_id, 0);
17 DCHECK_GE(frame_tree_node_id, 0);
18 DCHECK(handler);
19
20 render_id_handler_map_.insert(std::make_pair(
21 std::make_pair(render_process_id, render_frame_id), handler));
22 node_id_handler_map_.insert(std::make_pair(frame_tree_node_id, handler));
23 }
24
RemoveHandler(int render_process_id,int render_frame_id,int frame_tree_node_id)25 void CefRequestContextHandlerMap::RemoveHandler(int render_process_id,
26 int render_frame_id,
27 int frame_tree_node_id) {
28 DCHECK_GE(render_process_id, 0);
29 DCHECK_GE(render_frame_id, 0);
30 DCHECK_GE(frame_tree_node_id, 0);
31
32 auto it1 = render_id_handler_map_.find(
33 std::make_pair(render_process_id, render_frame_id));
34 if (it1 != render_id_handler_map_.end())
35 render_id_handler_map_.erase(it1);
36
37 auto it2 = node_id_handler_map_.find(frame_tree_node_id);
38 if (it2 != node_id_handler_map_.end())
39 node_id_handler_map_.erase(it2);
40 }
41
GetHandler(int render_process_id,int render_frame_id,int frame_tree_node_id,bool require_frame_match) const42 CefRefPtr<CefRequestContextHandler> CefRequestContextHandlerMap::GetHandler(
43 int render_process_id,
44 int render_frame_id,
45 int frame_tree_node_id,
46 bool require_frame_match) const {
47 if (render_process_id >= 0 && render_frame_id >= 0) {
48 const auto it1 = render_id_handler_map_.find(
49 std::make_pair(render_process_id, render_frame_id));
50 if (it1 != render_id_handler_map_.end())
51 return it1->second;
52 }
53
54 if (frame_tree_node_id >= 0) {
55 const auto it2 = node_id_handler_map_.find(frame_tree_node_id);
56 if (it2 != node_id_handler_map_.end())
57 return it2->second;
58 }
59
60 if (render_process_id >= 0 && !require_frame_match) {
61 // Choose an arbitrary handler for the same process.
62 for (auto& kv : render_id_handler_map_) {
63 if (kv.first.first == render_process_id)
64 return kv.second;
65 }
66 }
67
68 return nullptr;
69 }
70