TEST_F(HTMLPreloadScannerTest, testMetaAcceptCH) { ClientHintsPreferences dpr; ClientHintsPreferences resourceWidth; ClientHintsPreferences all; ClientHintsPreferences viewportWidth; dpr.setShouldSendDPR(true); all.setShouldSendDPR(true); resourceWidth.setShouldSendResourceWidth(true); all.setShouldSendResourceWidth(true); viewportWidth.setShouldSendViewportWidth(true); all.setShouldSendViewportWidth(true); TestCase testCases[] = { {"http://example.test", "<meta http-equiv='accept-ch' content='bla'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, {"http://example.test", "<meta http-equiv='accept-ch' content='dprw'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, {"http://example.test", "<meta http-equiv='accept-ch'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, {"http://example.test", "<meta http-equiv='accept-ch' content='dpr \t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, dpr}, {"http://example.test", "<meta http-equiv='accept-ch' content='bla,dpr \t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, dpr}, {"http://example.test", "<meta http-equiv='accept-ch' content=' width '><img sizes='100vw' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 500, resourceWidth}, {"http://example.test", "<meta http-equiv='accept-ch' content=' width , wutever'><img sizes='300px' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 300, resourceWidth}, {"http://example.test", "<meta http-equiv='accept-ch' content=' viewport-width '><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, viewportWidth}, {"http://example.test", "<meta http-equiv='accept-ch' content=' viewport-width , wutever'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0, viewportWidth}, {"http://example.test", "<meta http-equiv='accept-ch' content=' viewport-width ,width, wutever, dpr \t'><img sizes='90vw' srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 450, all}, }; for (const auto& testCase : testCases) { runSetUp(ViewportDisabled); test(testCase); } }
TEST_F(FrameFetchContextHintsTest, MonitorResourceWidthHints) { expectHeader("http://www.example.com/1.gif", "Width", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendResourceWidth(true); document->setClientHintsPreferences(preferences); expectHeader("http://www.example.com/1.gif", "Width", true, "500", 500); expectHeader("http://www.example.com/1.gif", "Width", true, "667", 666.6666); expectHeader("http://www.example.com/1.gif", "DPR", false, ""); }
TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) { expectHeader("http://www.example.com/1.gif", "DPR", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendDPR(true); document->setClientHintsPreferences(preferences); expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); dummyPageHolder->page().setDeviceScaleFactor(2.5); expectHeader("http://www.example.com/1.gif", "DPR", true, "2.5"); expectHeader("http://www.example.com/1.gif", "RW", false, ""); }
void handleAcceptClientHintsHeader(const String& headerValue, ClientHintsPreferences& preferences) { if (RuntimeEnabledFeatures::clientHintsEnabled()) { CommaDelimitedHeaderSet acceptCH; parseCommaDelimitedHeader(headerValue, acceptCH); if (acceptCH.contains("dpr")) preferences.setShouldSendDPR(true); if (acceptCH.contains("rw")) preferences.setShouldSendRW(true); } }
TEST_F(FrameFetchContextHintsTest, MonitorBothHints) { expectHeader("http://www.example.com/1.gif", "DPR", false, ""); expectHeader("http://www.example.com/1.gif", "RW", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendDPR(true); preferences.setShouldSendRW(true); document->setClientHintsPreferences(preferences); expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); expectHeader("http://www.example.com/1.gif", "RW", true, "500"); }
TEST_F(FrameFetchContextHintsTest, MonitorRWHints) { expectHeader("http://www.example.com/1.gif", "RW", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendRW(true); document->setClientHintsPreferences(preferences); expectHeader("http://www.example.com/1.gif", "RW", true, "500"); dummyPageHolder->frameView().setLayoutSizeFixedToFrameSize(false); dummyPageHolder->frameView().setLayoutSize(IntSize(800, 800)); expectHeader("http://www.example.com/1.gif", "RW", true, "800"); expectHeader("http://www.example.com/1.gif", "DPR", false, ""); }
TEST_F(FrameFetchContextHintsTest, MonitorViewportWidthHints) { expectHeader("http://www.example.com/1.gif", "Viewport-Width", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendViewportWidth(true); document->clientHintsPreferences().updateFrom(preferences); expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); dummyPageHolder->frameView().setLayoutSizeFixedToFrameSize(false); dummyPageHolder->frameView().setLayoutSize(IntSize(800, 800)); expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "800"); expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "800", 666.6666); expectHeader("http://www.example.com/1.gif", "DPR", false, ""); }
TEST_F(FrameFetchContextHintsTest, MonitorResourceWidthHints) { expectHeader("http://www.example.com/1.gif", "Width", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendResourceWidth(true); document->clientHintsPreferences().updateFrom(preferences); expectHeader("http://www.example.com/1.gif", "Width", true, "500", 500); expectHeader("http://www.example.com/1.gif", "Width", true, "667", 666.6666); expectHeader("http://www.example.com/1.gif", "DPR", false, ""); dummyPageHolder->page().setDeviceScaleFactor(2.5); expectHeader("http://www.example.com/1.gif", "Width", true, "1250", 500); expectHeader("http://www.example.com/1.gif", "Width", true, "1667", 666.6666); }
TEST_F(FrameFetchContextHintsTest, MonitorAllHints) { expectHeader("http://www.example.com/1.gif", "DPR", false, ""); expectHeader("http://www.example.com/1.gif", "Viewport-Width", false, ""); expectHeader("http://www.example.com/1.gif", "Width", false, ""); ClientHintsPreferences preferences; preferences.setShouldSendDPR(true); preferences.setShouldSendResourceWidth(true); preferences.setShouldSendViewportWidth(true); document->clientHintsPreferences().updateFrom(preferences); expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); expectHeader("http://www.example.com/1.gif", "Width", true, "400", 400); expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); }
void preloadRequestVerification(Resource::Type type, const char* url, const char* baseURL, int width, const ClientHintsPreferences& preferences) { if (!url) { EXPECT_FALSE(m_preloadRequest); return; } EXPECT_FALSE(m_preloadRequest->isPreconnect()); EXPECT_EQ(type, m_preloadRequest->resourceType()); EXPECT_STREQ(url, m_preloadRequest->resourceURL().ascii().data()); EXPECT_STREQ(baseURL, m_preloadRequest->baseURL().string().ascii().data()); EXPECT_EQ(width, m_preloadRequest->resourceWidth()); EXPECT_EQ(preferences.shouldSendDPR(), m_preloadRequest->preferences().shouldSendDPR()); EXPECT_EQ(preferences.shouldSendResourceWidth(), m_preloadRequest->preferences().shouldSendResourceWidth()); EXPECT_EQ(preferences.shouldSendViewportWidth(), m_preloadRequest->preferences().shouldSendViewportWidth()); }
static void configureRequest(FetchRequest& request, ImageLoader::BypassMainWorldBehavior bypassBehavior, Element& element, const ClientHintsPreferences& clientHintsPreferences) { if (bypassBehavior == ImageLoader::BypassMainWorldCSP) request.setContentSecurityCheck(DoNotCheckContentSecurityPolicy); AtomicString crossOriginMode = element.fastGetAttribute(HTMLNames::crossoriginAttr); if (!crossOriginMode.isNull()) request.setCrossOriginAccessControl(element.document().securityOrigin(), crossOriginMode); if (clientHintsPreferences.shouldSendResourceWidth() && isHTMLImageElement(element)) request.setResourceWidth(toHTMLImageElement(element).resourceWidth()); }