| 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 "core/loader/LinkLoader.h" | 5 #include "core/loader/LinkLoader.h" |
| 6 | 6 |
| 7 #include "core/fetch/ResourceFetcher.h" | 7 #include "core/fetch/ResourceFetcher.h" |
| 8 #include "core/frame/Settings.h" | 8 #include "core/frame/Settings.h" |
| 9 #include "core/html/LinkRelAttribute.h" | 9 #include "core/html/LinkRelAttribute.h" |
| 10 #include "core/loader/DocumentLoader.h" | 10 #include "core/loader/DocumentLoader.h" |
| 11 #include "core/loader/LinkLoaderClient.h" | 11 #include "core/loader/LinkLoaderClient.h" |
| 12 #include "core/loader/NetworkHintsInterface.h" | 12 #include "core/loader/NetworkHintsInterface.h" |
| 13 #include "core/testing/DummyPageHolder.h" | 13 #include "core/testing/DummyPageHolder.h" |
| 14 #include "platform/network/ResourceLoadPriority.h" | 14 #include "platform/network/ResourceLoadPriority.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include <base/macros.h> | 16 #include <base/macros.h> |
| 17 | 17 |
| 18 namespace blink { | 18 namespace blink { |
| 19 | 19 |
| 20 class MockLinkLoaderClient : public LinkLoaderClient { | 20 class MockLinkLoaderClient final : public NoBaseWillBeGarbageCollectedFinalized<
MockLinkLoaderClient>, public LinkLoaderClient { |
| 21 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MockLinkLoaderClient); |
| 21 public: | 22 public: |
| 22 MockLinkLoaderClient(bool shouldLoad) | 23 static PassOwnPtrWillBeRawPtr<MockLinkLoaderClient> create(bool shouldLoad) |
| 23 : m_shouldLoad(shouldLoad) | |
| 24 { | 24 { |
| 25 return adoptPtrWillBeNoop(new MockLinkLoaderClient(shouldLoad)); |
| 25 } | 26 } |
| 26 | 27 |
| 28 DEFINE_INLINE_VIRTUAL_TRACE() { LinkLoaderClient::trace(visitor); } |
| 29 |
| 27 bool shouldLoadLink() override | 30 bool shouldLoadLink() override |
| 28 { | 31 { |
| 29 return m_shouldLoad; | 32 return m_shouldLoad; |
| 30 } | 33 } |
| 31 | 34 |
| 32 void linkLoaded() override {} | 35 void linkLoaded() override {} |
| 33 void linkLoadingErrored() override {} | 36 void linkLoadingErrored() override {} |
| 34 void didStartLinkPrerender() override {} | 37 void didStartLinkPrerender() override {} |
| 35 void didStopLinkPrerender() override {} | 38 void didStopLinkPrerender() override {} |
| 36 void didSendLoadForLinkPrerender() override {} | 39 void didSendLoadForLinkPrerender() override {} |
| 37 void didSendDOMContentLoadedForLinkPrerender() override {} | 40 void didSendDOMContentLoadedForLinkPrerender() override {} |
| 38 | 41 |
| 39 private: | 42 private: |
| 43 explicit MockLinkLoaderClient(bool shouldLoad) |
| 44 : m_shouldLoad(shouldLoad) |
| 45 { |
| 46 } |
| 47 |
| 40 bool m_shouldLoad; | 48 bool m_shouldLoad; |
| 41 }; | 49 }; |
| 42 | 50 |
| 43 class NetworkHintsMock : public NetworkHintsInterface { | 51 class NetworkHintsMock : public NetworkHintsInterface { |
| 44 public: | 52 public: |
| 45 NetworkHintsMock() | 53 NetworkHintsMock() |
| 46 : m_didDnsPrefetch(false) | 54 : m_didDnsPrefetch(false) |
| 47 , m_didPreconnect(false) | 55 , m_didPreconnect(false) |
| 48 { | 56 { |
| 49 } | 57 } |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 // TODO(yoav): subresource should be *very* low priority (rather than lo
w). | 102 // TODO(yoav): subresource should be *very* low priority (rather than lo
w). |
| 95 {"data://example.test/cat.empty", "", ResourceLoadPriorityLow, WebURLReq
uest::RequestContextSubresource, true, ""}, | 103 {"data://example.test/cat.empty", "", ResourceLoadPriorityLow, WebURLReq
uest::RequestContextSubresource, true, ""}, |
| 96 {"data://example.test/cat.blob", "blabla", ResourceLoadPriorityLow, WebU
RLRequest::RequestContextSubresource, true, ""}, | 104 {"data://example.test/cat.blob", "blabla", ResourceLoadPriorityLow, WebU
RLRequest::RequestContextSubresource, true, ""}, |
| 97 {"bla://example.test/cat.gif", "image", ResourceLoadPriorityUnresolved,
WebURLRequest::RequestContextImage, false, ""}, | 105 {"bla://example.test/cat.gif", "image", ResourceLoadPriorityUnresolved,
WebURLRequest::RequestContextImage, false, ""}, |
| 98 }; | 106 }; |
| 99 | 107 |
| 100 // Test the cases with a single header | 108 // Test the cases with a single header |
| 101 for (const auto& testCase : cases) { | 109 for (const auto& testCase : cases) { |
| 102 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); | 110 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); |
| 103 dummyPageHolder->frame().settings()->setScriptEnabled(true); | 111 dummyPageHolder->frame().settings()->setScriptEnabled(true); |
| 104 MockLinkLoaderClient loaderClient(testCase.shouldLoad); | 112 OwnPtrWillBePersistent<MockLinkLoaderClient> loaderClient = MockLinkLoad
erClient::create(testCase.shouldLoad); |
| 105 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(&loaderClient
); | 113 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(loaderClient.
get()); |
| 106 KURL hrefURL = KURL(KURL(), testCase.href); | 114 KURL hrefURL = KURL(KURL(), testCase.href); |
| 107 loader->loadLink(LinkRelAttribute("preload"), | 115 loader->loadLink(LinkRelAttribute("preload"), |
| 108 CrossOriginAttributeNotSet, | 116 CrossOriginAttributeNotSet, |
| 109 String(), | 117 String(), |
| 110 testCase.as, | 118 testCase.as, |
| 111 hrefURL, | 119 hrefURL, |
| 112 dummyPageHolder->document(), | 120 dummyPageHolder->document(), |
| 113 NetworkHintsMock()); | 121 NetworkHintsMock()); |
| 114 ASSERT(dummyPageHolder->document().fetcher()); | 122 ASSERT(dummyPageHolder->document().fetcher()); |
| 115 WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>* preloads = dummyPag
eHolder->document().fetcher()->preloads(); | 123 WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>* preloads = dummyPag
eHolder->document().fetcher()->preloads(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 141 {"https://example.com/", true}, | 149 {"https://example.com/", true}, |
| 142 {"//example.com/", true}, | 150 {"//example.com/", true}, |
| 143 }; | 151 }; |
| 144 | 152 |
| 145 // TODO(yoav): Test (and fix) shouldLoad = false | 153 // TODO(yoav): Test (and fix) shouldLoad = false |
| 146 | 154 |
| 147 // Test the cases with a single header | 155 // Test the cases with a single header |
| 148 for (const auto& testCase : cases) { | 156 for (const auto& testCase : cases) { |
| 149 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); | 157 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); |
| 150 dummyPageHolder->document().settings()->setDNSPrefetchingEnabled(true); | 158 dummyPageHolder->document().settings()->setDNSPrefetchingEnabled(true); |
| 151 MockLinkLoaderClient loaderClient(testCase.shouldLoad); | 159 OwnPtrWillBePersistent<MockLinkLoaderClient> loaderClient = MockLinkLoad
erClient::create(testCase.shouldLoad); |
| 152 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(&loaderClient
); | 160 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(loaderClient.
get()); |
| 153 KURL hrefURL = KURL(KURL(ParsedURLStringTag(), String("http://example.co
m")), testCase.href); | 161 KURL hrefURL = KURL(KURL(ParsedURLStringTag(), String("http://example.co
m")), testCase.href); |
| 154 NetworkHintsMock networkHints; | 162 NetworkHintsMock networkHints; |
| 155 loader->loadLink(LinkRelAttribute("dns-prefetch"), | 163 loader->loadLink(LinkRelAttribute("dns-prefetch"), |
| 156 CrossOriginAttributeNotSet, | 164 CrossOriginAttributeNotSet, |
| 157 String(), | 165 String(), |
| 158 String(), | 166 String(), |
| 159 hrefURL, | 167 hrefURL, |
| 160 dummyPageHolder->document(), | 168 dummyPageHolder->document(), |
| 161 networkHints); | 169 networkHints); |
| 162 ASSERT_FALSE(networkHints.didPreconnect()); | 170 ASSERT_FALSE(networkHints.didPreconnect()); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 175 } cases[] = { | 183 } cases[] = { |
| 176 {"http://example.com/", CrossOriginAttributeNotSet, true, false, false}, | 184 {"http://example.com/", CrossOriginAttributeNotSet, true, false, false}, |
| 177 {"https://example.com/", CrossOriginAttributeNotSet, true, true, false}, | 185 {"https://example.com/", CrossOriginAttributeNotSet, true, true, false}, |
| 178 {"http://example.com/", CrossOriginAttributeAnonymous, true, false, true
}, | 186 {"http://example.com/", CrossOriginAttributeAnonymous, true, false, true
}, |
| 179 {"//example.com/", CrossOriginAttributeNotSet, true, false, false}, | 187 {"//example.com/", CrossOriginAttributeNotSet, true, false, false}, |
| 180 }; | 188 }; |
| 181 | 189 |
| 182 // Test the cases with a single header | 190 // Test the cases with a single header |
| 183 for (const auto& testCase : cases) { | 191 for (const auto& testCase : cases) { |
| 184 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); | 192 OwnPtr<DummyPageHolder> dummyPageHolder = DummyPageHolder::create(IntSiz
e(500, 500)); |
| 185 MockLinkLoaderClient loaderClient(testCase.shouldLoad); | 193 OwnPtrWillBePersistent<MockLinkLoaderClient> loaderClient = MockLinkLoad
erClient::create(testCase.shouldLoad); |
| 186 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(&loaderClient
); | 194 OwnPtrWillBeRawPtr<LinkLoader> loader = LinkLoader::create(loaderClient.
get()); |
| 187 KURL hrefURL = KURL(KURL(ParsedURLStringTag(), String("http://example.co
m")), testCase.href); | 195 KURL hrefURL = KURL(KURL(ParsedURLStringTag(), String("http://example.co
m")), testCase.href); |
| 188 NetworkHintsMock networkHints; | 196 NetworkHintsMock networkHints; |
| 189 loader->loadLink(LinkRelAttribute("preconnect"), | 197 loader->loadLink(LinkRelAttribute("preconnect"), |
| 190 testCase.crossOrigin, | 198 testCase.crossOrigin, |
| 191 String(), | 199 String(), |
| 192 String(), | 200 String(), |
| 193 hrefURL, | 201 hrefURL, |
| 194 dummyPageHolder->document(), | 202 dummyPageHolder->document(), |
| 195 networkHints); | 203 networkHints); |
| 196 ASSERT_EQ(testCase.shouldLoad, networkHints.didPreconnect()); | 204 ASSERT_EQ(testCase.shouldLoad, networkHints.didPreconnect()); |
| 197 ASSERT_EQ(testCase.isHTTPS, networkHints.isHTTPS()); | 205 ASSERT_EQ(testCase.isHTTPS, networkHints.isHTTPS()); |
| 198 ASSERT_EQ(testCase.isCrossOrigin, networkHints.isCrossOrigin()); | 206 ASSERT_EQ(testCase.isCrossOrigin, networkHints.isCrossOrigin()); |
| 199 } | 207 } |
| 200 } | 208 } |
| 201 | 209 |
| 202 } // namespace blink | 210 } // namespace blink |
| OLD | NEW |