mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:30:27 +00:00
import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1152171 part 2 - Rename AnimationTimeline to DocumentTimeline; r=smaug (26c118319) - Bug 1152171 part 3 - Update web-platform-tests expectations; r=jgraham (b7b4032aa) - Bug 1153734 part 1 - Remove AnimationEffect; r=smaug (9cf67a02e) - Bug 1153734 part 2 - Rename Animation to KeyframeEffectReadonly; r=smaug (b69556ee6) - Bug 1153734 part 3 - Rename AnimationPlayer.source to AnimationPlayer.effect; r=smaug (50d3130ee) - Bug 1153734 part 4 - Rename other uses of 'source' and 'source content'; r=jwatt (b02c4ba36) - Bug 1153734 part 5 - Add AnimationEffectReadonly as a superinterface of KeyframeEffectReadonly; r=smaug (c3395d3f5) - Bug 1149990 - Support replaying of finished CSS transitions by supporting setting of currentTime/startTime. r=birtles (3fb2cb401) - Bug 1154615 part 1 - Rename AnimationPlayer to Animation in WebIDL; r=smaug (6c2125b49) - Bug 1154615 part 2 - Rename PendingPlayerTracker to PendingAnimationTracker; r=jwatt (8d6804def) - Bug 1154615 part 3 - Rename internal members of PendingAnimationTracker; r=jwatt (f348f6355) - Bug 1154615 part 4 - Rename references to players in dom/animation; r=jwatt (0250572e8) - Bug 1117603 part 1 - Don't assume style rules have been refreshed in GetAnimationRule; r=dbaron (a5d340d0f) - remove kungFuDeathGrip (49df758e6) - Bug 1117603 part 2 - Don't unregister from the refresh driver unless we are also queueing events; r=dbaron (715c9caa1) - Bug 1154615 part 5 - Rename AnimationPlayerCollection to AnimationCollection; r=jwatt (4c596f089) - Bug 1154615 part 6 - Rename references to players within layout/; r=jwatt (42405f3fc) - Bug 1154615 part 7 - Rename CSSAnimationPlayer and CSSTransitionPlayer; r=jwatt (49ab272ed) - Bug 1154615 part 8 - Rename references to players in animation observers; r=jwatt (c3fa26d7a) - Bug 1154615 part 9 - Rename test files; r=jwatt (9d9f03e7b) - Bug 1145439 (Part 1) - Throttle requestAnimationFrame for non-visible iframes. r=mstange,mchang (be7d183d6) - Bug 1145439 (Part 2) - Make test_scroll_event_ordering.html wait for rAF to unthrottle. r=roc (9ac8317c9) - Bug 1144324 - Try to register for, and handle, touch events when APZ is enabled. r=dvander,jimm (fb75d1665) - Bug 1144324 - Remove the codepaths that conditionally enable touch events based on touch the presence of touch listeners. r=smaug,jimm (710617e6b) - Bug 1003991 - Disable https:// only load for ServiceWorkers when Developer Tools are open. r=nsm, r=miker (9d6669814) - Bug 1153267 - part 1 - use smart-pointer .forget() instead of NS_ADDREF+assign; r=ehsan (e4555c90c) - Bug 1153267 - part 2 - use smart pointers instead of manual NS_ADDREF'ing outparams; r=ehsan (ae8b60d5a) - Bug 1153267 - fix typo that broke OS X builds on a CLOSED TREE; r=bustage (08fdb3c4f) - Bug 1146843 - Revert part of cset 33c30e283fa8 because the code is used in Fennec. r=snorp (407248257) - Bug 1151940 part 1. Make some readonly properties defined on Window by CSSOM-view replaceable. r=smaug (5cb9b91f0) - Bug 1151940 part 2. Add a convenience function in nsGlobalWindow for replacing a property on the window with a new value. r=smaug (2ba39331c) - Bug 1151940 part 3. Make some writable cssom-view attributes that we only allow setting from chrome act the way readonly replaceables would when called from content. r=smaug (b485e1b44) - Goanna -> Gecko (2c539d7be) - Goanna -> Gecko (25d34e213) - Bug 1148962 - Use TakeOwnershipOfErrorReporting in CPOW code (r=bholley) (96c997639) - pointer style (a07fbffaa) - Bug 1152577: Add 'aReason' argument to AutoEntryScript constructor, and provide plausible names for its instantiations. r=bholley (512fa27e2) - bug 1155691 - Expose WindowRoot to chrome from window in webidl. r=smaug (235281924) - Bug 404828 - No need to assert that the top window isn't reachable. r=smaug (d73154fa0) - Bug 404828 - Followup: remove assertion expectations on a CLOSED TREE. a=tomcat (a5dabe1b7) - Bug 1156102 - Mark nsGlobalWindowObserver::mWindow as MOZ_NON_OWNING_REF; r=baku (c0d4208b7) - Bug 1107801 - Improve gamepad support on MacOS. r=ted (c591bd5ac) - Goanna -> Gecko (d9b81bc9e) - Bug 852944 - Gamepad API IPC; r=ted, r=baku (521892538) - Bug 1143529 part 1. Stop manually calling WrapObject in DataStoreService::GetDataStoresResolve. r=baku (056ad6bfe) - Bug 1143529 part 2. Tighten up the assert in binding Wrap methods. r=peterv (765a13325) - Bug 1152169 - DataStoreService should check if the first revision exists, r=bent (ee371cc5d) - Bug 1152169 followup: Mark FirstRevisionIdCallback methods Run() and HandleEvent() as 'override'. rs=ehsan (8186c4168) - Bug 1143651 - don't use CallQueryInterface when the compiler can do the cast for us; r=ehsan (a50f0a54b) - Bug 1144322 - Handle tabindex in overridden IsInteractiveHTMLContent methods. r=smaug (fd4b9beed) - Bug 1086684 - Stash the full path for file inputs to avoid doing IPC at inopportune times. r=ehsan/bent/gps (b843b1efc) - Bug 1143934 - Disallow mozSetFileNameArray in content processes. r=ehsan (42e5c8c6d) - Bug 1143934 - Fix assorted forms mochitests for e10s-compatibility. r=smaug (7a3babfed) - Bug 1143934 - Work around SessionStore dependency on current brokenness. r=ttaubert (5b0fcb5ce) - Bug 956530 - Clear the delayed caret data when clicking on a selected part of a text control if the focus event handler selects the control; r=roc (2859f07b4) - Bug 956530 follow-up: Fix the test failure on Windows 8 caused by the text box having a glowing outline as a result of being clicked on (d34e8da1a) - Bug 1157898 part 1. Make code of the form "return rv.ErrorCode();" where rv is an ErrorResult use StealNSResult instead. r=peterv (800da50e2) - Bug 1157898 part 2. Make code of the form "NS_ENSURE_SUCCESS(rv.ErrorCode(), rv.ErrorCode());" use Failed and StealNSResult instead. r=peterv (472432a83) - Bug 1157898 part 3. Fix the remaining consumers of rv.ErrorCode() in NS_ENSURE_* expressions to not do that. r=peterv (d452807e7) - Bug 1122238 part 1. Switch to using the new stackframe APIs in JSStackFrame. r=bholley (9d87b261a) - Bug 1122238 part 2. Stop caching things in JSStackFrame when we're called over Xrays. r=bholley (83eda7275) - Bug 1122238 part 3. Drop all the DOMException-cloning and sanitization gunk we added in bug 1107592 and bug 1107953 and bug 1117242 . r=bholley (f237aa948) - add support for NetBSD/SPARC64 (065783b70) - Bug 1153484 - Fetch should ignore invalid headers, but still process later headers. r=nsm (8925ddd77) - Bug 1157754 part 2. Convert consumers of ErrorResult::ClearMessage() to the new better APIs we have for suppressing exceptions on ErrorResult. r=bkelly (6519fbd5e) - Bug 1157754 part 3. Make ClearMessage private on ErrorResult. r=peterv (3fb218692) - Bug 1157898 part 4. Add ErrorResult::ErrorCodeIs() and use it in various places to get rid of ErrorCode(). r=peterv (bed7bfb4c) - Bug 1130686 - Refactor PromiseHolder in the service worker clients code. r=nsm (b3dbdcbfe) - Bug 1130686 - Implement client.focus. r=baku (5dee6d850) - Bug 1149163 part 1 - Clean up nsHTMLEditRules::GetInnerContent; r=froydnj (cc8f65b54) - Bug 1149163 part 2 - Make nsDOMIterator infallible; r=froydnj (d975f6c62) - Bug 1149163 part 3 - Clean up nsHTMLEditRules::BustUpInlinesAtBRs; r=froydnj (58155adad) - Bug 1149163 part 4 - Allow use of temporary nsBoolDomIterFunctor; r=froydnj (dbafec00f) - Bug 1149163 part 5 - Clean up nsHTMLEditRules::GetNodesForOperation; r=froydnj (41179d810) - Bug 1149163 part 6 - Clean up nsHTMLEditRules::LookInsideDivBQandList; r=froydnj (0b757bf14) - Bug 1149163 part 7 - Clean up nsHTMLEditRules::PromoteRange; r=froydnj (c49c714b1) - Bug 1149163 part 8 - Clean up nsHTMLEditRules::GetPromotedRanges; r=froydnj (5163a0026) - Bug 1148228 - Stop checking ul twice (43a22088c) - Bug 1141017 - resurrect serif and monospace. r=ehsan (95a1b6fcf) - Bug 1147412 part 1 - Make methods take nsINode*, not just nsIContent*; r=ehsan (7f762cdbe) - Bug 1147412 part 2 - Clean up nsHTMLEditor::SetInlinePropertyOnTextNode; r=ehsan (faf805587) - Bug 1147412 part 3 - Fix completely broken nsHTMLCSSUtils::IsCSSEquivalentToHTMLInlineStyleSet implementation; r=ehsan (73fea67c1) - Bug 1147412 part 4 - Clean up nsHTMLEditor::GetInlinePropertyBase; r=ehsan (3265bfbce) - Bug 1147412 part 5 - Clean up nsHTMLEditor::RemoveInlinePropertyImpl; r=ehsan (0f402bd7e) - Bug 1147412 part 6 - Remove nsHTMLCSSUtils::IsCSSEditableProperty(nsIDOMNode*,...); r=ehsan (100e4038a) - Bug 1147412 part 7 - Remove nsHTMLCSSUtils::GetComputedStyle(nsIDOMElement*); r=ehsan (6c51103bc) - Bug 1147412 part 8 - Clean up nsHTMLCSSUtils::IsCSSInvertible; r=ehsan (01e60c446) - Bug 1147412 part 9 - Convert some nsHTMLEditor members to Element; r=ehsan (e7efb1ac4) - Bug 1147412 part 10 - Clean up nsHTMLCSSUtils::Get*Property, GetCSSInlinePropertyBase; r=ehsan (54154143d) - Bug 1149163 part 9 - Clean up nsHTMLEditRules::GetNodesFromSelection; r=froydnj (5186308b9) - Bug 1154701 part 1 - Clean up nsHTMLEditor::CreateListOfNodesToPaste; r=ehsan (ea95238d5) - Bug 1153629 part 1 - Clean up nsHTMLEditRules::GetListActionNodes; r=ehsan (51f3b3e95) - Bug 1153629 part 2 - Clean up nsHTMLEditRules::GetParagraphFormatNodes; r=ehsan (a27bd7751) - Bug 1153629 part 3 - Clean up nsHTMLEditRules::GetNodesFromPoint; r=ehsan (edc7e4561) - Bug 1153629 part 4 - Clean up nsHTMLEditRules::ListIsEmptyLine; r=ehsan (ce3289bc7) - Bug 1153629 part 5 - Clean up nsHTMLEditRules::GetChildNodesForOperation; r=ehsan (b3a509dbf) - Bug 1153629 part 6 - Clean up nsHTMLEditRules::MakeBlockquote; r=ehsan (cb3808182) - Bug 1153629 part 7 - Clean up nsHTMLEditRules::RemoveBlockStyle, RemovePartOfBlock; r=ehsan (660b9f76e) - Bug 1153629 part 8 - Clean up nsHTMLEditRules::ApplyBlockStyle; r=ehsan (f54f9538c) - Bug 1153629 part 9 - Clean up nsHTMLEditRules::MakeTransitionList; r=ehsan (fb63cf6d8) - Bug 1153629 part 10 - Clean up nsHTMLEditRules::AlignInnerBlocks; r=ehsan (752d2df7a) - Bug 1153629 part 11 - Clean up nsHTMLEditRules::AdjustSpecialBreaks; r=ehsan (16ef0416b) - Bug 1153629 part 12 - Clean up nsHTMLEditRules::RemoveEmptyNodes; r=ehsan (d528e70e6) - Bug 1154701 part 2 - Use more OwningNonNull in editor; r=ehsan (85b1929e6) - Bug 1154701 part 3 - Clean up nsHTMLEditor::GetListAndTableParents, DiscoverPartialListsAndTables, ScanForListAndTableStructure, ReplaceOrphanedStructure; r=ehsan (7fe31f058) - Bug 1154701 part 4 - Switch nsHTMLEditor::mContentFilters to nsTArray; r=ehsan (64e6dd160) - Bug 1154701 part 5 - Switch nsHTMLEditor::objectResizeEventListeners to nsTArray; r=ehsan (036bc65fe) - Bug 1154701 part 6 - Clean up nsHTMLEditor::SetInlinePropertyOnNodeImpl; r=ehsan (2d619ca16) - Bug 1154701 part 7 - Clean up nsHTMLEditor::SetInlineProperty; r=ehsan (7a367d31b) - Bug 1154701 part 8 - Clean up nsHTMLEditor::SetInlinePropertyOnNode; r=ehsan (707c07d93) - Bug 1154701 part 9 - Clean up nsHTMLEditor::RelativeFontChange; r=ehsan (273ae9c64) - Bug 1154701 part 10 - Switch nsEditor::mActionListeners to nsTArray; r=ehsan (d2b5732fe) - Bug 1154701 part 11 - Switch nsEditor::mEditorObservers to nsTArray; r=ehsan (25a5af12e) - Bug 1154701 part 12 - Switch nsEditor::mDocStateListeners to nsTArray; r=ehsan (665af0792) - Bug 1154701 part 13 - Clean up nsHTMLEditor::SetCSSBackgroundColor; r=ehsan (ba424ade8) - Bug 1154701 part 14 - Remove unused nsCOMArray cruft; r=ehsan (3a8679a67) - Bug 1101651 - Part 1: xpcomrt version of dom media library need for standalone webrtcs. r=jesup (ae37b5464) - Bug 1137447 - New app update telemetry for patch type (complete or partial), extended error codes, and general cleanup. r=bbondy (c736ae502)
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "mozilla/dom/DocumentFragment.h"
|
||||
#include "mozilla/dom/OwningNonNull.h"
|
||||
#include "mozilla/ArrayUtils.h"
|
||||
#include "mozilla/Base64.h"
|
||||
#include "mozilla/BasicEvents.h"
|
||||
@@ -14,7 +15,6 @@
|
||||
#include "mozilla/dom/Selection.h"
|
||||
#include "nsAString.h"
|
||||
#include "nsAutoPtr.h"
|
||||
#include "nsCOMArray.h"
|
||||
#include "nsCOMPtr.h"
|
||||
#include "nsCRT.h"
|
||||
#include "nsCRTGlue.h"
|
||||
@@ -102,39 +102,6 @@ static nsresult RemoveFragComments(nsCString &theStr);
|
||||
static void RemoveBodyAndHead(nsIDOMNode *aNode);
|
||||
static nsresult FindTargetNode(nsIDOMNode *aStart, nsCOMPtr<nsIDOMNode> &aResult);
|
||||
|
||||
static nsCOMPtr<nsIDOMNode> GetListParent(nsIDOMNode* aNode)
|
||||
{
|
||||
NS_ENSURE_TRUE(aNode, nullptr);
|
||||
nsCOMPtr<nsIDOMNode> parent, tmp;
|
||||
aNode->GetParentNode(getter_AddRefs(parent));
|
||||
while (parent)
|
||||
{
|
||||
if (nsHTMLEditUtils::IsList(parent)) {
|
||||
return parent;
|
||||
}
|
||||
parent->GetParentNode(getter_AddRefs(tmp));
|
||||
parent = tmp;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
static nsCOMPtr<nsIDOMNode> GetTableParent(nsIDOMNode* aNode)
|
||||
{
|
||||
NS_ENSURE_TRUE(aNode, nullptr);
|
||||
nsCOMPtr<nsIDOMNode> parent, tmp;
|
||||
aNode->GetParentNode(getter_AddRefs(parent));
|
||||
while (parent)
|
||||
{
|
||||
if (nsHTMLEditUtils::IsTable(parent)) {
|
||||
return parent;
|
||||
}
|
||||
parent->GetParentNode(getter_AddRefs(tmp));
|
||||
parent = tmp;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
||||
nsresult
|
||||
nsHTMLEditor::LoadHTML(const nsAString & aInputString)
|
||||
{
|
||||
@@ -321,13 +288,21 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
// this is work to be completed at a later date (probably by jfrancis)
|
||||
|
||||
// make a list of what nodes in docFrag we need to move
|
||||
nsCOMArray<nsIDOMNode> nodeList;
|
||||
rv = CreateListOfNodesToPaste(fragmentAsNode, nodeList,
|
||||
streamStartParent, streamStartOffset,
|
||||
streamEndParent, streamEndOffset);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsTArray<OwningNonNull<nsINode>> nodeList;
|
||||
nsCOMPtr<nsINode> fragmentAsNodeNode = do_QueryInterface(fragmentAsNode);
|
||||
NS_ENSURE_STATE(fragmentAsNodeNode || !fragmentAsNode);
|
||||
nsCOMPtr<nsINode> streamStartParentNode =
|
||||
do_QueryInterface(streamStartParent);
|
||||
NS_ENSURE_STATE(streamStartParentNode || !streamStartParent);
|
||||
nsCOMPtr<nsINode> streamEndParentNode =
|
||||
do_QueryInterface(streamEndParent);
|
||||
NS_ENSURE_STATE(streamEndParentNode || !streamEndParent);
|
||||
CreateListOfNodesToPaste(*static_cast<DocumentFragment*>(fragmentAsNodeNode.get()),
|
||||
nodeList,
|
||||
streamStartParentNode, streamStartOffset,
|
||||
streamEndParentNode, streamEndOffset);
|
||||
|
||||
if (nodeList.Count() == 0) {
|
||||
if (nodeList.Length() == 0) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
@@ -352,9 +327,9 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
// but if not we want to delete _contents_ of cells and replace
|
||||
// with non-table elements. Use cellSelectionMode bool to
|
||||
// indicate results.
|
||||
nsIDOMNode* firstNode = nodeList[0];
|
||||
if (!nsHTMLEditUtils::IsTableElement(firstNode))
|
||||
if (!nsHTMLEditUtils::IsTableElement(nodeList[0])) {
|
||||
cellSelectionMode = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!cellSelectionMode)
|
||||
@@ -402,7 +377,8 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
NS_ENSURE_TRUE(parentNode, NS_ERROR_FAILURE);
|
||||
|
||||
// Adjust position based on the first node we are going to insert.
|
||||
NormalizeEOLInsertPosition(nodeList[0], address_of(parentNode), &offsetOfNewNode);
|
||||
NormalizeEOLInsertPosition(GetAsDOMNode(nodeList[0]),
|
||||
address_of(parentNode), &offsetOfNewNode);
|
||||
|
||||
// if there are any invisible br's after our insertion point, remove them.
|
||||
// this is because if there is a br at end of what we paste, it will make
|
||||
@@ -431,16 +407,15 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
|
||||
// build up list of parents of first node in list that are either
|
||||
// lists or tables. First examine front of paste node list.
|
||||
nsCOMArray<nsIDOMNode> startListAndTableArray;
|
||||
rv = GetListAndTableParents(false, nodeList, startListAndTableArray);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsTArray<OwningNonNull<Element>> startListAndTableArray;
|
||||
GetListAndTableParents(StartOrEnd::start, nodeList,
|
||||
startListAndTableArray);
|
||||
|
||||
// remember number of lists and tables above us
|
||||
int32_t highWaterMark = -1;
|
||||
if (startListAndTableArray.Count() > 0)
|
||||
{
|
||||
rv = DiscoverPartialListsAndTables(nodeList, startListAndTableArray, &highWaterMark);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (startListAndTableArray.Length() > 0) {
|
||||
highWaterMark = DiscoverPartialListsAndTables(nodeList,
|
||||
startListAndTableArray);
|
||||
}
|
||||
|
||||
// if we have pieces of tables or lists to be inserted, let's force the paste
|
||||
@@ -448,33 +423,31 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
// table or list contents outside the table or list.
|
||||
if (highWaterMark >= 0)
|
||||
{
|
||||
rv = ReplaceOrphanedStructure(false, nodeList, startListAndTableArray, highWaterMark);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
ReplaceOrphanedStructure(StartOrEnd::start, nodeList,
|
||||
startListAndTableArray, highWaterMark);
|
||||
}
|
||||
|
||||
// Now go through the same process again for the end of the paste node list.
|
||||
nsCOMArray<nsIDOMNode> endListAndTableArray;
|
||||
rv = GetListAndTableParents(true, nodeList, endListAndTableArray);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsTArray<OwningNonNull<Element>> endListAndTableArray;
|
||||
GetListAndTableParents(StartOrEnd::end, nodeList, endListAndTableArray);
|
||||
highWaterMark = -1;
|
||||
|
||||
// remember number of lists and tables above us
|
||||
if (endListAndTableArray.Count() > 0)
|
||||
{
|
||||
rv = DiscoverPartialListsAndTables(nodeList, endListAndTableArray, &highWaterMark);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (endListAndTableArray.Length() > 0) {
|
||||
highWaterMark = DiscoverPartialListsAndTables(nodeList,
|
||||
endListAndTableArray);
|
||||
}
|
||||
|
||||
// don't orphan partial list or table structure
|
||||
if (highWaterMark >= 0)
|
||||
{
|
||||
rv = ReplaceOrphanedStructure(true, nodeList, endListAndTableArray, highWaterMark);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
ReplaceOrphanedStructure(StartOrEnd::end, nodeList,
|
||||
endListAndTableArray, highWaterMark);
|
||||
}
|
||||
|
||||
// Loop over the node list and paste the nodes:
|
||||
nsCOMPtr<nsIDOMNode> parentBlock, lastInsertNode, insertedContextParent;
|
||||
int32_t listCount = nodeList.Count();
|
||||
int32_t listCount = nodeList.Length();
|
||||
int32_t j;
|
||||
if (IsBlockNode(parentNode))
|
||||
parentBlock = parentNode;
|
||||
@@ -484,7 +457,7 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
for (j=0; j<listCount; j++)
|
||||
{
|
||||
bool bDidInsert = false;
|
||||
nsCOMPtr<nsIDOMNode> curNode = nodeList[j];
|
||||
nsCOMPtr<nsIDOMNode> curNode = nodeList[j]->AsDOMNode();
|
||||
|
||||
NS_ENSURE_TRUE(curNode, NS_ERROR_FAILURE);
|
||||
NS_ENSURE_TRUE(curNode != fragmentAsNode, NS_ERROR_FAILURE);
|
||||
@@ -721,26 +694,25 @@ nsHTMLEditor::DoInsertHTMLWithContext(const nsAString & aInputString,
|
||||
return mRules->DidDoAction(selection, &ruleInfo, rv);
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsHTMLEditor::AddInsertionListener(nsIContentFilter *aListener)
|
||||
{
|
||||
NS_ENSURE_TRUE(aListener, NS_ERROR_NULL_POINTER);
|
||||
|
||||
// don't let a listener be added more than once
|
||||
if (mContentFilters.IndexOfObject(aListener) == -1)
|
||||
{
|
||||
NS_ENSURE_TRUE(mContentFilters.AppendObject(aListener), NS_ERROR_FAILURE);
|
||||
if (!mContentFilters.Contains(aListener)) {
|
||||
mContentFilters.AppendElement(*aListener);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
NS_IMETHODIMP
|
||||
nsHTMLEditor::RemoveInsertionListener(nsIContentFilter *aListener)
|
||||
{
|
||||
NS_ENSURE_TRUE(aListener, NS_ERROR_FAILURE);
|
||||
|
||||
NS_ENSURE_TRUE(mContentFilters.RemoveObject(aListener), NS_ERROR_FAILURE);
|
||||
mContentFilters.RemoveElement(aListener);
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
@@ -760,17 +732,15 @@ nsHTMLEditor::DoContentFilterCallback(const nsAString &aFlavor,
|
||||
{
|
||||
*aDoContinue = true;
|
||||
|
||||
int32_t i;
|
||||
nsIContentFilter *listener;
|
||||
for (i=0; i < mContentFilters.Count() && *aDoContinue; i++)
|
||||
{
|
||||
listener = (nsIContentFilter *)mContentFilters[i];
|
||||
if (listener)
|
||||
listener->NotifyOfInsertion(aFlavor, nullptr, sourceDoc,
|
||||
aWillDeleteSelection, aFragmentAsNode,
|
||||
aFragStartNode, aFragStartOffset,
|
||||
aFragEndNode, aFragEndOffset,
|
||||
aTargetNode, aTargetOffset, aDoContinue);
|
||||
for (auto& listener : mContentFilters) {
|
||||
if (!*aDoContinue) {
|
||||
break;
|
||||
}
|
||||
listener->NotifyOfInsertion(aFlavor, nullptr, sourceDoc,
|
||||
aWillDeleteSelection, aFragmentAsNode,
|
||||
aFragStartNode, aFragStartOffset,
|
||||
aFragEndNode, aFragEndOffset, aTargetNode,
|
||||
aTargetOffset, aDoContinue);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
@@ -1252,7 +1222,7 @@ nsresult nsHTMLEditor::InsertFromDataTransfer(DataTransfer *aDataTransfer,
|
||||
ErrorResult rv;
|
||||
nsRefPtr<DOMStringList> types = aDataTransfer->MozTypesAt(aIndex, rv);
|
||||
if (rv.Failed()) {
|
||||
return rv.ErrorCode();
|
||||
return rv.StealNSResult();
|
||||
}
|
||||
|
||||
bool hasPrivateHTMLFlavor = types->Contains(NS_LITERAL_STRING(kHTMLContext));
|
||||
@@ -2166,219 +2136,170 @@ nsresult nsHTMLEditor::ParseFragment(const nsAString & aFragStr,
|
||||
return rv;
|
||||
}
|
||||
|
||||
nsresult nsHTMLEditor::CreateListOfNodesToPaste(nsIDOMNode *aFragmentAsNode,
|
||||
nsCOMArray<nsIDOMNode>& outNodeList,
|
||||
nsIDOMNode *aStartNode,
|
||||
int32_t aStartOffset,
|
||||
nsIDOMNode *aEndNode,
|
||||
int32_t aEndOffset)
|
||||
void
|
||||
nsHTMLEditor::CreateListOfNodesToPaste(DocumentFragment& aFragment,
|
||||
nsTArray<OwningNonNull<nsINode>>& outNodeList,
|
||||
nsINode* aStartNode,
|
||||
int32_t aStartOffset,
|
||||
nsINode* aEndNode,
|
||||
int32_t aEndOffset)
|
||||
{
|
||||
NS_ENSURE_TRUE(aFragmentAsNode, NS_ERROR_NULL_POINTER);
|
||||
|
||||
nsresult rv;
|
||||
|
||||
// if no info was provided about the boundary between context and stream,
|
||||
// If no info was provided about the boundary between context and stream,
|
||||
// then assume all is stream.
|
||||
if (!aStartNode)
|
||||
{
|
||||
int32_t fragLen;
|
||||
rv = GetLengthOfDOMNode(aFragmentAsNode, (uint32_t&)fragLen);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
aStartNode = aFragmentAsNode;
|
||||
if (!aStartNode) {
|
||||
aStartNode = &aFragment;
|
||||
aStartOffset = 0;
|
||||
aEndNode = aFragmentAsNode;
|
||||
aEndOffset = fragLen;
|
||||
aEndNode = &aFragment;
|
||||
aEndOffset = aFragment.Length();
|
||||
}
|
||||
|
||||
nsRefPtr<nsRange> docFragRange;
|
||||
rv = nsRange::CreateRange(aStartNode, aStartOffset, aEndNode, aEndOffset, getter_AddRefs(docFragRange));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
nsresult rv = nsRange::CreateRange(aStartNode, aStartOffset,
|
||||
aEndNode, aEndOffset,
|
||||
getter_AddRefs(docFragRange));
|
||||
MOZ_ASSERT(NS_SUCCEEDED(rv));
|
||||
NS_ENSURE_SUCCESS(rv, );
|
||||
|
||||
// now use a subtree iterator over the range to create a list of nodes
|
||||
// Now use a subtree iterator over the range to create a list of nodes
|
||||
nsTrivialFunctor functor;
|
||||
nsDOMSubtreeIterator iter;
|
||||
rv = iter.Init(docFragRange);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
return iter.AppendList(functor, outNodeList);
|
||||
nsDOMSubtreeIterator iter(*docFragRange);
|
||||
iter.AppendList(functor, outNodeList);
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLEditor::GetListAndTableParents(bool aEnd,
|
||||
nsCOMArray<nsIDOMNode>& aListOfNodes,
|
||||
nsCOMArray<nsIDOMNode>& outArray)
|
||||
void
|
||||
nsHTMLEditor::GetListAndTableParents(StartOrEnd aStartOrEnd,
|
||||
nsTArray<OwningNonNull<nsINode>>& aNodeList,
|
||||
nsTArray<OwningNonNull<Element>>& outArray)
|
||||
{
|
||||
int32_t listCount = aListOfNodes.Count();
|
||||
NS_ENSURE_TRUE(listCount > 0, NS_ERROR_FAILURE); // no empty lists, please
|
||||
MOZ_ASSERT(aNodeList.Length());
|
||||
|
||||
// build up list of parents of first (or last) node in list
|
||||
// that are either lists, or tables.
|
||||
int32_t idx = 0;
|
||||
if (aEnd) idx = listCount-1;
|
||||
// Build up list of parents of first (or last) node in list that are either
|
||||
// lists, or tables.
|
||||
int32_t idx = aStartOrEnd == StartOrEnd::end ? aNodeList.Length() - 1 : 0;
|
||||
|
||||
nsCOMPtr<nsIDOMNode> pNode = aListOfNodes[idx];
|
||||
while (pNode)
|
||||
{
|
||||
if (nsHTMLEditUtils::IsList(pNode) || nsHTMLEditUtils::IsTable(pNode))
|
||||
{
|
||||
NS_ENSURE_TRUE(outArray.AppendObject(pNode), NS_ERROR_FAILURE);
|
||||
for (nsCOMPtr<nsINode> node = aNodeList[idx]; node;
|
||||
node = node->GetParentNode()) {
|
||||
if (nsHTMLEditUtils::IsList(node) || nsHTMLEditUtils::IsTable(node)) {
|
||||
outArray.AppendElement(*node->AsElement());
|
||||
}
|
||||
nsCOMPtr<nsIDOMNode> parent;
|
||||
pNode->GetParentNode(getter_AddRefs(parent));
|
||||
pNode = parent;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLEditor::DiscoverPartialListsAndTables(nsCOMArray<nsIDOMNode>& aPasteNodes,
|
||||
nsCOMArray<nsIDOMNode>& aListsAndTables,
|
||||
int32_t *outHighWaterMark)
|
||||
int32_t
|
||||
nsHTMLEditor::DiscoverPartialListsAndTables(nsTArray<OwningNonNull<nsINode>>& aPasteNodes,
|
||||
nsTArray<OwningNonNull<Element>>& aListsAndTables)
|
||||
{
|
||||
NS_ENSURE_TRUE(outHighWaterMark, NS_ERROR_NULL_POINTER);
|
||||
int32_t ret = -1;
|
||||
int32_t listAndTableParents = aListsAndTables.Length();
|
||||
|
||||
*outHighWaterMark = -1;
|
||||
int32_t listAndTableParents = aListsAndTables.Count();
|
||||
|
||||
// scan insertion list for table elements (other than table).
|
||||
int32_t listCount = aPasteNodes.Count();
|
||||
int32_t j;
|
||||
for (j=0; j<listCount; j++)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> curNode = aPasteNodes[j];
|
||||
|
||||
NS_ENSURE_TRUE(curNode, NS_ERROR_FAILURE);
|
||||
if (nsHTMLEditUtils::IsTableElement(curNode) && !nsHTMLEditUtils::IsTable(curNode))
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> theTable = GetTableParent(curNode);
|
||||
if (theTable)
|
||||
{
|
||||
int32_t indexT = aListsAndTables.IndexOf(theTable);
|
||||
if (indexT >= 0)
|
||||
{
|
||||
*outHighWaterMark = indexT;
|
||||
if (*outHighWaterMark == listAndTableParents-1) break;
|
||||
// Scan insertion list for table elements (other than table).
|
||||
for (auto& curNode : aPasteNodes) {
|
||||
if (nsHTMLEditUtils::IsTableElement(curNode) &&
|
||||
!curNode->IsHTMLElement(nsGkAtoms::table)) {
|
||||
nsCOMPtr<Element> table = curNode->GetParentElement();
|
||||
while (table && !table->IsHTMLElement(nsGkAtoms::table)) {
|
||||
table = table->GetParentElement();
|
||||
}
|
||||
if (table) {
|
||||
int32_t idx = aListsAndTables.IndexOf(table);
|
||||
if (idx == -1) {
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
ret = idx;
|
||||
if (ret == listAndTableParents - 1) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (nsHTMLEditUtils::IsListItem(curNode))
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> theList = GetListParent(curNode);
|
||||
if (theList)
|
||||
{
|
||||
int32_t indexL = aListsAndTables.IndexOf(theList);
|
||||
if (indexL >= 0)
|
||||
{
|
||||
*outHighWaterMark = indexL;
|
||||
if (*outHighWaterMark == listAndTableParents-1) break;
|
||||
if (nsHTMLEditUtils::IsListItem(curNode)) {
|
||||
nsCOMPtr<Element> list = curNode->GetParentElement();
|
||||
while (list && !nsHTMLEditUtils::IsList(list)) {
|
||||
list = list->GetParentElement();
|
||||
}
|
||||
if (list) {
|
||||
int32_t idx = aListsAndTables.IndexOf(list);
|
||||
if (idx == -1) {
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
ret = idx;
|
||||
if (ret == listAndTableParents - 1) {
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
return ret;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLEditor::ScanForListAndTableStructure( bool aEnd,
|
||||
nsCOMArray<nsIDOMNode>& aNodes,
|
||||
nsIDOMNode *aListOrTable,
|
||||
nsCOMPtr<nsIDOMNode> *outReplaceNode)
|
||||
nsINode*
|
||||
nsHTMLEditor::ScanForListAndTableStructure(StartOrEnd aStartOrEnd,
|
||||
nsTArray<OwningNonNull<nsINode>>& aNodes,
|
||||
Element& aListOrTable)
|
||||
{
|
||||
NS_ENSURE_TRUE(aListOrTable, NS_ERROR_NULL_POINTER);
|
||||
NS_ENSURE_TRUE(outReplaceNode, NS_ERROR_NULL_POINTER);
|
||||
|
||||
*outReplaceNode = 0;
|
||||
// Look upward from first/last paste node for a piece of this list/table
|
||||
int32_t idx = aStartOrEnd == StartOrEnd::end ? aNodes.Length() - 1 : 0;
|
||||
bool isList = nsHTMLEditUtils::IsList(&aListOrTable);
|
||||
|
||||
// look upward from first/last paste node for a piece of this list/table
|
||||
int32_t listCount = aNodes.Count(), idx = 0;
|
||||
if (aEnd) idx = listCount-1;
|
||||
bool bList = nsHTMLEditUtils::IsList(aListOrTable);
|
||||
|
||||
nsCOMPtr<nsIDOMNode> pNode = aNodes[idx];
|
||||
nsCOMPtr<nsIDOMNode> originalNode = pNode;
|
||||
while (pNode)
|
||||
{
|
||||
if ((bList && nsHTMLEditUtils::IsListItem(pNode)) ||
|
||||
(!bList && (nsHTMLEditUtils::IsTableElement(pNode) && !nsHTMLEditUtils::IsTable(pNode))))
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> structureNode;
|
||||
if (bList) structureNode = GetListParent(pNode);
|
||||
else structureNode = GetTableParent(pNode);
|
||||
if (structureNode == aListOrTable)
|
||||
{
|
||||
if (bList)
|
||||
*outReplaceNode = structureNode;
|
||||
else
|
||||
*outReplaceNode = pNode;
|
||||
break;
|
||||
for (nsCOMPtr<nsINode> node = aNodes[idx]; node;
|
||||
node = node->GetParentNode()) {
|
||||
if ((isList && nsHTMLEditUtils::IsListItem(node)) ||
|
||||
(!isList && nsHTMLEditUtils::IsTableElement(node) &&
|
||||
!node->IsHTMLElement(nsGkAtoms::table))) {
|
||||
nsCOMPtr<Element> structureNode = node->GetParentElement();
|
||||
if (isList) {
|
||||
while (structureNode && !nsHTMLEditUtils::IsList(structureNode)) {
|
||||
structureNode = structureNode->GetParentElement();
|
||||
}
|
||||
} else {
|
||||
while (structureNode &&
|
||||
!structureNode->IsHTMLElement(nsGkAtoms::table)) {
|
||||
structureNode = structureNode->GetParentElement();
|
||||
}
|
||||
}
|
||||
if (structureNode == &aListOrTable) {
|
||||
if (isList) {
|
||||
return structureNode;
|
||||
}
|
||||
return node;
|
||||
}
|
||||
}
|
||||
nsCOMPtr<nsIDOMNode> parent;
|
||||
pNode->GetParentNode(getter_AddRefs(parent));
|
||||
pNode = parent;
|
||||
}
|
||||
return NS_OK;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
nsresult
|
||||
nsHTMLEditor::ReplaceOrphanedStructure(bool aEnd,
|
||||
nsCOMArray<nsIDOMNode>& aNodeArray,
|
||||
nsCOMArray<nsIDOMNode>& aListAndTableArray,
|
||||
void
|
||||
nsHTMLEditor::ReplaceOrphanedStructure(StartOrEnd aStartOrEnd,
|
||||
nsTArray<OwningNonNull<nsINode>>& aNodeArray,
|
||||
nsTArray<OwningNonNull<Element>>& aListAndTableArray,
|
||||
int32_t aHighWaterMark)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNode> curNode = aListAndTableArray[aHighWaterMark];
|
||||
NS_ENSURE_TRUE(curNode, NS_ERROR_NULL_POINTER);
|
||||
OwningNonNull<Element> curNode = aListAndTableArray[aHighWaterMark];
|
||||
|
||||
nsCOMPtr<nsIDOMNode> replaceNode, originalNode;
|
||||
// Find substructure of list or table that must be included in paste.
|
||||
nsCOMPtr<nsINode> replaceNode =
|
||||
ScanForListAndTableStructure(aStartOrEnd, aNodeArray, curNode);
|
||||
|
||||
// find substructure of list or table that must be included in paste.
|
||||
nsresult rv = ScanForListAndTableStructure(aEnd, aNodeArray,
|
||||
curNode, address_of(replaceNode));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// if we found substructure, paste it instead of its descendants
|
||||
if (replaceNode)
|
||||
{
|
||||
// postprocess list to remove any descendants of this node
|
||||
// so that we don't insert them twice.
|
||||
nsCOMPtr<nsIDOMNode> endpoint;
|
||||
do
|
||||
{
|
||||
endpoint = GetArrayEndpoint(aEnd, aNodeArray);
|
||||
if (!endpoint) break;
|
||||
if (nsEditorUtils::IsDescendantOf(endpoint, replaceNode))
|
||||
aNodeArray.RemoveObject(endpoint);
|
||||
else
|
||||
break;
|
||||
} while(endpoint);
|
||||
|
||||
// now replace the removed nodes with the structural parent
|
||||
if (aEnd) aNodeArray.AppendObject(replaceNode);
|
||||
else aNodeArray.InsertObjectAt(replaceNode, 0);
|
||||
if (!replaceNode) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If we found substructure, paste it instead of its descendants.
|
||||
// Postprocess list to remove any descendants of this node so that we don't
|
||||
// insert them twice.
|
||||
while (aNodeArray.Length()) {
|
||||
int32_t idx = aStartOrEnd == StartOrEnd::start ? 0
|
||||
: aNodeArray.Length() - 1;
|
||||
OwningNonNull<nsINode> endpoint = aNodeArray[idx];
|
||||
if (!nsEditorUtils::IsDescendantOf(endpoint, replaceNode)) {
|
||||
break;
|
||||
}
|
||||
aNodeArray.RemoveElementAt(idx);
|
||||
}
|
||||
|
||||
// Now replace the removed nodes with the structural parent
|
||||
if (aStartOrEnd == StartOrEnd::end) {
|
||||
aNodeArray.AppendElement(*replaceNode);
|
||||
} else {
|
||||
aNodeArray.InsertElementAt(0, *replaceNode);
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsIDOMNode* nsHTMLEditor::GetArrayEndpoint(bool aEnd,
|
||||
nsCOMArray<nsIDOMNode>& aNodeArray)
|
||||
{
|
||||
int32_t listCount = aNodeArray.Count();
|
||||
if (listCount <= 0) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
if (aEnd) {
|
||||
return aNodeArray[listCount-1];
|
||||
}
|
||||
|
||||
return aNodeArray[0];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user