From c551f43206405019121bd2b2c93714319a0a3300 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Thu, 23 Jan 2020 17:21:03 +0100 Subject: BASELINE: Update Chromium to 79.0.3945.139 Change-Id: I336b7182fab9bca80b709682489c07db112eaca5 Reviewed-by: Allan Sandfeld Jensen --- chromium/chrome/browser/devtools/BUILD.gn | 10 +- chromium/chrome/browser/devtools/OWNERS | 1 + .../devtools/chrome_devtools_manager_delegate.cc | 5 +- .../devtools/chrome_devtools_manager_delegate.h | 1 + .../browser/devtools/chrome_devtools_session.cc | 3 + .../browser/devtools/chrome_devtools_session.h | 2 + .../devtools/device/android_device_manager.cc | 1 + .../devtools/device/devtools_android_bridge.cc | 4 +- .../devtools/device/devtools_device_discovery.h | 1 + .../devtools/device/port_forwarding_controller.cc | 20 +- .../browser/devtools/device/tcp_device_provider.cc | 35 +-- .../browser/devtools/device/tcp_device_provider.h | 8 +- .../devtools/devtools_sanity_browsertest.cc | 22 +- .../browser/devtools/devtools_ui_bindings.cc | 146 ++++++--- .../chrome/browser/devtools/devtools_window.cc | 25 +- chromium/chrome/browser/devtools/devtools_window.h | 8 + .../devtools/frontend/devtools_discovery_page.html | 28 +- .../devtools/inspector_protocol_config.json | 5 + .../protocol/devtools_protocol_browsertest.cc | 336 +++++++++++++++++++++ .../browser/devtools/protocol/security_handler.cc | 246 +++++++++++++++ .../browser/devtools/protocol/security_handler.h | 37 +++ .../devtools/serialize_host_descriptions.cc | 6 +- 22 files changed, 852 insertions(+), 98 deletions(-) create mode 100644 chromium/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc create mode 100644 chromium/chrome/browser/devtools/protocol/security_handler.cc create mode 100644 chromium/chrome/browser/devtools/protocol/security_handler.h (limited to 'chromium/chrome/browser/devtools') diff --git a/chromium/chrome/browser/devtools/BUILD.gn b/chromium/chrome/browser/devtools/BUILD.gn index 36b76413f8e..e89c23aab2d 100644 --- a/chromium/chrome/browser/devtools/BUILD.gn +++ b/chromium/chrome/browser/devtools/BUILD.gn @@ -26,6 +26,8 @@ if (!is_android) { "protocol/page.h", "protocol/protocol.cc", "protocol/protocol.h", + "protocol/security.cc", + "protocol/security.h", "protocol/target.cc", "protocol/target.h", ] @@ -198,8 +200,10 @@ static_library("devtools") { sources += [ "devtools_dock_tile.cc" ] } if (!is_android) { - deps += [ ":protocol_generated_sources", - "//third_party/inspector_protocol:encoding" ] + deps += [ + ":protocol_generated_sources", + "//third_party/inspector_protocol:encoding", + ] sources += [ "protocol/browser_handler.cc", "protocol/browser_handler.h", @@ -207,6 +211,8 @@ static_library("devtools") { "protocol/cast_handler.h", "protocol/page_handler.cc", "protocol/page_handler.h", + "protocol/security_handler.cc", + "protocol/security_handler.h", "protocol/target_handler.cc", "protocol/target_handler.h", ] diff --git a/chromium/chrome/browser/devtools/OWNERS b/chromium/chrome/browser/devtools/OWNERS index 1329473478e..e1277e85c22 100644 --- a/chromium/chrome/browser/devtools/OWNERS +++ b/chromium/chrome/browser/devtools/OWNERS @@ -1,6 +1,7 @@ dgozman@chromium.org pfeldman@chromium.org caseq@chromium.org +yangguo@chromium.org per-file devtools_embedder_message_dispatcher.*=set noparent per-file devtools_embedder_message_dispatcher.*=file://ipc/SECURITY_OWNERS diff --git a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc index d34abfa43f3..3564def60ef 100644 --- a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc +++ b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.cc @@ -227,9 +227,8 @@ ChromeDevToolsManagerDelegate::CreateNewTarget(const GURL& url) { } std::string ChromeDevToolsManagerDelegate::GetDiscoveryPageHTML() { - return ui::ResourceBundle::GetSharedInstance() - .GetRawDataResource(IDR_DEVTOOLS_DISCOVERY_PAGE_HTML) - .as_string(); + return ui::ResourceBundle::GetSharedInstance().DecompressDataResource( + IDR_DEVTOOLS_DISCOVERY_PAGE_HTML); } std::vector diff --git a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.h index 27a2dd29112..0e7bdc0eb74 100644 --- a/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.h +++ b/chromium/chrome/browser/devtools/chrome_devtools_manager_delegate.h @@ -17,6 +17,7 @@ #include "chrome/browser/devtools/protocol/protocol.h" #include "content/public/browser/devtools_agent_host_observer.h" #include "content/public/browser/devtools_manager_delegate.h" +#include "net/base/host_port_pair.h" class ChromeDevToolsSession; using RemoteLocations = std::set; diff --git a/chromium/chrome/browser/devtools/chrome_devtools_session.cc b/chromium/chrome/browser/devtools/chrome_devtools_session.cc index 4b75e59539e..846cdec8776 100644 --- a/chromium/chrome/browser/devtools/chrome_devtools_session.cc +++ b/chromium/chrome/browser/devtools/chrome_devtools_session.cc @@ -9,6 +9,7 @@ #include "chrome/browser/devtools/protocol/browser_handler.h" #include "chrome/browser/devtools/protocol/cast_handler.h" #include "chrome/browser/devtools/protocol/page_handler.h" +#include "chrome/browser/devtools/protocol/security_handler.h" #include "chrome/browser/devtools/protocol/target_handler.h" #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/devtools_agent_host_client.h" @@ -64,6 +65,8 @@ ChromeDevToolsSession::ChromeDevToolsSession( agent_host->GetType() == content::DevToolsAgentHost::kTypePage) { page_handler_ = std::make_unique(agent_host->GetWebContents(), dispatcher_.get()); + security_handler_ = std::make_unique( + agent_host->GetWebContents(), dispatcher_.get()); if (client->MayAttachToBrowser()) { cast_handler_ = std::make_unique( agent_host->GetWebContents(), dispatcher_.get()); diff --git a/chromium/chrome/browser/devtools/chrome_devtools_session.h b/chromium/chrome/browser/devtools/chrome_devtools_session.h index 2665df6eb43..4a181761533 100644 --- a/chromium/chrome/browser/devtools/chrome_devtools_session.h +++ b/chromium/chrome/browser/devtools/chrome_devtools_session.h @@ -22,6 +22,7 @@ class DevToolsAgentHostClient; class BrowserHandler; class CastHandler; class PageHandler; +class SecurityHandler; class TargetHandler; class WindowManagerHandler; @@ -61,6 +62,7 @@ class ChromeDevToolsSession : public protocol::FrontendChannel { std::unique_ptr browser_handler_; std::unique_ptr cast_handler_; std::unique_ptr page_handler_; + std::unique_ptr security_handler_; std::unique_ptr target_handler_; #if defined(OS_CHROMEOS) std::unique_ptr window_manager_protocl_handler_; diff --git a/chromium/chrome/browser/devtools/device/android_device_manager.cc b/chromium/chrome/browser/devtools/device/android_device_manager.cc index a59205407f5..4c4cf0b8584 100644 --- a/chromium/chrome/browser/devtools/device/android_device_manager.cc +++ b/chromium/chrome/browser/devtools/device/android_device_manager.cc @@ -18,6 +18,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/task/post_task.h" +#include "base/threading/thread.h" #include "base/threading/thread_task_runner_handle.h" #include "chrome/browser/devtools/device/usb/usb_device_manager_helper.h" #include "chrome/browser/devtools/device/usb/usb_device_provider.h" diff --git a/chromium/chrome/browser/devtools/device/devtools_android_bridge.cc b/chromium/chrome/browser/devtools/device/devtools_android_bridge.cc index ec895142198..f799123063b 100644 --- a/chromium/chrome/browser/devtools/device/devtools_android_bridge.cc +++ b/chromium/chrome/browser/devtools/device/devtools_android_bridge.cc @@ -166,8 +166,8 @@ DevToolsAndroidBridge::DevToolsAndroidBridge(Profile* profile) base::Bind(&DevToolsAndroidBridge::CreateDeviceProviders, base::Unretained(this))); base::Value target_discovery(base::Value::Type::LIST); - target_discovery.GetList().emplace_back(kChromeDiscoveryURL); - target_discovery.GetList().emplace_back(kNodeDiscoveryURL); + target_discovery.Append(kChromeDiscoveryURL); + target_discovery.Append(kNodeDiscoveryURL); profile->GetPrefs()->SetDefaultPrefValue(prefs::kDevToolsTCPDiscoveryConfig, std::move(target_discovery)); CreateDeviceProviders(); diff --git a/chromium/chrome/browser/devtools/device/devtools_device_discovery.h b/chromium/chrome/browser/devtools/device/devtools_device_discovery.h index 7b97e2f90e5..a83ad1f91b4 100644 --- a/chromium/chrome/browser/devtools/device/devtools_device_discovery.h +++ b/chromium/chrome/browser/devtools/device/devtools_device_discovery.h @@ -13,6 +13,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/memory/weak_ptr.h" +#include "base/values.h" #include "chrome/browser/devtools/device/android_device_manager.h" #include "content/public/browser/devtools_agent_host.h" diff --git a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc index 99fe24c6d13..2fbd2e47362 100644 --- a/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc +++ b/chromium/chrome/browser/devtools/device/port_forwarding_controller.cc @@ -28,7 +28,7 @@ #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "net/base/address_list.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" @@ -153,20 +153,18 @@ class PortForwardingHostResolver : public network::ResolveHostClientBase { const std::string& host, int port, ResolveHostCallback resolve_host_callback) - : binding_(this), - resolve_host_callback_(std::move(resolve_host_callback)) { + : resolve_host_callback_(std::move(resolve_host_callback)) { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - DCHECK(!binding_); + DCHECK(!receiver_.is_bound()); - network::mojom::ResolveHostClientPtr client_ptr; - binding_.Bind(mojo::MakeRequest(&client_ptr)); - binding_.set_connection_error_handler( - base::BindOnce(&PortForwardingHostResolver::OnComplete, - base::Unretained(this), net::ERR_FAILED, base::nullopt)); net::HostPortPair host_port_pair(host, port); content::BrowserContext::GetDefaultStoragePartition(profile) ->GetNetworkContext() - ->ResolveHost(host_port_pair, nullptr, std::move(client_ptr)); + ->ResolveHost(host_port_pair, nullptr, + receiver_.BindNewPipeAndPassRemote()); + receiver_.set_disconnect_handler( + base::BindOnce(&PortForwardingHostResolver::OnComplete, + base::Unretained(this), net::ERR_FAILED, base::nullopt)); } private: @@ -190,7 +188,7 @@ class PortForwardingHostResolver : public network::ResolveHostClientBase { delete this; } - mojo::Binding binding_; + mojo::Receiver receiver_{this}; ResolveHostCallback resolve_host_callback_; DISALLOW_COPY_AND_ASSIGN(PortForwardingHostResolver); diff --git a/chromium/chrome/browser/devtools/device/tcp_device_provider.cc b/chromium/chrome/browser/devtools/device/tcp_device_provider.cc index 49f340aae90..394538ff6cc 100644 --- a/chromium/chrome/browser/devtools/device/tcp_device_provider.cc +++ b/chromium/chrome/browser/devtools/device/tcp_device_provider.cc @@ -18,7 +18,7 @@ #include "chrome/browser/devtools/device/adb/adb_client_socket.h" #include "chrome/browser/net/system_network_context_manager.h" #include "content/public/browser/browser_task_traits.h" -#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/receiver.h" #include "net/base/completion_repeating_callback.h" #include "net/base/net_errors.h" #include "net/log/net_log_source.h" @@ -41,17 +41,16 @@ static void RunSocketCallback( class ResolveHostAndOpenSocket final : public network::ResolveHostClientBase { public: - ResolveHostAndOpenSocket(const net::HostPortPair& address, - const AdbClientSocket::SocketCallback& callback, - network::mojom::HostResolverPtr* host_resolver) - : callback_(callback), binding_(this) { - network::mojom::ResolveHostClientPtr client_ptr; - binding_.Bind(mojo::MakeRequest(&client_ptr)); - binding_.set_connection_error_handler( + ResolveHostAndOpenSocket( + const net::HostPortPair& address, + const AdbClientSocket::SocketCallback& callback, + mojo::Remote* host_resolver) + : callback_(callback) { + (*host_resolver) + ->ResolveHost(address, nullptr, receiver_.BindNewPipeAndPassRemote()); + receiver_.set_disconnect_handler( base::BindOnce(&ResolveHostAndOpenSocket::OnComplete, base::Unretained(this), net::ERR_FAILED, base::nullopt)); - - (*host_resolver)->ResolveHost(address, nullptr, std::move(client_ptr)); } private: @@ -77,7 +76,7 @@ class ResolveHostAndOpenSocket final : public network::ResolveHostClientBase { } AdbClientSocket::SocketCallback callback_; - mojo::Binding binding_; + mojo::Receiver receiver_{this}; }; } // namespace @@ -157,16 +156,18 @@ TCPDeviceProvider::~TCPDeviceProvider() { } void TCPDeviceProvider::InitializeHostResolver() { - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(&TCPDeviceProvider::InitializeHostResolverOnUI, - this, mojo::MakeRequest(&host_resolver_))); - host_resolver_.set_connection_error_handler(base::BindOnce( + host_resolver_.reset(); + base::PostTask( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(&TCPDeviceProvider::InitializeHostResolverOnUI, this, + host_resolver_.BindNewPipeAndPassReceiver())); + host_resolver_.set_disconnect_handler(base::BindOnce( &TCPDeviceProvider::InitializeHostResolver, base::Unretained(this))); } void TCPDeviceProvider::InitializeHostResolverOnUI( - network::mojom::HostResolverRequest request) { + mojo::PendingReceiver receiver) { g_browser_process->system_network_context_manager() ->GetContext() - ->CreateHostResolver(base::nullopt, std::move(request)); + ->CreateHostResolver(base::nullopt, std::move(receiver)); } diff --git a/chromium/chrome/browser/devtools/device/tcp_device_provider.h b/chromium/chrome/browser/devtools/device/tcp_device_provider.h index 5f1dae62d0b..17dea4f6d02 100644 --- a/chromium/chrome/browser/devtools/device/tcp_device_provider.h +++ b/chromium/chrome/browser/devtools/device/tcp_device_provider.h @@ -10,7 +10,10 @@ #include #include "chrome/browser/devtools/device/android_device_manager.h" +#include "mojo/public/cpp/bindings/pending_receiver.h" +#include "mojo/public/cpp/bindings/remote.h" #include "net/base/host_port_pair.h" +#include "services/network/public/mojom/host_resolver.mojom.h" // Instantiate this class only in a test and/or when the DEBUG_DEVTOOLS // BUILDFLAG is set. @@ -40,11 +43,12 @@ class TCPDeviceProvider : public AndroidDeviceManager::DeviceProvider { ~TCPDeviceProvider() override; void InitializeHostResolver(); - void InitializeHostResolverOnUI(network::mojom::HostResolverRequest request); + void InitializeHostResolverOnUI( + mojo::PendingReceiver receiver); HostPortSet targets_; base::Closure release_callback_; - network::mojom::HostResolverPtr host_resolver_; + mojo::Remote host_resolver_; }; #endif // CHROME_BROWSER_DEVTOOLS_DEVICE_TCP_DEVICE_PROVIDER_H_ diff --git a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc index ad76170f21e..c290c153251 100644 --- a/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc +++ b/chromium/chrome/browser/devtools/devtools_sanity_browsertest.cc @@ -99,6 +99,7 @@ #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_context_getter.h" #include "services/network/public/cpp/features.h" +#include "services/network/public/cpp/resource_response.h" #include "third_party/blink/public/platform/web_input_event.h" #include "ui/compositor/compositor_switches.h" #include "ui/gl/gl_switches.h" @@ -762,13 +763,9 @@ IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, // Tests that BeforeUnload event gets called on devtools that are opened // on another devtools. -#if defined(OS_CHROMEOS) || defined(OS_LINUX) // TODO(https://crbug.com/1000654): Re-enable this test. -#define MAYBE_TestDevToolsOnDevTools DISABLED_TestDevToolsOnDevTools -#else -#define MAYBE_TestDevToolsOnDevTools TestDevToolsOnDevTools -#endif -IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, MAYBE_TestDevToolsOnDevTools) { +IN_PROC_BROWSER_TEST_F(DevToolsBeforeUnloadTest, + DISABLED_TestDevToolsOnDevTools) { ASSERT_TRUE(spawned_test_server()->Start()); LoadTestPage(kDebuggerTestPage); @@ -831,9 +828,16 @@ IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, TestShowScriptsTab) { // Tests that scripts tab is populated with inspected scripts even if it // hadn't been shown by the moment inspected paged refreshed. // @see http://crbug.com/26312 -IN_PROC_BROWSER_TEST_F( - DevToolsSanityTest, - TestScriptsTabIsPopulatedOnInspectedPageRefresh) { +// This test is flaky on windows and linux asan. See https://crbug.com/1013003 +#if defined(OS_WIN) || defined(OS_MACOSX) +#define MAYBE_TestScriptsTabIsPopulatedOnInspectedPageRefresh \ + DISABLED_TestScriptsTabIsPopulatedOnInspectedPageRefresh +#else +#define MAYBE_TestScriptsTabIsPopulatedOnInspectedPageRefresh \ + TestScriptsTabIsPopulatedOnInspectedPageRefresh +#endif +IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, + MAYBE_TestScriptsTabIsPopulatedOnInspectedPageRefresh) { RunTest("testScriptsTabIsPopulatedOnInspectedPageRefresh", kDebuggerTestPage); } diff --git a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc index 1acc82d6f38..b43e8b7f7fc 100644 --- a/chromium/chrome/browser/devtools/devtools_ui_bindings.cc +++ b/chromium/chrome/browser/devtools/devtools_ui_bindings.cc @@ -77,6 +77,7 @@ #include "net/traffic_annotation/network_traffic_annotation.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/cpp/simple_url_loader_stream_consumer.h" +#include "services/network/public/mojom/url_response_head.mojom.h" #include "third_party/blink/public/mojom/renderer_preferences.mojom.h" #include "third_party/blink/public/public_buildflags.h" #include "ui/base/page_transition_types.h" @@ -199,9 +200,17 @@ InfoBarService* DefaultBindingsDelegate::GetInfoBarService() { } std::unique_ptr BuildObjectForResponse( - const net::HttpResponseHeaders* rh) { + const net::HttpResponseHeaders* rh, + bool success) { auto response = std::make_unique(); - response->SetInteger("statusCode", rh ? rh->response_code() : 200); + int responseCode = 200; + if (rh) { + responseCode = rh->response_code(); + } else if (!success) { + // In case of no headers, assume file:// URL and failed to load + responseCode = 404; + } + response->SetInteger("statusCode", responseCode); auto headers = std::make_unique(); size_t iterator = 0; @@ -312,7 +321,7 @@ std::string SanitizeFrontendQueryParam( // Convert boolean flags to true. if (key == "can_dock" || key == "debugFrontend" || key == "experiments" || key == "isSharedWorker" || key == "v8only" || key == "remoteFrontend" || - key == "nodeFrontend" || key == "hasOtherClients") + key == "nodeFrontend" || key == "hasOtherClients" || key == "uiDevTools") return "true"; // Pass connection endpoints as is. @@ -372,28 +381,86 @@ GURL SanitizeFrontendURL(const GURL& url, return result; } +constexpr base::TimeDelta kInitialBackoffDelay = + base::TimeDelta::FromMilliseconds(250); +constexpr base::TimeDelta kMaxBackoffDelay = base::TimeDelta::FromSeconds(10); + } // namespace class DevToolsUIBindings::NetworkResourceLoader : public network::SimpleURLLoaderStreamConsumer { public: - NetworkResourceLoader(int stream_id, - DevToolsUIBindings* bindings, - std::unique_ptr loader, - network::mojom::URLLoaderFactory* url_loader_factory, - const DispatchCallback& callback) + class URLLoaderFactoryHolder { + public: + network::mojom::URLLoaderFactory* get() { + return ptr_.get() ? ptr_.get() : refptr_.get(); + } + void operator=(std::unique_ptr&& ptr) { + ptr_ = std::move(ptr); + } + void operator=(scoped_refptr&& refptr) { + refptr_ = std::move(refptr); + } + + private: + std::unique_ptr ptr_; + scoped_refptr refptr_; + }; + + static void Create(int stream_id, + DevToolsUIBindings* bindings, + const network::ResourceRequest& resource_request, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + URLLoaderFactoryHolder url_loader_factory, + const DevToolsUIBindings::DispatchCallback& callback, + base::TimeDelta retry_delay = base::TimeDelta()) { + auto resource_loader = + std::make_unique( + stream_id, bindings, resource_request, traffic_annotation, + std::move(url_loader_factory), callback, retry_delay); + bindings->loaders_.insert(std::move(resource_loader)); + } + + NetworkResourceLoader( + int stream_id, + DevToolsUIBindings* bindings, + const network::ResourceRequest& resource_request, + const net::NetworkTrafficAnnotationTag& traffic_annotation, + URLLoaderFactoryHolder url_loader_factory, + const DispatchCallback& callback, + base::TimeDelta delay) : stream_id_(stream_id), bindings_(bindings), - loader_(std::move(loader)), - callback_(callback) { + resource_request_(resource_request), + traffic_annotation_(traffic_annotation), + loader_(network::SimpleURLLoader::Create( + std::make_unique(resource_request), + traffic_annotation)), + url_loader_factory_(std::move(url_loader_factory)), + callback_(callback), + retry_delay_(delay) { loader_->SetOnResponseStartedCallback(base::BindOnce( &NetworkResourceLoader::OnResponseStarted, base::Unretained(this))); - loader_->DownloadAsStream(url_loader_factory, this); + timer_.Start(FROM_HERE, delay, + base::BindRepeating(&NetworkResourceLoader::DownloadAsStream, + base::Unretained(this))); } private: + void DownloadAsStream() { + loader_->DownloadAsStream(url_loader_factory_.get(), this); + } + + base::TimeDelta GetNextExponentialBackoffDelay(const base::TimeDelta& delta) { + if (delta.is_zero()) { + return kInitialBackoffDelay; + } else { + return delta * 1.3; + } + } + void OnResponseStarted(const GURL& final_url, - const network::ResourceResponseHead& response_head) { + const network::mojom::URLResponseHead& response_head) { response_headers_ = response_head.headers; } @@ -418,9 +485,21 @@ class DevToolsUIBindings::NetworkResourceLoader } void OnComplete(bool success) override { - auto response = BuildObjectForResponse(response_headers_.get()); - callback_.Run(response.get()); - + if (!success && loader_->NetError() == net::ERR_INSUFFICIENT_RESOURCES && + retry_delay_ < kMaxBackoffDelay) { + const base::TimeDelta delay = + GetNextExponentialBackoffDelay(retry_delay_); + LOG(WARNING) << "DevToolsUIBindings::NetworkResourceLoader id = " + << stream_id_ + << " failed with insufficient resources, retrying in " + << delay << "." << std::endl; + NetworkResourceLoader::Create( + stream_id_, bindings_, resource_request_, traffic_annotation_, + std::move(url_loader_factory_), callback_, delay); + } else { + auto response = BuildObjectForResponse(response_headers_.get(), success); + callback_.Run(response.get()); + } bindings_->loaders_.erase(bindings_->loaders_.find(this)); } @@ -428,9 +507,14 @@ class DevToolsUIBindings::NetworkResourceLoader const int stream_id_; DevToolsUIBindings* const bindings_; + const network::ResourceRequest resource_request_; + const net::NetworkTrafficAnnotationTag traffic_annotation_; std::unique_ptr loader_; + URLLoaderFactoryHolder url_loader_factory_; DispatchCallback callback_; scoped_refptr response_headers_; + base::OneShotTimer timer_; + base::TimeDelta retry_delay_; DISALLOW_COPY_AND_ASSIGN(NetworkResourceLoader); }; @@ -738,22 +822,18 @@ void DevToolsUIBindings::LoadNetworkResource(const DispatchCallback& callback, } })"); - auto resource_request = std::make_unique(); - resource_request->url = gurl; + network::ResourceRequest resource_request; + resource_request.url = gurl; // TODO(caseq): this preserves behavior of URLFetcher-based implementation. // We really need to pass proper first party origin from the front-end. - resource_request->site_for_cookies = gurl; - resource_request->headers.AddHeadersFromString(headers); + resource_request.site_for_cookies = gurl; + resource_request.headers.AddHeadersFromString(headers); - std::unique_ptr file_url_loader_factory; - scoped_refptr network_url_loader_factory; - std::unique_ptr webui_url_loader_factory; - network::mojom::URLLoaderFactory* url_loader_factory; + NetworkResourceLoader::URLLoaderFactoryHolder url_loader_factory; if (gurl.SchemeIsFile()) { - file_url_loader_factory = content::CreateFileURLLoaderFactory( + url_loader_factory = content::CreateFileURLLoaderFactory( base::FilePath() /* profile_path */, nullptr /* shared_cors_origin_access_list */); - url_loader_factory = file_url_loader_factory.get(); } else if (content::HasWebUIScheme(gurl)) { content::WebContents* target_tab; #ifndef NDEBUG @@ -769,10 +849,9 @@ void DevToolsUIBindings::LoadNetworkResource(const DispatchCallback& callback, if (allow_web_ui_scheme) { std::vector allowed_webui_hosts; content::RenderFrameHost* frame_host = web_contents()->GetMainFrame(); - webui_url_loader_factory = content::CreateWebUIURLLoader( + url_loader_factory = content::CreateWebUIURLLoader( frame_host, target_tab->GetURL().scheme(), std::move(allowed_webui_hosts)); - url_loader_factory = webui_url_loader_factory.get(); } else { base::DictionaryValue response; response.SetInteger("statusCode", 403); @@ -782,17 +861,12 @@ void DevToolsUIBindings::LoadNetworkResource(const DispatchCallback& callback, } else { auto* partition = content::BrowserContext::GetStoragePartitionForSite( web_contents_->GetBrowserContext(), gurl); - network_url_loader_factory = - partition->GetURLLoaderFactoryForBrowserProcess(); - url_loader_factory = network_url_loader_factory.get(); + url_loader_factory = partition->GetURLLoaderFactoryForBrowserProcess(); } - auto simple_url_loader = network::SimpleURLLoader::Create( - std::move(resource_request), traffic_annotation); - auto resource_loader = std::make_unique( - stream_id, this, std::move(simple_url_loader), url_loader_factory, - callback); - loaders_.insert(std::move(resource_loader)); + NetworkResourceLoader::Create(stream_id, this, resource_request, + traffic_annotation, + std::move(url_loader_factory), callback); } void DevToolsUIBindings::OpenInNewTab(const std::string& url) { diff --git a/chromium/chrome/browser/devtools/devtools_window.cc b/chromium/chrome/browser/devtools/devtools_window.cc index 14bc702c89f..f0e249161a7 100644 --- a/chromium/chrome/browser/devtools/devtools_window.cc +++ b/chromium/chrome/browser/devtools/devtools_window.cc @@ -5,6 +5,7 @@ #include "chrome/browser/devtools/devtools_window.h" #include +#include #include #include "base/base64.h" @@ -21,7 +22,6 @@ #include "chrome/browser/devtools/devtools_eye_dropper.h" #include "chrome/browser/file_select_helper.h" #include "chrome/browser/infobars/infobar_service.h" -#include "chrome/browser/performance_manager/performance_manager_tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/task_manager/web_contents_tags.h" @@ -38,6 +38,7 @@ #include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "components/app_modal/javascript_dialog_manager.h" +#include "components/performance_manager/performance_manager_tab_helper.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/sync_preferences/pref_service_syncable.h" @@ -170,8 +171,8 @@ content::WebContents* DevToolsToolboxDelegate::OpenURLFromTab( DCHECK(source == web_contents()); if (!params.url.SchemeIs(content::kChromeDevToolsScheme)) return NULL; - content::NavigationController::LoadURLParams load_url_params(params.url); - source->GetController().LoadURLWithParams(load_url_params); + source->GetController().LoadURLWithParams( + content::NavigationController::LoadURLParams(params)); return source; } @@ -218,7 +219,7 @@ GURL DecorateFrontendURL(const GURL& base_url) { std::string url_string( frontend_url + ((frontend_url.find("?") == std::string::npos) ? "?" : "&") + - "dockSide=undocked"); // TODO(dgozman): remove this support in M38. + "dockSide=undocked"); // TODO(dgozman): remove this support in M38. base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); if (command_line->HasSwitch(switches::kEnableDevToolsExperiments)) url_string += "&experiments=true"; @@ -770,6 +771,16 @@ DevToolsWindow::MaybeCreateNavigationThrottle( return std::make_unique(handle, window); } +void DevToolsWindow::UpdateInspectedWebContents( + content::WebContents* new_web_contents) { + inspected_contents_observer_ = + std::make_unique(new_web_contents); + bindings_->AttachTo( + content::DevToolsAgentHost::GetOrCreateFor(new_web_contents)); + bindings_->CallClientFunction("DevToolsAPI.reattachMainTarget", nullptr, + nullptr, nullptr); +} + void DevToolsWindow::ScheduleShow(const DevToolsToggleAction& action) { if (life_stage_ == kLoadCompleted) { Show(action); @@ -800,7 +811,7 @@ void DevToolsWindow::Show(const DevToolsToggleAction& action) { &inspected_browser, &inspected_tab_index); DCHECK(inspected_browser); - DCHECK(inspected_tab_index != -1); + DCHECK_NE(-1, inspected_tab_index); RegisterModalDialogManager(inspected_browser); @@ -821,7 +832,7 @@ void DevToolsWindow::Show(const DevToolsToggleAction& action) { main_web_contents_->SetInitialFocus(); PrefsTabHelper::CreateForWebContents(main_web_contents_); - main_web_contents_->GetRenderViewHost()->SyncRendererPrefs(); + main_web_contents_->SyncRendererPrefs(); DoAction(action); return; @@ -1545,7 +1556,7 @@ void DevToolsWindow::CreateDevToolsBrowser() { browser_->tab_strip_model()->AddWebContents( std::move(owned_main_web_contents_), -1, ui::PAGE_TRANSITION_AUTO_TOPLEVEL, TabStripModel::ADD_ACTIVE); - main_web_contents_->GetRenderViewHost()->SyncRendererPrefs(); + main_web_contents_->SyncRendererPrefs(); } BrowserWindow* DevToolsWindow::GetInspectedBrowserWindow() { diff --git a/chromium/chrome/browser/devtools/devtools_window.h b/chromium/chrome/browser/devtools/devtools_window.h index b47e506fff9..0a14822e2c4 100644 --- a/chromium/chrome/browser/devtools/devtools_window.h +++ b/chromium/chrome/browser/devtools/devtools_window.h @@ -5,6 +5,9 @@ #ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_WINDOW_H_ #define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_WINDOW_H_ +#include +#include + #include "base/macros.h" #include "chrome/browser/devtools/devtools_contents_resizing_strategy.h" #include "chrome/browser/devtools/devtools_toggle_action.h" @@ -122,6 +125,11 @@ class DevToolsWindow : public DevToolsUIBindings::Delegate, static std::unique_ptr MaybeCreateNavigationThrottle(content::NavigationHandle* handle); + // Updates the WebContents inspected by the DevToolsWindow by reattaching + // the binding to |new_web_contents|. Called when swapping an outer + // WebContents with its inner WebContents. + void UpdateInspectedWebContents(content::WebContents* new_web_contents); + // Sets closure to be called after load is done. If already loaded, calls // closure immediately. void SetLoadCompletedCallback(const base::Closure& closure); diff --git a/chromium/chrome/browser/devtools/frontend/devtools_discovery_page.html b/chromium/chrome/browser/devtools/frontend/devtools_discovery_page.html index 88291aa4d80..52880365af5 100644 --- a/chromium/chrome/browser/devtools/frontend/devtools_discovery_page.html +++ b/chromium/chrome/browser/devtools/frontend/devtools_discovery_page.html @@ -1,5 +1,5 @@ - - + + Inspectable pages