| 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(DOMSettableTokenList::create(this)) | 151 , m_sizes(DOMSettableTokenList::create(this)) |
| 152 , m_relList(RelList::create(this)) | 152 , m_relList(RelList::create(this)) |
| 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_link.clear(); | 167 m_link.clear(); |
| 168 if (inDocument()) | 168 if (inDocument()) |
| 169 document().styleEngine().removeStyleSheetCandidateNode(this); | 169 document().styleEngine().removeStyleSheetCandidateNode(this); |
| 170 linkLoadEventSender().cancelEvent(this); | 170 linkLoadEventSender().cancelEvent(this); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 223 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); | 223 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); |
| 224 return nullptr; | 224 return nullptr; |
| 225 } | 225 } |
| 226 | 226 |
| 227 if (!m_link) { | 227 if (!m_link) { |
| 228 if (m_relAttribute.isImport()) { | 228 if (m_relAttribute.isImport()) { |
| 229 m_link = LinkImport::create(this); | 229 m_link = LinkImport::create(this); |
| 230 } else if (m_relAttribute.isManifest()) { | 230 } else if (m_relAttribute.isManifest()) { |
| 231 m_link = LinkManifest::create(this); | 231 m_link = LinkManifest::create(this); |
| 232 } else { | 232 } else { |
| 233 OwnPtrWillBeRawPtr<LinkStyle> link = LinkStyle::create(this); | 233 RawPtr<LinkStyle> link = LinkStyle::create(this); |
| 234 if (fastHasAttribute(disabledAttr)) { | 234 if (fastHasAttribute(disabledAttr)) { |
| 235 UseCounter::count(document(), UseCounter::HTMLLinkElementDisable
d); | 235 UseCounter::count(document(), UseCounter::HTMLLinkElementDisable
d); |
| 236 link->setDisabledState(true); | 236 link->setDisabledState(true); |
| 237 } | 237 } |
| 238 m_link = link.release(); | 238 m_link = link.release(); |
| 239 } | 239 } |
| 240 } | 240 } |
| 241 | 241 |
| 242 return m_link.get(); | 242 return m_link.get(); |
| 243 } | 243 } |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 300 return; | 300 return; |
| 301 | 301 |
| 302 m_linkLoader->released(); | 302 m_linkLoader->released(); |
| 303 | 303 |
| 304 if (m_isInShadowTree) { | 304 if (m_isInShadowTree) { |
| 305 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); | 305 ASSERT(!linkStyle() || !linkStyle()->hasSheet()); |
| 306 return; | 306 return; |
| 307 } | 307 } |
| 308 document().styleEngine().removeStyleSheetCandidateNode(this); | 308 document().styleEngine().removeStyleSheetCandidateNode(this); |
| 309 | 309 |
| 310 RefPtrWillBeRawPtr<StyleSheet> removedSheet = sheet(); | 310 RawPtr<StyleSheet> removedSheet = sheet(); |
| 311 | 311 |
| 312 if (m_link) | 312 if (m_link) |
| 313 m_link->ownerRemoved(); | 313 m_link->ownerRemoved(); |
| 314 | 314 |
| 315 document().removedStyleSheet(removedSheet.get()); | 315 document().removedStyleSheet(removedSheet.get()); |
| 316 } | 316 } |
| 317 | 317 |
| 318 void HTMLLinkElement::finishParsingChildren() | 318 void HTMLLinkElement::finishParsingChildren() |
| 319 { | 319 { |
| 320 m_createdByParser = false; | 320 m_createdByParser = false; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 { | 462 { |
| 463 visitor->trace(m_link); | 463 visitor->trace(m_link); |
| 464 visitor->trace(m_sizes); | 464 visitor->trace(m_sizes); |
| 465 visitor->trace(m_linkLoader); | 465 visitor->trace(m_linkLoader); |
| 466 visitor->trace(m_relList); | 466 visitor->trace(m_relList); |
| 467 HTMLElement::trace(visitor); | 467 HTMLElement::trace(visitor); |
| 468 LinkLoaderClient::trace(visitor); | 468 LinkLoaderClient::trace(visitor); |
| 469 DOMSettableTokenListObserver::trace(visitor); | 469 DOMSettableTokenListObserver::trace(visitor); |
| 470 } | 470 } |
| 471 | 471 |
| 472 PassOwnPtrWillBeRawPtr<LinkStyle> LinkStyle::create(HTMLLinkElement* owner) | 472 RawPtr<LinkStyle> LinkStyle::create(HTMLLinkElement* owner) |
| 473 { | 473 { |
| 474 return adoptPtrWillBeNoop(new LinkStyle(owner)); | 474 return (new LinkStyle(owner)); |
| 475 } | 475 } |
| 476 | 476 |
| 477 LinkStyle::LinkStyle(HTMLLinkElement* owner) | 477 LinkStyle::LinkStyle(HTMLLinkElement* owner) |
| 478 : LinkResource(owner) | 478 : LinkResource(owner) |
| 479 , m_disabledState(Unset) | 479 , m_disabledState(Unset) |
| 480 , m_pendingSheetType(None) | 480 , m_pendingSheetType(None) |
| 481 , m_loading(false) | 481 , m_loading(false) |
| 482 , m_firedLoad(false) | 482 , m_firedLoad(false) |
| 483 , m_loadedSheet(false) | 483 , m_loadedSheet(false) |
| 484 , m_fetchFollowingCORS(false) | 484 , m_fetchFollowingCORS(false) |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 // While the stylesheet is asynchronously loading, the owner can be moved un
der | 523 // While the stylesheet is asynchronously loading, the owner can be moved un
der |
| 524 // shadow tree. In that case, cancel any processing on the loaded content. | 524 // shadow tree. In that case, cancel any processing on the loaded content. |
| 525 if (m_owner->isInShadowTree()) { | 525 if (m_owner->isInShadowTree()) { |
| 526 m_loading = false; | 526 m_loading = false; |
| 527 removePendingSheet(); | 527 removePendingSheet(); |
| 528 if (m_sheet) | 528 if (m_sheet) |
| 529 clearSheet(); | 529 clearSheet(); |
| 530 return; | 530 return; |
| 531 } | 531 } |
| 532 // Completing the sheet load may cause scripts to execute. | 532 // Completing the sheet load may cause scripts to execute. |
| 533 RefPtrWillBeRawPtr<Node> protector(m_owner.get()); | 533 RawPtr<Node> protector(m_owner.get()); |
| 534 | 534 |
| 535 CSSParserContext parserContext(m_owner->document(), 0, baseURL, charset); | 535 CSSParserContext parserContext(m_owner->document(), 0, baseURL, charset); |
| 536 | 536 |
| 537 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheetHistogram,
("Blink.RestoredCachedStyleSheet", 2)); | 537 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheetHistogram,
("Blink.RestoredCachedStyleSheet", 2)); |
| 538 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheet2Histogram
, ("Blink.RestoredCachedStyleSheet2", StyleSheetCacheStatusCount)); | 538 DEFINE_STATIC_LOCAL(EnumerationHistogram, restoredCachedStyleSheet2Histogram
, ("Blink.RestoredCachedStyleSheet2", StyleSheetCacheStatusCount)); |
| 539 | 539 |
| 540 if (RefPtrWillBeRawPtr<StyleSheetContents> restoredSheet = const_cast<CSSSty
leSheetResource*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { | 540 if (RawPtr<StyleSheetContents> restoredSheet = const_cast<CSSStyleSheetResou
rce*>(cachedStyleSheet)->restoreParsedStyleSheet(parserContext)) { |
| 541 ASSERT(restoredSheet->isCacheable()); | 541 ASSERT(restoredSheet->isCacheable()); |
| 542 ASSERT(!restoredSheet->isLoading()); | 542 ASSERT(!restoredSheet->isLoading()); |
| 543 | 543 |
| 544 if (m_sheet) | 544 if (m_sheet) |
| 545 clearSheet(); | 545 clearSheet(); |
| 546 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); | 546 m_sheet = CSSStyleSheet::create(restoredSheet, m_owner); |
| 547 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 547 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
| 548 m_sheet->setTitle(m_owner->title()); | 548 m_sheet->setTitle(m_owner->title()); |
| 549 setCrossOriginStylesheetStatus(m_sheet.get()); | 549 setCrossOriginStylesheetStatus(m_sheet.get()); |
| 550 | 550 |
| 551 m_loading = false; | 551 m_loading = false; |
| 552 restoredSheet->checkLoaded(); | 552 restoredSheet->checkLoaded(); |
| 553 | 553 |
| 554 restoredCachedStyleSheetHistogram.count(true); | 554 restoredCachedStyleSheetHistogram.count(true); |
| 555 restoredCachedStyleSheet2Histogram.count(StyleSheetInMemoryCache); | 555 restoredCachedStyleSheet2Histogram.count(StyleSheetInMemoryCache); |
| 556 return; | 556 return; |
| 557 } | 557 } |
| 558 restoredCachedStyleSheetHistogram.count(false); | 558 restoredCachedStyleSheetHistogram.count(false); |
| 559 StyleSheetCacheStatus cacheStatus = cachedStyleSheet->response().wasCached()
? StyleSheetInDiskCache : StyleSheetNewEntry; | 559 StyleSheetCacheStatus cacheStatus = cachedStyleSheet->response().wasCached()
? StyleSheetInDiskCache : StyleSheetNewEntry; |
| 560 restoredCachedStyleSheet2Histogram.count(cacheStatus); | 560 restoredCachedStyleSheet2Histogram.count(cacheStatus); |
| 561 | 561 |
| 562 RefPtrWillBeRawPtr<StyleSheetContents> styleSheet = StyleSheetContents::crea
te(href, parserContext); | 562 RawPtr<StyleSheetContents> styleSheet = StyleSheetContents::create(href, par
serContext); |
| 563 | 563 |
| 564 if (m_sheet) | 564 if (m_sheet) |
| 565 clearSheet(); | 565 clearSheet(); |
| 566 | 566 |
| 567 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); | 567 m_sheet = CSSStyleSheet::create(styleSheet, m_owner); |
| 568 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); | 568 m_sheet->setMediaQueries(MediaQuerySet::create(m_owner->media())); |
| 569 m_sheet->setTitle(m_owner->title()); | 569 m_sheet->setTitle(m_owner->title()); |
| 570 setCrossOriginStylesheetStatus(m_sheet.get()); | 570 setCrossOriginStylesheetStatus(m_sheet.get()); |
| 571 | 571 |
| 572 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().secu
rityOrigin()); | 572 styleSheet->parseAuthorStyleSheet(cachedStyleSheet, m_owner->document().secu
rityOrigin()); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 733 | 733 |
| 734 if (!m_owner->shouldLoadLink()) | 734 if (!m_owner->shouldLoadLink()) |
| 735 return; | 735 return; |
| 736 | 736 |
| 737 m_loading = true; | 737 m_loading = true; |
| 738 | 738 |
| 739 bool mediaQueryMatches = true; | 739 bool mediaQueryMatches = true; |
| 740 LocalFrame* frame = loadingFrame(); | 740 LocalFrame* frame = loadingFrame(); |
| 741 if (!m_owner->media().isEmpty() && frame && frame->document()) { | 741 if (!m_owner->media().isEmpty() && frame && frame->document()) { |
| 742 RefPtr<ComputedStyle> documentStyle = StyleResolver::styleForDocumen
t(*frame->document()); | 742 RefPtr<ComputedStyle> documentStyle = StyleResolver::styleForDocumen
t(*frame->document()); |
| 743 RefPtrWillBeRawPtr<MediaQuerySet> media = MediaQuerySet::create(m_ow
ner->media()); | 743 RawPtr<MediaQuerySet> media = MediaQuerySet::create(m_owner->media()
); |
| 744 MediaQueryEvaluator evaluator(frame); | 744 MediaQueryEvaluator evaluator(frame); |
| 745 mediaQueryMatches = evaluator.eval(media.get()); | 745 mediaQueryMatches = evaluator.eval(media.get()); |
| 746 } | 746 } |
| 747 | 747 |
| 748 // Don't hold up layout tree construction and script execution on styles
heets | 748 // Don't hold up layout tree construction and script execution on styles
heets |
| 749 // that are not needed for the layout at the moment. | 749 // that are not needed for the layout at the moment. |
| 750 bool blocking = mediaQueryMatches && !m_owner->isAlternate() && m_owner-
>isCreatedByParser(); | 750 bool blocking = mediaQueryMatches && !m_owner->isAlternate() && m_owner-
>isCreatedByParser(); |
| 751 addPendingSheet(blocking ? Blocking : NonBlocking); | 751 addPendingSheet(blocking ? Blocking : NonBlocking); |
| 752 | 752 |
| 753 // Load stylesheets that are not needed for the layout immediately with
low priority. | 753 // Load stylesheets that are not needed for the layout immediately with
low priority. |
| 754 // When the link element is created by scripts, load the stylesheets asy
nchronously but in high priority. | 754 // When the link element is created by scripts, load the stylesheets asy
nchronously but in high priority. |
| 755 bool lowPriority = !mediaQueryMatches || m_owner->isAlternate(); | 755 bool lowPriority = !mediaQueryMatches || m_owner->isAlternate(); |
| 756 FetchRequest request = builder.build(lowPriority); | 756 FetchRequest request = builder.build(lowPriority); |
| 757 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_owne
r->fastGetAttribute(HTMLNames::crossoriginAttr)); | 757 CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue(m_owne
r->fastGetAttribute(HTMLNames::crossoriginAttr)); |
| 758 if (crossOrigin != CrossOriginAttributeNotSet) { | 758 if (crossOrigin != CrossOriginAttributeNotSet) { |
| 759 request.setCrossOriginAccessControl(document().securityOrigin(), cro
ssOrigin); | 759 request.setCrossOriginAccessControl(document().securityOrigin(), cro
ssOrigin); |
| 760 setFetchFollowingCORS(); | 760 setFetchFollowingCORS(); |
| 761 } | 761 } |
| 762 setResource(CSSStyleSheetResource::fetch(request, document().fetcher()))
; | 762 setResource(CSSStyleSheetResource::fetch(request, document().fetcher()))
; |
| 763 | 763 |
| 764 if (!resource()) { | 764 if (!resource()) { |
| 765 // 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. | 765 // 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 m_loading = false; | 766 m_loading = false; |
| 767 removePendingSheet(); | 767 removePendingSheet(); |
| 768 notifyLoadedSheetAndAllCriticalSubresources(Node::ErrorOccurredLoadi
ngSubresource); | 768 notifyLoadedSheetAndAllCriticalSubresources(Node::ErrorOccurredLoadi
ngSubresource); |
| 769 } | 769 } |
| 770 } else if (m_sheet) { | 770 } else if (m_sheet) { |
| 771 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed | 771 // we no longer contain a stylesheet, e.g. perhaps rel or type was chang
ed |
| 772 RefPtrWillBeRawPtr<StyleSheet> removedSheet = m_sheet.get(); | 772 RawPtr<StyleSheet> removedSheet = m_sheet.get(); |
| 773 clearSheet(); | 773 clearSheet(); |
| 774 document().removedStyleSheet(removedSheet.get()); | 774 document().removedStyleSheet(removedSheet.get()); |
| 775 } | 775 } |
| 776 } | 776 } |
| 777 | 777 |
| 778 void LinkStyle::setSheetTitle(const String& title) | 778 void LinkStyle::setSheetTitle(const String& title) |
| 779 { | 779 { |
| 780 if (m_sheet) | 780 if (m_sheet) |
| 781 m_sheet->setTitle(title); | 781 m_sheet->setTitle(title); |
| 782 } | 782 } |
| 783 | 783 |
| 784 void LinkStyle::ownerRemoved() | 784 void LinkStyle::ownerRemoved() |
| 785 { | 785 { |
| 786 if (m_sheet) | 786 if (m_sheet) |
| 787 clearSheet(); | 787 clearSheet(); |
| 788 | 788 |
| 789 if (styleSheetIsLoading()) | 789 if (styleSheetIsLoading()) |
| 790 removePendingSheet(); | 790 removePendingSheet(); |
| 791 } | 791 } |
| 792 | 792 |
| 793 DEFINE_TRACE(LinkStyle) | 793 DEFINE_TRACE(LinkStyle) |
| 794 { | 794 { |
| 795 visitor->trace(m_sheet); | 795 visitor->trace(m_sheet); |
| 796 LinkResource::trace(visitor); | 796 LinkResource::trace(visitor); |
| 797 ResourceOwner<StyleSheetResource>::trace(visitor); | 797 ResourceOwner<StyleSheetResource>::trace(visitor); |
| 798 } | 798 } |
| 799 | 799 |
| 800 } // namespace blink | 800 } // namespace blink |
| OLD | NEW |