Since my last response in this thread, I talked with kinuko@, yhirano@ about the design and also spent some amount of time to understand the current design and make the design of Loader's Onion Soup clearer.
Let me share some updates here.
Now I'm planning to split tasks into three steps as follows.
(1) Use network::mojom::URLLoader in Blink
(2) Move most of the code for FetchContext in content to Blink
(3) Replace WebURLRequest with network::mojom::URLRequest.
Note that step 1 and 2 are blocking the rest of service worker's onion soup.
In step 1, we are going to use ThrottlingURLLoader and add a URLLoader which uses network::mojom::URLLoader in Blink. It's placed in a directory blink/renderer/platform/loader/fetch/url_loader, which is different from other parts of loader code (blink/renderer/platform/loader/fetch) to clarify they are use non-Blink types.
In step 3, I'm planning to expand the usage of network::mojom::URLRequest as a struct to represent network request exposed to outside of Blink. However, the usage will be limited because the network::mojom::URLRequest is basically going to be copied to blink::ResourceRequest immediately after going into Blink, and the only usage of network::mojom::URLRequest will be kept in the directory (b/r/p/l/f/url_loader).
For reference, let me put the design docs for Loader's Onion Soup and eliminating WebURLRequest.
Onion Soup: Loaders:
https://docs.google.com/document/d/18TVbhZ4MnGTCHYqeQtqz59SdTHP7CFqVyHWYbcD_d5A/edit