chromium http 处理

1,在D:\dev\electron9\src\content\public\browser\content_browser_client.h 中,放着对外可以覆盖的接口

如,强制下载而不是用plugin打开:

  // Called on IO or UI thread to determine whether or not to allow load and
  // render MHTML page from http/https URLs.
  virtual bool ShouldForceDownloadResource(const GURL& url,
                                           const std::string& mime_type);

D:\dev\electron9\src\extensions\shell\browser\shell_content_browser_client.cc,这个类扩展自上面 class ShellContentBrowserClient : public content::ContentBrowserClient 。

 

D:\dev\electron9\src\electron\shell\browser\electron_browser_client.h  这个类扩展自 class ElectronBrowserClient : public content::ContentBrowserClient,public content::RenderProcessHostObserver

加入扩展命令启动开关:

void ElectronBrowserClient::AppendExtraCommandLineSwitches(

void ElectronBrowserClient::OverrideWebkitPrefs

喜好的获取:

 ProcessPreferences prefs;
  auto* web_preferences =
      WebContentsPreferences::From(GetWebContentsFromProcessID(process_id));
  if (web_preferences) {
    prefs.sandbox = web_preferences->IsEnabled(options::kSandbox);
    prefs.native_window_open =
        web_preferences->IsEnabled(options::kNativeWindowOpen);
    prefs.disable_popups = web_preferences->IsEnabled("disablePopups");
    prefs.web_security = web_preferences->IsEnabled(options::kWebSecurity,
                                                    true /* default value */);
    prefs.browser_context = host->GetBrowserContext();

 


http下载:

 

void PluginResponseInterceptorURLLoaderThrottle::WillProcessResponse(
    const GURL& response_url,
    network::mojom::URLResponseHead* response_head,
    bool* defer) {
  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
  if (content::download_utils::MustDownload(response_url,
                                            response_head->headers.get(),
                                            response_head->mime_type)) {
    return;
  }

  content::WebContents* web_contents =
      content::WebContents::FromFrameTreeNodeId(frame_tree_node_id_);
  if (!web_contents)
    return;

  std::string extension_id = PluginUtils::GetExtensionIdForMimeType(
      web_contents->GetBrowserContext(), response_head->mime_type);

  if (extension_id.empty())
    return;

  MimeTypesHandler::ReportUsedHandler(extension_id);

  std::string view_id = base::GenerateGUID();
  // The string passed down to the original client with the response body.
  std::string payload = view_id;

  mojo::PendingRemote<network::mojom::URLLoader> dummy_new_loader;
  ignore_result(dummy_new_loader.InitWithNewPipeAndPassReceiver());
  mojo::Remote<network::mojom::URLLoaderClient> new_client;
  mojo::PendingReceiver<network::mojom::URLLoaderClient> new_client_receiver =
      new_client.BindNewPipeAndPassReceiver();

  uint32_t data_pipe_size = 64U;
  // Provide the MimeHandlerView code a chance to override the payload. This is
  // the case where the resource is handled by frame-based MimeHandlerView.
  *defer = extensions::MimeHandlerViewAttachHelper::
      OverrideBodyForInterceptedResponse(
          frame_tree_node_id_, response_url, response_head->mime_type, view_id,
          &payload, &data_pipe_size,
          base::BindOnce(
              &PluginResponseInterceptorURLLoaderThrottle::ResumeLoad,
              weak_factory_.GetWeakPtr()));

  mojo::DataPipe data_pipe(data_pipe_size);
  uint32_t len = static_cast<uint32_t>(payload.size());
  CHECK_EQ(MOJO_RESULT_OK,
           data_pipe.producer_handle->WriteData(
               payload.c_str(), &len, MOJO_WRITE_DATA_FLAG_ALL_OR_NONE));

  new_client->OnStartLoadingResponseBody(std::move(data_pipe.consumer_handle));

  network::URLLoaderCompletionStatus status(net::OK);
  status.decoded_body_length = len;
  new_client->OnComplete(status);

  mojo::PendingRemote<network::mojom::URLLoader> original_loader;
  mojo::PendingReceiver<network::mojom::URLLoaderClient> original_client;
  delegate_->InterceptResponse(std::move(dummy_new_loader),
                               std::move(new_client_receiver), &original_loader,
                               &original_client);

  // Make a deep copy of URLResponseHead before passing it cross-thread.
  auto deep_copied_response = response_head->Clone();
  if (response_head->headers) {
    deep_copied_response->headers =
        base::MakeRefCounted<net::HttpResponseHeaders>(
            response_head->headers->raw_headers());
  }

  auto transferrable_loader = content::mojom::TransferrableURLLoader::New();
  transferrable_loader->url = GURL(
      extensions::Extension::GetBaseURLFromExtensionId(extension_id).spec() +
      base::GenerateGUID());
  transferrable_loader->url_loader = std::move(original_loader);
  transferrable_loader->url_loader_client = std::move(original_client);
  transferrable_loader->head = std::move(deep_copied_response);
  transferrable_loader->head->intercepted_by_plugin = true;

  bool embedded = resource_type_ !=
                  static_cast<int>(blink::mojom::ResourceType::kMainFrame);
  base::PostTask(
      FROM_HERE, {content::BrowserThread::UI},
      base::BindOnce(
          &extensions::StreamsPrivateAPI::SendExecuteMimeTypeHandlerEvent,
          extension_id, view_id, embedded, frame_tree_node_id_,
          -1 /* render_process_id */, -1 /* render_frame_id */,
          std::move(transferrable_loader), response_url));
}

 

调用堆栈:

electron.exe!net::HttpContentDisposition::ConsumeDispositionType() 行 368
    在 o:\net\http\http_content_disposition.cc(368)
electron.exe!net::HttpContentDisposition::Parse() 行 404
    在 o:\net\http\http_content_disposition.cc(404)
electron.exe!net::HttpContentDisposition::HttpContentDisposition() 行 345
    在 o:\net\http\http_content_disposition.cc(345)
electron.exe!content::download_utils::MustDownload() 行 45
    在 o:\content\browser\loader\download_utils_impl.cc(45)
electron.exe!PluginResponseInterceptorURLLoaderThrottle::WillProcessResponse() 行 41
    在 o:\chrome\browser\plugins\plugin_response_interceptor_url_loader_throttle.cc(41)
electron.exe!blink::ThrottlingURLLoader::OnReceiveResponse() 行 567
    在 o:\third_party\blink\common\loader\throttling_url_loader.cc(567)
electron.exe!network::mojom::URLLoaderClientStubDispatch::Accept() 行 1126
    在 o:\fake\prefix\gen\services\network\public\mojom\url_loader.mojom.cc(1126)
electron.exe!network::mojom::URLLoaderClientStub<mojo::RawPtrImplRefTraits<network::mojom::URLLoaderClient>>::Accept() 行 294
    在 o:\fake\prefix\gen\services\network\public\mojom\url_loader.mojom.h(294)
electron.exe!mojo::InterfaceEndpointClient::HandleValidatedMessage() 行 554
    在 o:\mojo\public\cpp\bindings\lib\interface_endpoint_client.cc(554)
electron.exe!mojo::InterfaceEndpointClient::HandleIncomingMessageThunk::Accept() 行 140
    在 o:\mojo\public\cpp\bindings\lib\interface_endpoint_client.cc(140)
electron.exe!mojo::MessageDispatcher::Accept() 行 41
    在 o:\mojo\public\cpp\bindings\lib\message_dispatcher.cc(41)
electron.exe!mojo::InterfaceEndpointClient::HandleIncomingMessage() 行 357
    在 o:\mojo\public\cpp\bindings\lib\interface_endpoint_client.cc(357)
electron.exe!mojo::internal::MultiplexRouter::ProcessIncomingMessage() 行 952
    在 o:\mojo\public\cpp\bindings\lib\multiplex_router.cc(952)
electron.exe!mojo::internal::MultiplexRouter::Accept() 行 620
    在 o:\mojo\public\cpp\bindings\lib\multiplex_router.cc(620)
electron.exe!mojo::MessageDispatcher::Accept() 行 41
    在 o:\mojo\public\cpp\bindings\lib\message_dispatcher.cc(41)
electron.exe!mojo::Connector::DispatchMessageW() 行 538
    在 o:\mojo\public\cpp\bindings\lib\connector.cc(538)
electron.exe!mojo::Connector::ReadAllAvailableMessages() 行 627
    在 o:\mojo\public\cpp\bindings\lib\connector.cc(627)
electron.exe!mojo::Connector::OnHandleReadyInternal() 行 448
    在 o:\mojo\public\cpp\bindings\lib\connector.cc(448)
electron.exe!mojo::Connector::OnWatcherHandleReady() 行 408
    在 o:\mojo\public\cpp\bindings\lib\connector.cc(408)
electron.exe!base::internal::FunctorTraits<void (mojo::Connector::*)(unsigned int),void>::Invoke<void (mojo::Connector::*)(unsigned int),mojo::Connector *,unsigned int>() 行 489
    在 o:\base\bind_internal.h(489)
electron.exe!base::internal::InvokeHelper<0,void>::MakeItSo<void (mojo::Connector::*const &)(unsigned int),mojo::Connector *,unsigned int>() 行 623
    在 o:\base\bind_internal.h(623)
electron.exe!base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int),base::internal::UnretainedWrapper<mojo::Connector>>,void (unsigned int)>::RunImpl<void (mojo::Connector::*const &)(unsigned int),const std::__1::tuple<base::internal::UnretainedWrapper<mojo::Connector>> &,0>() 行 696
    在 o:\base\bind_internal.h(696)
electron.exe!base::internal::Invoker<base::internal::BindState<void (mojo::Connector::*)(unsigned int),base::internal::UnretainedWrapper<mojo::Connector>>,void (unsigned int)>::Run() 行 678
    在 o:\base\bind_internal.h(678)
electron.exe!base::RepeatingCallback<void (unsigned int)>::Run() 行 132
    在 o:\base\callback.h(132)
electron.exe!mojo::SimpleWatcher::DiscardReadyState() 行 195
    在 o:\mojo\public\cpp\system\simple_watcher.h(195)
electron.exe!base::internal::FunctorTraits<void (*)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),void>::Invoke<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),const base::RepeatingCallback<void (unsigned int)> &,unsigned int,const mojo::HandleSignalsState &>() 行 389
    在 o:\base\bind_internal.h(389)
electron.exe!base::internal::InvokeHelper<0,void>::MakeItSo<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),const base::RepeatingCallback<void (unsigned int)> &,unsigned int,const mojo::HandleSignalsState &>() 行 623
    在 o:\base\bind_internal.h(623)
electron.exe!base::internal::Invoker<base::internal::BindState<void (*)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),base::RepeatingCallback<void (unsigned int)>>,void (unsigned int, const mojo::HandleSignalsState &)>::RunImpl<void (*const &)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),const std::__1::tuple<base::RepeatingCallback<void (unsigned int)>> &,0>() 行 696
    在 o:\base\bind_internal.h(696)
electron.exe!base::internal::Invoker<base::internal::BindState<void (*)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),base::RepeatingCallback<void (unsigned int)>>,void (unsigned int, const mojo::HandleSignalsState &)>::Run() 行 678
    在 o:\base\bind_internal.h(678)
electron.exe!base::RepeatingCallback<void (unsigned int, const mojo::HandleSignalsState &)>::Run() 行 132
    在 o:\base\callback.h(132)
electron.exe!mojo::SimpleWatcher::OnHandleReady() 行 293
    在 o:\mojo\public\cpp\system\simple_watcher.cc(293)
electron.exe!base::internal::FunctorTraits<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),void>::Invoke<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>() 行 489
    在 o:\base\bind_internal.h(489)
electron.exe!base::internal::InvokeHelper<1,void>::MakeItSo<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>() 行 646
    在 o:\base\bind_internal.h(646)
electron.exe!base::internal::Invoker<base::internal::BindState<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,void ()>::RunImpl<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),std::__1::tuple<base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,0,1,2,3>() 行 696
    在 o:\base\bind_internal.h(696)
electron.exe!base::internal::Invoker<base::internal::BindState<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,void ()>::RunOnce() 行 665
    在 o:\base\bind_internal.h(665)
electron.exe!base::OnceCallback<void ()>::Run() 行 99
    在 o:\base\callback.h(99)
electron.exe!base::TaskAnnotator::RunTask() 行 144
    在 o:\base\task\common\task_annotator.cc(144)
electron.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWorkImpl() 行 325
    在 o:\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc(325)
electron.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::DoWork() 行 250
    在 o:\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc(250)
electron.exe!base::MessagePumpForUI::DoRunLoop() 行 217
    在 o:\base\message_loop\message_pump_win.cc(217)
electron.exe!base::MessagePumpWin::Run() 行 76
    在 o:\base\message_loop\message_pump_win.cc(76)
electron.exe!base::sequence_manager::internal::ThreadControllerWithMessagePumpImpl::Run() 行 433
    在 o:\base\task\sequence_manager\thread_controller_with_message_pump_impl.cc(433)
electron.exe!base::RunLoop::Run() 行 124
    在 o:\base\run_loop.cc(124)
electron.exe!content::BrowserMainLoop::MainMessageLoopRun() 行 1498
    在 o:\content\browser\browser_main_loop.cc(1498)
electron.exe!content::BrowserMainLoop::RunMainMessageLoopParts() 行 1060
    在 o:\content\browser\browser_main_loop.cc(1060)
electron.exe!content::BrowserMainRunnerImpl::Run() 行 150
    在 o:\content\browser\browser_main_runner_impl.cc(150)
electron.exe!content::BrowserMain() 行 47
    在 o:\content\browser\browser_main.cc(47)
electron.exe!content::RunBrowserProcessMain() 行 530
    在 o:\content\app\content_main_runner_impl.cc(530)
electron.exe!content::ContentMainRunnerImpl::RunServiceManager() 行 980
    在 o:\content\app\content_main_runner_impl.cc(980)
electron.exe!content::ContentMainRunnerImpl::Run() 行 879
    在 o:\content\app\content_main_runner_impl.cc(879)
electron.exe!content::ContentServiceManagerMainDelegate::RunEmbedderProcess() 行 52
    在 o:\content\app\content_service_manager_main_delegate.cc(52)
electron.exe!service_manager::Main() 行 454
    在 o:\services\service_manager\embedder\main.cc(454)
electron.exe!content::ContentMain() 行 20
    在 o:\content\app\content_main.cc(20)
electron.exe!wWinMain() 行 210
    在 o:\electron\shell\app\electron_main.cc(210)
[外部代码]

 

posted @ 2020-10-21 14:36  Bigben  阅读(455)  评论(0编辑  收藏  举报