• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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