| Index: content/renderer/render_frame_impl.cc | 
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc | 
| index b3b402a51a7ed2c39303b6d76491e7770f66e200..de55d05d388d405081fa17a8e8b83c4936001a5c 100644 | 
| --- a/content/renderer/render_frame_impl.cc | 
| +++ b/content/renderer/render_frame_impl.cc | 
| @@ -41,6 +41,7 @@ | 
| #include "content/common/frame_replication_state.h" | 
| #include "content/common/input_messages.h" | 
| #include "content/common/navigation_params.h" | 
| +#include "content/common/savable_subframe.h" | 
| #include "content/common/service_worker/service_worker_types.h" | 
| #include "content/common/site_isolation_policy.h" | 
| #include "content/common/swapped_out_messages.h" | 
| @@ -108,6 +109,7 @@ | 
| #include "content/renderer/shared_worker_repository.h" | 
| #include "content/renderer/skia_benchmarking_extension.h" | 
| #include "content/renderer/stats_collection_controller.h" | 
| +#include "content/renderer/web_frame_utils.h" | 
| #include "content/renderer/web_ui_extension.h" | 
| #include "content/renderer/websharedworker_proxy.h" | 
| #include "gin/modules/module_registry.h" | 
| @@ -526,16 +528,6 @@ bool IsReload(FrameMsg_Navigate_Type::Value navigation_type) { | 
| navigation_type == FrameMsg_Navigate_Type::RELOAD_ORIGINAL_REQUEST_URL; | 
| } | 
|  | 
| -// Returns the routing ID of the RenderFrameImpl or RenderFrameProxy | 
| -// associated with |web_frame|. | 
| -int GetRoutingIdForFrameOrProxy(WebFrame* web_frame) { | 
| -  if (!web_frame) | 
| -    return MSG_ROUTING_NONE; | 
| -  if (web_frame->isWebRemoteFrame()) | 
| -    return RenderFrameProxy::FromWebFrame(web_frame)->routing_id(); | 
| -  return RenderFrameImpl::FromWebFrame(web_frame)->GetRoutingID(); | 
| -} | 
| - | 
| RenderFrameImpl::CreateRenderFrameImplFunction g_create_render_frame_impl = | 
| nullptr; | 
|  | 
| @@ -4512,11 +4504,9 @@ void RenderFrameImpl::OnGetSavableResourceLinks() { | 
| std::vector<GURL> resources_list; | 
| std::vector<GURL> referrer_urls_list; | 
| std::vector<blink::WebReferrerPolicy> referrer_policies_list; | 
| -  std::vector<GURL> subframe_original_urls; | 
| -  std::vector<blink::WebFrame*> subframes; | 
| +  std::vector<SavableSubframe> subframes; | 
| SavableResourcesResult result(&resources_list, &referrer_urls_list, | 
| -                                &referrer_policies_list, | 
| -                                &subframe_original_urls, &subframes); | 
| +                                &referrer_policies_list, &subframes); | 
|  | 
| if (!GetSavableResourceLinksForFrame( | 
| frame_, &result, const_cast<const char**>(GetSavableSchemes()))) { | 
| @@ -4531,16 +4521,9 @@ void RenderFrameImpl::OnGetSavableResourceLinks() { | 
| Referrer(referrer_urls_list[i], referrer_policies_list[i])); | 
| } | 
|  | 
| -  std::vector<int> subframe_routing_ids; | 
| -  for (WebFrame* subframe : subframes) { | 
| -    subframe_routing_ids.push_back(GetRoutingIdForFrameOrProxy(subframe)); | 
| -  } | 
| - | 
| DCHECK_EQ(resources_list.size(), referrers_list.size()); | 
| -  DCHECK_EQ(subframe_original_urls.size(), subframe_routing_ids.size()); | 
| Send(new FrameHostMsg_SavableResourceLinksResponse( | 
| -      routing_id_, resources_list, referrers_list, subframe_original_urls, | 
| -      subframe_routing_ids)); | 
| +      routing_id_, resources_list, referrers_list, subframes)); | 
| } | 
|  | 
| void RenderFrameImpl::OnGetSerializedHtmlWithLocalLinks( | 
|  |