OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 | 79 |
80 #include "core/HTMLNames.h" | 80 #include "core/HTMLNames.h" |
81 #include "core/dom/Document.h" | 81 #include "core/dom/Document.h" |
82 #include "core/dom/DocumentType.h" | 82 #include "core/dom/DocumentType.h" |
83 #include "core/dom/Element.h" | 83 #include "core/dom/Element.h" |
84 #include "core/editing/serializers/Serialization.h" | 84 #include "core/editing/serializers/Serialization.h" |
85 #include "core/frame/FrameSerializer.h" | 85 #include "core/frame/FrameSerializer.h" |
86 #include "core/html/HTMLAllCollection.h" | 86 #include "core/html/HTMLAllCollection.h" |
87 #include "core/html/HTMLElement.h" | 87 #include "core/html/HTMLElement.h" |
88 #include "core/html/HTMLFormElement.h" | 88 #include "core/html/HTMLFormElement.h" |
| 89 #include "core/html/HTMLFrameOwnerElement.h" |
89 #include "core/html/HTMLHtmlElement.h" | 90 #include "core/html/HTMLHtmlElement.h" |
90 #include "core/html/HTMLMetaElement.h" | 91 #include "core/html/HTMLMetaElement.h" |
91 #include "core/loader/DocumentLoader.h" | 92 #include "core/loader/DocumentLoader.h" |
92 #include "core/loader/FrameLoader.h" | 93 #include "core/loader/FrameLoader.h" |
93 #include "public/platform/WebVector.h" | 94 #include "public/platform/WebVector.h" |
94 #include "web/WebLocalFrameImpl.h" | 95 #include "web/WebLocalFrameImpl.h" |
95 #include "wtf/text/TextEncoding.h" | 96 #include "wtf/text/TextEncoding.h" |
96 | 97 |
97 namespace blink { | 98 namespace blink { |
98 | 99 |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 | 268 |
268 CString encodedContent = param->textEncoding.encode(content, WTF::EntitiesFo
rUnencodables); | 269 CString encodedContent = param->textEncoding.encode(content, WTF::EntitiesFo
rUnencodables); |
269 | 270 |
270 // Send result to the client. | 271 // Send result to the client. |
271 m_client->didSerializeDataForFrame(WebCString(encodedContent), status); | 272 m_client->didSerializeDataForFrame(WebCString(encodedContent), status); |
272 } | 273 } |
273 | 274 |
274 // TODO(yosin): We should utilize |MarkupFormatter| here to share code, | 275 // TODO(yosin): We should utilize |MarkupFormatter| here to share code, |
275 // especially escaping attribute values, done by |WebEntities| |m_htmlEntities| | 276 // especially escaping attribute values, done by |WebEntities| |m_htmlEntities| |
276 // and |m_xmlEntities|. | 277 // and |m_xmlEntities|. |
| 278 void WebFrameSerializerImpl::appendAttribute( |
| 279 StringBuilder& result, |
| 280 bool isHTMLDocument, |
| 281 const String& attrName, |
| 282 const String& attrValue) { |
| 283 result.append(' '); |
| 284 result.append(attrName); |
| 285 result.appendLiteral("=\""); |
| 286 if (isHTMLDocument) |
| 287 result.append(m_htmlEntities.convertEntitiesInString(attrValue)); |
| 288 else |
| 289 result.append(m_xmlEntities.convertEntitiesInString(attrValue)); |
| 290 result.append('\"'); |
| 291 } |
| 292 |
277 void WebFrameSerializerImpl::openTagToString( | 293 void WebFrameSerializerImpl::openTagToString( |
278 Element* element, | 294 Element* element, |
279 SerializeDomParam* param) | 295 SerializeDomParam* param) |
280 { | 296 { |
281 bool needSkip; | 297 bool needSkip; |
282 StringBuilder result; | 298 StringBuilder result; |
283 // Do pre action for open tag. | 299 // Do pre action for open tag. |
284 result.append(preActionBeforeSerializeOpenTag(element, param, &needSkip)); | 300 result.append(preActionBeforeSerializeOpenTag(element, param, &needSkip)); |
285 if (needSkip) | 301 if (needSkip) |
286 return; | 302 return; |
287 // Add open tag | 303 // Add open tag |
288 result.append('<'); | 304 result.append('<'); |
289 result.append(element->nodeName().lower()); | 305 result.append(element->nodeName().lower()); |
| 306 |
| 307 // Find out if this element owns a frame. |
| 308 WebFrame* frame = nullptr; |
| 309 if (element->isFrameOwnerElement()) { |
| 310 frame = WebFrame::fromFrame( |
| 311 toHTMLFrameOwnerElement(element)->contentFrame()); |
| 312 } |
| 313 |
290 // Go through all attributes and serialize them. | 314 // Go through all attributes and serialize them. |
291 AttributeCollection attributes = element->attributes(); | 315 for (const auto& it : element->attributes()) { |
292 AttributeCollection::iterator end = attributes.end(); | 316 const QualifiedName& attrName = it.name(); |
293 for (AttributeCollection::iterator it = attributes.begin(); it != end; ++it)
{ | 317 String attrValue = it.value(); |
294 result.append(' '); | |
295 // Add attribute pair | |
296 result.append(it->name().toString()); | |
297 result.appendLiteral("=\""); | |
298 if (!it->value().isEmpty()) { | |
299 const String& attrValue = it->value(); | |
300 | 318 |
301 // Check whether we need to replace some resource links | 319 // Rewrite the attribute value if requested. |
302 // with local resource paths. | 320 if (element->hasLegalLinkAttribute(attrName)) { |
303 const QualifiedName& attrName = it->name(); | 321 // For links start with "javascript:", we do not change it. |
304 if (element->hasLegalLinkAttribute(attrName)) { | 322 if (!attrValue.startsWith("javascript:", TextCaseInsensitive)) { |
305 // For links start with "javascript:", we do not change it. | 323 // Get the absolute link. |
306 if (attrValue.startsWith("javascript:", TextCaseInsensitive)) { | 324 KURL completeURL = param->document->completeURL(attrValue); |
307 result.append(m_htmlEntities.convertEntitiesInString(attrVal
ue)); | 325 |
| 326 // Check whether we have a local file to link to. |
| 327 WebString rewrittenLink; |
| 328 if (frame && m_delegate->rewriteFrameSource(frame, &rewrittenLin
k)) { |
| 329 attrValue = rewrittenLink; |
| 330 } else if (m_delegate->rewriteLink(completeURL, &rewrittenLink))
{ |
| 331 attrValue = rewrittenLink; |
308 } else { | 332 } else { |
309 // Get the absolute link | 333 attrValue = completeURL; |
310 String completeURL = param->document->completeURL(attrValue)
; | |
311 // Check whether we have local files for those link. | |
312 if (m_localLinks.contains(completeURL)) { | |
313 result.append(m_htmlEntities.convertEntitiesInString(m_l
ocalLinks.get(completeURL))); | |
314 } else { | |
315 result.append(m_htmlEntities.convertEntitiesInString(com
pleteURL)); | |
316 } | |
317 } | 334 } |
318 } else { | |
319 if (param->isHTMLDocument) | |
320 result.append(m_htmlEntities.convertEntitiesInString(attrVal
ue)); | |
321 else | |
322 result.append(m_xmlEntities.convertEntitiesInString(attrValu
e)); | |
323 } | 335 } |
324 } | 336 } |
325 result.append('\"'); | 337 |
| 338 appendAttribute(result, param->isHTMLDocument, attrName.toString(), attr
Value); |
326 } | 339 } |
327 | 340 |
328 // Do post action for open tag. | 341 // Do post action for open tag. |
329 String addedContents = postActionAfterSerializeOpenTag(element, param); | 342 String addedContents = postActionAfterSerializeOpenTag(element, param); |
330 // Complete the open tag for element when it has child/children. | 343 // Complete the open tag for element when it has child/children. |
331 if (element->hasChildren() || param->haveAddedContentsBeforeEnd) | 344 if (element->hasChildren() || param->haveAddedContentsBeforeEnd) |
332 result.append('>'); | 345 result.append('>'); |
333 // Append the added contents generate in post action of open tag. | 346 // Append the added contents generate in post action of open tag. |
334 result.append(addedContents); | 347 result.append(addedContents); |
335 // Save the result to data buffer. | 348 // Save the result to data buffer. |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
403 default: | 416 default: |
404 // For other type node, call default action. | 417 // For other type node, call default action. |
405 saveHTMLContentToBuffer(createMarkup(node), param); | 418 saveHTMLContentToBuffer(createMarkup(node), param); |
406 break; | 419 break; |
407 } | 420 } |
408 } | 421 } |
409 | 422 |
410 WebFrameSerializerImpl::WebFrameSerializerImpl( | 423 WebFrameSerializerImpl::WebFrameSerializerImpl( |
411 WebLocalFrame* frame, | 424 WebLocalFrame* frame, |
412 WebFrameSerializerClient* client, | 425 WebFrameSerializerClient* client, |
413 const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths) | 426 WebFrameSerializer::LinkRewritingDelegate* delegate) |
414 : m_client(client) | 427 : m_client(client) |
| 428 , m_delegate(delegate) |
415 , m_htmlEntities(false) | 429 , m_htmlEntities(false) |
416 , m_xmlEntities(true) | 430 , m_xmlEntities(true) |
417 { | 431 { |
418 // Must specify available webframe. | 432 // Must specify available webframe. |
419 ASSERT(frame); | 433 ASSERT(frame); |
420 m_specifiedWebLocalFrameImpl = toWebLocalFrameImpl(frame); | 434 m_specifiedWebLocalFrameImpl = toWebLocalFrameImpl(frame); |
421 // Make sure we have non 0 client. | 435 // Make sure we have non null client and delegate. |
422 ASSERT(client); | 436 ASSERT(client); |
423 // Build local resources map. | 437 ASSERT(delegate); |
424 for (const auto& it : urlsToLocalPaths) { | |
425 KURL url = it.first; | |
426 ASSERT(!m_localLinks.contains(url.string())); | |
427 m_localLinks.set(url.string(), it.second); | |
428 } | |
429 | 438 |
430 ASSERT(m_dataBuffer.isEmpty()); | 439 ASSERT(m_dataBuffer.isEmpty()); |
431 } | 440 } |
432 | 441 |
433 bool WebFrameSerializerImpl::serialize() | 442 bool WebFrameSerializerImpl::serialize() |
434 { | 443 { |
435 bool didSerialization = false; | 444 bool didSerialization = false; |
436 | 445 |
437 Document* document = m_specifiedWebLocalFrameImpl->frame()->document(); | 446 Document* document = m_specifiedWebLocalFrameImpl->frame()->document(); |
438 const KURL& url = document->url(); | 447 const KURL& url = document->url(); |
(...skipping 18 matching lines...) Expand all Loading... |
457 // Report empty contents for invalid URLs. | 466 // Report empty contents for invalid URLs. |
458 m_client->didSerializeDataForFrame( | 467 m_client->didSerializeDataForFrame( |
459 WebCString(), WebFrameSerializerClient::CurrentFrameIsFinished); | 468 WebCString(), WebFrameSerializerClient::CurrentFrameIsFinished); |
460 } | 469 } |
461 | 470 |
462 ASSERT(m_dataBuffer.isEmpty()); | 471 ASSERT(m_dataBuffer.isEmpty()); |
463 return didSerialization; | 472 return didSerialization; |
464 } | 473 } |
465 | 474 |
466 } // namespace blink | 475 } // namespace blink |
OLD | NEW |