OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ | 3 * Copyright (C) 2009 Torch Mobile, Inc. http://www.torchmobile.com/ |
4 * Copyright (C) 2010 Google Inc. All Rights Reserved. | 4 * Copyright (C) 2010 Google Inc. All Rights Reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 FetchRequest::DeferOption m_defer; | 367 FetchRequest::DeferOption m_defer; |
368 StoredCredentials m_allowCredentials; | 368 StoredCredentials m_allowCredentials; |
369 RefPtr<MediaValues> m_mediaValues; | 369 RefPtr<MediaValues> m_mediaValues; |
370 }; | 370 }; |
371 | 371 |
372 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med
iaValues> mediaValues) | 372 TokenPreloadScanner::TokenPreloadScanner(const KURL& documentURL, PassRefPtr<Med
iaValues> mediaValues) |
373 : m_documentURL(documentURL) | 373 : m_documentURL(documentURL) |
374 , m_inStyle(false) | 374 , m_inStyle(false) |
375 , m_inPicture(false) | 375 , m_inPicture(false) |
376 , m_isAppCacheEnabled(false) | 376 , m_isAppCacheEnabled(false) |
| 377 , m_isCSPEnabled(false) |
377 , m_templateCount(0) | 378 , m_templateCount(0) |
378 , m_mediaValues(mediaValues) | 379 , m_mediaValues(mediaValues) |
379 { | 380 { |
380 } | 381 } |
381 | 382 |
382 TokenPreloadScanner::~TokenPreloadScanner() | 383 TokenPreloadScanner::~TokenPreloadScanner() |
383 { | 384 { |
384 } | 385 } |
385 | 386 |
386 TokenPreloadScannerCheckpoint TokenPreloadScanner::createCheckpoint() | 387 TokenPreloadScannerCheckpoint TokenPreloadScanner::createCheckpoint() |
387 { | 388 { |
388 TokenPreloadScannerCheckpoint checkpoint = m_checkpoints.size(); | 389 TokenPreloadScannerCheckpoint checkpoint = m_checkpoints.size(); |
389 m_checkpoints.append(Checkpoint(m_predictedBaseElementURL, m_inStyle, m_isAp
pCacheEnabled, m_templateCount)); | 390 m_checkpoints.append(Checkpoint(m_predictedBaseElementURL, m_inStyle, m_isAp
pCacheEnabled, m_isCSPEnabled, m_templateCount)); |
390 return checkpoint; | 391 return checkpoint; |
391 } | 392 } |
392 | 393 |
393 void TokenPreloadScanner::rewindTo(TokenPreloadScannerCheckpoint checkpointIndex
) | 394 void TokenPreloadScanner::rewindTo(TokenPreloadScannerCheckpoint checkpointIndex
) |
394 { | 395 { |
395 ASSERT(checkpointIndex < m_checkpoints.size()); // If this ASSERT fires, che
ckpointIndex is invalid. | 396 ASSERT(checkpointIndex < m_checkpoints.size()); // If this ASSERT fires, che
ckpointIndex is invalid. |
396 const Checkpoint& checkpoint = m_checkpoints[checkpointIndex]; | 397 const Checkpoint& checkpoint = m_checkpoints[checkpointIndex]; |
397 m_predictedBaseElementURL = checkpoint.predictedBaseElementURL; | 398 m_predictedBaseElementURL = checkpoint.predictedBaseElementURL; |
398 m_inStyle = checkpoint.inStyle; | 399 m_inStyle = checkpoint.inStyle; |
399 m_isAppCacheEnabled = checkpoint.isAppCacheEnabled; | 400 m_isAppCacheEnabled = checkpoint.isAppCacheEnabled; |
| 401 m_isCSPEnabled = checkpoint.isCSPEnabled; |
400 m_templateCount = checkpoint.templateCount; | 402 m_templateCount = checkpoint.templateCount; |
401 m_cssScanner.reset(); | 403 m_cssScanner.reset(); |
402 m_checkpoints.clear(); | 404 m_checkpoints.clear(); |
403 } | 405 } |
404 | 406 |
405 void TokenPreloadScanner::scan(const HTMLToken& token, const SegmentedString& so
urce, PreloadRequestStream& requests) | 407 void TokenPreloadScanner::scan(const HTMLToken& token, const SegmentedString& so
urce, PreloadRequestStream& requests) |
406 { | 408 { |
407 scanCommon(token, source, requests); | 409 scanCommon(token, source, requests); |
408 } | 410 } |
409 | 411 |
410 void TokenPreloadScanner::scan(const CompactHTMLToken& token, const SegmentedStr
ing& source, PreloadRequestStream& requests) | 412 void TokenPreloadScanner::scan(const CompactHTMLToken& token, const SegmentedStr
ing& source, PreloadRequestStream& requests) |
411 { | 413 { |
412 scanCommon(token, source, requests); | 414 scanCommon(token, source, requests); |
413 } | 415 } |
414 | 416 |
415 template<typename Token> | 417 template<typename Token> |
416 void TokenPreloadScanner::scanCommon(const Token& token, const SegmentedString&
source, PreloadRequestStream& requests) | 418 void TokenPreloadScanner::scanCommon(const Token& token, const SegmentedString&
source, PreloadRequestStream& requests) |
417 { | 419 { |
418 // Disable preload for documents with AppCache. | 420 // Disable preload for documents with AppCache. |
419 if (m_isAppCacheEnabled) | 421 if (m_isAppCacheEnabled) |
420 return; | 422 return; |
421 | 423 |
| 424 // http://crbug.com/434230 Disable preload for documents with CSP <meta> tag
s |
| 425 if (m_isCSPEnabled) |
| 426 return; |
| 427 |
422 switch (token.type()) { | 428 switch (token.type()) { |
423 case HTMLToken::Character: { | 429 case HTMLToken::Character: { |
424 if (!m_inStyle) | 430 if (!m_inStyle) |
425 return; | 431 return; |
426 m_cssScanner.scan(token.data(), source, requests); | 432 m_cssScanner.scan(token.data(), source, requests); |
427 return; | 433 return; |
428 } | 434 } |
429 case HTMLToken::EndTag: { | 435 case HTMLToken::EndTag: { |
430 const StringImpl* tagImpl = tagImplFor(token.data()); | 436 const StringImpl* tagImpl = tagImplFor(token.data()); |
431 if (match(tagImpl, templateTag)) { | 437 if (match(tagImpl, templateTag)) { |
(...skipping 27 matching lines...) Expand all Loading... |
459 // The first <base> element is the one that wins. | 465 // The first <base> element is the one that wins. |
460 if (!m_predictedBaseElementURL.isEmpty()) | 466 if (!m_predictedBaseElementURL.isEmpty()) |
461 return; | 467 return; |
462 updatePredictedBaseURL(token); | 468 updatePredictedBaseURL(token); |
463 return; | 469 return; |
464 } | 470 } |
465 if (match(tagImpl, htmlTag) && token.getAttributeItem(manifestAttr)) { | 471 if (match(tagImpl, htmlTag) && token.getAttributeItem(manifestAttr)) { |
466 m_isAppCacheEnabled = true; | 472 m_isAppCacheEnabled = true; |
467 return; | 473 return; |
468 } | 474 } |
| 475 if (match(tagImpl, metaTag)) { |
| 476 const typename Token::Attribute* equivAttribute = token.getAttribute
Item(http_equivAttr); |
| 477 if (equivAttribute && equalIgnoringCase(String(equivAttribute->value
), "content-security-policy")) { |
| 478 m_isCSPEnabled = true; |
| 479 return; |
| 480 } |
| 481 } |
469 | 482 |
470 if (RuntimeEnabledFeatures::pictureEnabled() && (match(tagImpl, pictureT
ag))) { | 483 if (RuntimeEnabledFeatures::pictureEnabled() && (match(tagImpl, pictureT
ag))) { |
471 m_inPicture = true; | 484 m_inPicture = true; |
472 m_pictureSourceURL = String(); | 485 m_pictureSourceURL = String(); |
473 return; | 486 return; |
474 } | 487 } |
475 | 488 |
476 StartTagScanner scanner(tagImpl, m_mediaValues); | 489 StartTagScanner scanner(tagImpl, m_mediaValues); |
477 scanner.processAttributes(token.attributes()); | 490 scanner.processAttributes(token.attributes()); |
478 if (m_inPicture) | 491 if (m_inPicture) |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
527 if (m_token.type() == HTMLToken::StartTag) | 540 if (m_token.type() == HTMLToken::StartTag) |
528 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name
(), Likely8Bit)); | 541 m_tokenizer->updateStateFor(attemptStaticStringCreation(m_token.name
(), Likely8Bit)); |
529 m_scanner.scan(m_token, m_source, requests); | 542 m_scanner.scan(m_token, m_source, requests); |
530 m_token.clear(); | 543 m_token.clear(); |
531 } | 544 } |
532 | 545 |
533 preloader->takeAndPreload(requests); | 546 preloader->takeAndPreload(requests); |
534 } | 547 } |
535 | 548 |
536 } | 549 } |
OLD | NEW |