network_delegate_error_observer.cc 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright (c) 2011 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "net/proxy_resolution/network_delegate_error_observer.h"
  5. #include "base/bind.h"
  6. #include "base/location.h"
  7. #include "base/memory/raw_ptr.h"
  8. #include "base/task/single_thread_task_runner.h"
  9. #include "net/base/net_errors.h"
  10. #include "net/base/network_delegate.h"
  11. namespace net {
  12. // NetworkDelegateErrorObserver::Core -----------------------------------------
  13. class NetworkDelegateErrorObserver::Core
  14. : public base::RefCountedThreadSafe<NetworkDelegateErrorObserver::Core> {
  15. public:
  16. Core(NetworkDelegate* network_delegate,
  17. base::SingleThreadTaskRunner* origin_runner);
  18. Core(const Core&) = delete;
  19. Core& operator=(const Core&) = delete;
  20. void NotifyPACScriptError(int line_number, const std::u16string& error);
  21. void Shutdown();
  22. private:
  23. friend class base::RefCountedThreadSafe<NetworkDelegateErrorObserver::Core>;
  24. virtual ~Core();
  25. raw_ptr<NetworkDelegate> network_delegate_;
  26. scoped_refptr<base::SingleThreadTaskRunner> origin_runner_;
  27. };
  28. NetworkDelegateErrorObserver::Core::Core(
  29. NetworkDelegate* network_delegate,
  30. base::SingleThreadTaskRunner* origin_runner)
  31. : network_delegate_(network_delegate), origin_runner_(origin_runner) {
  32. DCHECK(origin_runner);
  33. }
  34. NetworkDelegateErrorObserver::Core::~Core() = default;
  35. void NetworkDelegateErrorObserver::Core::NotifyPACScriptError(
  36. int line_number,
  37. const std::u16string& error) {
  38. if (!origin_runner_->BelongsToCurrentThread()) {
  39. origin_runner_->PostTask(
  40. FROM_HERE,
  41. base::BindOnce(&Core::NotifyPACScriptError, this, line_number, error));
  42. return;
  43. }
  44. if (network_delegate_)
  45. network_delegate_->NotifyPACScriptError(line_number, error);
  46. }
  47. void NetworkDelegateErrorObserver::Core::Shutdown() {
  48. CHECK(origin_runner_->BelongsToCurrentThread());
  49. network_delegate_ = nullptr;
  50. }
  51. // NetworkDelegateErrorObserver -----------------------------------------------
  52. NetworkDelegateErrorObserver::NetworkDelegateErrorObserver(
  53. NetworkDelegate* network_delegate,
  54. base::SingleThreadTaskRunner* origin_runner)
  55. : core_(base::MakeRefCounted<Core>(network_delegate, origin_runner)) {}
  56. NetworkDelegateErrorObserver::~NetworkDelegateErrorObserver() {
  57. core_->Shutdown();
  58. }
  59. // static
  60. std::unique_ptr<ProxyResolverErrorObserver>
  61. NetworkDelegateErrorObserver::Create(
  62. NetworkDelegate* network_delegate,
  63. const scoped_refptr<base::SingleThreadTaskRunner>& origin_runner) {
  64. return std::make_unique<NetworkDelegateErrorObserver>(network_delegate,
  65. origin_runner.get());
  66. }
  67. void NetworkDelegateErrorObserver::OnPACScriptError(
  68. int line_number,
  69. const std::u16string& error) {
  70. core_->NotifyPACScriptError(line_number, error);
  71. }
  72. } // namespace net