chromium/ios/web/network_context_owner.cc

// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ios/web/public/init/network_context_owner.h"

#include <memory>
#include <string>
#include <vector>

#include "base/functional/bind.h"
#include "ios/web/public/thread/web_task_traits.h"
#include "ios/web/public/thread/web_thread.h"
#include "net/url_request/url_request_context_getter.h"
#include "net/url_request/url_request_context_getter_observer.h"
#include "services/network/network_context.h"

namespace web {

NetworkContextOwner::NetworkContextOwner(
    net::URLRequestContextGetter* request_context,
    const std::vector<std::string>& cors_exempt_header_list,
    mojo::Remote<network::mojom::NetworkContext>* network_context_client)
    : request_context_(request_context) {
  DCHECK_CURRENTLY_ON(WebThread::UI);
  web::GetIOThreadTaskRunner({})->PostTask(
      FROM_HERE,
      base::BindOnce(&NetworkContextOwner::InitializeOnIOThread,
                     // This is safe, since `this` will be deleted on the IO
                     // thread, which would have to happen afterwards.
                     base::Unretained(this), cors_exempt_header_list,
                     network_context_client->BindNewPipeAndPassReceiver()));
}

NetworkContextOwner::~NetworkContextOwner() {
  DCHECK_CURRENTLY_ON(WebThread::IO);
  if (request_context_)
    request_context_->RemoveObserver(this);
}

void NetworkContextOwner::InitializeOnIOThread(
    const std::vector<std::string> cors_exempt_header_list,
    mojo::PendingReceiver<network::mojom::NetworkContext>
        network_context_receiver) {
  DCHECK_CURRENTLY_ON(WebThread::IO);
  DCHECK(!network_context_);

  network_context_ = std::make_unique<network::NetworkContext>(
      nullptr, std::move(network_context_receiver),
      request_context_->GetURLRequestContext(), cors_exempt_header_list);
  request_context_->AddObserver(this);
}

void NetworkContextOwner::OnContextShuttingDown() {
  DCHECK_CURRENTLY_ON(WebThread::IO);

  // Cancels any pending requests owned by the NetworkContext.
  network_context_.reset();

  request_context_->RemoveObserver(this);
  request_context_ = nullptr;
}

}  // namespace web