@@ -182,6 +182,55 @@ void RenderFrameDevToolsAgentHost::WebContentsCreated(
182
182
}
183
183
}
184
184
185
+ // static
186
+ void RenderFrameDevToolsAgentHost::UpdateRawHeadersAccess (
187
+ RenderFrameHostImpl* old_rfh,
188
+ RenderFrameHostImpl* new_rfh) {
189
+ DCHECK_NE (old_rfh, new_rfh);
190
+ RenderProcessHost* old_rph = old_rfh ? old_rfh->GetProcess () : nullptr ;
191
+ RenderProcessHost* new_rph = new_rfh ? new_rfh->GetProcess () : nullptr ;
192
+ if (old_rph == new_rph)
193
+ return ;
194
+ std::set<url::Origin> old_process_origins;
195
+ std::set<url::Origin> new_process_origins;
196
+ for (const auto & entry : g_agent_host_instances.Get ()) {
197
+ RenderFrameHostImpl* frame_host = entry.second ->frame_host_ ;
198
+ if (!frame_host)
199
+ continue ;
200
+ // Do not skip the nodes if they're about to get attached.
201
+ if (!entry.second ->IsAttached () &&
202
+ (!new_rfh || entry.first != new_rfh->frame_tree_node ())) {
203
+ continue ;
204
+ }
205
+ RenderProcessHost* process_host = frame_host->GetProcess ();
206
+ if (process_host == old_rph)
207
+ old_process_origins.insert (frame_host->GetLastCommittedOrigin ());
208
+ else if (process_host == new_rph)
209
+ new_process_origins.insert (frame_host->GetLastCommittedOrigin ());
210
+ }
211
+ if (!base::FeatureList::IsEnabled (network::features::kNetworkService )) {
212
+ if (old_rph && old_process_origins.empty ()) {
213
+ ChildProcessSecurityPolicyImpl::GetInstance ()->RevokeReadRawCookies (
214
+ old_rph->GetID ());
215
+ }
216
+ if (new_rph && !new_process_origins.empty ()) {
217
+ ChildProcessSecurityPolicyImpl::GetInstance ()->GrantReadRawCookies (
218
+ new_rph->GetID ());
219
+ }
220
+ return ;
221
+ }
222
+ if (old_rph) {
223
+ GetNetworkService ()->SetRawHeadersAccess (
224
+ old_rph->GetID (), std::vector<url::Origin>(old_process_origins.begin (),
225
+ old_process_origins.end ()));
226
+ }
227
+ if (new_rph) {
228
+ GetNetworkService ()->SetRawHeadersAccess (
229
+ new_rph->GetID (), std::vector<url::Origin>(new_process_origins.begin (),
230
+ new_process_origins.end ()));
231
+ }
232
+ }
233
+
185
234
RenderFrameDevToolsAgentHost::RenderFrameDevToolsAgentHost (
186
235
FrameTreeNode* frame_tree_node)
187
236
: DevToolsAgentHostImpl(frame_tree_node->devtools_frame_token ().ToString()),
@@ -266,7 +315,7 @@ bool RenderFrameDevToolsAgentHost::AttachSession(DevToolsSession* session) {
266
315
// DevToolsFrameTraceRecorder. Taking snapshots happens in TracingHandler.
267
316
if (!use_video_capture_api)
268
317
frame_trace_recorder_.reset (new DevToolsFrameTraceRecorder ());
269
- GrantPolicy ( );
318
+ UpdateRawHeadersAccess ( nullptr , frame_host_ );
270
319
#if defined(OS_ANDROID)
271
320
GetWakeLock ()->RequestWakeLock ();
272
321
#endif
@@ -278,7 +327,7 @@ void RenderFrameDevToolsAgentHost::DetachSession(DevToolsSession* session) {
278
327
// Destroying session automatically detaches in renderer.
279
328
if (sessions ().empty ()) {
280
329
frame_trace_recorder_.reset ();
281
- RevokePolicy ( );
330
+ UpdateRawHeadersAccess (frame_host_, nullptr );
282
331
#if defined(OS_ANDROID)
283
332
GetWakeLock ()->CancelWakeLock ();
284
333
#endif
@@ -371,10 +420,10 @@ void RenderFrameDevToolsAgentHost::UpdateFrameHost(
371
420
return ;
372
421
}
373
422
374
- if (IsAttached ())
375
- RevokePolicy ();
376
-
423
+ RenderFrameHostImpl* old_host = frame_host_;
377
424
frame_host_ = frame_host;
425
+ if (IsAttached ())
426
+ UpdateRawHeadersAccess (old_host, frame_host);
378
427
379
428
std::vector<DevToolsSession*> restricted_sessions;
380
429
for (DevToolsSession* session : sessions ()) {
@@ -390,46 +439,9 @@ void RenderFrameDevToolsAgentHost::UpdateFrameHost(
390
439
inspector->TargetReloadedAfterCrash ();
391
440
}
392
441
393
- if (IsAttached ())
394
- GrantPolicy ();
395
442
UpdateRendererChannel (IsAttached ());
396
443
}
397
444
398
- void RenderFrameDevToolsAgentHost::GrantPolicy () {
399
- if (!frame_host_)
400
- return ;
401
- uint32_t process_id = frame_host_->GetProcess ()->GetID ();
402
- if (base::FeatureList::IsEnabled (network::features::kNetworkService ))
403
- GetNetworkService ()->SetRawHeadersAccess (process_id, true );
404
- ChildProcessSecurityPolicyImpl::GetInstance ()->GrantReadRawCookies (
405
- process_id);
406
- }
407
-
408
- void RenderFrameDevToolsAgentHost::RevokePolicy () {
409
- if (!frame_host_)
410
- return ;
411
-
412
- bool process_has_agents = false ;
413
- RenderProcessHost* process_host = frame_host_->GetProcess ();
414
- for (const auto & ftn_agent : g_agent_host_instances.Get ()) {
415
- RenderFrameDevToolsAgentHost* agent = ftn_agent.second ;
416
- if (!agent->IsAttached ())
417
- continue ;
418
- if (agent->frame_host_ && agent->frame_host_ != frame_host_ &&
419
- agent->frame_host_ ->GetProcess () == process_host) {
420
- process_has_agents = true ;
421
- }
422
- }
423
-
424
- // We are the last to disconnect from the renderer -> revoke permissions.
425
- if (!process_has_agents) {
426
- if (base::FeatureList::IsEnabled (network::features::kNetworkService ))
427
- GetNetworkService ()->SetRawHeadersAccess (process_host->GetID (), false );
428
- ChildProcessSecurityPolicyImpl::GetInstance ()->RevokeReadRawCookies (
429
- process_host->GetID ());
430
- }
431
- }
432
-
433
445
void RenderFrameDevToolsAgentHost::DidStartNavigation (
434
446
NavigationHandle* navigation_handle) {
435
447
NavigationHandleImpl* handle =
@@ -472,9 +484,10 @@ void RenderFrameDevToolsAgentHost::RenderFrameDeleted(RenderFrameHost* rfh) {
472
484
473
485
void RenderFrameDevToolsAgentHost::DestroyOnRenderFrameGone () {
474
486
scoped_refptr<RenderFrameDevToolsAgentHost> protect (this );
475
- if (IsAttached ())
476
- RevokePolicy ();
477
- ForceDetachAllSessions ();
487
+ if (IsAttached ()) {
488
+ ForceDetachAllSessions ();
489
+ UpdateRawHeadersAccess (frame_host_, nullptr );
490
+ }
478
491
frame_host_ = nullptr ;
479
492
UpdateRendererChannel (IsAttached ());
480
493
SetFrameTreeNode (nullptr );
0 commit comments