gecko-dev/layout/style/nsHTMLStyleSheet.cpp

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

184 строки
5.8 KiB
C++
Исходник Обычный вид История

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
2012-05-21 15:12:37 +04:00
* 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/. */
/*
* style sheet and style rule processor representing data from presentational
* HTML attributes
*/
#include "nsHTMLStyleSheet.h"
#include "nsMappedAttributes.h"
#include "nsGkAtoms.h"
#include "nsPresContext.h"
#include "mozilla/EventStates.h"
#include "mozilla/PresShell.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/DocumentInlines.h"
#include "nsStyleConsts.h"
#include "nsError.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/dom/Element.h"
Bug 234485: Map xml:lang attribute into style so that it's used for font selection and hyphenation. r=bzbarsky The code in nsHTMLStyleSheet implements LangRule to map xml:lang into style and the code to manage its uniqueness. The change to nsGenericHTMLElement fixes the mapping of the HTML lang attribute to do cascading the way all other rule mapping does so that the cascading works correctly. The tests test that the correct style language is used for hyphenation by copying over a set of hyphenation reftests that check its basic response to languages. There are no specific tests for font selection, but font selection is known to use the same language data from style. I verified manually (see other attachments to bug) that the rule uniqueness is being managed correctly. --HG-- rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-1.xhtml rename : layout/reftests/text/auto-hyphenation-10.html => layout/reftests/text/auto-hyphenation-xmllang-10.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12b.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14b.xhtml rename : layout/reftests/text/auto-hyphenation-1a.html => layout/reftests/text/auto-hyphenation-xmllang-1a.xhtml rename : layout/reftests/text/auto-hyphenation-2.html => layout/reftests/text/auto-hyphenation-xmllang-2.xhtml rename : layout/reftests/text/auto-hyphenation-3.html => layout/reftests/text/auto-hyphenation-xmllang-3.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-4.xhtml rename : layout/reftests/text/auto-hyphenation-5.html => layout/reftests/text/auto-hyphenation-xmllang-5.xhtml rename : layout/reftests/text/auto-hyphenation-6.html => layout/reftests/text/auto-hyphenation-xmllang-6.xhtml rename : layout/reftests/text/auto-hyphenation-7.html => layout/reftests/text/auto-hyphenation-xmllang-7.xhtml rename : layout/reftests/text/auto-hyphenation-8.html => layout/reftests/text/auto-hyphenation-xmllang-8.xhtml rename : layout/reftests/text/auto-hyphenation-9.html => layout/reftests/text/auto-hyphenation-xmllang-9.xhtml
2013-05-30 12:00:20 +04:00
#include "nsHashKeys.h"
#include "mozilla/OperatorNewExtensions.h"
#include "mozilla/RestyleManager.h"
#include "mozilla/ServoBindings.h"
#include "mozilla/ServoStyleSet.h"
Bug 234485: Map xml:lang attribute into style so that it's used for font selection and hyphenation. r=bzbarsky The code in nsHTMLStyleSheet implements LangRule to map xml:lang into style and the code to manage its uniqueness. The change to nsGenericHTMLElement fixes the mapping of the HTML lang attribute to do cascading the way all other rule mapping does so that the cascading works correctly. The tests test that the correct style language is used for hyphenation by copying over a set of hyphenation reftests that check its basic response to languages. There are no specific tests for font selection, but font selection is known to use the same language data from style. I verified manually (see other attachments to bug) that the rule uniqueness is being managed correctly. --HG-- rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-1.xhtml rename : layout/reftests/text/auto-hyphenation-10.html => layout/reftests/text/auto-hyphenation-xmllang-10.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12b.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14b.xhtml rename : layout/reftests/text/auto-hyphenation-1a.html => layout/reftests/text/auto-hyphenation-xmllang-1a.xhtml rename : layout/reftests/text/auto-hyphenation-2.html => layout/reftests/text/auto-hyphenation-xmllang-2.xhtml rename : layout/reftests/text/auto-hyphenation-3.html => layout/reftests/text/auto-hyphenation-xmllang-3.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-4.xhtml rename : layout/reftests/text/auto-hyphenation-5.html => layout/reftests/text/auto-hyphenation-xmllang-5.xhtml rename : layout/reftests/text/auto-hyphenation-6.html => layout/reftests/text/auto-hyphenation-xmllang-6.xhtml rename : layout/reftests/text/auto-hyphenation-7.html => layout/reftests/text/auto-hyphenation-xmllang-7.xhtml rename : layout/reftests/text/auto-hyphenation-8.html => layout/reftests/text/auto-hyphenation-xmllang-8.xhtml rename : layout/reftests/text/auto-hyphenation-9.html => layout/reftests/text/auto-hyphenation-xmllang-9.xhtml
2013-05-30 12:00:20 +04:00
using namespace mozilla;
using namespace mozilla::dom;
// -----------------------------------------------------------
1998-07-25 05:20:48 +04:00
struct MappedAttrTableEntry : public PLDHashEntryHdr {
nsMappedAttributes* mAttributes;
};
static PLDHashNumber MappedAttrTable_HashKey(const void* key) {
nsMappedAttributes* attributes =
static_cast<nsMappedAttributes*>(const_cast<void*>(key));
return attributes->HashValue();
}
static void MappedAttrTable_ClearEntry(PLDHashTable* table,
PLDHashEntryHdr* hdr) {
MappedAttrTableEntry* entry = static_cast<MappedAttrTableEntry*>(hdr);
entry->mAttributes->DropStyleSheetReference();
memset(entry, 0, sizeof(MappedAttrTableEntry));
}
static bool MappedAttrTable_MatchEntry(const PLDHashEntryHdr* hdr,
const void* key) {
nsMappedAttributes* attributes =
static_cast<nsMappedAttributes*>(const_cast<void*>(key));
const MappedAttrTableEntry* entry =
static_cast<const MappedAttrTableEntry*>(hdr);
return attributes->Equals(entry->mAttributes);
}
static const PLDHashTableOps MappedAttrTable_Ops = {
MappedAttrTable_HashKey, MappedAttrTable_MatchEntry,
PLDHashTable::MoveEntryStub, MappedAttrTable_ClearEntry, nullptr};
Bug 234485: Map xml:lang attribute into style so that it's used for font selection and hyphenation. r=bzbarsky The code in nsHTMLStyleSheet implements LangRule to map xml:lang into style and the code to manage its uniqueness. The change to nsGenericHTMLElement fixes the mapping of the HTML lang attribute to do cascading the way all other rule mapping does so that the cascading works correctly. The tests test that the correct style language is used for hyphenation by copying over a set of hyphenation reftests that check its basic response to languages. There are no specific tests for font selection, but font selection is known to use the same language data from style. I verified manually (see other attachments to bug) that the rule uniqueness is being managed correctly. --HG-- rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-1.xhtml rename : layout/reftests/text/auto-hyphenation-10.html => layout/reftests/text/auto-hyphenation-xmllang-10.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12b.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14b.xhtml rename : layout/reftests/text/auto-hyphenation-1a.html => layout/reftests/text/auto-hyphenation-xmllang-1a.xhtml rename : layout/reftests/text/auto-hyphenation-2.html => layout/reftests/text/auto-hyphenation-xmllang-2.xhtml rename : layout/reftests/text/auto-hyphenation-3.html => layout/reftests/text/auto-hyphenation-xmllang-3.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-4.xhtml rename : layout/reftests/text/auto-hyphenation-5.html => layout/reftests/text/auto-hyphenation-xmllang-5.xhtml rename : layout/reftests/text/auto-hyphenation-6.html => layout/reftests/text/auto-hyphenation-xmllang-6.xhtml rename : layout/reftests/text/auto-hyphenation-7.html => layout/reftests/text/auto-hyphenation-xmllang-7.xhtml rename : layout/reftests/text/auto-hyphenation-8.html => layout/reftests/text/auto-hyphenation-xmllang-8.xhtml rename : layout/reftests/text/auto-hyphenation-9.html => layout/reftests/text/auto-hyphenation-xmllang-9.xhtml
2013-05-30 12:00:20 +04:00
// -----------------------------------------------------------
// -----------------------------------------------------------
nsHTMLStyleSheet::nsHTMLStyleSheet(Document* aDocument)
: mDocument(aDocument),
mMappedAttrTable(&MappedAttrTable_Ops, sizeof(MappedAttrTableEntry)),
mMappedAttrsDirty(false) {
MOZ_ASSERT(aDocument);
}
void nsHTMLStyleSheet::SetOwningDocument(Document* aDocument) {
mDocument = aDocument; // not refcounted
1998-04-14 00:24:54 +04:00
}
void nsHTMLStyleSheet::Reset() {
mServoUnvisitedLinkDecl = nullptr;
mServoVisitedLinkDecl = nullptr;
mServoActiveLinkDecl = nullptr;
mMappedAttrTable.Clear();
mMappedAttrsDirty = false;
}
nsresult nsHTMLStyleSheet::ImplLinkColorSetter(
RefPtr<RawServoDeclarationBlock>& aDecl, nscolor aColor) {
if (!mDocument || !mDocument->GetPresShell()) {
return NS_OK;
1998-07-25 05:20:48 +04:00
}
MOZ_ASSERT(!ServoStyleSet::IsInServoTraversal());
aDecl = Servo_DeclarationBlock_CreateEmpty().Consume();
Servo_DeclarationBlock_SetColorValue(aDecl.get(), eCSSProperty_color, aColor);
// Now make sure we restyle any links that might need it. This
// shouldn't happen often, so just rebuilding everything is ok.
if (Element* root = mDocument->GetRootElement()) {
RestyleManager* rm = mDocument->GetPresContext()->RestyleManager();
rm->PostRestyleEvent(root, RestyleHint::RestyleSubtree(), nsChangeHint(0));
}
1998-07-25 05:20:48 +04:00
return NS_OK;
}
nsresult nsHTMLStyleSheet::SetLinkColor(nscolor aColor) {
return ImplLinkColorSetter(mServoUnvisitedLinkDecl, aColor);
}
nsresult nsHTMLStyleSheet::SetActiveLinkColor(nscolor aColor) {
return ImplLinkColorSetter(mServoActiveLinkDecl, aColor);
1998-07-25 05:20:48 +04:00
}
nsresult nsHTMLStyleSheet::SetVisitedLinkColor(nscolor aColor) {
return ImplLinkColorSetter(mServoVisitedLinkDecl, aColor);
1998-07-25 05:20:48 +04:00
}
already_AddRefed<nsMappedAttributes> nsHTMLStyleSheet::UniqueMappedAttributes(
nsMappedAttributes* aMapped) {
mMappedAttrsDirty = true;
auto entry = static_cast<MappedAttrTableEntry*>(
mMappedAttrTable.Add(aMapped, fallible));
if (!entry) return nullptr;
if (!entry->mAttributes) {
// We added a new entry to the hashtable, so we have a new unique set.
entry->mAttributes = aMapped;
}
Bug 1207245 - part 6 - rename nsRefPtr<T> to RefPtr<T>; r=ehsan; a=Tomcat The bulk of this commit was generated with a script, executed at the top level of a typical source code checkout. The only non-machine-generated part was modifying MFBT's moz.build to reflect the new naming. CLOSED TREE makes big refactorings like this a piece of cake. # The main substitution. find . -name '*.cpp' -o -name '*.cc' -o -name '*.h' -o -name '*.mm' -o -name '*.idl'| \ xargs perl -p -i -e ' s/nsRefPtr\.h/RefPtr\.h/g; # handle includes s/nsRefPtr ?</RefPtr</g; # handle declarations and variables ' # Handle a special friend declaration in gfx/layers/AtomicRefCountedWithFinalize.h. perl -p -i -e 's/::nsRefPtr;/::RefPtr;/' gfx/layers/AtomicRefCountedWithFinalize.h # Handle nsRefPtr.h itself, a couple places that define constructors # from nsRefPtr, and code generators specially. We do this here, rather # than indiscriminantly s/nsRefPtr/RefPtr/, because that would rename # things like nsRefPtrHashtable. perl -p -i -e 's/nsRefPtr/RefPtr/g' \ mfbt/nsRefPtr.h \ xpcom/glue/nsCOMPtr.h \ xpcom/base/OwningNonNull.h \ ipc/ipdl/ipdl/lower.py \ ipc/ipdl/ipdl/builtin.py \ dom/bindings/Codegen.py \ python/lldbutils/lldbutils/utils.py # In our indiscriminate substitution above, we renamed # nsRefPtrGetterAddRefs, the class behind getter_AddRefs. Fix that up. find . -name '*.cpp' -o -name '*.h' -o -name '*.idl' | \ xargs perl -p -i -e 's/nsRefPtrGetterAddRefs/RefPtrGetterAddRefs/g' if [ -d .git ]; then git mv mfbt/nsRefPtr.h mfbt/RefPtr.h else hg mv mfbt/nsRefPtr.h mfbt/RefPtr.h fi --HG-- rename : mfbt/nsRefPtr.h => mfbt/RefPtr.h
2015-10-18 08:24:48 +03:00
RefPtr<nsMappedAttributes> ret = entry->mAttributes;
return ret.forget();
}
void nsHTMLStyleSheet::DropMappedAttributes(nsMappedAttributes* aMapped) {
NS_ENSURE_TRUE_VOID(aMapped);
#ifdef DEBUG
uint32_t entryCount = mMappedAttrTable.EntryCount() - 1;
#endif
mMappedAttrTable.Remove(aMapped);
NS_ASSERTION(entryCount == mMappedAttrTable.EntryCount(), "not removed");
}
void nsHTMLStyleSheet::CalculateMappedServoDeclarations() {
for (auto iter = mMappedAttrTable.Iter(); !iter.Done(); iter.Next()) {
MappedAttrTableEntry* attr = static_cast<MappedAttrTableEntry*>(iter.Get());
if (attr->mAttributes->GetServoStyle()) {
// Only handle cases which haven't been filled in already
continue;
}
attr->mAttributes->LazilyResolveServoDeclaration(mDocument);
}
}
size_t nsHTMLStyleSheet::DOMSizeOfIncludingThis(
MallocSizeOf aMallocSizeOf) const {
size_t n = aMallocSizeOf(this);
n += mMappedAttrTable.ShallowSizeOfExcludingThis(aMallocSizeOf);
for (auto iter = mMappedAttrTable.ConstIter(); !iter.Done(); iter.Next()) {
auto entry = static_cast<MappedAttrTableEntry*>(iter.Get());
n += entry->mAttributes->SizeOfIncludingThis(aMallocSizeOf);
}
// Measurement of the following members may be added later if DMD finds it is
// worthwhile:
// - mURL
// - mLinkRule
// - mVisitedRule
// - mActiveRule
// - mTableQuirkColorRule
// - mTableTHRule
Bug 234485: Map xml:lang attribute into style so that it's used for font selection and hyphenation. r=bzbarsky The code in nsHTMLStyleSheet implements LangRule to map xml:lang into style and the code to manage its uniqueness. The change to nsGenericHTMLElement fixes the mapping of the HTML lang attribute to do cascading the way all other rule mapping does so that the cascading works correctly. The tests test that the correct style language is used for hyphenation by copying over a set of hyphenation reftests that check its basic response to languages. There are no specific tests for font selection, but font selection is known to use the same language data from style. I verified manually (see other attachments to bug) that the rule uniqueness is being managed correctly. --HG-- rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-1.xhtml rename : layout/reftests/text/auto-hyphenation-10.html => layout/reftests/text/auto-hyphenation-xmllang-10.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-11b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-12b.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13a.xhtml rename : layout/reftests/text/auto-hyphenation-1.html => layout/reftests/text/auto-hyphenation-xmllang-13b.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14a.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-14b.xhtml rename : layout/reftests/text/auto-hyphenation-1a.html => layout/reftests/text/auto-hyphenation-xmllang-1a.xhtml rename : layout/reftests/text/auto-hyphenation-2.html => layout/reftests/text/auto-hyphenation-xmllang-2.xhtml rename : layout/reftests/text/auto-hyphenation-3.html => layout/reftests/text/auto-hyphenation-xmllang-3.xhtml rename : layout/reftests/text/auto-hyphenation-4.html => layout/reftests/text/auto-hyphenation-xmllang-4.xhtml rename : layout/reftests/text/auto-hyphenation-5.html => layout/reftests/text/auto-hyphenation-xmllang-5.xhtml rename : layout/reftests/text/auto-hyphenation-6.html => layout/reftests/text/auto-hyphenation-xmllang-6.xhtml rename : layout/reftests/text/auto-hyphenation-7.html => layout/reftests/text/auto-hyphenation-xmllang-7.xhtml rename : layout/reftests/text/auto-hyphenation-8.html => layout/reftests/text/auto-hyphenation-xmllang-8.xhtml rename : layout/reftests/text/auto-hyphenation-9.html => layout/reftests/text/auto-hyphenation-xmllang-9.xhtml
2013-05-30 12:00:20 +04:00
// - mLangRuleTable
//
// The following members are not measured:
// - mDocument, because it's non-owning
return n;
}