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

Unified Diff: Source/core/fetch/CSSStyleSheetResource.cpp

Issue 166633002: Prefetch @import files from CSS files. Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 10 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 side-by-side diff with in-line comments
Download patch
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())

Powered by Google App Engine
This is Rietveld 408576698