Bug 1385272 - Make plaintext serializer not crash when a <tr> is a child of a <tr>. r=Ehsan

MozReview-Commit-ID: CMNIWYX8R07

--HG--
extra : rebase_source : 0b245f01c4c7aa4b78853534584876a23689826c
This commit is contained in:
Henri Sivonen 2017-08-14 14:24:51 +03:00
Родитель 14cf46a41a
Коммит 057b37715a
3 изменённых файлов: 39 добавлений и 1 удалений

Просмотреть файл

@ -0,0 +1,29 @@
<html>
<head>
<script>
try { o1 = document.createElement("tr") } catch(e) { }
try { o2 = document.createElement("td") } catch(e) { }
try { o3 = document.createElement("tr") } catch(e) { }
try { o4 = document.createElement("div") } catch(e) { }
try { o5 = document.createElement("input") } catch(e) { }
try { o6 = document.createElement('map') } catch(e) { }
try { o7 = document.createElement('select') } catch(e) { }
try { o8 = document.createElement("canvas") } catch(e) { }
try { o9 = document.createElement("area") } catch(e) { };
try { o1.appendChild(o2) } catch(e) { }
try { document.documentElement.appendChild(o3) } catch(e) { }
try { document.documentElement.appendChild(o4) } catch(e) { }
try { document.documentElement.appendChild(o6) } catch(e) { }
try { o3.appendChild(o7) } catch(e) { }
try { o4.appendChild(o8) } catch(e) { }
try { o3.appendChild(o5); } catch(e) { }
try { o3.appendChild(o1); } catch(e) { }
try { o6.contentEditable = "true" } catch(e) { };
try { o6.offsetHeight } catch(e) { };
try { o4.appendChild(o9) } catch(e) { };
try { o2.insertAdjacentHTML("beforeBegin", "<button id='id0'></button>\n"); } catch(e) { }
try { document.replaceChild(document.documentElement, document.documentElement); } catch(e) { }
try { document.execCommand("selectall",false,null) } catch(e) { }
</script>
</head>
</html>

Просмотреть файл

@ -221,3 +221,4 @@ load xhr_empty_datauri.html
load xhr_html_nullresponse.html
load 1383478.html
load 1383780.html
pref(clipboard.autocopy,true) load 1385272-1.html

Просмотреть файл

@ -1018,6 +1018,14 @@ nsDocumentEncoder::EncodeToString(nsAString& aOutputString)
return EncodeToStringWithMaxLength(0, aOutputString);
}
static bool ParentIsTR(nsIContent* aContent) {
mozilla::dom::Element* parent = aContent->GetParentElement();
if (!parent) {
return false;
}
return parent->IsHTMLElement(nsGkAtoms::tr);
}
NS_IMETHODIMP
nsDocumentEncoder::EncodeToStringWithMaxLength(uint32_t aMaxLength,
nsAString& aOutputString)
@ -1088,7 +1096,7 @@ nsDocumentEncoder::EncodeToStringWithMaxLength(uint32_t aMaxLength,
NS_ENSURE_SUCCESS(rv, rv);
}
nsCOMPtr<nsIContent> content = do_QueryInterface(node);
if (content && content->IsHTMLElement(nsGkAtoms::tr)) {
if (content && content->IsHTMLElement(nsGkAtoms::tr) && !ParentIsTR(content)) {
nsINode* n = content;
if (!prevNode) {
// Went from a non-<tr> to a <tr>