gecko-dev/editor/libeditor/ChangeStyleTransaction.h

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

134 строки
4.7 KiB
C
Исходник Обычный вид История

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef ChangeStyleTransaction_h
#define ChangeStyleTransaction_h
#include "EditTransactionBase.h" // base class
#include "nsCOMPtr.h" // nsCOMPtr members
#include "nsCycleCollectionParticipant.h" // various macros
#include "nsString.h" // nsString members
class nsAtom;
class nsStyledElement;
namespace mozilla {
namespace dom {
class Element;
} // namespace dom
/**
* A transaction that changes the value of a CSS inline style of a content
* node. This transaction covers add, remove, and change a property's value.
*/
class ChangeStyleTransaction final : public EditTransactionBase {
protected:
ChangeStyleTransaction(nsStyledElement& aStyledElement, nsAtom& aProperty,
const nsAString& aValue, bool aRemove);
public:
/**
* Creates a change style transaction. This never returns nullptr.
*
* @param aStyledElement The node whose style attribute will be changed.
* @param aProperty The name of the property to change.
* @param aValue New value for aProperty.
*/
static already_AddRefed<ChangeStyleTransaction> Create(
nsStyledElement& aStyledElement, nsAtom& aProperty,
const nsAString& aValue);
/**
* Creates a change style transaction. This never returns nullptr.
*
* @param aStyledElement The node whose style attribute will be changed.
* @param aProperty The name of the property to change.
* @param aValue The value to remove from aProperty.
*/
static already_AddRefed<ChangeStyleTransaction> CreateToRemove(
nsStyledElement& aStyledElement, nsAtom& aProperty,
const nsAString& aValue);
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ChangeStyleTransaction,
EditTransactionBase)
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_EDITTRANSACTIONBASE
NS_DECL_EDITTRANSACTIONBASE_GETASMETHODS_OVERRIDE(ChangeStyleTransaction)
MOZ_CAN_RUN_SCRIPT NS_IMETHOD RedoTransaction() override;
/**
* Returns true if the list of white-space separated values contains aValue
*
* @param aValueList [IN] a list of white-space separated values
* @param aValue [IN] the value to look for in the list
* @return true if the value is in the list of values
*/
static bool ValueIncludes(const nsACString& aValueList,
const nsACString& aValue);
friend std::ostream& operator<<(std::ostream& aStream,
const ChangeStyleTransaction& aTransaction);
private:
virtual ~ChangeStyleTransaction() = default;
/**
Bug 1802831 - Make `AutoInlineStyleSetter` align setting `text-decoration` style behavior in the CSS mode to the other browsers r=m_kato Gecko wraps selection (and parent elements if entirely selected in them) in new `<span>` element and set `text-decoration`. However, the other browsers tries to reuse selected or parent element which already has `text-decoration` style. The other browsers' behavior is more reasonable from point of view of: * smaller footprint * minimizing to update the DOM tree And aligning the behavior makes it easier to check the compatibility between browsers and us avoid from new test failures aligning other behaviors to the other browsers. If there is an element specifying `text-decoration`, its `text-decoration` declaration should be updated first. If found element is `<i>`, `<s>` or `<strike>`, it should be replaced with new `<span>` because these elements just represents the visual style and we should not use such elements in the CSS mode (bug 1802736). At this time, unless the element has `text-decoration` rules in its `style` attribute value, we the new `text-decoration` style should have the value represented by the removing element (i.e., `underline` for `<i>`, `line-through` for the others). However, if found element is `<ins>` or `<del>`, we should set its `text-decoration` and unless it already has `text-decoration` rules, we need to append corresponding style (`underline` for `<ins>` and `line-through` for `<del>`) too. When setting the values or removing a value from `text-decoration` declaration, the value should be normalized to represent only `text-decoration-line` for compatibility with the other browsers and keeping the implementation simpler. And also the value should be built as the following order: 1. underline 2. overline 3. line-though rather than updating current value with complicated code. Then, the tests can compare with one expectation. Depends on D163188 Differential Revision: https://phabricator.services.mozilla.com/D163429
2022-12-03 01:50:56 +03:00
* Build new text-decoration value to set/remove specific values to/from the
* rule which already has aCurrentValues.
*/
Bug 1802831 - Make `AutoInlineStyleSetter` align setting `text-decoration` style behavior in the CSS mode to the other browsers r=m_kato Gecko wraps selection (and parent elements if entirely selected in them) in new `<span>` element and set `text-decoration`. However, the other browsers tries to reuse selected or parent element which already has `text-decoration` style. The other browsers' behavior is more reasonable from point of view of: * smaller footprint * minimizing to update the DOM tree And aligning the behavior makes it easier to check the compatibility between browsers and us avoid from new test failures aligning other behaviors to the other browsers. If there is an element specifying `text-decoration`, its `text-decoration` declaration should be updated first. If found element is `<i>`, `<s>` or `<strike>`, it should be replaced with new `<span>` because these elements just represents the visual style and we should not use such elements in the CSS mode (bug 1802736). At this time, unless the element has `text-decoration` rules in its `style` attribute value, we the new `text-decoration` style should have the value represented by the removing element (i.e., `underline` for `<i>`, `line-through` for the others). However, if found element is `<ins>` or `<del>`, we should set its `text-decoration` and unless it already has `text-decoration` rules, we need to append corresponding style (`underline` for `<ins>` and `line-through` for `<del>`) too. When setting the values or removing a value from `text-decoration` declaration, the value should be normalized to represent only `text-decoration-line` for compatibility with the other browsers and keeping the implementation simpler. And also the value should be built as the following order: 1. underline 2. overline 3. line-though rather than updating current value with complicated code. Then, the tests can compare with one expectation. Depends on D163188 Differential Revision: https://phabricator.services.mozilla.com/D163429
2022-12-03 01:50:56 +03:00
void BuildTextDecorationValueToSet(const nsACString& aCurrentValues,
const nsACString& aAddingValues,
nsACString& aOutValues);
void BuildTextDecorationValueToRemove(const nsACString& aCurrentValues,
const nsACString& aRemovingValues,
nsACString& aOutValues);
/**
Bug 1802831 - Make `AutoInlineStyleSetter` align setting `text-decoration` style behavior in the CSS mode to the other browsers r=m_kato Gecko wraps selection (and parent elements if entirely selected in them) in new `<span>` element and set `text-decoration`. However, the other browsers tries to reuse selected or parent element which already has `text-decoration` style. The other browsers' behavior is more reasonable from point of view of: * smaller footprint * minimizing to update the DOM tree And aligning the behavior makes it easier to check the compatibility between browsers and us avoid from new test failures aligning other behaviors to the other browsers. If there is an element specifying `text-decoration`, its `text-decoration` declaration should be updated first. If found element is `<i>`, `<s>` or `<strike>`, it should be replaced with new `<span>` because these elements just represents the visual style and we should not use such elements in the CSS mode (bug 1802736). At this time, unless the element has `text-decoration` rules in its `style` attribute value, we the new `text-decoration` style should have the value represented by the removing element (i.e., `underline` for `<i>`, `line-through` for the others). However, if found element is `<ins>` or `<del>`, we should set its `text-decoration` and unless it already has `text-decoration` rules, we need to append corresponding style (`underline` for `<ins>` and `line-through` for `<del>`) too. When setting the values or removing a value from `text-decoration` declaration, the value should be normalized to represent only `text-decoration-line` for compatibility with the other browsers and keeping the implementation simpler. And also the value should be built as the following order: 1. underline 2. overline 3. line-though rather than updating current value with complicated code. Then, the tests can compare with one expectation. Depends on D163188 Differential Revision: https://phabricator.services.mozilla.com/D163429
2022-12-03 01:50:56 +03:00
* Helper method for above methods.
*/
Bug 1802831 - Make `AutoInlineStyleSetter` align setting `text-decoration` style behavior in the CSS mode to the other browsers r=m_kato Gecko wraps selection (and parent elements if entirely selected in them) in new `<span>` element and set `text-decoration`. However, the other browsers tries to reuse selected or parent element which already has `text-decoration` style. The other browsers' behavior is more reasonable from point of view of: * smaller footprint * minimizing to update the DOM tree And aligning the behavior makes it easier to check the compatibility between browsers and us avoid from new test failures aligning other behaviors to the other browsers. If there is an element specifying `text-decoration`, its `text-decoration` declaration should be updated first. If found element is `<i>`, `<s>` or `<strike>`, it should be replaced with new `<span>` because these elements just represents the visual style and we should not use such elements in the CSS mode (bug 1802736). At this time, unless the element has `text-decoration` rules in its `style` attribute value, we the new `text-decoration` style should have the value represented by the removing element (i.e., `underline` for `<i>`, `line-through` for the others). However, if found element is `<ins>` or `<del>`, we should set its `text-decoration` and unless it already has `text-decoration` rules, we need to append corresponding style (`underline` for `<ins>` and `line-through` for `<del>`) too. When setting the values or removing a value from `text-decoration` declaration, the value should be normalized to represent only `text-decoration-line` for compatibility with the other browsers and keeping the implementation simpler. And also the value should be built as the following order: 1. underline 2. overline 3. line-though rather than updating current value with complicated code. Then, the tests can compare with one expectation. Depends on D163188 Differential Revision: https://phabricator.services.mozilla.com/D163429
2022-12-03 01:50:56 +03:00
void BuildTextDecorationValue(bool aUnderline, bool aOverline,
bool aLineThrough, nsACString& aOutValues);
/**
* If the boolean is true and if the value is not the empty string,
* set the property in the transaction to that value; if the value
* is empty, remove the property from element's styles. If the boolean
* is false, just remove the style attribute.
*/
MOZ_CAN_RUN_SCRIPT nsresult SetStyle(bool aAttributeWasSet,
nsACString& aValue);
// The element to operate upon.
RefPtr<nsStyledElement> mStyledElement;
// The CSS property to change.
RefPtr<nsAtom> mProperty;
// The value to set the property to (ignored if mRemoveProperty==true).
nsCString mValue;
// The value to set the property to for undo.
nsCString mUndoValue;
// The value to set the property to for redo.
nsCString mRedoValue;
// true if the operation is to remove mProperty from mElement.
bool mRemoveProperty;
// True if the style attribute was present and not empty before DoTransaction.
bool mUndoAttributeWasSet;
// True if the style attribute is present and not empty after DoTransaction.
bool mRedoAttributeWasSet;
};
} // namespace mozilla
#endif // #ifndef ChangeStyleTransaction_h