| Index: third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp
|
| diff --git a/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp b/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp
|
| index 49240cb6dd4b3b324852571255d14b00590f0c31..b1ce352001a769cd1f3060912ab3052e67b35a73 100644
|
| --- a/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp
|
| +++ b/third_party/WebKit/Source/web/WebFrameSerializerImpl.cpp
|
| @@ -86,6 +86,7 @@
|
| #include "core/html/HTMLAllCollection.h"
|
| #include "core/html/HTMLElement.h"
|
| #include "core/html/HTMLFormElement.h"
|
| +#include "core/html/HTMLFrameOwnerElement.h"
|
| #include "core/html/HTMLHtmlElement.h"
|
| #include "core/html/HTMLMetaElement.h"
|
| #include "core/loader/DocumentLoader.h"
|
| @@ -274,6 +275,21 @@ void WebFrameSerializerImpl::encodeAndFlushBuffer(
|
| // TODO(yosin): We should utilize |MarkupFormatter| here to share code,
|
| // especially escaping attribute values, done by |WebEntities| |m_htmlEntities|
|
| // and |m_xmlEntities|.
|
| +void WebFrameSerializerImpl::appendAttribute(
|
| + StringBuilder& result,
|
| + bool isHTMLDocument,
|
| + const String& attrName,
|
| + const String& attrValue) {
|
| + result.append(' ');
|
| + result.append(attrName);
|
| + result.appendLiteral("=\"");
|
| + if (isHTMLDocument)
|
| + result.append(m_htmlEntities.convertEntitiesInString(attrValue));
|
| + else
|
| + result.append(m_xmlEntities.convertEntitiesInString(attrValue));
|
| + result.append('\"');
|
| +}
|
| +
|
| void WebFrameSerializerImpl::openTagToString(
|
| Element* element,
|
| SerializeDomParam* param)
|
| @@ -287,42 +303,39 @@ void WebFrameSerializerImpl::openTagToString(
|
| // Add open tag
|
| result.append('<');
|
| result.append(element->nodeName().lower());
|
| +
|
| + // Find out if this element owns a frame.
|
| + WebFrame* frame = nullptr;
|
| + if (element->isFrameOwnerElement()) {
|
| + frame = WebFrame::fromFrame(
|
| + toHTMLFrameOwnerElement(element)->contentFrame());
|
| + }
|
| +
|
| // Go through all attributes and serialize them.
|
| - AttributeCollection attributes = element->attributes();
|
| - AttributeCollection::iterator end = attributes.end();
|
| - for (AttributeCollection::iterator it = attributes.begin(); it != end; ++it) {
|
| - result.append(' ');
|
| - // Add attribute pair
|
| - result.append(it->name().toString());
|
| - result.appendLiteral("=\"");
|
| - if (!it->value().isEmpty()) {
|
| - const String& attrValue = it->value();
|
| -
|
| - // Check whether we need to replace some resource links
|
| - // with local resource paths.
|
| - const QualifiedName& attrName = it->name();
|
| - if (element->hasLegalLinkAttribute(attrName)) {
|
| - // For links start with "javascript:", we do not change it.
|
| - if (attrValue.startsWith("javascript:", TextCaseInsensitive)) {
|
| - result.append(m_htmlEntities.convertEntitiesInString(attrValue));
|
| + for (const auto& it : element->attributes()) {
|
| + const QualifiedName& attrName = it.name();
|
| + String attrValue = it.value();
|
| +
|
| + // Rewrite the attribute value if requested.
|
| + if (element->hasLegalLinkAttribute(attrName)) {
|
| + // For links start with "javascript:", we do not change it.
|
| + if (!attrValue.startsWith("javascript:", TextCaseInsensitive)) {
|
| + // Get the absolute link.
|
| + KURL completeURL = param->document->completeURL(attrValue);
|
| +
|
| + // Check whether we have a local file to link to.
|
| + WebString rewrittenLink;
|
| + if (frame && m_delegate->rewriteFrameSource(frame, &rewrittenLink)) {
|
| + attrValue = rewrittenLink;
|
| + } else if (m_delegate->rewriteLink(completeURL, &rewrittenLink)) {
|
| + attrValue = rewrittenLink;
|
| } else {
|
| - // Get the absolute link
|
| - String completeURL = param->document->completeURL(attrValue);
|
| - // Check whether we have local files for those link.
|
| - if (m_localLinks.contains(completeURL)) {
|
| - result.append(m_htmlEntities.convertEntitiesInString(m_localLinks.get(completeURL)));
|
| - } else {
|
| - result.append(m_htmlEntities.convertEntitiesInString(completeURL));
|
| - }
|
| + attrValue = completeURL;
|
| }
|
| - } else {
|
| - if (param->isHTMLDocument)
|
| - result.append(m_htmlEntities.convertEntitiesInString(attrValue));
|
| - else
|
| - result.append(m_xmlEntities.convertEntitiesInString(attrValue));
|
| }
|
| }
|
| - result.append('\"');
|
| +
|
| + appendAttribute(result, param->isHTMLDocument, attrName.toString(), attrValue);
|
| }
|
|
|
| // Do post action for open tag.
|
| @@ -410,22 +423,18 @@ void WebFrameSerializerImpl::buildContentForNode(
|
| WebFrameSerializerImpl::WebFrameSerializerImpl(
|
| WebLocalFrame* frame,
|
| WebFrameSerializerClient* client,
|
| - const WebVector<std::pair<WebURL, WebString>>& urlsToLocalPaths)
|
| + WebFrameSerializer::LinkRewritingDelegate* delegate)
|
| : m_client(client)
|
| + , m_delegate(delegate)
|
| , m_htmlEntities(false)
|
| , m_xmlEntities(true)
|
| {
|
| // Must specify available webframe.
|
| ASSERT(frame);
|
| m_specifiedWebLocalFrameImpl = toWebLocalFrameImpl(frame);
|
| - // Make sure we have non 0 client.
|
| + // Make sure we have non null client and delegate.
|
| ASSERT(client);
|
| - // Build local resources map.
|
| - for (const auto& it : urlsToLocalPaths) {
|
| - KURL url = it.first;
|
| - ASSERT(!m_localLinks.contains(url.string()));
|
| - m_localLinks.set(url.string(), it.second);
|
| - }
|
| + ASSERT(delegate);
|
|
|
| ASSERT(m_dataBuffer.isEmpty());
|
| }
|
|
|