Chromium Code Reviews| 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 { |
|
Nate Chapin
2015/09/01 23:54:47
Moved without modification from farther down in th
| |
| 51 public: | |
| 52 static PassOwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> create(Frame* parent) | |
| 53 { | |
| 54 return adoptPtrWillBeNoop(new StubFrameLoaderClientWithParent(parent)); | |
| 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) | |
| 68 { | |
| 69 } | |
| 70 | |
| 71 RawPtrWillBeMember<Frame> m_parent; | |
| 72 }; | |
| 73 | |
| 74 class StubFrameOwner : public NoBaseWillBeGarbageCollectedFinalized<StubFrameOwn er>, public FrameOwner { | |
|
Nate Chapin
2015/09/01 23:54:47
Moved without modification from farther down in th
| |
| 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 { | |
| 86 protected: | |
| 87 void SetUp() override | |
| 88 { | |
| 89 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); | |
| 90 dummyPageHolder->page().setDeviceScaleFactor(1.0); | |
| 91 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou rceRequest("http://www.example.com"), SubstituteData()); | |
| 92 document = toHTMLDocument(&dummyPageHolder->document()); | |
| 93 fetchContext = static_cast<FrameFetchContext*>(&documentLoader->fetcher( )->context()); | |
| 94 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get( )); | |
| 95 } | |
| 96 | |
| 97 void TearDown() override | |
| 98 { | |
| 99 documentLoader->detachFromFrame(); | |
| 100 documentLoader.clear(); | |
| 101 | |
| 102 if (childFrame) { | |
| 103 childDocumentLoader->detachFromFrame(); | |
| 104 childDocumentLoader.clear(); | |
| 105 childFrame->detach(FrameDetachType::Remove); | |
| 106 } | |
| 107 } | |
| 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; | |
|
dcheng
2015/09/02 17:17:12
It might be nice to update these to use the right
| |
| 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 { | |
| 50 public: | 138 public: |
| 51 FrameFetchContextUpgradeTest() | 139 FrameFetchContextUpgradeTest() |
| 52 : secureURL(ParsedURLString, "https://secureorigin.test/image.png") | 140 : secureURL(ParsedURLString, "https://secureorigin.test/image.png") |
|
dcheng
2015/09/02 17:17:12
Maybe just inline this directly into line 142? I d
Nate Chapin
2015/09/02 17:29:55
Done.
| |
| 53 , exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://ex ample.test/"))) | 141 , exampleOrigin(SecurityOrigin::create(KURL(ParsedURLString, "https://ex ample.test/"))) |
| 54 , secureOrigin(SecurityOrigin::create(secureURL)) | 142 , secureOrigin(SecurityOrigin::create(secureURL)) |
| 55 { | 143 { |
| 56 } | 144 } |
| 57 | 145 |
| 58 protected: | 146 protected: |
| 59 virtual void SetUp() | |
| 60 { | |
| 61 dummyPageHolder = DummyPageHolder::create(IntSize(500, 500)); | |
| 62 dummyPageHolder->page().setDeviceScaleFactor(1.0); | |
| 63 documentLoader = DocumentLoader::create(&dummyPageHolder->frame(), Resou rceRequest("http://www.example.com"), SubstituteData()); | |
| 64 document = toHTMLDocument(&dummyPageHolder->document()); | |
| 65 fetchContext = &documentLoader->fetcher()->context(); | |
| 66 FrameFetchContext::provideDocumentToContext(*fetchContext, document.get( )); | |
| 67 } | |
| 68 | |
| 69 virtual void TearDown() | |
| 70 { | |
| 71 documentLoader->detachFromFrame(); | |
| 72 documentLoader.clear(); | |
| 73 } | |
| 74 | |
| 75 void expectUpgrade(const char* input, const char* expected) | 147 void expectUpgrade(const char* input, const char* expected) |
| 76 { | 148 { |
| 77 expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest: :FrameTypeNone, expected); | 149 expectUpgrade(input, WebURLRequest::RequestContextScript, WebURLRequest: :FrameTypeNone, expected); |
| 78 } | 150 } |
| 79 | 151 |
| 80 void expectUpgrade(const char* input, WebURLRequest::RequestContext requestC ontext, WebURLRequest::FrameType frameType, const char* expected) | 152 void expectUpgrade(const char* input, WebURLRequest::RequestContext requestC ontext, WebURLRequest::FrameType frameType, const char* expected) |
| 81 { | 153 { |
| 82 KURL inputURL(ParsedURLString, input); | 154 KURL inputURL(ParsedURLString, input); |
| 83 KURL expectedURL(ParsedURLString, expected); | 155 KURL expectedURL(ParsedURLString, expected); |
| 84 | 156 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 106 | 178 |
| 107 fetchContext->upgradeInsecureRequest(fetchRequest); | 179 fetchContext->upgradeInsecureRequest(fetchRequest); |
| 108 | 180 |
| 109 EXPECT_STREQ(shouldPrefer ? "1" : "", | 181 EXPECT_STREQ(shouldPrefer ? "1" : "", |
| 110 fetchRequest.resourceRequest().httpHeaderField("Upgrade-Insecure-Req uests").utf8().data()); | 182 fetchRequest.resourceRequest().httpHeaderField("Upgrade-Insecure-Req uests").utf8().data()); |
| 111 } | 183 } |
| 112 | 184 |
| 113 KURL secureURL; | 185 KURL secureURL; |
| 114 RefPtr<SecurityOrigin> exampleOrigin; | 186 RefPtr<SecurityOrigin> exampleOrigin; |
| 115 RefPtr<SecurityOrigin> secureOrigin; | 187 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 }; | 188 }; |
| 124 | 189 |
| 125 TEST_F(FrameFetchContextUpgradeTest, UpgradeInsecureResourceRequests) | 190 TEST_F(FrameFetchContextUpgradeTest, UpgradeInsecureResourceRequests) |
| 126 { | 191 { |
| 127 struct TestCase { | 192 struct TestCase { |
| 128 const char* original; | 193 const char* original; |
| 129 const char* upgraded; | 194 const char* upgraded; |
| 130 } tests[] = { | 195 } tests[] = { |
| 131 { "http://example.test/image.png", "https://example.test/image.png" }, | 196 { "http://example.test/image.png", "https://example.test/image.png" }, |
| 132 { "http://example.test:80/image.png", "https://example.test:443/image.pn g" }, | 197 { "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 | 282 |
| 218 for (const auto& test : tests) { | 283 for (const auto& test : tests) { |
| 219 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsDoN otUpgrade); | 284 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsDoN otUpgrade); |
| 220 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); | 285 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); |
| 221 | 286 |
| 222 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsUpg rade); | 287 document->setInsecureRequestsPolicy(SecurityContext::InsecureRequestsUpg rade); |
| 223 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); | 288 expectHTTPSHeader(test.toRequest, test.frameType, test.shouldPrefer); |
| 224 } | 289 } |
| 225 } | 290 } |
| 226 | 291 |
| 227 class FrameFetchContextHintsTest : public ::testing::Test { | 292 class FrameFetchContextHintsTest : public FrameFetchContextTest { |
| 228 public: | 293 public: |
| 229 FrameFetchContextHintsTest() { } | 294 FrameFetchContextHintsTest() { } |
| 230 | 295 |
| 231 protected: | 296 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) | 297 void expectHeader(const char* input, const char* headerName, bool isPresent, const char* headerValue, float width = 0) |
| 249 { | 298 { |
| 250 KURL inputURL(ParsedURLString, input); | 299 KURL inputURL(ParsedURLString, input); |
| 251 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc hInitiatorInfo()); | 300 FetchRequest fetchRequest = FetchRequest(ResourceRequest(inputURL), Fetc hInitiatorInfo()); |
| 252 if (width > 0) { | 301 if (width > 0) { |
| 253 FetchRequest::ResourceWidth resourceWidth; | 302 FetchRequest::ResourceWidth resourceWidth; |
| 254 resourceWidth.width = width; | 303 resourceWidth.width = width; |
| 255 resourceWidth.isSet = true; | 304 resourceWidth.isSet = true; |
| 256 fetchRequest.setResourceWidth(resourceWidth); | 305 fetchRequest.setResourceWidth(resourceWidth); |
| 257 } | 306 } |
| 258 fetchContext->addClientHintsIfNecessary(fetchRequest); | 307 fetchContext->addClientHintsIfNecessary(fetchRequest); |
| 259 | 308 |
| 260 EXPECT_STREQ(isPresent ? headerValue : "", | 309 EXPECT_STREQ(isPresent ? headerValue : "", |
| 261 fetchRequest.resourceRequest().httpHeaderField(headerName).utf8().da ta()); | 310 fetchRequest.resourceRequest().httpHeaderField(headerName).utf8().da ta()); |
| 262 } | 311 } |
| 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 }; | 312 }; |
| 271 | 313 |
| 272 TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) | 314 TEST_F(FrameFetchContextHintsTest, MonitorDPRHints) |
| 273 { | 315 { |
| 274 expectHeader("http://www.example.com/1.gif", "DPR", false, ""); | 316 expectHeader("http://www.example.com/1.gif", "DPR", false, ""); |
| 275 ClientHintsPreferences preferences; | 317 ClientHintsPreferences preferences; |
| 276 preferences.setShouldSendDPR(true); | 318 preferences.setShouldSendDPR(true); |
| 277 document->clientHintsPreferences().updateFrom(preferences); | 319 document->clientHintsPreferences().updateFrom(preferences); |
| 278 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); | 320 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); |
| 279 dummyPageHolder->page().setDeviceScaleFactor(2.5); | 321 dummyPageHolder->page().setDeviceScaleFactor(2.5); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 316 ClientHintsPreferences preferences; | 358 ClientHintsPreferences preferences; |
| 317 preferences.setShouldSendDPR(true); | 359 preferences.setShouldSendDPR(true); |
| 318 preferences.setShouldSendResourceWidth(true); | 360 preferences.setShouldSendResourceWidth(true); |
| 319 preferences.setShouldSendViewportWidth(true); | 361 preferences.setShouldSendViewportWidth(true); |
| 320 document->clientHintsPreferences().updateFrom(preferences); | 362 document->clientHintsPreferences().updateFrom(preferences); |
| 321 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); | 363 expectHeader("http://www.example.com/1.gif", "DPR", true, "1"); |
| 322 expectHeader("http://www.example.com/1.gif", "Width", true, "400", 400); | 364 expectHeader("http://www.example.com/1.gif", "Width", true, "400", 400); |
| 323 expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); | 365 expectHeader("http://www.example.com/1.gif", "Viewport-Width", true, "500"); |
| 324 } | 366 } |
| 325 | 367 |
| 326 class StubFrameLoaderClientWithParent final : public EmptyFrameLoaderClient { | 368 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 { | 369 { |
| 392 // Default case | 370 // Default case |
| 393 ResourceRequest request("http://www.example.com"); | 371 ResourceRequest request("http://www.example.com"); |
| 394 EXPECT_EQ(UseProtocolCachePolicy, fetchContext->resourceRequestCachePolicy(r equest, Resource::MainResource)); | 372 EXPECT_EQ(UseProtocolCachePolicy, fetchContext->resourceRequestCachePolicy(r equest, Resource::MainResource)); |
| 395 | 373 |
| 396 // Post | 374 // Post |
| 397 ResourceRequest postRequest("http://www.example.com"); | 375 ResourceRequest postRequest("http://www.example.com"); |
| 398 postRequest.setHTTPMethod("POST"); | 376 postRequest.setHTTPMethod("POST"); |
| 399 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( postRequest, Resource::MainResource)); | 377 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( postRequest, Resource::MainResource)); |
| 400 | 378 |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 412 document->frame()->loader().setLoadType(FrameLoadTypeSame); | 390 document->frame()->loader().setLoadType(FrameLoadTypeSame); |
| 413 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( request, Resource::MainResource)); | 391 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( request, Resource::MainResource)); |
| 414 | 392 |
| 415 // Conditional request | 393 // Conditional request |
| 416 document->frame()->loader().setLoadType(FrameLoadTypeStandard); | 394 document->frame()->loader().setLoadType(FrameLoadTypeStandard); |
| 417 ResourceRequest conditional("http://www.example.com"); | 395 ResourceRequest conditional("http://www.example.com"); |
| 418 conditional.setHTTPHeaderField("If-Modified-Since", "foo"); | 396 conditional.setHTTPHeaderField("If-Modified-Since", "foo"); |
| 419 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( conditional, Resource::MainResource)); | 397 EXPECT_EQ(ReloadIgnoringCacheData, fetchContext->resourceRequestCachePolicy( conditional, Resource::MainResource)); |
| 420 | 398 |
| 421 // Set up a child frame | 399 // Set up a child frame |
| 422 OwnPtrWillBeRawPtr<StubFrameLoaderClientWithParent> client = StubFrameLoader ClientWithParent::create(document->frame()); | 400 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 | 401 |
| 433 // Child frame as part of back/forward | 402 // Child frame as part of back/forward |
| 434 document->frame()->loader().setLoadType(FrameLoadTypeBackForward); | 403 document->frame()->loader().setLoadType(FrameLoadTypeBackForward); |
| 435 EXPECT_EQ(ReturnCacheDataElseLoad, childFetchContext->resourceRequestCachePo licy(request, Resource::MainResource)); | 404 EXPECT_EQ(ReturnCacheDataElseLoad, childFetchContext->resourceRequestCachePo licy(request, Resource::MainResource)); |
| 436 | 405 |
| 437 // Child frame as part of reload | 406 // Child frame as part of reload |
| 438 document->frame()->loader().setLoadType(FrameLoadTypeReload); | 407 document->frame()->loader().setLoadType(FrameLoadTypeReload); |
| 439 EXPECT_EQ(ReloadIgnoringCacheData, childFetchContext->resourceRequestCachePo licy(request, Resource::MainResource)); | 408 EXPECT_EQ(ReloadIgnoringCacheData, childFetchContext->resourceRequestCachePo licy(request, Resource::MainResource)); |
| 440 | 409 |
| 441 // Child frame as part of end to end reload | 410 // Child frame as part of end to end reload |
| 442 document->frame()->loader().setLoadType(FrameLoadTypeReloadFromOrigin); | 411 document->frame()->loader().setLoadType(FrameLoadTypeReloadFromOrigin); |
| 443 EXPECT_EQ(ReloadBypassingCache, childFetchContext->resourceRequestCachePolic y(request, Resource::MainResource)); | 412 EXPECT_EQ(ReloadBypassingCache, childFetchContext->resourceRequestCachePolic y(request, Resource::MainResource)); |
| 413 } | |
| 444 | 414 |
| 445 childDocumentLoader->detachFromFrame(); | 415 TEST_F(FrameFetchContextTest, ModifyPriorityForExperiments) |
| 446 childDocumentLoader.clear(); | 416 { |
| 447 childFrame->detach(FrameDetachType::Remove); | 417 Settings* settings = document->frame()->settings(); |
| 418 FetchRequest request(ResourceRequest("http://www.example.com"), FetchInitiat orInfo()); | |
| 419 | |
| 420 FetchRequest preloadRequest(ResourceRequest("http://www.example.com"), Fetch InitiatorInfo()); | |
| 421 preloadRequest.setForPreload(true); | |
| 422 | |
| 423 FetchRequest deferredRequest(ResourceRequest("http://www.example.com"), Fetc hInitiatorInfo()); | |
| 424 deferredRequest.setDefer(FetchRequest::LazyLoad); | |
| 425 | |
| 426 // Start with all experiments disabled. | |
| 427 settings->setFEtchIncreaseAsyncScriptPriority(false); | |
| 428 settings->setFEtchIncreaseFontPriority(false); | |
| 429 settings->setFEtchDeferLateScripts(false); | |
| 430 settings->setFEtchIncreasePriorities(false); | |
| 431 settings->setLowPriorityIframes(false); | |
| 432 | |
| 433 // Base case, no priority change. Note that this triggers m_imageFetched, wh ich will matter for setFetchDeferLateScripts() case below. | |
| 434 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment s(ResourceLoadPriorityLow, Resource::Image, request)); | |
| 435 | |
| 436 // Font priority with and without fetchIncreaseFontPriority() | |
| 437 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Font, request)); | |
| 438 settings->setFEtchIncreaseFontPriority(true); | |
| 439 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen ts(ResourceLoadPriorityMedium, Resource::Font, request)); | |
| 440 | |
| 441 // Basic script cases | |
| 442 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Script, request)); | |
| 443 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); | |
| 444 | |
| 445 // Enable deferring late scripts. Preload priority should drop. | |
| 446 settings->setFEtchDeferLateScripts(true); | |
| 447 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment s(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); | |
| 448 | |
| 449 // Enable increasing priority of async scripts. | |
| 450 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment s(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); | |
| 451 settings->setFEtchIncreaseAsyncScriptPriority(true); | |
| 452 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); | |
| 453 | |
| 454 // Enable increased priorities for the remainder. | |
| 455 settings->setFEtchIncreasePriorities(true); | |
| 456 | |
| 457 // Re-test font priority with increased prioriries | |
| 458 settings->setFEtchIncreaseFontPriority(false); | |
| 459 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen ts(ResourceLoadPriorityMedium, Resource::Font, request)); | |
| 460 settings->setFEtchIncreaseFontPriority(true); | |
| 461 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper iments(ResourceLoadPriorityMedium, Resource::Font, request)); | |
| 462 | |
| 463 // Re-test basic script cases and deferring late script case with increased prioriries | |
| 464 settings->setFEtchIncreasePriorities(true); | |
| 465 settings->setFEtchDeferLateScripts(false); | |
| 466 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper iments(ResourceLoadPriorityMedium, Resource::Script, request)); | |
| 467 EXPECT_EQ(ResourceLoadPriorityHigh, fetchContext->modifyPriorityForExperimen ts(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); | |
| 468 | |
| 469 // Re-test deferring late scripts. | |
| 470 settings->setFEtchDeferLateScripts(true); | |
| 471 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Script, preloadRequest)); | |
| 472 | |
| 473 // Re-test increasing priority of async scripts. Should ignore general incra esed priorities. | |
| 474 settings->setFEtchIncreaseAsyncScriptPriority(false); | |
| 475 EXPECT_EQ(ResourceLoadPriorityLow, fetchContext->modifyPriorityForExperiment s(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); | |
| 476 settings->setFEtchIncreaseAsyncScriptPriority(true); | |
| 477 EXPECT_EQ(ResourceLoadPriorityMedium, fetchContext->modifyPriorityForExperim ents(ResourceLoadPriorityMedium, Resource::Script, deferredRequest)); | |
| 478 | |
| 479 // Set up a child frame, test main resource load with and without setLowPrio rityIframes() | |
| 480 FrameFetchContext* childFetchContext = createChildFrame(); | |
| 481 EXPECT_EQ(ResourceLoadPriorityVeryHigh, childFetchContext->modifyPriorityFor Experiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); | |
| 482 settings->setLowPriorityIframes(true); | |
| 483 EXPECT_EQ(ResourceLoadPriorityVeryLow, childFetchContext->modifyPriorityForE xperiments(ResourceLoadPriorityVeryHigh, Resource::MainResource, request)); | |
| 484 | |
| 485 // Ensure we don't go out of bounds | |
| 486 settings->setFEtchIncreasePriorities(true); | |
| 487 EXPECT_EQ(ResourceLoadPriorityVeryHigh, fetchContext->modifyPriorityForExper iments(ResourceLoadPriorityVeryHigh, Resource::Script, request)); | |
| 488 settings->setFEtchIncreasePriorities(false); | |
| 489 settings->setFEtchDeferLateScripts(true); | |
| 490 EXPECT_EQ(ResourceLoadPriorityVeryLow, fetchContext->modifyPriorityForExperi ments(ResourceLoadPriorityVeryLow, Resource::Script, preloadRequest)); | |
| 448 } | 491 } |
| 449 | 492 |
| 450 } // namespace | 493 } // namespace |
| OLD | NEW |