| 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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 117 return; | 117 return; |
| 118 } | 118 } |
| 119 if (state == ParseHeight && i > start) { | 119 if (state == ParseHeight && i > start) { |
| 120 int height = charactersToInt(value + start, i - start); | 120 int height = charactersToInt(value + start, i - start); |
| 121 iconSizes.append(IntSize(width, height)); | 121 iconSizes.append(IntSize(width, height)); |
| 122 } | 122 } |
| 123 } | 123 } |
| 124 | 124 |
| 125 static LinkEventSender& linkLoadEventSender() | 125 static LinkEventSender& linkLoadEventSender() |
| 126 { | 126 { |
| 127 DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<LinkEventSender>, sharedLoadEvent
Sender, (LinkEventSender::create(EventTypeNames::load))); | 127 DEFINE_STATIC_LOCAL(Persistent<LinkEventSender>, sharedLoadEventSender, (Lin
kEventSender::create(EventTypeNames::load))); |
| 128 return *sharedLoadEventSender; | 128 return *sharedLoadEventSender; |
| 129 } | 129 } |
| 130 | 130 |
| 131 static bool styleSheetTypeIsSupported(const String& type) | 131 static bool styleSheetTypeIsSupported(const String& type) |
| 132 { | 132 { |
| 133 String trimmedType = ContentType(type).type(); | 133 String trimmedType = ContentType(type).type(); |
| 134 return trimmedType.isEmpty() || MIMETypeRegistry::isSupportedStyleSheetMIMET
ype(trimmedType); | 134 return trimmedType.isEmpty() || MIMETypeRegistry::isSupportedStyleSheetMIMET
ype(trimmedType); |
| 135 } | 135 } |
| 136 | 136 |
| 137 void HTMLLinkElement::parseSizesAttribute(const AtomicString& value, Vector<IntS
ize>& iconSizes) | 137 void HTMLLinkElement::parseSizesAttribute(const AtomicString& value, Vector<IntS
ize>& iconSizes) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 148 inline HTMLLinkElement::HTMLLinkElement(Document& document, bool createdByParser
) | 148 inline HTMLLinkElement::HTMLLinkElement(Document& document, bool createdByParser
) |
| 149 : HTMLElement(linkTag, document) | 149 : HTMLElement(linkTag, document) |
| 150 , m_linkLoader(LinkLoader::create(this)) | 150 , m_linkLoader(LinkLoader::create(this)) |
| 151 , m_sizes(DOMTokenList::create(this)) | 151 , m_sizes(DOMTokenList::create(this)) |
| 152 , m_relList(RelList::create(this).leakRef()) | 152 , m_relList(RelList::create(this).leakRef()) |
| 153 , m_createdByParser(createdByParser) | 153 , m_createdByParser(createdByParser) |
| 154 , m_isInShadowTree(false) | 154 , m_isInShadowTree(false) |
| 155 { | 155 { |
| 156 } | 156 } |
| 157 | 157 |
| 158 PassRefPtrWillBeRawPtr<HTMLLinkElement> HTMLLinkElement::create(Document& docume
nt, bool createdByParser) | 158 RawPtr<HTMLLinkElement> HTMLLinkElement::create(Document& document, bool created
ByParser) |
| 159 { | 159 { |
| 160 return adoptRefWillBeNoop(new HTMLLinkElement(document, createdByParser)); | 160 return new HTMLLinkElement(document, createdByParser); |
| 161 } | 161 } |
| 162 | 162 |
| 163 HTMLLinkElement::~HTMLLinkElement() | 163 HTMLLinkElement::~HTMLLinkElement() |
| 164 { | 164 { |
| 165 #if !ENABLE(OILPAN) | 165 #if !ENABLE(OILPAN) |
| 166 m_sizes->setObserver(nullptr); | 166 m_sizes->setObserver(nullptr); |
| 167 m_relList->setObserver(nullptr); | 167 m_relList->setObserver(nullptr); |
| 168 m_link.clear(); | 168 m_link.clear(); |
| 169 if (inDocument()) | 169 if (inDocument()) |
| 170 document().styleEngine().removeStyleSheetCandidateNode(this); | 170 document().styleEngine().removeStyleSheetCandidateNode(this); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 230 | 230 |
| 231 if (!m_link) { | 231 if (!m_link) { |
| 232 if (m_relAttribute.isImport()) { | 232 if (m_relAttribute.isImport()) { |
| 233 m_link = LinkImport::create(this); | 233 m_link = LinkImport::create(this); |
| 234 } else if (m_relAttribute.isManifest()) { | 234 } else if (m_relAttribute.isManifest()) { |
| 235 m_link = LinkManifest::create(this); | 235 m_link = LinkManifest::create(this); |
| 236 } else if (RuntimeEnabledFeatures::linkServiceWorkerEnabled() && m_relAt
tribute.isServiceWorker()) { | 236 } else if (RuntimeEnabledFeatures::linkServiceWorkerEnabled() && m_relAt
tribute.isServiceWorker()) { |
| 237 if (document().frame()) | 237 if (document().frame()) |
| 238 m_link = document().frame()->loader().client()->createServiceWor
kerLinkResource(this); | 238 m_link = document().frame()->loader().client()->createServiceWor
kerLinkResource(this); |
| 239 } else { | 239 } else { |
| 240 OwnPtrWillBeRawPtr<LinkStyle> link = LinkStyle::create(this); | 240 RawPtr<LinkStyle> link = LinkStyle::create(this); |
| 241 if (fastHasAttribute(disabledAttr)) { | 241 if (fastHasAttribute(disabledAttr)) { |
| 242 UseCounter::count(document(), UseCounter::HTMLLinkElementDisable
d); | 242 UseCounter::count(document(), UseCounter::HTMLLinkElementDisable
d); |
| 243 link->setDisabledState(true); | 243 link->setDisabledState(true); |
| 244 } | 244 } |
| 245 m_link = link.release(); | 245 m_link = link.release(); |
| 246 } | 246 } |
| 247 } | 247 } |
| 248 | 248 |
| 249 return m_link.get(); | 249 return m_link.get(); |
| 250 } | 250 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 307 return; | 307 return; |
| 308 | 308 |
| 309 m_linkLoader->released(); | 309 m_linkLoader->released(); |
| 310 | 310 |
| 311 if (m_isInShadowTree) { | 311 if (m_isInShadowTree) { |
| 312 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); | 312 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); |
| 313 return; | 313 return; |
| 314 } | 314 } |
| 315 document().styleEngine().removeStyleSheetCandidateNode(this); | 315 document().styleEngine().removeStyleSheetCandidateNode(this); |
| 316 | 316 |
| 317 RefPtrWillBeRawPtr<StyleSheet> removedSheet = sheet(); | 317 RawPtr<StyleSheet> removedSheet = sheet(); |
| 318 | 318 |
| 319 if (m_link) | 319 if (m_link) |
| 320 m_link->ownerRemoved(); | 320 m_link->ownerRemoved(); |
| 321 | 321 |
| 322 document().removedStyleSheet(removedSheet.get()); | 322 document().removedStyleSheet(removedSheet.get()); |
| 323 } | 323 } |
| 324 | 324 |
| 325 void HTMLLinkElement::finishParsingChildren() | 325 void HTMLLinkElement::finishParsingChildren() |
| 326 { | 326 { |
| 327 m_createdByParser = false; | 327 m_createdByParser = false; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 { | 469 { |
| 470 visitor->trace(m_link); | 470 visitor->trace(m_link); |
| 471 visitor->trace(m_sizes); | 471 visitor->trace(m_sizes); |
| 472 visitor->trace(m_linkLoader); | 472 visitor->trace(m_linkLoader); |
| 473 visitor->trace(m_relList); | 473 visitor->trace(m_relList); |
| 474 HTMLElement::trace(visitor); | 474 HTMLElement::trace(visitor); |
| 475 LinkLoaderClient::trace(visitor); | 475 LinkLoaderClient::trace(visitor); |
| 476 DOMTokenListObserver::trace(visitor); | 476 DOMTokenListObserver::trace(visitor); |
| 477 } | 477 } |
| 478 | 478 |
| 479 PassOwnPtrWillBeRawPtr<LinkStyle> LinkStyle::create(HTMLLinkElement* owner) | 479 RawPtr<LinkStyle> LinkStyle::create(HTMLLinkElement* owner) |
| 480 { | 480 { |
| 481 return adoptPtrWillBeNoop(new LinkStyle(owner)); | 481 return new LinkStyle(owner); |
| 482 } | 482 } |
| 483 | 483 |
| 484 LinkStyle::LinkStyle(HTMLLinkElement* owner) | 484 LinkStyle::LinkStyle(HTMLLinkElement* owner) |
| 485 : LinkResource(owner) | 485 : LinkResource(owner) |
| 486 , m_disabledState(Unset) | 486 , m_disabledState(Unset) |
| 487 , m_pendingSheetType(None) | 487 , m_pendingSheetType(None) |
| 488 , m_loading(false) | 488 , m_loading(false) |
| 489 , m_firedLoad(false) | 489 , m_firedLoad(false) |
| 490 , m_loadedSheet(false) | 490 , m_loadedSheet(false) |
| 491 , m_fetchFollowingCORS(false) | 491 , m_fetchFollowingCORS(false) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 530 // While the stylesheet is asynchronously loading, the owner can be moved un
der | 530 // While the stylesheet is asynchronously loading, the owner can be moved un
der |
| 531 // shadow tree. In that case, cancel any processing on the loaded content. | 531 // shadow tree. In that case, cancel any processing on the loaded content. |
| 532 if (m_owner->isInShadowTree()) { | 532 if (m_owner->isInShadowTree()) { |
| 533 m_loading = false; | 533 m_loading = false; |
| 534 removePendingSheet(); | 534 removePendingSheet(); |
| 535 if (m_sheet) | 535 if (m_sheet) |
| 536 clearSheet(); | 536 clearSheet(); |
| 537 return; | 537 return; |
| 538 } | 538 } |
| 539 // Completing the sheet load may cause scripts to execute. | 539 // Completing the sheet load may cause scripts to execute. |
| 540 RefPtrWillBeRawPtr<Node> protector(m_owner.get()); | 540 RawPtr<Node> protector(m_owner.get()); |
| 541 | 541 |
| 542 CSSParserContext parserContext(m_owner->document(), 0, baseURL, charset); | 542 CSSParserContext parserContext(m_owner->document(), 0, baseURL, charset); |
| 543 | 543 |
| 544 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheetHistogram,
("Blink.RestoredCachedStyleSheet", 2)); | 544 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheetHistogram,
("Blink.RestoredCachedStyleSheet", 2)); |
| 545 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheet2Histogram
, ("Blink.RestoredCachedStyleSheet2", StyleSheetCacheStatusCount)); | 545 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheet2Histogram
, ("Blink.RestoredCachedStyleSheet2", StyleSheetCacheStatusCount)); |
| 546 | 546 |
| 547 if (RefPtrWillBeRawPtr<StyleSheetContents> restoredSheet = const_cast<CSSSty
leSheetResource*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { | 547 if (RawPtr<StyleSheetContents> restoredSheet = const_cast<CSSStyleSheetResou
rce*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { |
| 548 ASSERT(restoredSheet->isCacheable()); | 548 ASSERT(restoredSheet->isCacheable()); |
| 549 ASSERT(!restoredSheet->isLoading()); | 549 ASSERT(!restoredSheet->isLoading()); |
| 550 | 550 |
| 551 if (m_sheet) | 551 if (m_sheet) |
| 552 clearSheet(); | 552 clearSheet(); |
| 553 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); | 553 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); |
| 554 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 554 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
| 555 m_sheet->setTitle(m_owner->title()); | 555 m_sheet->setTitle(m_owner->title()); |
| 556 setCrossOriginStylesheetStatus(m_sheet.get()); | 556 setCrossOriginStylesheetStatus(m_sheet.get()); |
| 557 | 557 |
| 558 m_loading = false; | 558 m_loading = false; |
| 559 restoredSheet->checkLoaded(); | 559 restoredSheet->checkLoaded(); |
| 560 | 560 |
| 561 restoredCachedStyleSheetHistogram.count(true); | 561 restoredCachedStyleSheetHistogram.count(true); |
| 562 restoredCachedStyleSheet2Histogram.count(StyleSheetInMemoryCache); | 562 restoredCachedStyleSheet2Histogram.count(StyleSheetInMemoryCache); |
| 563 return; | 563 return; |
| 564 } | 564 } |
| 565 restoredCachedStyleSheetHistogram.count(false); | 565 restoredCachedStyleSheetHistogram.count(false); |
| 566 StyleSheetCacheStatus cacheStatus = cachedStyleSheet->response().wasCached()
? StyleSheetInDiskCache : StyleSheetNewEntry; | 566 StyleSheetCacheStatus cacheStatus = cachedStyleSheet->response().wasCached()
? StyleSheetInDiskCache : StyleSheetNewEntry; |
| 567 restoredCachedStyleSheet2Histogram.count(cacheStatus); | 567 restoredCachedStyleSheet2Histogram.count(cacheStatus); |
| 568 | 568 |
| 569 RefPtrWillBeRawPtr<StyleSheetContents> styleSheet = StyleSheetContents::crea
te(href, parserContext); | 569 RawPtr<StyleSheetContents> styleSheet = StyleSheetContents::create(href, par
serContext); |
| 570 | 570 |
| 571 if (m_sheet) | 571 if (m_sheet) |
| 572 clearSheet(); | 572 clearSheet(); |
| 573 | 573 |
| 574 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); | 574 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); |
| 575 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 575 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
| 576 m_sheet->setTitle(m_owner->title()); | 576 m_sheet->setTitle(m_owner->title()); |
| 577 setCrossOriginStylesheetStatus(m_sheet.get()); | 577 setCrossOriginStylesheetStatus(m_sheet.get()); |
| 578 | 578 |
| 579 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().getS
ecurityOrigin()); | 579 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().getS
ecurityOrigin()); |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 | 734 |
| 735 if (!m_owner->shouldLoadLink()) | 735 if (!m_owner->shouldLoadLink()) |
| 736 return; | 736 return; |
| 737 | 737 |
| 738 m_loading = true; | 738 m_loading = true; |
| 739 | 739 |
| 740 bool mediaQueryMatches = true; | 740 bool mediaQueryMatches = true; |
| 741 LocalFrame* frame = loadingFrame(); | 741 LocalFrame* frame = loadingFrame(); |
| 742 if (!m_owner->media().isEmpty() && frame && frame->document()) { | 742 if (!m_owner->media().isEmpty() && frame && frame->document()) { |
| 743 RefPtr<ComputedStyle> documentStyle = StyleResolver::styleForDocumen
t(*frame->document()); | 743 RefPtr<ComputedStyle> documentStyle = StyleResolver::styleForDocumen
t(*frame->document()); |
| 744 RefPtrWillBeRawPtr<MediaQuerySet> media = MediaQuerySet::create(m_ow
ner->media()); | 744 RawPtr<MediaQuerySet> media = MediaQuerySet::create(m_owner->media()
); |
| 745 MediaQueryEvaluator evaluator(frame); | 745 MediaQueryEvaluator evaluator(frame); |
| 746 mediaQueryMatches = evaluator.eval(media.get()); | 746 mediaQueryMatches = evaluator.eval(media.get()); |
| 747 } | 747 } |
| 748 | 748 |
| 749 // Don't hold up layout tree construction and script execution on styles
heets | 749 // Don't hold up layout tree construction and script execution on styles
heets |
| 750 // that are not needed for the layout at the moment. | 750 // that are not needed for the layout at the moment. |
| 751 bool blocking = mediaQueryMatches && !m_owner->isAlternate() && m_owner-
>isCreatedByParser(); | 751 bool blocking = mediaQueryMatches && !m_owner->isAlternate() && m_owner-
>isCreatedByParser(); |
| 752 addPendingSheet(blocking ? Blocking : NonBlocking); | 752 addPendingSheet(blocking ? Blocking : NonBlocking); |
| 753 | 753 |
| 754 // Load stylesheets that are not needed for the layout immediately with
low priority. | 754 // Load stylesheets that are not needed for the layout immediately with
low priority. |
| 755 // When the link element is created by scripts, load the stylesheets asy
nchronously but in high priority. | 755 // When the link element is created by scripts, load the stylesheets asy
nchronously but in high priority. |
| 756 bool lowPriority = !mediaQueryMatches || m_owner->isAlternate(); | 756 bool lowPriority = !mediaQueryMatches || m_owner->isAlternate(); |
| 757 FetchRequest request = builder.build(lowPriority); | 757 FetchRequest request = builder.build(lowPriority); |
| 758 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_owne
r->fastGetAttribute(HTMLNames::crossoriginAttr)); | 758 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_owne
r->fastGetAttribute(HTMLNames::crossoriginAttr)); |
| 759 if (crossOrigin != CrossOriginAttributeNotSet) { | 759 if (crossOrigin != CrossOriginAttributeNotSet) { |
| 760 request.setCrossOriginAccessControl(document().getSecurityOrigin(),
crossOrigin); | 760 request.setCrossOriginAccessControl(document().getSecurityOrigin(),
crossOrigin); |
| 761 setFetchFollowingCORS(); | 761 setFetchFollowingCORS(); |
| 762 } | 762 } |
| 763 setResource(CSSStyleSheetResource::fetch(request, document().fetcher()))
; | 763 setResource(CSSStyleSheetResource::fetch(request, document().fetcher()))
; |
| 764 | 764 |
| 765 if (m_loading && !resource()) { | 765 if (m_loading && !resource()) { |
| 766 // The request may have been denied if (for example) the stylesheet
is local and the document is remote, or if there was a Content Security Policy F
ailure. | 766 // The request may have been denied if (for example) the stylesheet
is local and the document is remote, or if there was a Content Security Policy F
ailure. |
| 767 // setCSSStyleSheet() can be called synchronuosly in setResource() a
nd thus resource() is null and |m_loading| is false in such cases even if the re
quest succeeds. | 767 // setCSSStyleSheet() can be called synchronuosly in setResource() a
nd thus resource() is null and |m_loading| is false in such cases even if the re
quest succeeds. |
| 768 m_loading = false; | 768 m_loading = false; |
| 769 removePendingSheet(); | 769 removePendingSheet(); |
| 770 notifyLoadedSheetAndAllCriticalSubresources(Node::ErrorOccurredLoadi
ngSubresource); | 770 notifyLoadedSheetAndAllCriticalSubresources(Node::ErrorOccurredLoadi
ngSubresource); |
| 771 } | 771 } |
| 772 } else if (m_sheet) { | 772 } else if (m_sheet) { |
| 773 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed | 773 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed |
| 774 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get(); | 774 RawPtr<StyleSheet> removedSheet = m_sheet.get(); |
| 775 clearSheet(); | 775 clearSheet(); |
| 776 document().removedStyleSheet(removedSheet.get()); | 776 document().removedStyleSheet(removedSheet.get()); |
| 777 } | 777 } |
| 778 } | 778 } |
| 779 | 779 |
| 780 void LinkStyle::setSheetTitle(const String& title) | 780 void LinkStyle::setSheetTitle(const String& title) |
| 781 { | 781 { |
| 782 if (m_sheet) | 782 if (m_sheet) |
| 783 m_sheet->setTitle(title); | 783 m_sheet->setTitle(title); |
| 784 } | 784 } |
| 785 | 785 |
| 786 void LinkStyle::ownerRemoved() | 786 void LinkStyle::ownerRemoved() |
| 787 { | 787 { |
| 788 if (m_sheet) | 788 if (m_sheet) |
| 789 clearSheet(); | 789 clearSheet(); |
| 790 | 790 |
| 791 if (styleSheetIsLoading()) | 791 if (styleSheetIsLoading()) |
| 792 removePendingSheet(); | 792 removePendingSheet(); |
| 793 } | 793 } |
| 794 | 794 |
| 795 DEFINE_TRACE(LinkStyle) | 795 DEFINE_TRACE(LinkStyle) |
| 796 { | 796 { |
| 797 visitor->trace(m_sheet); | 797 visitor->trace(m_sheet); |
| 798 LinkResource::trace(visitor); | 798 LinkResource::trace(visitor); |
| 799 ResourceOwner<StyleSheetResource>::trace(visitor); | 799 ResourceOwner<StyleSheetResource>::trace(visitor); |
| 800 } | 800 } |
| 801 | 801 |
| 802 } // namespace blink | 802 } // namespace blink |
| OLD | NEW |