gecko-dev/layout/style/nsHTMLStyleSheet.h
L. David Baron 1d8a7b6aa6 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 16:00:20 +08:00

175 lines
5.6 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/. */
/*
* style sheet and style rule processor representing data from presentational
* HTML attributes
*/
#ifndef nsHTMLStyleSheet_h_
#define nsHTMLStyleSheet_h_
#include "nsAutoPtr.h"
#include "nsColor.h"
#include "nsCOMPtr.h"
#include "nsIStyleRule.h"
#include "nsIStyleRuleProcessor.h"
#include "nsIStyleSheet.h"
#include "pldhash.h"
#include "mozilla/Attributes.h"
#include "nsString.h"
class nsMappedAttributes;
class nsHTMLStyleSheet MOZ_FINAL : public nsIStyleSheet,
public nsIStyleRuleProcessor
{
public:
nsHTMLStyleSheet(nsIURI* aURL, nsIDocument* aDocument);
NS_DECL_ISUPPORTS
// nsIStyleSheet api
virtual nsIURI* GetSheetURI() const MOZ_OVERRIDE;
virtual nsIURI* GetBaseURI() const MOZ_OVERRIDE;
virtual void GetTitle(nsString& aTitle) const MOZ_OVERRIDE;
virtual void GetType(nsString& aType) const MOZ_OVERRIDE;
virtual bool HasRules() const MOZ_OVERRIDE;
virtual bool IsApplicable() const MOZ_OVERRIDE;
virtual void SetEnabled(bool aEnabled) MOZ_OVERRIDE;
virtual bool IsComplete() const MOZ_OVERRIDE;
virtual void SetComplete() MOZ_OVERRIDE;
virtual nsIStyleSheet* GetParentSheet() const MOZ_OVERRIDE; // will be null
virtual nsIDocument* GetOwningDocument() const MOZ_OVERRIDE;
virtual void SetOwningDocument(nsIDocument* aDocumemt) MOZ_OVERRIDE;
#ifdef DEBUG
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
#endif
// nsIStyleRuleProcessor API
virtual void RulesMatching(ElementRuleProcessorData* aData) MOZ_OVERRIDE;
virtual void RulesMatching(PseudoElementRuleProcessorData* aData) MOZ_OVERRIDE;
virtual void RulesMatching(AnonBoxRuleProcessorData* aData) MOZ_OVERRIDE;
#ifdef MOZ_XUL
virtual void RulesMatching(XULTreeRuleProcessorData* aData) MOZ_OVERRIDE;
#endif
virtual nsRestyleHint HasStateDependentStyle(StateRuleProcessorData* aData) MOZ_OVERRIDE;
virtual bool HasDocumentStateDependentStyle(StateRuleProcessorData* aData) MOZ_OVERRIDE;
virtual nsRestyleHint
HasAttributeDependentStyle(AttributeRuleProcessorData* aData) MOZ_OVERRIDE;
virtual bool MediumFeaturesChanged(nsPresContext* aPresContext) MOZ_OVERRIDE;
virtual size_t SizeOfExcludingThis(nsMallocSizeOfFun aMallocSizeOf)
const MOZ_MUST_OVERRIDE MOZ_OVERRIDE;
virtual size_t SizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf)
const MOZ_MUST_OVERRIDE MOZ_OVERRIDE;
size_t DOMSizeOfIncludingThis(nsMallocSizeOfFun aMallocSizeOf) const;
void Reset(nsIURI* aURL);
nsresult SetLinkColor(nscolor aColor);
nsresult SetActiveLinkColor(nscolor aColor);
nsresult SetVisitedLinkColor(nscolor aColor);
// Mapped Attribute management methods
already_AddRefed<nsMappedAttributes>
UniqueMappedAttributes(nsMappedAttributes* aMapped);
void DropMappedAttributes(nsMappedAttributes* aMapped);
nsIStyleRule* LangRuleFor(const nsString& aLanguage);
private:
nsHTMLStyleSheet(const nsHTMLStyleSheet& aCopy) MOZ_DELETE;
nsHTMLStyleSheet& operator=(const nsHTMLStyleSheet& aCopy) MOZ_DELETE;
~nsHTMLStyleSheet();
class HTMLColorRule;
friend class HTMLColorRule;
class HTMLColorRule MOZ_FINAL : public nsIStyleRule {
public:
HTMLColorRule() {}
NS_DECL_ISUPPORTS
// nsIStyleRule interface
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
#ifdef DEBUG
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
#endif
nscolor mColor;
};
// Implementation of SetLink/VisitedLink/ActiveLinkColor
nsresult ImplLinkColorSetter(nsRefPtr<HTMLColorRule>& aRule, nscolor aColor);
class GenericTableRule;
friend class GenericTableRule;
class GenericTableRule : public nsIStyleRule {
public:
GenericTableRule() {}
virtual ~GenericTableRule() {}
NS_DECL_ISUPPORTS
// nsIStyleRule interface
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE = 0;
#ifdef DEBUG
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
#endif
};
// this rule handles <th> inheritance
class TableTHRule;
friend class TableTHRule;
class TableTHRule MOZ_FINAL : public GenericTableRule {
public:
TableTHRule() {}
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
};
// Rule to handle quirk table colors
class TableQuirkColorRule MOZ_FINAL : public GenericTableRule {
public:
TableQuirkColorRule() {}
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
};
public: // for mLangRuleTable structures only
// Rule to handle xml:lang attributes, of which we have exactly one
// per language string, maintained in mLangRuleTable.
class LangRule MOZ_FINAL : public nsIStyleRule {
public:
LangRule(const nsSubstring& aLang) : mLang(aLang) {}
NS_DECL_ISUPPORTS
// nsIStyleRule interface
virtual void MapRuleInfoInto(nsRuleData* aRuleData) MOZ_OVERRIDE;
#ifdef DEBUG
virtual void List(FILE* out = stdout, int32_t aIndent = 0) const MOZ_OVERRIDE;
#endif
nsString mLang;
};
private:
nsCOMPtr<nsIURI> mURL;
nsIDocument* mDocument;
nsRefPtr<HTMLColorRule> mLinkRule;
nsRefPtr<HTMLColorRule> mVisitedRule;
nsRefPtr<HTMLColorRule> mActiveRule;
nsRefPtr<TableQuirkColorRule> mTableQuirkColorRule;
nsRefPtr<TableTHRule> mTableTHRule;
PLDHashTable mMappedAttrTable;
PLDHashTable mLangRuleTable;
};
#endif /* !defined(nsHTMLStyleSheet_h_) */