Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: Source/core/html/HTMLLinkElement.cpp

Issue 1011103002: Allow cross-origin cssRules access to CORS-fetched stylesheet. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: improve test coverage a bit Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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(baseURL, 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(baseURL, 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
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(const KURL& baseURL, CSSStyleShee t* 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 if (!m_owner->document().securityOrigin()->canRequest(baseURL))
Mike West 2015/03/17 20:05:46 I'm not sure it's useful to check canRequest here,
sof 2015/03/17 21:52:15 Yes, it serves no purpose to do this check here (n
685 sheet->setAllowRuleAccessFromOrigin(m_owner->document().securityOrig in());
686 }
687 m_fetchFollowingCORS = false;
688 }
689
676 void LinkStyle::process() 690 void LinkStyle::process()
677 { 691 {
678 ASSERT(m_owner->shouldProcessStyle()); 692 ASSERT(m_owner->shouldProcessStyle());
679 String type = m_owner->typeValue().lower(); 693 String type = m_owner->typeValue().lower();
680 LinkRequestBuilder builder(m_owner); 694 LinkRequestBuilder builder(m_owner);
681 695
682 if (m_owner->relAttribute().iconType() != InvalidIcon && builder.url().isVal id() && !builder.url().isEmpty()) { 696 if (m_owner->relAttribute().iconType() != InvalidIcon && builder.url().isVal id() && !builder.url().isEmpty()) {
683 if (!m_owner->shouldLoadLink()) 697 if (!m_owner->shouldLoadLink())
684 return; 698 return;
685 if (!document().securityOrigin()->canDisplay(builder.url())) 699 if (!document().securityOrigin()->canDisplay(builder.url()))
(...skipping 30 matching lines...) Expand all
716 } 730 }
717 731
718 // Don't hold up render tree construction and script execution on styles heets 732 // Don't hold up render tree construction and script execution on styles heets
719 // that are not needed for the rendering at the moment. 733 // that are not needed for the rendering at the moment.
720 bool blocking = mediaQueryMatches && !m_owner->isAlternate(); 734 bool blocking = mediaQueryMatches && !m_owner->isAlternate();
721 addPendingSheet(blocking ? Blocking : NonBlocking); 735 addPendingSheet(blocking ? Blocking : NonBlocking);
722 736
723 // Load stylesheets that are not needed for the rendering immediately wi th low priority. 737 // Load stylesheets that are not needed for the rendering immediately wi th low priority.
724 FetchRequest request = builder.build(blocking); 738 FetchRequest request = builder.build(blocking);
725 AtomicString crossOriginMode = m_owner->fastGetAttribute(HTMLNames::cros soriginAttr); 739 AtomicString crossOriginMode = m_owner->fastGetAttribute(HTMLNames::cros soriginAttr);
726 if (!crossOriginMode.isNull()) 740 if (!crossOriginMode.isNull()) {
727 request.setCrossOriginAccessControl(document().securityOrigin(), cro ssOriginMode); 741 request.setCrossOriginAccessControl(document().securityOrigin(), cro ssOriginMode);
742 setFetchFollowingCORS();
743 }
728 setResource(document().fetcher()->fetchCSSStyleSheet(request)); 744 setResource(document().fetcher()->fetchCSSStyleSheet(request));
729 745
730 if (!resource()) { 746 if (!resource()) {
731 // The request may have been denied if (for example) the stylesheet is local and the document is remote. 747 // The request may have been denied if (for example) the stylesheet is local and the document is remote.
732 m_loading = false; 748 m_loading = false;
733 removePendingSheet(); 749 removePendingSheet();
734 } 750 }
735 } else if (m_sheet) { 751 } else if (m_sheet) {
736 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang ed 752 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang ed
737 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get(); 753 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get();
(...skipping 17 matching lines...) Expand all
755 removePendingSheet(); 771 removePendingSheet();
756 } 772 }
757 773
758 DEFINE_TRACE(LinkStyle) 774 DEFINE_TRACE(LinkStyle)
759 { 775 {
760 visitor->trace(m_sheet); 776 visitor->trace(m_sheet);
761 LinkResource::trace(visitor); 777 LinkResource::trace(visitor);
762 } 778 }
763 779
764 } // namespace blink 780 } // namespace blink
OLDNEW
« Source/core/html/HTMLLinkElement.h ('K') | « Source/core/html/HTMLLinkElement.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698