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

Side by Side Diff: Source/core/page/PageSerializer.cpp

Issue 813453002: Oilpan: have PageSerializer accurately handle its GCed references. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years 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 unified diff | Download patch
« no previous file with comments | « Source/core/page/PageSerializer.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
71 namespace blink { 71 namespace blink {
72 72
73 static bool isCharsetSpecifyingNode(const Node& node) 73 static bool isCharsetSpecifyingNode(const Node& node)
74 { 74 {
75 if (!isHTMLMetaElement(node)) 75 if (!isHTMLMetaElement(node))
76 return false; 76 return false;
77 77
78 const HTMLMetaElement& element = toHTMLMetaElement(node); 78 const HTMLMetaElement& element = toHTMLMetaElement(node);
79 HTMLAttributeList attributeList; 79 HTMLAttributeList attributeList;
80 AttributeCollection attributes = element.attributes(); 80 AttributeCollection attributes = element.attributes();
81 for (const Attribute& attr : attributes) { 81 for (const Attribute& attr: attributes) {
82 // FIXME: We should deal appropriately with the attribute if they have a namespace. 82 // FIXME: We should deal appropriately with the attribute if they have a namespace.
83 attributeList.append(std::make_pair(attr.name().localName(), attr.value( ).string())); 83 attributeList.append(std::make_pair(attr.name().localName(), attr.value( ).string()));
84 } 84 }
85 WTF::TextEncoding textEncoding = encodingFromMetaAttributes(attributeList); 85 WTF::TextEncoding textEncoding = encodingFromMetaAttributes(attributeList);
86 return textEncoding.isValid(); 86 return textEncoding.isValid();
87 } 87 }
88 88
89 static bool shouldIgnoreElement(const Element& element) 89 static bool shouldIgnoreElement(const Element& element)
90 { 90 {
91 return isHTMLScriptElement(element) || isHTMLNoScriptElement(element) || isC harsetSpecifyingNode(element); 91 return isHTMLScriptElement(element) || isHTMLNoScriptElement(element) || isC harsetSpecifyingNode(element);
92 } 92 }
93 93
94 static const QualifiedName& frameOwnerURLAttributeName(const HTMLFrameOwnerEleme nt& frameOwner) 94 static const QualifiedName& frameOwnerURLAttributeName(const HTMLFrameOwnerEleme nt& frameOwner)
95 { 95 {
96 // FIXME: We should support all frame owners including applets. 96 // FIXME: We should support all frame owners including applets.
97 return isHTMLObjectElement(frameOwner) ? HTMLNames::dataAttr : HTMLNames::sr cAttr; 97 return isHTMLObjectElement(frameOwner) ? HTMLNames::dataAttr : HTMLNames::sr cAttr;
98 } 98 }
99 99
100 class SerializerMarkupAccumulator final : public MarkupAccumulator { 100 class SerializerMarkupAccumulator final : public MarkupAccumulator {
101 STACK_ALLOCATED();
101 public: 102 public:
102 SerializerMarkupAccumulator(PageSerializer*, const Document&, WillBeHeapVect or<RawPtrWillBeMember<Node>>*); 103 SerializerMarkupAccumulator(PageSerializer*, const Document&, WillBeHeapVect or<RawPtrWillBeMember<Node>>*);
103 virtual ~SerializerMarkupAccumulator(); 104 virtual ~SerializerMarkupAccumulator();
104 105
105 protected: 106 protected:
106 virtual void appendText(StringBuilder& out, Text&) override; 107 virtual void appendText(StringBuilder& out, Text&) override;
107 virtual void appendElement(StringBuilder& out, Element&, Namespaces*) overri de; 108 virtual void appendElement(StringBuilder& out, Element&, Namespaces*) overri de;
108 virtual void appendCustomAttributes(StringBuilder& out, const Element&, Name spaces*) override; 109 virtual void appendCustomAttributes(StringBuilder& out, const Element&, Name spaces*) override;
109 virtual void appendEndTag(const Element&) override; 110 virtual void appendEndTag(const Element&) override;
110 111
111 private: 112 private:
112 PageSerializer* m_serializer; 113 RawPtrWillBeMember<PageSerializer> m_serializer;
113 const Document& m_document; 114 RawPtrWillBeMember<const Document> m_document;
114 }; 115 };
115 116
116 SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer* seriali zer, const Document& document, WillBeHeapVector<RawPtrWillBeMember<Node>>* nodes ) 117 SerializerMarkupAccumulator::SerializerMarkupAccumulator(PageSerializer* seriali zer, const Document& document, WillBeHeapVector<RawPtrWillBeMember<Node>>* nodes )
117 : MarkupAccumulator(nodes, ResolveAllURLs, nullptr) 118 : MarkupAccumulator(nodes, ResolveAllURLs, nullptr)
118 , m_serializer(serializer) 119 , m_serializer(serializer)
119 , m_document(document) 120 , m_document(&document)
120 { 121 {
121 } 122 }
122 123
123 SerializerMarkupAccumulator::~SerializerMarkupAccumulator() 124 SerializerMarkupAccumulator::~SerializerMarkupAccumulator()
124 { 125 {
125 } 126 }
126 127
127 void SerializerMarkupAccumulator::appendText(StringBuilder& out, Text& text) 128 void SerializerMarkupAccumulator::appendText(StringBuilder& out, Text& text)
128 { 129 {
129 Element* parent = text.parentElement(); 130 Element* parent = text.parentElement();
130 if (parent && !shouldIgnoreElement(*parent)) 131 if (parent && !shouldIgnoreElement(*parent))
131 MarkupAccumulator::appendText(out, text); 132 MarkupAccumulator::appendText(out, text);
132 } 133 }
133 134
134 void SerializerMarkupAccumulator::appendElement(StringBuilder& out, Element& ele ment, Namespaces* namespaces) 135 void SerializerMarkupAccumulator::appendElement(StringBuilder& out, Element& ele ment, Namespaces* namespaces)
135 { 136 {
136 if (!shouldIgnoreElement(element)) 137 if (!shouldIgnoreElement(element))
137 MarkupAccumulator::appendElement(out, element, namespaces); 138 MarkupAccumulator::appendElement(out, element, namespaces);
138 139
139 if (isHTMLHeadElement(element)) { 140 if (isHTMLHeadElement(element)) {
140 out.appendLiteral("<meta charset=\""); 141 out.appendLiteral("<meta charset=\"");
141 out.append(m_document.charset()); 142 out.append(m_document->charset());
142 out.appendLiteral("\">"); 143 out.appendLiteral("\">");
143 } 144 }
144 145
145 // FIXME: For object (plugins) tags and video tag we could replace them by a n image of their current contents. 146 // FIXME: For object (plugins) tags and video tag we could replace them by a n image of their current contents.
146 } 147 }
147 148
148 void SerializerMarkupAccumulator::appendCustomAttributes(StringBuilder& out, con st Element& element, Namespaces* namespaces) 149 void SerializerMarkupAccumulator::appendCustomAttributes(StringBuilder& out, con st Element& element, Namespaces* namespaces)
149 { 150 {
150 if (!element.isFrameOwnerElement()) 151 if (!element.isFrameOwnerElement())
151 return; 152 return;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 return; 207 return;
207 } 208 }
208 209
209 WillBeHeapVector<RawPtrWillBeMember<Node>> serializedNodes; 210 WillBeHeapVector<RawPtrWillBeMember<Node>> serializedNodes;
210 SerializerMarkupAccumulator accumulator(this, document, &serializedNodes); 211 SerializerMarkupAccumulator accumulator(this, document, &serializedNodes);
211 String text = accumulator.serializeNodes(document, IncludeNode); 212 String text = accumulator.serializeNodes(document, IncludeNode);
212 CString frameHTML = textEncoding.normalizeAndEncode(text, WTF::EntitiesForUn encodables); 213 CString frameHTML = textEncoding.normalizeAndEncode(text, WTF::EntitiesForUn encodables);
213 m_resources->append(SerializedResource(url, document.suggestedMIMEType(), Sh aredBuffer::create(frameHTML.data(), frameHTML.length()))); 214 m_resources->append(SerializedResource(url, document.suggestedMIMEType(), Sh aredBuffer::create(frameHTML.data(), frameHTML.length())));
214 m_resourceURLs.add(url); 215 m_resourceURLs.add(url);
215 216
216 for (Node* node : serializedNodes) { 217 for (Node* node: serializedNodes) {
217 ASSERT(node); 218 ASSERT(node);
218 if (!node->isElementNode()) 219 if (!node->isElementNode())
219 continue; 220 continue;
220 221
221 Element& element = toElement(*node); 222 Element& element = toElement(*node);
222 // We have to process in-line style as it might contain some resources ( typically background images). 223 // We have to process in-line style as it might contain some resources ( typically background images).
223 if (element.isStyledElement()) 224 if (element.isStyledElement())
224 retrieveResourcesForProperties(element.inlineStyle(), document); 225 retrieveResourcesForProperties(element.inlineStyle(), document);
225 226
226 if (isHTMLImageElement(element)) { 227 if (isHTMLImageElement(element)) {
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 322
322 RefPtr<SharedBuffer> data = imageRenderer ? image->imageForRenderer(imageRen derer)->data() : nullptr; 323 RefPtr<SharedBuffer> data = imageRenderer ? image->imageForRenderer(imageRen derer)->data() : nullptr;
323 if (!data) 324 if (!data)
324 data = image->image()->data(); 325 data = image->image()->data();
325 326
326 addToResources(image, data, url); 327 addToResources(image, data, url);
327 } 328 }
328 329
329 void PageSerializer::addFontToResources(FontResource* font) 330 void PageSerializer::addFontToResources(FontResource* font)
330 { 331 {
331 if (!font || !shouldAddURL(font->url()) || !font->isLoaded() || !font->resou rceBuffer()) { 332 if (!font || !shouldAddURL(font->url()) || !font->isLoaded() || !font->resou rceBuffer())
332 return; 333 return;
333 } 334
334 RefPtr<SharedBuffer> data(font->resourceBuffer()); 335 RefPtr<SharedBuffer> data(font->resourceBuffer());
335 336
336 addToResources(font, data, font->url()); 337 addToResources(font, data, font->url());
337 } 338 }
338 339
339 void PageSerializer::retrieveResourcesForProperties(const StylePropertySet* styl eDeclaration, Document& document) 340 void PageSerializer::retrieveResourcesForProperties(const StylePropertySet* styl eDeclaration, Document& document)
340 { 341 {
341 if (!styleDeclaration) 342 if (!styleDeclaration)
342 return; 343 return;
343 344
(...skipping 26 matching lines...) Expand all
370 addFontToResources(fontFaceSrcValue->fetch(&document)); 371 addFontToResources(fontFaceSrcValue->fetch(&document));
371 } else if (cssValue->isValueList()) { 372 } else if (cssValue->isValueList()) {
372 CSSValueList* cssValueList = toCSSValueList(cssValue); 373 CSSValueList* cssValueList = toCSSValueList(cssValue);
373 for (unsigned i = 0; i < cssValueList->length(); i++) 374 for (unsigned i = 0; i < cssValueList->length(); i++)
374 retrieveResourcesForCSSValue(cssValueList->item(i), document); 375 retrieveResourcesForCSSValue(cssValueList->item(i), document);
375 } 376 }
376 } 377 }
377 378
378 KURL PageSerializer::urlForBlankFrame(LocalFrame* frame) 379 KURL PageSerializer::urlForBlankFrame(LocalFrame* frame)
379 { 380 {
380 HashMap<LocalFrame*, KURL>::iterator iter = m_blankFrameURLs.find(frame); 381 BlankFrameURLMap::iterator iter = m_blankFrameURLs.find(frame);
381 if (iter != m_blankFrameURLs.end()) 382 if (iter != m_blankFrameURLs.end())
382 return iter->value; 383 return iter->value;
383 String url = "wyciwyg://frame/" + String::number(m_blankFrameCounter++); 384 String url = "wyciwyg://frame/" + String::number(m_blankFrameCounter++);
384 KURL fakeURL(ParsedURLString, url); 385 KURL fakeURL(ParsedURLString, url);
385 m_blankFrameURLs.add(frame, fakeURL); 386 m_blankFrameURLs.add(frame, fakeURL);
386 387
387 return fakeURL; 388 return fakeURL;
388 } 389 }
389 390
390 } 391 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/page/PageSerializer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698