Chromium Code Reviews| Index: Source/core/fetch/CSSStyleSheetResource.cpp |
| diff --git a/Source/core/fetch/CSSStyleSheetResource.cpp b/Source/core/fetch/CSSStyleSheetResource.cpp |
| index be920489f280bb79685f86cff7c37bad9b17caeb..7cde684da5eda39ce0a57fcf493aee40b2f29532 100644 |
| --- a/Source/core/fetch/CSSStyleSheetResource.cpp |
| +++ b/Source/core/fetch/CSSStyleSheetResource.cpp |
| @@ -30,6 +30,7 @@ |
| #include "core/css/StyleSheetContents.h" |
| #include "core/fetch/ResourceClientWalker.h" |
| #include "core/fetch/StyleSheetResourceClient.h" |
| +#include "core/html/parser/CompactHTMLToken.h" |
| #include "core/html/parser/TextResourceDecoder.h" |
| #include "platform/SharedBuffer.h" |
| #include "platform/network/HTTPParsers.h" |
| @@ -38,15 +39,22 @@ |
| namespace WebCore { |
| -CSSStyleSheetResource::CSSStyleSheetResource(const ResourceRequest& resourceRequest, const String& charset) |
| +CSSStyleSheetResource::CSSStyleSheetResource(const ResourceRequest& resourceRequest, const String& charset, Document* document) |
| : StyleSheetResource(resourceRequest, CSSStyleSheet) |
| , m_decoder(TextResourceDecoder::create("text/css", charset)) |
| + , m_tokenizer(HTMLTokenizer::create(m_options)) |
| + , m_preloadScanner(adoptPtr(new CSSPreloadScanner)) |
| + , m_input(adoptPtr(new BackgroundHTMLInputStream)) |
| + , m_token(adoptPtr(new HTMLToken)) |
| + , m_preloader(adoptPtr(new HTMLResourcePreloader(document))) |
| + , m_prescan(true) |
| { |
| DEFINE_STATIC_LOCAL(const AtomicString, acceptCSS, ("text/css,*/*;q=0.1", AtomicString::ConstructFromLiteral)); |
| // Prefer text/css but accept any type (dell.com serves a stylesheet |
| // as text/html; see <http://bugs.webkit.org/show_bug.cgi?id=11451>). |
| setAccept(acceptCSS); |
| + m_tokenizer->setState(HTMLTokenizer::RAWTEXTState); |
| } |
| CSSStyleSheetResource::~CSSStyleSheetResource() |
| @@ -108,6 +116,32 @@ void CSSStyleSheetResource::checkNotify() |
| m_decodedSheetText = String(); |
| } |
| +void CSSStyleSheetResource::appendData(const char* data, int length) |
| +{ |
| + Resource::appendData(data, length); |
| + if (m_prescan) { |
| + // FIXME: Allow scanning entire CSS file for background images and prefetch according to applied rules. |
| + m_prescan = false; |
| + prescan(data); |
| + } |
| +} |
| + |
| +void CSSStyleSheetResource::prescan(const char* data) |
| +{ |
| + PreloadRequestStream pendingPreloads; |
| + m_input->append(data); |
| + |
| + while (true) { |
| + if (!m_tokenizer->nextToken(m_input->current(), *m_token)) |
| + break; // We've reached the end of our current input. |
| + |
| + CompactHTMLToken token(m_token.get(), TextPosition(m_input->current().currentLine(), m_input->current().currentColumn())); |
| + m_preloadScanner->scan(token.data(), m_input->current(), pendingPreloads); |
|
shatch
2014/02/14 16:20:17
What's the advantage to running this through the t
|
| + m_token->clear(); |
| + } |
| + m_preloader->takeAndPreload(pendingPreloads); |
| +} |
| + |
| bool CSSStyleSheetResource::canUseSheet(bool enforceMIMEType, bool* hasValidMIMEType) const |
| { |
| if (errorOccurred()) |