OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. | 5 * Copyright (C) 2003, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv
ed. |
6 * Copyright (C) 2009 Rob Buis (rwlbuis@gmail.com) | 6 * Copyright (C) 2009 Rob Buis (rwlbuis@gmail.com) |
7 * Copyright (C) 2011 Google Inc. All rights reserved. | 7 * Copyright (C) 2011 Google Inc. All rights reserved. |
8 * | 8 * |
9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
482 return adoptPtrWillBeNoop(new LinkStyle(owner)); | 482 return adoptPtrWillBeNoop(new LinkStyle(owner)); |
483 } | 483 } |
484 | 484 |
485 LinkStyle::LinkStyle(HTMLLinkElement* owner) | 485 LinkStyle::LinkStyle(HTMLLinkElement* owner) |
486 : LinkResource(owner) | 486 : LinkResource(owner) |
487 , m_disabledState(Unset) | 487 , m_disabledState(Unset) |
488 , m_pendingSheetType(None) | 488 , m_pendingSheetType(None) |
489 , m_loading(false) | 489 , m_loading(false) |
490 , m_firedLoad(false) | 490 , m_firedLoad(false) |
491 , m_loadedSheet(false) | 491 , m_loadedSheet(false) |
| 492 , m_fetchFollowingCORS(false) |
492 { | 493 { |
493 } | 494 } |
494 | 495 |
495 LinkStyle::~LinkStyle() | 496 LinkStyle::~LinkStyle() |
496 { | 497 { |
497 #if !ENABLE(OILPAN) | 498 #if !ENABLE(OILPAN) |
498 if (m_sheet) | 499 if (m_sheet) |
499 m_sheet->clearOwnerNode(); | 500 m_sheet->clearOwnerNode(); |
500 #endif | 501 #endif |
501 } | 502 } |
(...skipping 24 matching lines...) Expand all Loading... |
526 | 527 |
527 if (RefPtrWillBeRawPtr<StyleSheetContents> restoredSheet = const_cast<CSSSty
leSheetResource*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { | 528 if (RefPtrWillBeRawPtr<StyleSheetContents> restoredSheet = const_cast<CSSSty
leSheetResource*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { |
528 ASSERT(restoredSheet->isCacheable()); | 529 ASSERT(restoredSheet->isCacheable()); |
529 ASSERT(!restoredSheet->isLoading()); | 530 ASSERT(!restoredSheet->isLoading()); |
530 | 531 |
531 if (m_sheet) | 532 if (m_sheet) |
532 clearSheet(); | 533 clearSheet(); |
533 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); | 534 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); |
534 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 535 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
535 m_sheet->setTitle(m_owner->title()); | 536 m_sheet->setTitle(m_owner->title()); |
| 537 setCrossOriginStylesheetStatus(m_sheet.get()); |
536 | 538 |
537 m_loading = false; | 539 m_loading = false; |
538 restoredSheet->checkLoaded(); | 540 restoredSheet->checkLoaded(); |
539 return; | 541 return; |
540 } | 542 } |
541 | 543 |
542 RefPtrWillBeRawPtr<StyleSheetContents> styleSheet = StyleSheetContents::crea
te(href, parserContext); | 544 RefPtrWillBeRawPtr<StyleSheetContents> styleSheet = StyleSheetContents::crea
te(href, parserContext); |
543 | 545 |
544 if (m_sheet) | 546 if (m_sheet) |
545 clearSheet(); | 547 clearSheet(); |
546 | 548 |
547 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); | 549 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); |
548 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 550 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
549 m_sheet->setTitle(m_owner->title()); | 551 m_sheet->setTitle(m_owner->title()); |
| 552 setCrossOriginStylesheetStatus(m_sheet.get()); |
550 | 553 |
551 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().secu
rityOrigin()); | 554 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().secu
rityOrigin()); |
552 | 555 |
553 m_loading = false; | 556 m_loading = false; |
554 styleSheet->notifyLoadedSheet(cachedStyleSheet); | 557 styleSheet->notifyLoadedSheet(cachedStyleSheet); |
555 styleSheet->checkLoaded(); | 558 styleSheet->checkLoaded(); |
556 | 559 |
557 if (styleSheet->isCacheable()) | 560 if (styleSheet->isCacheable()) |
558 const_cast<CSSStyleSheetResource*>(cachedStyleSheet)->saveParsedStyleShe
et(styleSheet); | 561 const_cast<CSSStyleSheetResource*>(cachedStyleSheet)->saveParsedStyleShe
et(styleSheet); |
559 } | 562 } |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
666 if (!m_sheet && m_disabledState == EnabledViaScript) { | 669 if (!m_sheet && m_disabledState == EnabledViaScript) { |
667 if (m_owner->shouldProcessStyle()) | 670 if (m_owner->shouldProcessStyle()) |
668 process(); | 671 process(); |
669 } else { | 672 } else { |
670 // FIXME: We don't have enough knowledge here to know if we should c
all addedStyleSheet() or removedStyleSheet(). | 673 // FIXME: We don't have enough knowledge here to know if we should c
all addedStyleSheet() or removedStyleSheet(). |
671 m_owner->document().styleResolverChanged(); | 674 m_owner->document().styleResolverChanged(); |
672 } | 675 } |
673 } | 676 } |
674 } | 677 } |
675 | 678 |
| 679 void LinkStyle::setCrossOriginStylesheetStatus(CSSStyleSheet* sheet) |
| 680 { |
| 681 if (m_fetchFollowingCORS && resource() && !resource()->errorOccurred()) { |
| 682 // Record the security origin the CORS access check succeeded at, if cro
ss origin. |
| 683 // Only origins that are script accessible to it may access the styleshe
et's rules. |
| 684 sheet->setAllowRuleAccessFromOrigin(m_owner->document().securityOrigin()
); |
| 685 } |
| 686 m_fetchFollowingCORS = false; |
| 687 } |
| 688 |
676 void LinkStyle::process() | 689 void LinkStyle::process() |
677 { | 690 { |
678 ASSERT(m_owner->shouldProcessStyle()); | 691 ASSERT(m_owner->shouldProcessStyle()); |
679 String type = m_owner->typeValue().lower(); | 692 String type = m_owner->typeValue().lower(); |
680 LinkRequestBuilder builder(m_owner); | 693 LinkRequestBuilder builder(m_owner); |
681 | 694 |
682 if (m_owner->relAttribute().iconType() != InvalidIcon && builder.url().isVal
id() && !builder.url().isEmpty()) { | 695 if (m_owner->relAttribute().iconType() != InvalidIcon && builder.url().isVal
id() && !builder.url().isEmpty()) { |
683 if (!m_owner->shouldLoadLink()) | 696 if (!m_owner->shouldLoadLink()) |
684 return; | 697 return; |
685 if (!document().securityOrigin()->canDisplay(builder.url())) | 698 if (!document().securityOrigin()->canDisplay(builder.url())) |
(...skipping 30 matching lines...) Expand all Loading... |
716 } | 729 } |
717 | 730 |
718 // Don't hold up render tree construction and script execution on styles
heets | 731 // Don't hold up render tree construction and script execution on styles
heets |
719 // that are not needed for the rendering at the moment. | 732 // that are not needed for the rendering at the moment. |
720 bool blocking = mediaQueryMatches && !m_owner->isAlternate(); | 733 bool blocking = mediaQueryMatches && !m_owner->isAlternate(); |
721 addPendingSheet(blocking ? Blocking : NonBlocking); | 734 addPendingSheet(blocking ? Blocking : NonBlocking); |
722 | 735 |
723 // Load stylesheets that are not needed for the rendering immediately wi
th low priority. | 736 // Load stylesheets that are not needed for the rendering immediately wi
th low priority. |
724 FetchRequest request = builder.build(blocking); | 737 FetchRequest request = builder.build(blocking); |
725 AtomicString crossOriginMode = m_owner->fastGetAttribute(HTMLNames::cros
soriginAttr); | 738 AtomicString crossOriginMode = m_owner->fastGetAttribute(HTMLNames::cros
soriginAttr); |
726 if (!crossOriginMode.isNull()) | 739 if (!crossOriginMode.isNull()) { |
727 request.setCrossOriginAccessControl(document().securityOrigin(), cro
ssOriginMode); | 740 request.setCrossOriginAccessControl(document().securityOrigin(), cro
ssOriginMode); |
| 741 setFetchFollowingCORS(); |
| 742 } |
728 setResource(document().fetcher()->fetchCSSStyleSheet(request)); | 743 setResource(document().fetcher()->fetchCSSStyleSheet(request)); |
729 | 744 |
730 if (!resource()) { | 745 if (!resource()) { |
731 // The request may have been denied if (for example) the stylesheet
is local and the document is remote. | 746 // The request may have been denied if (for example) the stylesheet
is local and the document is remote. |
732 m_loading = false; | 747 m_loading = false; |
733 removePendingSheet(); | 748 removePendingSheet(); |
734 } | 749 } |
735 } else if (m_sheet) { | 750 } else if (m_sheet) { |
736 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed | 751 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed |
737 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get(); | 752 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get(); |
(...skipping 17 matching lines...) Expand all Loading... |
755 removePendingSheet(); | 770 removePendingSheet(); |
756 } | 771 } |
757 | 772 |
758 DEFINE_TRACE(LinkStyle) | 773 DEFINE_TRACE(LinkStyle) |
759 { | 774 { |
760 visitor->trace(m_sheet); | 775 visitor->trace(m_sheet); |
761 LinkResource::trace(visitor); | 776 LinkResource::trace(visitor); |
762 } | 777 } |
763 | 778 |
764 } // namespace blink | 779 } // namespace blink |
OLD | NEW |