| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2015, Google Inc. All rights reserved. | 2 * Copyright (c) 2015, Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "core/loader/FrameFetchContext.h" | 32 #include "core/loader/FrameFetchContext.h" |
| 33 | 33 |
| 34 #include "core/fetch/FetchInitiatorInfo.h" | 34 #include "core/fetch/FetchInitiatorInfo.h" |
| 35 #include "core/frame/FrameHost.h" | 35 #include "core/frame/FrameHost.h" |
| 36 #include "core/frame/FrameOwner.h" | 36 #include "core/frame/FrameOwner.h" |
| 37 #include "core/frame/FrameView.h" | 37 #include "core/frame/FrameView.h" |
| 38 #include "core/frame/Settings.h" |
| 38 #include "core/html/HTMLDocument.h" | 39 #include "core/html/HTMLDocument.h" |
| 39 #include "core/loader/DocumentLoader.h" | 40 #include "core/loader/DocumentLoader.h" |
| 40 #include "core/loader/EmptyClients.h" | 41 #include "core/loader/EmptyClients.h" |
| 41 #include "core/page/Page.h" | 42 #include "core/page/Page.h" |
| 42 #include "core/testing/DummyPageHolder.h" | 43 #include "core/testing/DummyPageHolder.h" |
| 43 #include "platform/network/ResourceRequest.h" | 44 #include "platform/network/ResourceRequest.h" |
| 44 #include "platform/weborigin/KURL.h" | 45 #include "platform/weborigin/KURL.h" |
| 45 #include <gtest/gtest.h> | 46 #include <gtest/gtest.h> |
| 46 | 47 |
| 47 namespace blink { | 48 namespace blink { |
| 48 | 49 |
| 49 class FrameFetchContextUpgradeTest : public ::testing::Test { | 50 class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { |
| 50 public: | 51 public: |
| 51 FrameFetchContextUpgradeTest() | 52 static PassOwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> create(Frame*
parent) |
| 52 : secureURL(ParsedURLString, "https://secureorigin.test/image.png") | 53 { |
| 53 , exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://ex
ample.test/"))) | 54 return adoptPtrWillBeNoop(new StubFrameLoaderClientWithParent(parent)); |
| 54 , secureOrigin(SecurityOrigin::create(secureURL)) | 55 } |
| 56 |
| 57 DEFINE_INLINE_VIRTUAL_TRACE() |
| 58 { |
| 59 visitor->trace(m_parent); |
| 60 EmptyFrameLoaderClient::trace(visitor); |
| 61 } |
| 62 |
| 63 Frame* parent() const override { return m_parent.get(); } |
| 64 |
| 65 private: |
| 66 explicit StubFrameLoaderClientWithParent(Frame* parent) |
| 67 : m_parent(parent) |
| 55 { | 68 { |
| 56 } | 69 } |
| 57 | 70 |
| 71 RawPtrWillBeMember<Frame> m_parent; |
| 72 }; |
| 73 |
| 74 class StubFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<StubFrameOwn
er>, public FrameOwner { |
| 75 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(StubFrameOwner); |
| 76 public: |
| 77 DEFINE_INLINE_VIRTUAL_TRACE() { FrameOwner::trace(visitor); } |
| 78 |
| 79 bool isLocal() const override { return false; } |
| 80 SandboxFlags sandboxFlags() const override { return SandboxNone; } |
| 81 void dispatchLoad() override { } |
| 82 void renderFallbackContent() override { } |
| 83 }; |
| 84 |
| 85 class FrameFetchContextTest : public ::testing::Test { |
| 58 protected: | 86 protected: |
| 59 virtual void SetUp() | 87 void SetUp() override |
| 60 { | 88 { |
| 61 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); | 89 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); |
| 62 dummyPageHolder->page().setDeviceScaleFactor(1.0); | 90 dummyPageHolder->page().setDeviceScaleFactor(1.0); |
| 63 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou
rceRequest("http://www.example.com"), SubstituteData()); | 91 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou
rceRequest("http://www.example.com"), SubstituteData()); |
| 64 document = toHTMLDocument(&dummyPageHolder->document()); | 92 document = toHTMLDocument(&dummyPageHolder->document()); |
| 65 fetchContext = &documentLoader->fetcher()->context(); | 93 fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher(
)->context()); |
| 66 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get(
)); | 94 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get(
)); |
| 67 } | 95 } |
| 68 | 96 |
| 69 virtual void TearDown() | 97 void TearDown() override |
| 70 { | 98 { |
| 71 documentLoader->detachFromFrame(); | 99 documentLoader->detachFromFrame(); |
| 72 documentLoader.clear(); | 100 documentLoader.clear(); |
| 101 |
| 102 if (childFrame) { |
| 103 childDocumentLoader->detachFromFrame(); |
| 104 childDocumentLoader.clear(); |
| 105 childFrame->detach(FrameDetachType::Remove); |
| 106 } |
| 73 } | 107 } |
| 74 | 108 |
| 109 FrameFetchContext* createChildFrame() |
| 110 { |
| 111 childClient = StubFrameLoaderClientWithParent::create(document->frame())
; |
| 112 childFrame = LocalFrame::create(childClient.get(), document->frame()->ho
st(), &owner); |
| 113 childFrame->setView(FrameView::create(childFrame.get(), IntSize(500, 500
))); |
| 114 childFrame->init(); |
| 115 childDocumentLoader = DocumentLoader::create(childFrame.get(), ResourceR
equest("http://www.example.com"), SubstituteData()); |
| 116 childDocument = childFrame->document(); |
| 117 FrameFetchContext* childFetchContext = static_cast<FrameFetchContext*>(&
childDocumentLoader->fetcher()->context()); |
| 118 FrameFetchContext::provideDocumentToContext(*childFetchContext, childDoc
ument.get()); |
| 119 return childFetchContext; |
| 120 } |
| 121 |
| 122 OwnPtr<DummyPageHolder> dummyPageHolder; |
| 123 // We don't use the DocumentLoader directly in any tests, but need to keep i
t around as long |
| 124 // as the ResourceFetcher and Document live due to indirect usage. |
| 125 RefPtrWillBePersistent<DocumentLoader> documentLoader; |
| 126 RefPtrWillBePersistent<Document> document; |
| 127 Persistent<FrameFetchContext> fetchContext; |
| 128 |
| 129 OwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> childClient; |
| 130 RefPtrWillBeRawPtr<LocalFrame> childFrame; |
| 131 RefPtrWillBePersistent<DocumentLoader> childDocumentLoader; |
| 132 RefPtrWillBePersistent<Document> childDocument; |
| 133 StubFrameOwner owner; |
| 134 |
| 135 }; |
| 136 |
| 137 class FrameFetchContextUpgradeTest : public FrameFetchContextTest { |
| 138 public: |
| 139 FrameFetchContextUpgradeTest() |
| 140 : exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://ex
ample.test/"))) |
| 141 , secureOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://sec
ureorigin.test/image.png"))) |
| 142 { |
| 143 } |
| 144 |
| 145 protected: |
| 75 void expectUpgrade(const char* input, const char* expected) | 146 void expectUpgrade(const char* input, const char* expected) |
| 76 { | 147 { |
| 77 expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest:
:FrameTypeNone, expected); | 148 expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest:
:FrameTypeNone, expected); |
| 78 } | 149 } |
| 79 | 150 |
| 80 void expectUpgrade(const char* input, WebURLRequest::RequestContext requestC
ontext, WebURLRequest::FrameType frameType, const char* expected) | 151 void expectUpgrade(const char* input, WebURLRequest::RequestContext requestC
ontext, WebURLRequest::FrameType frameType, const char* expected) |
| 81 { | 152 { |
| 82 KURL inputURL(ParsedURLString, input); | 153 KURL inputURL(ParsedURLString, input); |
| 83 KURL expectedURL(ParsedURLString, expected); | 154 KURL expectedURL(ParsedURLString, expected); |
| 84 | 155 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 103 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc
hInitiatorInfo()); | 174 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc
hInitiatorInfo()); |
| 104 fetchRequest.mutableResourceRequest().setRequestContext(WebURLRequest::R
equestContextScript); | 175 fetchRequest.mutableResourceRequest().setRequestContext(WebURLRequest::R
equestContextScript); |
| 105 fetchRequest.mutableResourceRequest().setFrameType(frameType); | 176 fetchRequest.mutableResourceRequest().setFrameType(frameType); |
| 106 | 177 |
| 107 fetchContext->upgradeInsecureRequest(fetchRequest); | 178 fetchContext->upgradeInsecureRequest(fetchRequest); |
| 108 | 179 |
| 109 EXPECT_STREQ(shouldPrefer ? "1" : "", | 180 EXPECT_STREQ(shouldPrefer ? "1" : "", |
| 110 fetchRequest.resourceRequest().httpHeaderField("Upgrade-Insecure-Req
uests").utf8().data()); | 181 fetchRequest.resourceRequest().httpHeaderField("Upgrade-Insecure-Req
uests").utf8().data()); |
| 111 } | 182 } |
| 112 | 183 |
| 113 KURL secureURL; | |
| 114 RefPtr<SecurityOrigin> exampleOrigin; | 184 RefPtr<SecurityOrigin> exampleOrigin; |
| 115 RefPtr<SecurityOrigin> secureOrigin; | 185 RefPtr<SecurityOrigin> secureOrigin; |
| 116 | |
| 117 OwnPtr<DummyPageHolder> dummyPageHolder; | |
| 118 // We don't use the DocumentLoader directly in any tests, but need to keep i
t around as long | |
| 119 // as the ResourceFetcher and Document live due to indirect usage. | |
| 120 RefPtrWillBePersistent<DocumentLoader> documentLoader; | |
| 121 RefPtrWillBePersistent<Document> document; | |
| 122 Persistent<FetchContext> fetchContext; | |
| 123 }; | 186 }; |
| 124 | 187 |
| 125 TEST_F(FrameFetchContextUpgradeTest, UpgradeInsecureResourceRequests) | 188 TEST_F(FrameFetchContextUpgradeTest, UpgradeInsecureResourceRequests) |
| 126 { | 189 { |
| 127 struct TestCase { | 190 struct TestCase { |
| 128 const char* original; | 191 const char* original; |
| 129 const char* upgraded; | 192 const char* upgraded; |
| 130 } tests[] = { | 193 } tests[] = { |
| 131 { "http://example.test/image.png", "https://example.test/image.png" }, | 194 { "http://example.test/image.png", "https://example.test/image.png" }, |
| 132 { "http://example.test:80/image.png", "https://example.test:443/image.pn
g" }, | 195 { "http://example.test:80/image.png", "https://example.test:443/image.pn
g" }, |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 217 | 280 |
| 218 for (const auto& test : tests) { | 281 for (const auto& test : tests) { |
| 219 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsDoN
otUpgrade); | 282 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsDoN
otUpgrade); |
| 220 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); | 283 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); |
| 221 | 284 |
| 222 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsUpg
rade); | 285 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsUpg
rade); |
| 223 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); | 286 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); |
| 224 } | 287 } |
| 225 } | 288 } |
| 226 | 289 |
| 227 class FrameFetchContextHintsTest : public ::testing::Test { | 290 class FrameFetchContextHintsTest : public FrameFetchContextTest { |
| 228 public: | 291 public: |
| 229 FrameFetchContextHintsTest() { } | 292 FrameFetchContextHintsTest() { } |
| 230 | 293 |
| 231 protected: | 294 protected: |
| 232 virtual void SetUp() | |
| 233 { | |
| 234 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); | |
| 235 dummyPageHolder->page().setDeviceScaleFactor(1.0); | |
| 236 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou
rceRequest("http://www.example.com"), SubstituteData()); | |
| 237 document = toHTMLDocument(&dummyPageHolder->document()); | |
| 238 fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher(
)->context()); | |
| 239 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get(
)); | |
| 240 } | |
| 241 | |
| 242 virtual void TearDown() | |
| 243 { | |
| 244 documentLoader->detachFromFrame(); | |
| 245 documentLoader.clear(); | |
| 246 } | |
| 247 | |
| 248 void expectHeader(const char* input, const char* headerName, bool isPresent,
const char* headerValue, float width = 0) | 295 void expectHeader(const char* input, const char* headerName, bool isPresent,
const char* headerValue, float width = 0) |
| 249 { | 296 { |
| 250 KURL inputURL(ParsedURLString, input); | 297 KURL inputURL(ParsedURLString, input); |
| 251 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc
hInitiatorInfo()); | 298 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc
hInitiatorInfo()); |
| 252 if (width > 0) { | 299 if (width > 0) { |
| 253 FetchRequest::ResourceWidth resourceWidth; | 300 FetchRequest::ResourceWidth resourceWidth; |
| 254 resourceWidth.width = width; | 301 resourceWidth.width = width; |
| 255 resourceWidth.isSet = true; | 302 resourceWidth.isSet = true; |
| 256 fetchRequest.setResourceWidth(resourceWidth); | 303 fetchRequest.setResourceWidth(resourceWidth); |
| 257 } | 304 } |
| 258 fetchContext->addClientHintsIfNecessary(fetchRequest); | 305 fetchContext->addClientHintsIfNecessary(fetchRequest); |
| 259 | 306 |
| 260 EXPECT_STREQ(isPresent ? headerValue : "", | 307 EXPECT_STREQ(isPresent ? headerValue : "", |
| 261 fetchRequest.resourceRequest().httpHeaderField(headerName).utf8().da
ta()); | 308 fetchRequest.resourceRequest().httpHeaderField(headerName).utf8().da
ta()); |
| 262 } | 309 } |
| 263 | |
| 264 OwnPtr<DummyPageHolder> dummyPageHolder; | |
| 265 // We don't use the DocumentLoader directly in any tests, but need to keep i
t around as long | |
| 266 // as the ResourceFetcher and Document live due to indirect usage. | |
| 267 RefPtrWillBePersistent<DocumentLoader> documentLoader; | |
| 268 RefPtrWillBePersistent<Document> document; | |
| 269 Persistent<FrameFetchContext> fetchContext; | |
| 270 }; | 310 }; |
| 271 | 311 |
| 272 TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) | 312 TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) |
| 273 { | 313 { |
| 274 expectHeader("http://www.example.com/1.gif", "DPR", false, ""); | 314 expectHeader("http://www.example.com/1.gif", "DPR", false, ""); |
| 275 ClientHintsPreferences preferences; | 315 ClientHintsPreferences preferences; |
| 276 preferences.setShouldSendDPR(true); | 316 preferences.setShouldSendDPR(true); |
| 277 document->clientHintsPreferences().updateFrom(preferences); | 317 document->clientHintsPreferences().updateFrom(preferences); |
| 278 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); | 318 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); |
| 279 dummyPageHolder->page().setDeviceScaleFactor(2.5); | 319 dummyPageHolder->page().setDeviceScaleFactor(2.5); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 ClientHintsPreferences preferences; | 356 ClientHintsPreferences preferences; |
| 317 preferences.setShouldSendDPR(true); | 357 preferences.setShouldSendDPR(true); |
| 318 preferences.setShouldSendResourceWidth(true); | 358 preferences.setShouldSendResourceWidth(true); |
| 319 preferences.setShouldSendViewportWidth(true); | 359 preferences.setShouldSendViewportWidth(true); |
| 320 document->clientHintsPreferences().updateFrom(preferences); | 360 document->clientHintsPreferences().updateFrom(preferences); |
| 321 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); | 361 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); |
| 322 expectHeader("http://www.example.com/1.gif", "Width", true, "400", 400); | 362 expectHeader("http://www.example.com/1.gif", "Width", true, "400", 400); |
| 323 expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); | 363 expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); |
| 324 } | 364 } |
| 325 | 365 |
| 326 class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { | 366 TEST_F(FrameFetchContextTest, MainResource) |
| 327 public: | |
| 328 static PassOwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> create(Frame*
parent) | |
| 329 { | |
| 330 return adoptPtrWillBeNoop(new StubFrameLoaderClientWithParent(parent)); | |
| 331 } | |
| 332 | |
| 333 DEFINE_INLINE_VIRTUAL_TRACE() | |
| 334 { | |
| 335 visitor->trace(m_parent); | |
| 336 EmptyFrameLoaderClient::trace(visitor); | |
| 337 } | |
| 338 | |
| 339 Frame* parent() const override { return m_parent.get(); } | |
| 340 | |
| 341 private: | |
| 342 explicit StubFrameLoaderClientWithParent(Frame* parent) | |
| 343 : m_parent(parent) | |
| 344 { | |
| 345 } | |
| 346 | |
| 347 RawPtrWillBeMember<Frame> m_parent; | |
| 348 }; | |
| 349 | |
| 350 class StubFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<StubFrameOwn
er>, public FrameOwner { | |
| 351 WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(StubFrameOwner); | |
| 352 public: | |
| 353 DEFINE_INLINE_VIRTUAL_TRACE() { FrameOwner::trace(visitor); } | |
| 354 | |
| 355 bool isLocal() const override { return false; } | |
| 356 SandboxFlags sandboxFlags() const override { return SandboxNone; } | |
| 357 void dispatchLoad() override { } | |
| 358 void renderFallbackContent() override { } | |
| 359 }; | |
| 360 | |
| 361 class FrameFetchContextCachePolicyTest : public ::testing::Test { | |
| 362 public: | |
| 363 FrameFetchContextCachePolicyTest() { } | |
| 364 | |
| 365 protected: | |
| 366 void SetUp() override | |
| 367 { | |
| 368 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); | |
| 369 dummyPageHolder->page().setDeviceScaleFactor(1.0); | |
| 370 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou
rceRequest("http://www.example.com"), SubstituteData()); | |
| 371 document = toHTMLDocument(&dummyPageHolder->document()); | |
| 372 fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher(
)->context()); | |
| 373 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get(
)); | |
| 374 } | |
| 375 | |
| 376 void TearDown() override | |
| 377 { | |
| 378 documentLoader->detachFromFrame(); | |
| 379 documentLoader.clear(); | |
| 380 } | |
| 381 | |
| 382 OwnPtr<DummyPageHolder> dummyPageHolder; | |
| 383 // We don't use the DocumentLoader directly in any tests, but need to keep i
t around as long | |
| 384 // as the ResourceFetcher and Document live due to indirect usage. | |
| 385 RefPtrWillBePersistent<DocumentLoader> documentLoader; | |
| 386 RefPtrWillBePersistent<Document> document; | |
| 387 Persistent<FrameFetchContext> fetchContext; | |
| 388 }; | |
| 389 | |
| 390 TEST_F(FrameFetchContextCachePolicyTest, MainResource) | |
| 391 { | 367 { |
| 392 // Default case | 368 // Default case |
| 393 ResourceRequest request("http://www.example.com"); | 369 ResourceRequest request("http://www.example.com"); |
| 394 EXPECT_EQ(UseProtocolCachePolicy, fetchContext->resourceRequestCachePolicy(r
equest, Resource::MainResource)); | 370 EXPECT_EQ(UseProtocolCachePolicy, fetchContext->resourceRequestCachePolicy(r
equest, Resource::MainResource)); |
| 395 | 371 |
| 396 // Post | 372 // Post |
| 397 ResourceRequest postRequest("http://www.example.com"); | 373 ResourceRequest postRequest("http://www.example.com"); |
| 398 postRequest.setHTTPMethod("POST"); | 374 postRequest.setHTTPMethod("POST"); |
| 399 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
postRequest, Resource::MainResource)); | 375 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
postRequest, Resource::MainResource)); |
| 400 | 376 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 412 document->frame()->loader().setLoadType(FrameLoadTypeSame); | 388 document->frame()->loader().setLoadType(FrameLoadTypeSame); |
| 413 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
request, Resource::MainResource)); | 389 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
request, Resource::MainResource)); |
| 414 | 390 |
| 415 // Conditional request | 391 // Conditional request |
| 416 document->frame()->loader().setLoadType(FrameLoadTypeStandard); | 392 document->frame()->loader().setLoadType(FrameLoadTypeStandard); |
| 417 ResourceRequest conditional("http://www.example.com"); | 393 ResourceRequest conditional("http://www.example.com"); |
| 418 conditional.setHTTPHeaderField("If-Modified-Since", "foo"); | 394 conditional.setHTTPHeaderField("If-Modified-Since", "foo"); |
| 419 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
conditional, Resource::MainResource)); | 395 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy(
conditional, Resource::MainResource)); |
| 420 | 396 |
| 421 // Set up a child frame | 397 // Set up a child frame |
| 422 OwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> client = StubFrameLoader
ClientWithParent::create(document->frame()); | 398 FrameFetchContext* childFetchContext = createChildFrame(); |
| 423 StubFrameOwner owner; | |
| 424 RefPtrWillBeRawPtr<LocalFrame> childFrame = LocalFrame::create(client.get(),
document->frame()->host(), &owner); | |
| 425 childFrame->setView(FrameView::create(childFrame.get(), IntSize(500, 500))); | |
| 426 childFrame->init(); | |
| 427 RefPtrWillBePersistent<DocumentLoader> childDocumentLoader = | |
| 428 DocumentLoader::create(childFrame.get(), ResourceRequest("http://www.exa
mple.com"), SubstituteData()); | |
| 429 RefPtrWillBePersistent<Document> childDocument = childFrame->document(); | |
| 430 FrameFetchContext* childFetchContext = static_cast<FrameFetchContext*>(&chil
dDocumentLoader->fetcher()->context()); | |
| 431 FrameFetchContext::provideDocumentToContext(*childFetchContext, childDocumen
t.get()); | |
| 432 | 399 |
| 433 // Child frame as part of back/forward | 400 // Child frame as part of back/forward |
| 434 document->frame()->loader().setLoadType(FrameLoadTypeBackForward); | 401 document->frame()->loader().setLoadType(FrameLoadTypeBackForward); |
| 435 EXPECT_EQ(ReturnCacheDataElseLoad, childFetchContext->resourceRequestCachePo
licy(request, Resource::MainResource)); | 402 EXPECT_EQ(ReturnCacheDataElseLoad, childFetchContext->resourceRequestCachePo
licy(request, Resource::MainResource)); |
| 436 | 403 |
| 437 // Child frame as part of reload | 404 // Child frame as part of reload |
| 438 document->frame()->loader().setLoadType(FrameLoadTypeReload); | 405 document->frame()->loader().setLoadType(FrameLoadTypeReload); |
| 439 EXPECT_EQ(ReloadIgnoringCacheData, childFetchContext->resourceRequestCachePo
licy(request, Resource::MainResource)); | 406 EXPECT_EQ(ReloadIgnoringCacheData, childFetchContext->resourceRequestCachePo
licy(request, Resource::MainResource)); |
| 440 | 407 |
| 441 // Child frame as part of end to end reload | 408 // Child frame as part of end to end reload |
| 442 document->frame()->loader().setLoadType(FrameLoadTypeReloadFromOrigin); | 409 document->frame()->loader().setLoadType(FrameLoadTypeReloadFromOrigin); |
| 443 EXPECT_EQ(ReloadBypassingCache, childFetchContext->resourceRequestCachePolic
y(request, Resource::MainResource)); | 410 EXPECT_EQ(ReloadBypassingCache, childFetchContext->resourceRequestCachePolic
y(request, Resource::MainResource)); |
| 411 } |
| 444 | 412 |
| 445 childDocumentLoader->detachFromFrame(); | 413 TEST_F(FrameFetchContextTest, ModifyPriorityForExperiments) |
| 446 childDocumentLoader.clear(); | 414 { |
| 447 childFrame->detach(FrameDetachType::Remove); | 415 Settings* settings = document->frame()->settings(); |
| 416 FetchRequest request(ResourceRequest("http://www.example.com"), FetchInitiat
orInfo()); |
| 417 |
| 418 FetchRequest preloadRequest(ResourceRequest("http://www.example.com"), Fetch
InitiatorInfo()); |
| 419 preloadRequest.setForPreload(true); |
| 420 |
| 421 FetchRequest deferredRequest(ResourceRequest("http://www.example.com"), Fetc
hInitiatorInfo()); |
| 422 deferredRequest.setDefer(FetchRequest::LazyLoad); |
| 423 |
| 424 // Start with all experiments disabled. |
| 425 settings->setFEtchIncreaseAsyncScriptPriority(false); |
| 426 settings->setFEtchIncreaseFontPriority(false); |
| 427 settings->setFEtchDeferLateScripts(false); |
| 428 settings->setFEtchIncreasePriorities(false); |
| 429 settings->setLowPriorityIframes(false); |
| 430 |
| 431 // Base case, no priority change. Note that this triggers m_imageFetched, wh
ich will matter for setFetchDeferLateScripts() case below. |
| 432 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment
s(ResourceLoadPriorityLow, Resource::Image, request)); |
| 433 |
| 434 // Font priority with and without fetchIncreaseFontPriority() |
| 435 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Font, request)); |
| 436 settings->setFEtchIncreaseFontPriority(true); |
| 437 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen
ts(ResourceLoadPriorityMedium, Resource::Font, request)); |
| 438 |
| 439 // Basic script cases |
| 440 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Script, request)); |
| 441 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| 442 |
| 443 // Enable deferring late scripts. Preload priority should drop. |
| 444 settings->setFEtchDeferLateScripts(true); |
| 445 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment
s(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| 446 |
| 447 // Enable increasing priority of async scripts. |
| 448 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment
s(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| 449 settings->setFEtchIncreaseAsyncScriptPriority(true); |
| 450 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| 451 |
| 452 // Enable increased priorities for the remainder. |
| 453 settings->setFEtchIncreasePriorities(true); |
| 454 |
| 455 // Re-test font priority with increased prioriries |
| 456 settings->setFEtchIncreaseFontPriority(false); |
| 457 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen
ts(ResourceLoadPriorityMedium, Resource::Font, request)); |
| 458 settings->setFEtchIncreaseFontPriority(true); |
| 459 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper
iments(ResourceLoadPriorityMedium, Resource::Font, request)); |
| 460 |
| 461 // Re-test basic script cases and deferring late script case with increased
prioriries |
| 462 settings->setFEtchIncreasePriorities(true); |
| 463 settings->setFEtchDeferLateScripts(false); |
| 464 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper
iments(ResourceLoadPriorityMedium, Resource::Script, request)); |
| 465 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen
ts(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| 466 |
| 467 // Re-test deferring late scripts. |
| 468 settings->setFEtchDeferLateScripts(true); |
| 469 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); |
| 470 |
| 471 // Re-test increasing priority of async scripts. Should ignore general incra
esed priorities. |
| 472 settings->setFEtchIncreaseAsyncScriptPriority(false); |
| 473 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment
s(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| 474 settings->setFEtchIncreaseAsyncScriptPriority(true); |
| 475 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim
ents(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); |
| 476 |
| 477 // Set up a child frame, test main resource load with and without setLowPrio
rityIframes() |
| 478 FrameFetchContext* childFetchContext = createChildFrame(); |
| 479 EXPECT_EQ(ResourceLoadPriorityVeryHigh, childFetchContext->modifyPriorityFor
Experiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); |
| 480 settings->setLowPriorityIframes(true); |
| 481 EXPECT_EQ(ResourceLoadPriorityVeryLow, childFetchContext->modifyPriorityForE
xperiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); |
| 482 |
| 483 // Ensure we don't go out of bounds |
| 484 settings->setFEtchIncreasePriorities(true); |
| 485 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper
iments(ResourceLoadPriorityVeryHigh, Resource::Script, request)); |
| 486 settings->setFEtchIncreasePriorities(false); |
| 487 settings->setFEtchDeferLateScripts(true); |
| 488 EXPECT_EQ(ResourceLoadPriorityVeryLow, fetchContext->modifyPriorityForExperi
ments(ResourceLoadPriorityVeryLow, Resource::Script, preloadRequest)); |
| 448 } | 489 } |
| 449 | 490 |
| 450 } // namespace | 491 } // namespace |
| OLD | NEW |