Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/html/parser/HTMLPreloadScanner.h" | 6 #include "core/html/parser/HTMLPreloadScanner.h" |
| 7 | 7 |
| 8 #include "core/MediaTypeNames.h" | 8 #include "core/MediaTypeNames.h" |
| 9 #include "core/css/MediaValuesCached.h" | 9 #include "core/css/MediaValuesCached.h" |
| 10 #include "core/fetch/ClientHintsPreferences.h" | 10 #include "core/fetch/ClientHintsPreferences.h" |
| 11 #include "core/frame/Settings.h" | 11 #include "core/frame/Settings.h" |
| 12 #include "core/html/parser/HTMLParserOptions.h" | 12 #include "core/html/parser/HTMLParserOptions.h" |
| 13 #include "core/html/parser/HTMLResourcePreloader.h" | 13 #include "core/html/parser/HTMLResourcePreloader.h" |
| 14 #include "core/loader/Preconnecter.h" | |
| 14 #include "core/testing/DummyPageHolder.h" | 15 #include "core/testing/DummyPageHolder.h" |
| 15 #include <gtest/gtest.h> | 16 #include <gtest/gtest.h> |
| 16 | 17 |
| 17 namespace blink { | 18 namespace blink { |
| 18 | 19 |
| 19 typedef struct { | 20 typedef struct { |
| 20 const char* baseURL; | 21 const char* baseURL; |
| 21 const char* inputHTML; | 22 const char* inputHTML; |
| 22 const char* preloadedURL; | 23 const char* preloadedURL; |
| 23 const char* outputBaseURL; | 24 const char* outputBaseURL; |
| 24 Resource::Type type; | 25 Resource::Type type; |
| 25 int resourceWidth; | 26 int resourceWidth; |
| 26 ClientHintsPreferences preferences; | 27 ClientHintsPreferences preferences; |
| 27 } TestCase; | 28 } TestCase; |
| 28 | 29 |
| 30 typedef struct { | |
| 31 const char* baseURL; | |
| 32 const char* inputHTML; | |
| 33 const char* preconnectedHost; | |
| 34 CrossOriginAttributeValue crossOrigin; | |
| 35 } PreconnectTestCase; | |
| 36 | |
| 37 class MockPreconnecter : public PreconnecterHost { | |
|
Mike West
2015/06/02 11:18:34
Nit: I'd prefer either `MockPreconnecterHost : pub
| |
| 38 public: | |
| 39 static PassOwnPtr<PreconnecterHost> createLeavingReference(MockPreconnecter* & preconnector) | |
| 40 { | |
| 41 preconnector = new MockPreconnecter(); | |
| 42 return adoptPtr(preconnector); | |
| 43 } | |
| 44 | |
| 45 virtual void preconnect(KURL& host, CrossOriginAttributeValue crossOrigin) o verride | |
| 46 { | |
| 47 m_host = host; | |
| 48 m_crossOrigin = crossOrigin; | |
| 49 } | |
| 50 | |
| 51 void init() | |
| 52 { | |
| 53 m_host = KURL(); | |
| 54 m_crossOrigin = CrossOriginAttributeNotSet; | |
| 55 } | |
| 56 | |
| 57 void verify(String host, CrossOriginAttributeValue crossOrigin) | |
| 58 { | |
| 59 EXPECT_STREQ(m_host.string().ascii().data(), host.ascii().data()); | |
| 60 EXPECT_EQ(m_crossOrigin, crossOrigin); | |
| 61 } | |
| 62 | |
| 63 private: | |
| 64 | |
|
Mike West
2015/06/02 11:18:33
Nit: No newline.
| |
| 65 KURL m_host; | |
| 66 CrossOriginAttributeValue m_crossOrigin; | |
| 67 }; | |
| 29 class MockHTMLResourcePreloader : public ResourcePreloader { | 68 class MockHTMLResourcePreloader : public ResourcePreloader { |
|
Mike West
2015/06/02 11:18:34
Nit: Newline.
| |
| 30 public: | 69 public: |
| 31 void preloadRequestVerification(Resource::Type type, const String& url, cons t String& baseURL, int width) | 70 void preloadRequestVerification(Resource::Type type, const String& url, cons t String& baseURL, int width) |
| 32 { | 71 { |
| 33 EXPECT_EQ(m_preloadRequest->resourceType(), type); | 72 EXPECT_EQ(m_preloadRequest->resourceType(), type); |
| 34 EXPECT_STREQ(m_preloadRequest->resourceURL().ascii().data(), url.ascii( ).data()); | 73 EXPECT_STREQ(m_preloadRequest->resourceURL().ascii().data(), url.ascii( ).data()); |
| 35 EXPECT_STREQ(m_preloadRequest->baseURL().ascii().data(), baseURL.ascii() .data()); | 74 EXPECT_STREQ(m_preloadRequest->baseURL().ascii().data(), baseURL.ascii() .data()); |
| 36 EXPECT_EQ(m_preloadRequest->resourceWidth(), width); | 75 EXPECT_EQ(m_preloadRequest->resourceWidth(), width); |
| 37 } | 76 } |
| 38 | 77 |
| 39 protected: | 78 protected: |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 72 data.displayMode = WebDisplayModeBrowser; | 111 data.displayMode = WebDisplayModeBrowser; |
| 73 return MediaValuesCached::create(data); | 112 return MediaValuesCached::create(data); |
| 74 } | 113 } |
| 75 | 114 |
| 76 void runSetUp(bool viewportEnabled) | 115 void runSetUp(bool viewportEnabled) |
| 77 { | 116 { |
| 78 HTMLParserOptions options(&m_dummyPageHolder->document()); | 117 HTMLParserOptions options(&m_dummyPageHolder->document()); |
| 79 KURL documentURL(ParsedURLString, "http://whatever.test/"); | 118 KURL documentURL(ParsedURLString, "http://whatever.test/"); |
| 80 m_dummyPageHolder->document().settings()->setViewportEnabled(viewportEna bled); | 119 m_dummyPageHolder->document().settings()->setViewportEnabled(viewportEna bled); |
| 81 m_dummyPageHolder->document().settings()->setViewportMetaEnabled(viewpor tEnabled); | 120 m_dummyPageHolder->document().settings()->setViewportMetaEnabled(viewpor tEnabled); |
| 82 m_scanner = HTMLPreloadScanner::create(options, documentURL, CachedDocum entParameters::create(&m_dummyPageHolder->document(), createMediaValues())); | 121 m_scanner = HTMLPreloadScanner::create(options, documentURL, CachedDocum entParameters::create(&m_dummyPageHolder->document(), createMediaValues()), Mock Preconnecter::createLeavingReference(m_preconnecter)); |
| 83 } | 122 } |
| 84 | 123 |
| 85 virtual void SetUp() | 124 virtual void SetUp() |
| 86 { | 125 { |
| 87 runSetUp(true); | 126 runSetUp(true); |
| 88 } | 127 } |
| 89 | 128 |
| 90 void test(TestCase testCase) | 129 void test(TestCase testCase) |
| 91 { | 130 { |
| 92 MockHTMLResourcePreloader preloader; | 131 MockHTMLResourcePreloader preloader; |
| 93 KURL baseURL(ParsedURLString, testCase.baseURL); | 132 KURL baseURL(ParsedURLString, testCase.baseURL); |
| 94 m_scanner->appendToEnd(String(testCase.inputHTML)); | 133 m_scanner->appendToEnd(String(testCase.inputHTML)); |
| 95 m_scanner->scan(&preloader, baseURL); | 134 m_scanner->scan(&preloader, baseURL); |
| 96 | 135 |
| 97 preloader.preloadRequestVerification(testCase.type, testCase.preloadedUR L, testCase.outputBaseURL, testCase.resourceWidth); | 136 preloader.preloadRequestVerification(testCase.type, testCase.preloadedUR L, testCase.outputBaseURL, testCase.resourceWidth); |
| 98 } | 137 } |
| 99 | 138 |
| 139 void test(PreconnectTestCase testCase) | |
| 140 { | |
| 141 m_preconnecter->init(); | |
| 142 MockHTMLResourcePreloader preloader; | |
| 143 KURL baseURL(ParsedURLString, testCase.baseURL); | |
| 144 m_scanner->appendToEnd(String(testCase.inputHTML)); | |
| 145 m_scanner->scan(&preloader, baseURL); | |
| 146 m_preconnecter->verify(testCase.preconnectedHost, testCase.crossOrigin); | |
| 147 } | |
| 148 | |
| 100 private: | 149 private: |
| 101 OwnPtr<DummyPageHolder> m_dummyPageHolder; | 150 OwnPtr<DummyPageHolder> m_dummyPageHolder; |
| 102 OwnPtr<HTMLPreloadScanner> m_scanner; | 151 OwnPtr<HTMLPreloadScanner> m_scanner; |
| 152 MockPreconnecter* m_preconnecter; | |
| 103 }; | 153 }; |
| 104 | 154 |
| 105 TEST_F(HTMLPreloadScannerTest, testImages) | 155 TEST_F(HTMLPreloadScannerTest, testImages) |
| 106 { | 156 { |
| 107 TestCase testCases[] = { | 157 TestCase testCases[] = { |
| 108 {"http://example.test", "<img src='bla.gif'>", "bla.gif", "http://exampl e.test/", Resource::Image, 0}, | 158 {"http://example.test", "<img src='bla.gif'>", "bla.gif", "http://exampl e.test/", Resource::Image, 0}, |
| 109 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, | 159 {"http://example.test", "<img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test/", Resource::Image, 0}, |
| 110 {"http://example.test", "<img sizes='50vw' src='bla.gif'>", "bla.gif", " http://example.test/", Resource::Image, 0}, | 160 {"http://example.test", "<img sizes='50vw' src='bla.gif'>", "bla.gif", " http://example.test/", Resource::Image, 0}, |
| 111 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 1x'>", "bla2.gif", "http://example.test/", Resource::Image, 0}, | 161 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 1x'>", "bla2.gif", "http://example.test/", Resource::Image, 0}, |
| 112 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 0.5x'>", "bla.gif", "http://example.test/", Resource::Image, 0}, | 162 {"http://example.test", "<img sizes='50vw' src='bla.gif' srcset='bla2.gi f 0.5x'>", "bla.gif", "http://example.test/", Resource::Image, 0}, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 197 {"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}, | 247 {"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}, |
| 198 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw '>< img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test /", Resource::Image, 0, rw}, | 248 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw '>< img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://example.test /", Resource::Image, 0, rw}, |
| 199 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw , w utever'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://exa mple.test/", Resource::Image, 0, rw}, | 249 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw , w utever'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "http://exa mple.test/", Resource::Image, 0, rw}, |
| 200 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw , w utever, dpr \t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "ht tp://example.test/", Resource::Image, 0, dprAndRw}, | 250 {"http://example.test", "<meta http-equiv='accept-ch' content=' rw , w utever, dpr \t'><img srcset='bla.gif 320w, blabla.gif 640w'>", "blabla.gif", "ht tp://example.test/", Resource::Image, 0, dprAndRw}, |
| 201 }; | 251 }; |
| 202 | 252 |
| 203 for (auto testCase : testCases) | 253 for (auto testCase : testCases) |
| 204 test(testCase); | 254 test(testCase); |
| 205 } | 255 } |
| 206 | 256 |
| 257 TEST_F(HTMLPreloadScannerTest, testPreconnect) | |
| 258 { | |
| 259 PreconnectTestCase testCases[] = { | |
| 260 {"http://example.test", "<link rel=preconnect href=http://example2.test> ", "http://example2.test/", CrossOriginAttributeNotSet}, | |
| 261 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin=anonymous>", "http://example2.test/", CrossOriginAttributeNotSet}, | |
| 262 {"http://example.test", "<link rel=preconnect href=http://example2.test crossorigin='use-credentials'>", "http://example2.test/", CrossOriginAttributeNo tSet}, | |
| 263 {"http://example.test", "<link rel=preconnected href=http://example2.tes t crossorigin='use-credentials'>", "", CrossOriginAttributeNotSet}, | |
|
Mike West
2015/06/02 11:18:34
Is it intentional that the `crossorigin` attribute
| |
| 264 }; | |
| 265 | |
| 266 for (auto testCase : testCases) | |
|
Mike West
2015/06/02 11:18:34
Nit: `const auto&`
| |
| 267 test(testCase); | |
| 268 } | |
| 269 | |
| 207 } | 270 } |
| OLD | NEW |