OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 10 matching lines...) Expand all Loading... |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "core/page/PageSerializer.h" | 31 #include "core/frame/FrameSerializer.h" |
32 | 32 |
33 #include "core/HTMLNames.h" | 33 #include "core/HTMLNames.h" |
34 #include "core/InputTypeNames.h" | 34 #include "core/InputTypeNames.h" |
35 #include "core/css/CSSFontFaceRule.h" | 35 #include "core/css/CSSFontFaceRule.h" |
36 #include "core/css/CSSFontFaceSrcValue.h" | 36 #include "core/css/CSSFontFaceSrcValue.h" |
37 #include "core/css/CSSImageValue.h" | 37 #include "core/css/CSSImageValue.h" |
38 #include "core/css/CSSImportRule.h" | 38 #include "core/css/CSSImportRule.h" |
39 #include "core/css/CSSRuleList.h" | 39 #include "core/css/CSSRuleList.h" |
40 #include "core/css/CSSStyleDeclaration.h" | 40 #include "core/css/CSSStyleDeclaration.h" |
41 #include "core/css/CSSStyleRule.h" | 41 #include "core/css/CSSStyleRule.h" |
42 #include "core/css/CSSValueList.h" | 42 #include "core/css/CSSValueList.h" |
43 #include "core/css/StylePropertySet.h" | 43 #include "core/css/StylePropertySet.h" |
44 #include "core/css/StyleRule.h" | 44 #include "core/css/StyleRule.h" |
45 #include "core/css/StyleSheetContents.h" | 45 #include "core/css/StyleSheetContents.h" |
46 #include "core/dom/Document.h" | 46 #include "core/dom/Document.h" |
47 #include "core/dom/Element.h" | 47 #include "core/dom/Element.h" |
48 #include "core/dom/Text.h" | 48 #include "core/dom/Text.h" |
49 #include "core/editing/serializers/MarkupAccumulator.h" | 49 #include "core/editing/serializers/MarkupAccumulator.h" |
50 #include "core/fetch/FontResource.h" | 50 #include "core/fetch/FontResource.h" |
51 #include "core/fetch/ImageResource.h" | 51 #include "core/fetch/ImageResource.h" |
52 #include "core/frame/LocalFrame.h" | 52 #include "core/frame/LocalFrame.h" |
53 #include "core/html/HTMLFrameElementBase.h" | 53 #include "core/html/HTMLFrameElementBase.h" |
54 #include "core/html/HTMLImageElement.h" | 54 #include "core/html/HTMLImageElement.h" |
55 #include "core/html/HTMLInputElement.h" | 55 #include "core/html/HTMLInputElement.h" |
56 #include "core/html/HTMLLinkElement.h" | 56 #include "core/html/HTMLLinkElement.h" |
57 #include "core/html/HTMLMetaElement.h" | 57 #include "core/html/HTMLMetaElement.h" |
58 #include "core/html/HTMLStyleElement.h" | 58 #include "core/html/HTMLStyleElement.h" |
59 #include "core/html/ImageDocument.h" | 59 #include "core/html/ImageDocument.h" |
60 #include "core/page/Page.h" | |
61 #include "core/style/StyleFetchedImage.h" | 60 #include "core/style/StyleFetchedImage.h" |
62 #include "core/style/StyleImage.h" | 61 #include "core/style/StyleImage.h" |
63 #include "platform/SerializedResource.h" | 62 #include "platform/SerializedResource.h" |
64 #include "platform/graphics/Image.h" | 63 #include "platform/graphics/Image.h" |
65 #include "platform/heap/Handle.h" | 64 #include "platform/heap/Handle.h" |
66 #include "wtf/HashSet.h" | 65 #include "wtf/HashSet.h" |
67 #include "wtf/OwnPtr.h" | 66 #include "wtf/OwnPtr.h" |
68 #include "wtf/text/CString.h" | 67 #include "wtf/text/CString.h" |
69 #include "wtf/text/StringBuilder.h" | 68 #include "wtf/text/StringBuilder.h" |
70 #include "wtf/text/TextEncoding.h" | 69 #include "wtf/text/TextEncoding.h" |
71 #include "wtf/text/WTFString.h" | 70 #include "wtf/text/WTFString.h" |
72 | 71 |
73 namespace blink { | 72 namespace blink { |
74 | 73 |
75 static bool shouldIgnoreElement(const Element& element) | 74 static bool shouldIgnoreElement(const Element& element) |
76 { | 75 { |
77 if (isHTMLScriptElement(element)) | 76 if (isHTMLScriptElement(element)) |
78 return true; | 77 return true; |
79 if (isHTMLNoScriptElement(element)) | 78 if (isHTMLNoScriptElement(element)) |
80 return true; | 79 return true; |
81 return isHTMLMetaElement(element) && toHTMLMetaElement(element).computeEncod
ing().isValid(); | 80 return isHTMLMetaElement(element) && toHTMLMetaElement(element).computeEncod
ing().isValid(); |
82 } | 81 } |
83 | 82 |
84 class SerializerMarkupAccumulator : public MarkupAccumulator { | 83 class SerializerMarkupAccumulator : public MarkupAccumulator { |
85 STACK_ALLOCATED(); | 84 STACK_ALLOCATED(); |
86 public: | 85 public: |
87 SerializerMarkupAccumulator(PageSerializer::Delegate&, const Document&, Will
BeHeapVector<RawPtrWillBeMember<Node>>&); | 86 SerializerMarkupAccumulator(FrameSerializer::Delegate&, const Document&, Wil
lBeHeapVector<RawPtrWillBeMember<Node>>&); |
88 ~SerializerMarkupAccumulator() override; | 87 ~SerializerMarkupAccumulator() override; |
89 | 88 |
90 protected: | 89 protected: |
91 void appendText(StringBuilder& out, Text&) override; | 90 void appendText(StringBuilder& out, Text&) override; |
92 bool shouldIgnoreAttribute(const Attribute&) override; | 91 bool shouldIgnoreAttribute(const Attribute&) override; |
93 void appendElement(StringBuilder& out, Element&, Namespaces*) override; | 92 void appendElement(StringBuilder& out, Element&, Namespaces*) override; |
94 void appendAttribute(StringBuilder& out, const Element&, const Attribute&, N
amespaces*) override; | 93 void appendAttribute(StringBuilder& out, const Element&, const Attribute&, N
amespaces*) override; |
95 void appendStartTag(Node&, Namespaces* = nullptr) override; | 94 void appendStartTag(Node&, Namespaces* = nullptr) override; |
96 void appendEndTag(const Element&) override; | 95 void appendEndTag(const Element&) override; |
97 | 96 |
98 private: | 97 private: |
99 void appendAttributeValue(StringBuilder& out, const String& attributeValue); | 98 void appendAttributeValue(StringBuilder& out, const String& attributeValue); |
100 void appendRewrittenAttribute( | 99 void appendRewrittenAttribute( |
101 StringBuilder& out, | 100 StringBuilder& out, |
102 const Element&, | 101 const Element&, |
103 const String& attributeName, | 102 const String& attributeName, |
104 const String& attributeValue); | 103 const String& attributeValue); |
105 | 104 |
106 PageSerializer::Delegate& m_delegate; | 105 FrameSerializer::Delegate& m_delegate; |
107 RawPtrWillBeMember<const Document> m_document; | 106 RawPtrWillBeMember<const Document> m_document; |
108 | 107 |
109 // FIXME: |PageSerializer| uses |m_nodes| for collecting nodes in document | 108 // FIXME: |FrameSerializer| uses |m_nodes| for collecting nodes in document |
110 // included into serialized text then extracts image, object, etc. The size | 109 // included into serialized text then extracts image, object, etc. The size |
111 // of this vector isn't small for large document. It is better to use | 110 // of this vector isn't small for large document. It is better to use |
112 // callback like functionality. | 111 // callback like functionality. |
113 WillBeHeapVector<RawPtrWillBeMember<Node>>& m_nodes; | 112 WillBeHeapVector<RawPtrWillBeMember<Node>>& m_nodes; |
114 | 113 |
115 // Elements with links rewritten via appendAttribute method. | 114 // Elements with links rewritten via appendAttribute method. |
116 WillBeHeapHashSet<RawPtrWillBeMember<const Element>> m_elementsWithRewritten
Links; | 115 WillBeHeapHashSet<RawPtrWillBeMember<const Element>> m_elementsWithRewritten
Links; |
117 }; | 116 }; |
118 | 117 |
119 SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer::Delegat
e& delegate, const Document& document, WillBeHeapVector<RawPtrWillBeMember<Node>
>& nodes) | 118 SerializerMarkupAccumulator::SerializerMarkupAccumulator(FrameSerializer::Delega
te& delegate, const Document& document, WillBeHeapVector<RawPtrWillBeMember<Node
>>& nodes) |
120 : MarkupAccumulator(ResolveAllURLs) | 119 : MarkupAccumulator(ResolveAllURLs) |
121 , m_delegate(delegate) | 120 , m_delegate(delegate) |
122 , m_document(&document) | 121 , m_document(&document) |
123 , m_nodes(nodes) | 122 , m_nodes(nodes) |
124 { | 123 { |
125 } | 124 } |
126 | 125 |
127 SerializerMarkupAccumulator::~SerializerMarkupAccumulator() | 126 SerializerMarkupAccumulator::~SerializerMarkupAccumulator() |
128 { | 127 { |
129 } | 128 } |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 out.appendLiteral("\""); | 232 out.appendLiteral("\""); |
234 } | 233 } |
235 | 234 |
236 // TODO(tiger): Right now there is no support for rewriting URLs inside CSS | 235 // TODO(tiger): Right now there is no support for rewriting URLs inside CSS |
237 // documents which leads to bugs like <https://crbug.com/251898>. Not being | 236 // documents which leads to bugs like <https://crbug.com/251898>. Not being |
238 // able to rewrite URLs inside CSS documents means that resources imported from | 237 // able to rewrite URLs inside CSS documents means that resources imported from |
239 // url(...) statements in CSS might not work when rewriting links for the | 238 // url(...) statements in CSS might not work when rewriting links for the |
240 // "Webpage, Complete" method of saving a page. It will take some work but it | 239 // "Webpage, Complete" method of saving a page. It will take some work but it |
241 // needs to be done if we want to continue to support non-MHTML saved pages. | 240 // needs to be done if we want to continue to support non-MHTML saved pages. |
242 | 241 |
243 PageSerializer::PageSerializer( | 242 FrameSerializer::FrameSerializer( |
244 Vector<SerializedResource>& resources, | 243 Vector<SerializedResource>& resources, |
245 Delegate& delegate) | 244 Delegate& delegate) |
246 : m_resources(&resources) | 245 : m_resources(&resources) |
247 , m_delegate(delegate) | 246 , m_delegate(delegate) |
248 { | 247 { |
249 } | 248 } |
250 | 249 |
251 void PageSerializer::serializeFrame(const LocalFrame& frame) | 250 void FrameSerializer::serializeFrame(const LocalFrame& frame) |
252 { | 251 { |
253 ASSERT(frame.document()); | 252 ASSERT(frame.document()); |
254 Document& document = *frame.document(); | 253 Document& document = *frame.document(); |
255 KURL url = document.url(); | 254 KURL url = document.url(); |
256 | 255 |
257 // If frame is an image document, add the image and don't continue | 256 // If frame is an image document, add the image and don't continue |
258 if (document.isImageDocument()) { | 257 if (document.isImageDocument()) { |
259 ImageDocument& imageDocument = toImageDocument(document); | 258 ImageDocument& imageDocument = toImageDocument(document); |
260 addImageToResources(imageDocument.cachedImage(), url); | 259 addImageToResources(imageDocument.cachedImage(), url); |
261 return; | 260 return; |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
299 serializeCSSStyleSheet(*sheet, url); | 298 serializeCSSStyleSheet(*sheet, url); |
300 } | 299 } |
301 } else if (isHTMLStyleElement(element)) { | 300 } else if (isHTMLStyleElement(element)) { |
302 HTMLStyleElement& styleElement = toHTMLStyleElement(element); | 301 HTMLStyleElement& styleElement = toHTMLStyleElement(element); |
303 if (CSSStyleSheet* sheet = styleElement.sheet()) | 302 if (CSSStyleSheet* sheet = styleElement.sheet()) |
304 serializeCSSStyleSheet(*sheet, KURL()); | 303 serializeCSSStyleSheet(*sheet, KURL()); |
305 } | 304 } |
306 } | 305 } |
307 } | 306 } |
308 | 307 |
309 void PageSerializer::serializeCSSStyleSheet(CSSStyleSheet& styleSheet, const KUR
L& url) | 308 void FrameSerializer::serializeCSSStyleSheet(CSSStyleSheet& styleSheet, const KU
RL& url) |
310 { | 309 { |
311 StringBuilder cssText; | 310 StringBuilder cssText; |
312 cssText.appendLiteral("@charset \""); | 311 cssText.appendLiteral("@charset \""); |
313 cssText.append(styleSheet.contents()->charset().lower()); | 312 cssText.append(styleSheet.contents()->charset().lower()); |
314 cssText.appendLiteral("\";\n\n"); | 313 cssText.appendLiteral("\";\n\n"); |
315 | 314 |
316 for (unsigned i = 0; i < styleSheet.length(); ++i) { | 315 for (unsigned i = 0; i < styleSheet.length(); ++i) { |
317 CSSRule* rule = styleSheet.item(i); | 316 CSSRule* rule = styleSheet.item(i); |
318 String itemText = rule->cssText(); | 317 String itemText = rule->cssText(); |
319 if (!itemText.isEmpty()) { | 318 if (!itemText.isEmpty()) { |
320 cssText.append(itemText); | 319 cssText.append(itemText); |
321 if (i < styleSheet.length() - 1) | 320 if (i < styleSheet.length() - 1) |
322 cssText.appendLiteral("\n\n"); | 321 cssText.appendLiteral("\n\n"); |
323 } | 322 } |
324 | 323 |
325 // Some rules have resources associated with them that we need to retrie
ve. | 324 // Some rules have resources associated with them that we need to retrie
ve. |
326 serializeCSSRule(rule); | 325 serializeCSSRule(rule); |
327 } | 326 } |
328 | 327 |
329 if (shouldAddURL(url)) { | 328 if (shouldAddURL(url)) { |
330 WTF::TextEncoding textEncoding(styleSheet.contents()->charset()); | 329 WTF::TextEncoding textEncoding(styleSheet.contents()->charset()); |
331 ASSERT(textEncoding.isValid()); | 330 ASSERT(textEncoding.isValid()); |
332 String textString = cssText.toString(); | 331 String textString = cssText.toString(); |
333 CString text = textEncoding.encode(textString, WTF::EntitiesForUnencodab
les); | 332 CString text = textEncoding.encode(textString, WTF::EntitiesForUnencodab
les); |
334 m_resources->append(SerializedResource(url, String("text/css"), SharedBu
ffer::create(text.data(), text.length()))); | 333 m_resources->append(SerializedResource(url, String("text/css"), SharedBu
ffer::create(text.data(), text.length()))); |
335 m_resourceURLs.add(url); | 334 m_resourceURLs.add(url); |
336 } | 335 } |
337 } | 336 } |
338 | 337 |
339 void PageSerializer::serializeCSSRule(CSSRule* rule) | 338 void FrameSerializer::serializeCSSRule(CSSRule* rule) |
340 { | 339 { |
341 ASSERT(rule->parentStyleSheet()->ownerDocument()); | 340 ASSERT(rule->parentStyleSheet()->ownerDocument()); |
342 Document& document = *rule->parentStyleSheet()->ownerDocument(); | 341 Document& document = *rule->parentStyleSheet()->ownerDocument(); |
343 | 342 |
344 switch (rule->type()) { | 343 switch (rule->type()) { |
345 case CSSRule::STYLE_RULE: | 344 case CSSRule::STYLE_RULE: |
346 retrieveResourcesForProperties(&toCSSStyleRule(rule)->styleRule()->prope
rties(), document); | 345 retrieveResourcesForProperties(&toCSSStyleRule(rule)->styleRule()->prope
rties(), document); |
347 break; | 346 break; |
348 | 347 |
349 case CSSRule::IMPORT_RULE: { | 348 case CSSRule::IMPORT_RULE: { |
(...skipping 27 matching lines...) Expand all Loading... |
377 case CSSRule::KEYFRAMES_RULE: | 376 case CSSRule::KEYFRAMES_RULE: |
378 case CSSRule::KEYFRAME_RULE: | 377 case CSSRule::KEYFRAME_RULE: |
379 case CSSRule::VIEWPORT_RULE: | 378 case CSSRule::VIEWPORT_RULE: |
380 break; | 379 break; |
381 | 380 |
382 default: | 381 default: |
383 ASSERT_NOT_REACHED(); | 382 ASSERT_NOT_REACHED(); |
384 } | 383 } |
385 } | 384 } |
386 | 385 |
387 bool PageSerializer::shouldAddURL(const KURL& url) | 386 bool FrameSerializer::shouldAddURL(const KURL& url) |
388 { | 387 { |
389 return url.isValid() && !m_resourceURLs.contains(url) && !url.protocolIsData
() | 388 return url.isValid() && !m_resourceURLs.contains(url) && !url.protocolIsData
() |
390 && !m_delegate.shouldSkipResource(url); | 389 && !m_delegate.shouldSkipResource(url); |
391 } | 390 } |
392 | 391 |
393 void PageSerializer::addToResources(Resource* resource, PassRefPtr<SharedBuffer>
data, const KURL& url) | 392 void FrameSerializer::addToResources(Resource* resource, PassRefPtr<SharedBuffer
> data, const KURL& url) |
394 { | 393 { |
395 if (!data) { | 394 if (!data) { |
396 WTF_LOG_ERROR("No data for resource %s", url.string().utf8().data()); | 395 WTF_LOG_ERROR("No data for resource %s", url.string().utf8().data()); |
397 return; | 396 return; |
398 } | 397 } |
399 | 398 |
400 String mimeType = resource->response().mimeType(); | 399 String mimeType = resource->response().mimeType(); |
401 m_resources->append(SerializedResource(url, mimeType, data)); | 400 m_resources->append(SerializedResource(url, mimeType, data)); |
402 m_resourceURLs.add(url); | 401 m_resourceURLs.add(url); |
403 } | 402 } |
404 | 403 |
405 void PageSerializer::addImageToResources(ImageResource* image, const KURL& url) | 404 void FrameSerializer::addImageToResources(ImageResource* image, const KURL& url) |
406 { | 405 { |
407 if (!shouldAddURL(url)) | 406 if (!shouldAddURL(url)) |
408 return; | 407 return; |
409 | 408 |
410 if (!image || !image->hasImage() || image->errorOccurred()) | 409 if (!image || !image->hasImage() || image->errorOccurred()) |
411 return; | 410 return; |
412 | 411 |
413 RefPtr<SharedBuffer> data = image->image()->data(); | 412 RefPtr<SharedBuffer> data = image->image()->data(); |
414 addToResources(image, data, url); | 413 addToResources(image, data, url); |
415 } | 414 } |
416 | 415 |
417 void PageSerializer::addFontToResources(FontResource* font) | 416 void FrameSerializer::addFontToResources(FontResource* font) |
418 { | 417 { |
419 if (!font || !shouldAddURL(font->url()) || !font->isLoaded() || !font->resou
rceBuffer()) | 418 if (!font || !shouldAddURL(font->url()) || !font->isLoaded() || !font->resou
rceBuffer()) |
420 return; | 419 return; |
421 | 420 |
422 RefPtr<SharedBuffer> data(font->resourceBuffer()); | 421 RefPtr<SharedBuffer> data(font->resourceBuffer()); |
423 | 422 |
424 addToResources(font, data, font->url()); | 423 addToResources(font, data, font->url()); |
425 } | 424 } |
426 | 425 |
427 void PageSerializer::retrieveResourcesForProperties(const StylePropertySet* styl
eDeclaration, Document& document) | 426 void FrameSerializer::retrieveResourcesForProperties(const StylePropertySet* sty
leDeclaration, Document& document) |
428 { | 427 { |
429 if (!styleDeclaration) | 428 if (!styleDeclaration) |
430 return; | 429 return; |
431 | 430 |
432 // The background-image and list-style-image (for ul or ol) are the CSS prop
erties | 431 // The background-image and list-style-image (for ul or ol) are the CSS prop
erties |
433 // that make use of images. We iterate to make sure we include any other | 432 // that make use of images. We iterate to make sure we include any other |
434 // image properties there might be. | 433 // image properties there might be. |
435 unsigned propertyCount = styleDeclaration->propertyCount(); | 434 unsigned propertyCount = styleDeclaration->propertyCount(); |
436 for (unsigned i = 0; i < propertyCount; ++i) { | 435 for (unsigned i = 0; i < propertyCount; ++i) { |
437 RefPtrWillBeRawPtr<CSSValue> cssValue = styleDeclaration->propertyAt(i).
value(); | 436 RefPtrWillBeRawPtr<CSSValue> cssValue = styleDeclaration->propertyAt(i).
value(); |
438 retrieveResourcesForCSSValue(cssValue.get(), document); | 437 retrieveResourcesForCSSValue(cssValue.get(), document); |
439 } | 438 } |
440 } | 439 } |
441 | 440 |
442 void PageSerializer::retrieveResourcesForCSSValue(CSSValue* cssValue, Document&
document) | 441 void FrameSerializer::retrieveResourcesForCSSValue(CSSValue* cssValue, Document&
document) |
443 { | 442 { |
444 if (cssValue->isImageValue()) { | 443 if (cssValue->isImageValue()) { |
445 CSSImageValue* imageValue = toCSSImageValue(cssValue); | 444 CSSImageValue* imageValue = toCSSImageValue(cssValue); |
446 if (imageValue->isCachePending()) | 445 if (imageValue->isCachePending()) |
447 return; | 446 return; |
448 StyleImage* styleImage = imageValue->cachedImage(); | 447 StyleImage* styleImage = imageValue->cachedImage(); |
449 if (!styleImage || !styleImage->isImageResource()) | 448 if (!styleImage || !styleImage->isImageResource()) |
450 return; | 449 return; |
451 | 450 |
452 addImageToResources(styleImage->cachedImage(), styleImage->cachedImage()
->url()); | 451 addImageToResources(styleImage->cachedImage(), styleImage->cachedImage()
->url()); |
453 } else if (cssValue->isFontFaceSrcValue()) { | 452 } else if (cssValue->isFontFaceSrcValue()) { |
454 CSSFontFaceSrcValue* fontFaceSrcValue = toCSSFontFaceSrcValue(cssValue); | 453 CSSFontFaceSrcValue* fontFaceSrcValue = toCSSFontFaceSrcValue(cssValue); |
455 if (fontFaceSrcValue->isLocal()) { | 454 if (fontFaceSrcValue->isLocal()) { |
456 return; | 455 return; |
457 } | 456 } |
458 | 457 |
459 addFontToResources(fontFaceSrcValue->fetch(&document)); | 458 addFontToResources(fontFaceSrcValue->fetch(&document)); |
460 } else if (cssValue->isValueList()) { | 459 } else if (cssValue->isValueList()) { |
461 CSSValueList* cssValueList = toCSSValueList(cssValue); | 460 CSSValueList* cssValueList = toCSSValueList(cssValue); |
462 for (unsigned i = 0; i < cssValueList->length(); i++) | 461 for (unsigned i = 0; i < cssValueList->length(); i++) |
463 retrieveResourcesForCSSValue(cssValueList->item(i), document); | 462 retrieveResourcesForCSSValue(cssValueList->item(i), document); |
464 } | 463 } |
465 } | 464 } |
466 | 465 |
467 // Returns MOTW (Mark of the Web) declaration before html tag which is in | 466 // Returns MOTW (Mark of the Web) declaration before html tag which is in |
468 // HTML comment, e.g. "<!-- saved from url=(%04d)%s -->" | 467 // HTML comment, e.g. "<!-- saved from url=(%04d)%s -->" |
469 // See http://msdn2.microsoft.com/en-us/library/ms537628(VS.85).aspx. | 468 // See http://msdn2.microsoft.com/en-us/library/ms537628(VS.85).aspx. |
470 String PageSerializer::markOfTheWebDeclaration(const KURL& url) | 469 String FrameSerializer::markOfTheWebDeclaration(const KURL& url) |
471 { | 470 { |
472 StringBuilder builder; | 471 StringBuilder builder; |
473 bool emitsMinus = false; | 472 bool emitsMinus = false; |
474 CString orignalUrl = url.string().ascii(); | 473 CString orignalUrl = url.string().ascii(); |
475 for (const char* string = orignalUrl.data(); *string; ++string) { | 474 for (const char* string = orignalUrl.data(); *string; ++string) { |
476 const char ch = *string; | 475 const char ch = *string; |
477 if (ch == '-' && emitsMinus) { | 476 if (ch == '-' && emitsMinus) { |
478 builder.append("%2D"); | 477 builder.append("%2D"); |
479 emitsMinus = false; | 478 emitsMinus = false; |
480 continue; | 479 continue; |
481 } | 480 } |
482 emitsMinus = ch == '-'; | 481 emitsMinus = ch == '-'; |
483 builder.append(ch); | 482 builder.append(ch); |
484 } | 483 } |
485 CString escapedUrl = builder.toString().ascii(); | 484 CString escapedUrl = builder.toString().ascii(); |
486 return String::format("saved from url=(%04d)%s", static_cast<int>(escapedUrl
.length()), escapedUrl.data()); | 485 return String::format("saved from url=(%04d)%s", static_cast<int>(escapedUrl
.length()), escapedUrl.data()); |
487 } | 486 } |
488 | 487 |
489 } // namespace blink | 488 } // namespace blink |
OLD | NEW |