#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/format_macros.h"
#include "base/no_destructor.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/task/single_thread_task_runner.h"
#include "base/task/task_runner.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/run_until.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/scoped_mock_clock_override.h"
#include "base/test/test_timeouts.h"
#include "base/threading/thread_restrictions.h"
#include "base/time/time_override.h"
#include "build/build_config.h"
#include "content/browser/blob_storage/chrome_blob_storage_context.h"
#include "content/browser/loader/prefetch_browsertest_base.h"
#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "content/browser/web_package/mock_signed_exchange_handler.h"
#include "content/browser/web_package/prefetched_signed_exchange_cache.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/navigation_handle.h"
#include "content/public/browser/network_service_util.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_paths.h"
#include "content/public/common/content_switches.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/browsing_data_remover_test_util.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/public/test/test_navigation_observer.h"
#include "content/shell/browser/shell.h"
#include "content/shell/common/shell_switches.h"
#include "content/test/content_browser_test_utils_internal.h"
#include "net/base/features.h"
#include "net/dns/mock_host_resolver.h"
#include "net/http/http_cache.h"
#include "net/test/embedded_test_server/controllable_http_response.h"
#include "services/network/public/cpp/features.h"
#include "storage/browser/blob/blob_storage_context.h"
#include "third_party/blink/public/common/switches.h"
namespace content {
namespace {
std::string GetHeaderIntegrityString(const net::SHA256HashValue& hash) { … }
PrefetchedSignedExchangeCache::EntryMap GetCachedExchanges(Shell* shell) { … }
PrefetchBrowserTestBase::ResponseEntry CreateSignedExchangeResponseEntry(
const std::string& content,
const std::vector<std::pair<std::string, std::string>>& additional_headers =
{ … }
std::string CreateAlternateLinkHeader(const GURL& sxg_url,
const GURL& inner_url) { … }
std::string CreateAllowedAltSxgLinkHeader(
const GURL& inner_url,
const net::SHA256HashValue& header_integrity) { … }
std::string CreatePreloadLinkHeader(const GURL& url, const char* as) { … }
class MockClock { … };
MockClock* MockClock::mock_clock_ = …;
class NavigationHandleSXGAttributeObserver : public WebContentsObserver { … };
}
class SignedExchangePrefetchBrowserTest : public PrefetchBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_SameOrigin) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_CrossOrigin) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_SameURL) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_BlobStorageLimit) { … }
IN_PROC_BROWSER_TEST_F(
SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_BlobStorageLimitWithContentLength) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_CacheControlNoStore) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_VaryAsteriskHeader) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_VaryAcceptEncodingHeader) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_ExceedPrefetchReuseMins) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_CacheControlPublic) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
PrefetchMainResourceSXG_CacheControlPublicExpire) { … }
#if (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && defined(THREAD_SANITIZER)
#define MAYBE_PrefetchMainResourceSXG_SignatureExpire …
#else
#define MAYBE_PrefetchMainResourceSXG_SignatureExpire …
#endif
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest,
MAYBE_PrefetchMainResourceSXG_SignatureExpire) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangePrefetchBrowserTest, ClearAll) { … }
class SignedExchangeSubresourcePrefetchBrowserTest
: public PrefetchBrowserTestBase { … };
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_SameOrigin) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_SameUrl) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_CrossOrigin) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_CrossOrigin_CorsError) { … }
#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_ANDROID)
#define MAYBE_MainResourceSXGAndScriptSXG_CrossOrigin_AsDocument …
#else
#define MAYBE_MainResourceSXGAndScriptSXG_CrossOrigin_AsDocument …
#endif
IN_PROC_BROWSER_TEST_F(
SignedExchangeSubresourcePrefetchBrowserTest,
MAYBE_MainResourceSXGAndScriptSXG_CrossOrigin_AsDocument) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_DifferentOriginScriptSXG) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_CacheControlNoStore) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_VaryAsteriskHeader) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_VaryAcceptEncodingHeader) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_ExceedPrefetchReuseMins) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_CacheControlPublic) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MainResourceSXGAndScriptSXG_CacheControlPublicExpire) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
ImageSrcsetAndSizes) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MultipleResources) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
IntegrityMismatch) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
IntegrityMismatchSendsReport) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
MultipleResources_IntegrityMismatch) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
DISABLED_CORS) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
OpaqueResponseBlocking_AllowedAfterSniffing) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
OpaqueResponseBlocking_BlockedAfterSniffing) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
OpaqueResponseBlocking_AllowedWithoutSniffing) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
OpaqueResponseBlocking_BlockedWithoutSniffing) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
ScriptSXGNotGCed) { … }
IN_PROC_BROWSER_TEST_F(SignedExchangeSubresourcePrefetchBrowserTest,
DoNotSendUnrelatedSXG) { … }
}