| Index: third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
|
| diff --git a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
|
| deleted file mode 100644
|
| index 7db81061bcc8244001713490982c73a2dfc25d04..0000000000000000000000000000000000000000
|
| --- a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
|
| +++ /dev/null
|
| @@ -1,234 +0,0 @@
|
| -/*
|
| - Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de)
|
| - Copyright (C) 2001 Dirk Mueller (mueller@kde.org)
|
| - Copyright (C) 2002 Waldo Bastian (bastian@kde.org)
|
| - Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com)
|
| - Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
|
| -
|
| - This library is free software; you can redistribute it and/or
|
| - modify it under the terms of the GNU Library General Public
|
| - License as published by the Free Software Foundation; either
|
| - version 2 of the License, or (at your option) any later version.
|
| -
|
| - This library is distributed in the hope that it will be useful,
|
| - but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
| - Library General Public License for more details.
|
| -
|
| - You should have received a copy of the GNU Library General Public License
|
| - along with this library; see the file COPYING.LIB. If not, write to
|
| - the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
| - Boston, MA 02110-1301, USA.
|
| -
|
| - This class provides all functionality needed for loading images, style
|
| - sheets and html pages from the web. It has a memory cache for these objects.
|
| -*/
|
| -
|
| -#include "core/fetch/CSSStyleSheetResource.h"
|
| -
|
| -#include "core/css/StyleSheetContents.h"
|
| -#include "core/fetch/FetchRequest.h"
|
| -#include "core/fetch/MemoryCache.h"
|
| -#include "core/fetch/ResourceClientWalker.h"
|
| -#include "core/fetch/ResourceFetcher.h"
|
| -#include "core/fetch/StyleSheetResourceClient.h"
|
| -#include "platform/SharedBuffer.h"
|
| -#include "wtf/CurrentTime.h"
|
| -
|
| -namespace blink {
|
| -
|
| -CSSStyleSheetResource* CSSStyleSheetResource::fetch(FetchRequest& request,
|
| - ResourceFetcher* fetcher) {
|
| - DCHECK_EQ(request.resourceRequest().frameType(),
|
| - WebURLRequest::FrameTypeNone);
|
| - request.mutableResourceRequest().setRequestContext(
|
| - WebURLRequest::RequestContextStyle);
|
| - CSSStyleSheetResource* resource = toCSSStyleSheetResource(
|
| - fetcher->requestResource(request, CSSStyleSheetResourceFactory()));
|
| - // TODO(kouhei): Dedupe this logic w/ ScriptResource::fetch
|
| - if (resource && !request.integrityMetadata().isEmpty())
|
| - resource->setIntegrityMetadata(request.integrityMetadata());
|
| - return resource;
|
| -}
|
| -
|
| -CSSStyleSheetResource* CSSStyleSheetResource::createForTest(
|
| - const ResourceRequest& request,
|
| - const String& charset) {
|
| - return new CSSStyleSheetResource(request, ResourceLoaderOptions(), charset);
|
| -}
|
| -
|
| -CSSStyleSheetResource::CSSStyleSheetResource(
|
| - const ResourceRequest& resourceRequest,
|
| - const ResourceLoaderOptions& options,
|
| - const String& charset)
|
| - : StyleSheetResource(resourceRequest,
|
| - CSSStyleSheet,
|
| - options,
|
| - "text/css",
|
| - charset),
|
| - m_didNotifyFirstData(false) {}
|
| -
|
| -CSSStyleSheetResource::~CSSStyleSheetResource() {}
|
| -
|
| -void CSSStyleSheetResource::setParsedStyleSheetCache(
|
| - StyleSheetContents* newSheet) {
|
| - if (m_parsedStyleSheetCache)
|
| - m_parsedStyleSheetCache->clearReferencedFromResource();
|
| - m_parsedStyleSheetCache = newSheet;
|
| - if (m_parsedStyleSheetCache)
|
| - m_parsedStyleSheetCache->setReferencedFromResource(this);
|
| -
|
| - // Updates the decoded size to take parsed stylesheet cache into account.
|
| - updateDecodedSize();
|
| -}
|
| -
|
| -DEFINE_TRACE(CSSStyleSheetResource) {
|
| - visitor->trace(m_parsedStyleSheetCache);
|
| - StyleSheetResource::trace(visitor);
|
| -}
|
| -
|
| -void CSSStyleSheetResource::didAddClient(ResourceClient* c) {
|
| - DCHECK(StyleSheetResourceClient::isExpectedType(c));
|
| - // Resource::didAddClient() must be before setCSSStyleSheet(), because
|
| - // setCSSStyleSheet() may cause scripts to be executed, which could destroy
|
| - // 'c' if it is an instance of HTMLLinkElement. see the comment of
|
| - // HTMLLinkElement::setCSSStyleSheet.
|
| - Resource::didAddClient(c);
|
| -
|
| - if (hasClient(c) && m_didNotifyFirstData)
|
| - static_cast<StyleSheetResourceClient*>(c)->didAppendFirstData(this);
|
| -
|
| - // |c| might be removed in didAppendFirstData, so ensure it is still a client.
|
| - if (hasClient(c) && !isLoading()) {
|
| - static_cast<StyleSheetResourceClient*>(c)->setCSSStyleSheet(
|
| - resourceRequest().url(), response().url(), encoding(), this);
|
| - }
|
| -}
|
| -
|
| -const String CSSStyleSheetResource::sheetText(
|
| - MIMETypeCheck mimeTypeCheck) const {
|
| - if (!canUseSheet(mimeTypeCheck))
|
| - return String();
|
| -
|
| - // Use cached decoded sheet text when available
|
| - if (!m_decodedSheetText.isNull()) {
|
| - // We should have the decoded sheet text cached when the resource is fully
|
| - // loaded.
|
| - DCHECK_EQ(getStatus(), Resource::Cached);
|
| -
|
| - return m_decodedSheetText;
|
| - }
|
| -
|
| - if (!data() || data()->isEmpty())
|
| - return String();
|
| -
|
| - return decodedText();
|
| -}
|
| -
|
| -void CSSStyleSheetResource::appendData(const char* data, size_t length) {
|
| - Resource::appendData(data, length);
|
| - if (m_didNotifyFirstData)
|
| - return;
|
| - ResourceClientWalker<StyleSheetResourceClient> w(clients());
|
| - while (StyleSheetResourceClient* c = w.next())
|
| - c->didAppendFirstData(this);
|
| - m_didNotifyFirstData = true;
|
| -}
|
| -
|
| -void CSSStyleSheetResource::checkNotify() {
|
| - // Decode the data to find out the encoding and cache the decoded sheet text.
|
| - if (data())
|
| - setDecodedSheetText(decodedText());
|
| -
|
| - ResourceClientWalker<StyleSheetResourceClient> w(clients());
|
| - while (StyleSheetResourceClient* c = w.next()) {
|
| - markClientFinished(c);
|
| - c->setCSSStyleSheet(resourceRequest().url(), response().url(), encoding(),
|
| - this);
|
| - }
|
| -
|
| - // Clear raw bytes as now we have the full decoded sheet text.
|
| - // We wait for all LinkStyle::setCSSStyleSheet to run (at least once)
|
| - // as SubresourceIntegrity checks require raw bytes.
|
| - // Note that LinkStyle::setCSSStyleSheet can be called from didAddClient too,
|
| - // but is safe as we should have a cached ResourceIntegrityDisposition.
|
| - clearData();
|
| -}
|
| -
|
| -void CSSStyleSheetResource::destroyDecodedDataIfPossible() {
|
| - if (!m_parsedStyleSheetCache)
|
| - return;
|
| -
|
| - setParsedStyleSheetCache(nullptr);
|
| -}
|
| -
|
| -void CSSStyleSheetResource::destroyDecodedDataForFailedRevalidation() {
|
| - setDecodedSheetText(String());
|
| - destroyDecodedDataIfPossible();
|
| -}
|
| -
|
| -bool CSSStyleSheetResource::canUseSheet(MIMETypeCheck mimeTypeCheck) const {
|
| - if (errorOccurred())
|
| - return false;
|
| -
|
| - // This check exactly matches Firefox. Note that we grab the Content-Type
|
| - // header directly because we want to see what the value is BEFORE content
|
| - // sniffing. Firefox does this by setting a "type hint" on the channel. This
|
| - // implementation should be observationally equivalent.
|
| - //
|
| - // This code defaults to allowing the stylesheet for non-HTTP protocols so
|
| - // folks can use standards mode for local HTML documents.
|
| - if (mimeTypeCheck == MIMETypeCheck::Lax)
|
| - return true;
|
| - AtomicString contentType = httpContentType();
|
| - return contentType.isEmpty() || equalIgnoringCase(contentType, "text/css") ||
|
| - equalIgnoringCase(contentType, "application/x-unknown-content-type");
|
| -}
|
| -
|
| -StyleSheetContents* CSSStyleSheetResource::restoreParsedStyleSheet(
|
| - const CSSParserContext& context) {
|
| - if (!m_parsedStyleSheetCache)
|
| - return nullptr;
|
| - if (m_parsedStyleSheetCache->hasFailedOrCanceledSubresources()) {
|
| - setParsedStyleSheetCache(nullptr);
|
| - return nullptr;
|
| - }
|
| -
|
| - DCHECK(m_parsedStyleSheetCache->isCacheableForResource());
|
| - DCHECK(m_parsedStyleSheetCache->isReferencedFromResource());
|
| -
|
| - // Contexts must be identical so we know we would get the same exact result if
|
| - // we parsed again.
|
| - if (m_parsedStyleSheetCache->parserContext() != context)
|
| - return nullptr;
|
| -
|
| - return m_parsedStyleSheetCache;
|
| -}
|
| -
|
| -void CSSStyleSheetResource::saveParsedStyleSheet(StyleSheetContents* sheet) {
|
| - DCHECK(sheet);
|
| - DCHECK(sheet->isCacheableForResource());
|
| -
|
| - if (!memoryCache()->contains(this)) {
|
| - // This stylesheet resource did conflict with another resource and was not
|
| - // added to the cache.
|
| - setParsedStyleSheetCache(nullptr);
|
| - return;
|
| - }
|
| - setParsedStyleSheetCache(sheet);
|
| -}
|
| -
|
| -void CSSStyleSheetResource::setDecodedSheetText(
|
| - const String& decodedSheetText) {
|
| - m_decodedSheetText = decodedSheetText;
|
| - updateDecodedSize();
|
| -}
|
| -
|
| -void CSSStyleSheetResource::updateDecodedSize() {
|
| - size_t decodedSize = m_decodedSheetText.charactersSizeInBytes();
|
| - if (m_parsedStyleSheetCache)
|
| - decodedSize += m_parsedStyleSheetCache->estimatedSizeInBytes();
|
| - setDecodedSize(decodedSize);
|
| -}
|
| -
|
| -} // namespace blink
|
|
|