Index: Source/core/page/PageSerializer.cpp |
diff --git a/Source/core/page/PageSerializer.cpp b/Source/core/page/PageSerializer.cpp |
index 2005a65ae7df45cb0bf933950dfea0897603668d..e22b0d444c574bb00c083da4437f2b97d94c6691 100644 |
--- a/Source/core/page/PageSerializer.cpp |
+++ b/Source/core/page/PageSerializer.cpp |
@@ -32,9 +32,13 @@ |
#include "core/page/PageSerializer.h" |
#include "HTMLNames.h" |
+#include "core/css/CSSFontFaceRule.h" |
+#include "core/css/CSSFontFaceSrcValue.h" |
#include "core/css/CSSImageValue.h" |
#include "core/css/CSSImportRule.h" |
+#include "core/css/CSSStyleDeclaration.h" |
#include "core/css/CSSStyleRule.h" |
+#include "core/css/CSSValueList.h" |
#include "core/css/StylePropertySet.h" |
#include "core/css/StyleRule.h" |
#include "core/css/StyleSheetContents.h" |
@@ -42,6 +46,7 @@ |
#include "core/dom/Element.h" |
#include "core/dom/Text.h" |
#include "core/editing/MarkupAccumulator.h" |
+#include "core/fetch/FontResource.h" |
#include "core/fetch/ImageResource.h" |
#include "core/html/HTMLFrameOwnerElement.h" |
#include "core/html/HTMLImageElement.h" |
@@ -261,16 +266,15 @@ void PageSerializer::serializeCSSStyleSheet(CSSStyleSheet* styleSheet, const KUR |
Document* document = styleSheet->ownerDocument(); |
// Some rules have resources associated with them that we need to retrieve. |
if (rule->type() == CSSRule::IMPORT_RULE) { |
- CSSImportRule* importRule = static_cast<CSSImportRule*>(rule); |
+ CSSImportRule* importRule = toCSSImportRule(rule); |
KURL importURL = document->completeURL(importRule->href()); |
if (m_resourceURLs.contains(importURL)) |
continue; |
serializeCSSStyleSheet(importRule->styleSheet(), importURL); |
} else if (rule->type() == CSSRule::FONT_FACE_RULE) { |
- // FIXME: Add support for font face rule. It is not clear to me at this point if the actual otf/eot file can |
- // be retrieved from the CSSFontFaceRule object. |
+ retrieveResourcesForProperties(toCSSFontFaceRule(rule)->styleRule()->properties(), document); |
} else if (rule->type() == CSSRule::STYLE_RULE) { |
- retrieveResourcesForRule(static_cast<CSSStyleRule*>(rule)->styleRule(), document); |
+ retrieveResourcesForProperties(toCSSStyleRule(rule)->styleRule()->properties(), document); |
} |
} |
@@ -285,9 +289,26 @@ void PageSerializer::serializeCSSStyleSheet(CSSStyleSheet* styleSheet, const KUR |
} |
} |
+bool PageSerializer::shouldAddURL(const KURL& url) |
+{ |
+ return url.isValid() && !m_resourceURLs.contains(url) && !url.protocolIsData(); |
+} |
+ |
+void PageSerializer::addToResources(Resource* resource, PassRefPtr<SharedBuffer> data, const KURL& url) |
+{ |
+ if (!data) { |
+ LOG_ERROR("No data for resource %s", url.string().utf8().data()); |
+ return; |
+ } |
+ |
+ String mimeType = resource->response().mimeType(); |
+ m_resources->append(SerializedResource(url, mimeType, data)); |
+ m_resourceURLs.add(url); |
+} |
+ |
void PageSerializer::addImageToResources(ImageResource* image, RenderObject* imageRenderer, const KURL& url) |
{ |
- if (!url.isValid() || m_resourceURLs.contains(url) || url.protocolIsData()) |
+ if (!shouldAddURL(url)) |
return; |
if (!image || image->image() == Image::nullImage()) |
@@ -297,19 +318,17 @@ void PageSerializer::addImageToResources(ImageResource* image, RenderObject* ima |
if (!data) |
data = image->image()->data(); |
- if (!data) { |
- LOG_ERROR("No data for image %s", url.string().utf8().data()); |
- return; |
- } |
- |
- String mimeType = image->response().mimeType(); |
- m_resources->append(SerializedResource(url, mimeType, data)); |
- m_resourceURLs.add(url); |
+ addToResources(image, data, url); |
} |
-void PageSerializer::retrieveResourcesForRule(StyleRule* rule, Document* document) |
+void PageSerializer::addFontToResources(FontResource* font) |
{ |
- retrieveResourcesForProperties(rule->properties(), document); |
+ if (!font || !shouldAddURL(font->url()) || !font->isLoaded() || !font->resourceBuffer()) { |
+ return; |
+ } |
+ RefPtr<SharedBuffer> data(font->resourceBuffer()); |
+ |
+ addToResources(font, data, font->url()); |
} |
void PageSerializer::retrieveResourcesForProperties(const StylePropertySet* styleDeclaration, Document* document) |
@@ -323,17 +342,31 @@ void PageSerializer::retrieveResourcesForProperties(const StylePropertySet* styl |
unsigned propertyCount = styleDeclaration->propertyCount(); |
for (unsigned i = 0; i < propertyCount; ++i) { |
RefPtr<CSSValue> cssValue = styleDeclaration->propertyAt(i).value(); |
- if (!cssValue->isImageValue()) |
- continue; |
+ retrieveResourcesForCSSValue(cssValue.get(), document); |
+ } |
+} |
- CSSImageValue* imageValue = toCSSImageValue(cssValue.get()); |
+void PageSerializer::retrieveResourcesForCSSValue(CSSValue* cssValue, Document* document) |
+{ |
+ if (cssValue->isImageValue()) { |
+ CSSImageValue* imageValue = toCSSImageValue(cssValue); |
StyleImage* styleImage = imageValue->cachedOrPendingImage(); |
// Non cached-images are just place-holders and do not contain data. |
if (!styleImage || !styleImage->isImageResource()) |
- continue; |
+ return; |
+ |
+ addImageToResources(styleImage->cachedImage(), 0, styleImage->cachedImage()->url()); |
+ } else if (cssValue->isFontFaceSrcValue()) { |
+ CSSFontFaceSrcValue* fontFaceSrcValue = toCSSFontFaceSrcValue(cssValue); |
+ if (fontFaceSrcValue->isLocal()) { |
+ return; |
+ } |
- ImageResource* image = static_cast<StyleFetchedImage*>(styleImage)->cachedImage(); |
- addImageToResources(image, 0, image->url()); |
+ addFontToResources(fontFaceSrcValue->fetch(document)); |
+ } else if (cssValue->isValueList()) { |
+ CSSValueList* cssValueList = toCSSValueList(cssValue); |
+ for (unsigned i = 0; i < cssValueList->length(); i++) |
+ retrieveResourcesForCSSValue(cssValueList->item(i), document); |
} |
} |