diff --git a/mozilla/content/html/content/src/nsHTMLFontElement.cpp b/mozilla/content/html/content/src/nsHTMLFontElement.cpp index 8ab5b4f278b..031c8ebbf5d 100644 --- a/mozilla/content/html/content/src/nsHTMLFontElement.cpp +++ b/mozilla/content/html/content/src/nsHTMLFontElement.cpp @@ -35,6 +35,10 @@ #include "nsIPresContext.h" #include "nsIHTMLAttributes.h" +// MJA: bug 31816 +#include "nsIPresShell.h" +#include "nsIDocShellTreeItem.h" +// - END MJA class nsHTMLFontElement : public nsIDOMHTMLFontElement, public nsIJSScriptObject, @@ -218,7 +222,48 @@ MapFontAttributesInto(const nsIHTMLMappedAttributes* aAttributes, font->mFont.name = familyList; nsAutoString face; - if (NS_OK == dc->FirstExistingFont(font->mFont, face)) { + + // MJA: bug 31816 + // if we are not using document fonts, but this is a xul document, + // then we set the chromeOverride bit so we use the document fonts anyway + PRBool chromeOverride = PR_FALSE; + PRBool useDocumentFonts = PR_TRUE; + aPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts,useDocumentFonts); + if (!useDocumentFonts) { + // check if the prefs have been disabled for this shell + // - if prefs are disabled then we use the document fonts anyway (yet another override) + PRBool prefsEnabled = PR_TRUE; + nsCOMPtr shell; + aPresContext->GetShell(getter_AddRefs(shell)); + if (shell) { + shell->ArePrefStyleRulesEnabled(prefsEnabled); + } + if (!prefsEnabled) { + useDocumentFonts = PR_TRUE; + } else { + // see if we are in the chrome, if so, use the document fonts (override the useDocFonts setting) + nsresult result = NS_OK; + nsCOMPtr container; + result = aPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + chromeOverride = PR_TRUE; + } + } + } + } + } + } + + // find the correct font if we are usingDocumentFonts OR we are overriding for XUL + // MJA: bug 31816 + if ((chromeOverride || useDocumentFonts) && + NS_OK == dc->FirstExistingFont(font->mFont, face)) { if (face.EqualsIgnoreCase("-moz-fixed")) { font->mFlags |= NS_STYLE_FONT_USE_FIXED; } else { diff --git a/mozilla/content/html/style/src/nsCSSStyleRule.cpp b/mozilla/content/html/style/src/nsCSSStyleRule.cpp index 8e7467fecc0..3576882a33b 100644 --- a/mozilla/content/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/content/html/style/src/nsCSSStyleRule.cpp @@ -55,6 +55,11 @@ #include "nsIStyleSet.h" #include "nsISizeOfHandler.h" +// MJA: bug 31816 +#include "nsIPresShell.h" +#include "nsIDocShellTreeItem.h" +// - END MJA + // #define DEBUG_REFS static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); @@ -1599,7 +1604,48 @@ MapDeclarationFontInto(nsICSSDeclaration* aDeclaration, font->mFont.name = familyList; nsAutoString face; - if (NS_OK == dc->FirstExistingFont(font->mFont, face)) { + + // MJA: bug 31816 + // if we are not using document fonts, but this is a xul document, + // then we set the chromeOverride bit so we use the document fonts anyway + PRBool chromeOverride = PR_FALSE; + PRBool useDocumentFonts = PR_TRUE; + aPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts,useDocumentFonts); + if (!useDocumentFonts) { + // check if the prefs have been disabled for this shell + // - if prefs are disabled then we use the document fonts anyway (yet another override) + PRBool prefsEnabled = PR_TRUE; + nsCOMPtr shell; + aPresContext->GetShell(getter_AddRefs(shell)); + if (shell) { + shell->ArePrefStyleRulesEnabled(prefsEnabled); + } + if (!prefsEnabled) { + useDocumentFonts = PR_TRUE; + } else { + // see if we are in the chrome, if so, use the document fonts (override the useDocFonts setting) + nsresult result = NS_OK; + nsCOMPtr container; + result = aPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + chromeOverride = PR_TRUE; + } + } + } + } + } + } + + // find the correct font if we are usingDocumentFonts OR we are overriding for XUL + // MJA: bug 31816 + if ((chromeOverride || useDocumentFonts) && + (NS_OK == dc->FirstExistingFont(font->mFont, face))) { if (face.EqualsIgnoreCase("-moz-fixed")) { font->mFlags |= NS_STYLE_FONT_USE_FIXED; } diff --git a/mozilla/layout/base/nsIPresShell.h b/mozilla/layout/base/nsIPresShell.h index 04aa6754189..99f5b665311 100644 --- a/mozilla/layout/base/nsIPresShell.h +++ b/mozilla/layout/base/nsIPresShell.h @@ -146,6 +146,26 @@ public: NS_IMETHOD SelectAlternateStyleSheet(const nsString& aSheetTitle) = 0; + /** Setup all style rules required to implement preferences + * - used for background/text/link colors and link underlining + * may be extended for any prefs that are implemented via style rules + * - aForceReflow argument is used to force a full reframe to make the rules show + * (only used when the current page needs to reflect changed pref rules) + * + * - initially created for bugs 31816, 20760, 22963 + */ + NS_IMETHOD SetPreferenceStyleRules(PRBool aForceReflow) = 0; + + /** Allow client to enable and disable the use of the preference style rules, + * by type. + * NOTE: type argument is currently ignored, but is in the API for + * future refinement + * + * - initially created for bugs 31816, 20760, 22963 + */ + NS_IMETHOD EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType=0xFF) = 0; + NS_IMETHOD ArePrefStyleRulesEnabled(PRBool& aEnabled) = 0; + /** * Gather titles of all selectable (alternate and preferred) style sheets * fills void array with nsString* caller must free strings diff --git a/mozilla/layout/base/nsPresContext.cpp b/mozilla/layout/base/nsPresContext.cpp index cd874619131..043258ff9e8 100644 --- a/mozilla/layout/base/nsPresContext.cpp +++ b/mozilla/layout/base/nsPresContext.cpp @@ -110,6 +110,14 @@ nsPresContext::nsPresContext() mDefaultColor = NS_RGB(0x00, 0x00, 0x00); mDefaultBackgroundColor = NS_RGB(0xFF, 0xFF, 0xFF); #endif + + mUseDocumentColors = PR_TRUE; + mUseDocumentFonts = PR_TRUE; + + mLinkColor = NS_RGB(0x33, 0x33, 0xFF); + mVisitedLinkColor = NS_RGB(0x66, 0x00, 0xCC); + mUnderlineLinks = PR_TRUE; + mDefaultBackgroundImageAttachment = NS_STYLE_BG_ATTACHMENT_SCROLL; mDefaultBackgroundImageRepeat = NS_STYLE_BG_REPEAT_XY; mDefaultBackgroundImageOffsetX = mDefaultBackgroundImageOffsetY = 0; @@ -144,6 +152,9 @@ nsPresContext::~nsPresContext() if (mPrefs) { mPrefs->UnregisterCallback("font.", PrefChangedCallback, (void*)this); mPrefs->UnregisterCallback("browser.display.", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.underline_anchors", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.link_color", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.visited_color", PrefChangedCallback, (void*)this); } } @@ -240,16 +251,17 @@ nsPresContext::GetUserPreferences() mWidgetRenderingMode = (enum nsWidgetRendering)prefInt; // bad cast } + // * document colors PRBool usePrefColors = PR_TRUE; -#ifdef _WIN32 + PRUint32 colorPref; PRBool boolPref; +#ifdef _WIN32 // XXX Is Windows the only platform that uses this? if (NS_OK == mPrefs->GetBoolPref("browser.display.wfe.use_windows_colors", &boolPref)) { usePrefColors = !boolPref; } #endif if (usePrefColors) { - PRUint32 colorPref; if (NS_OK == mPrefs->GetColorPrefDWord("browser.display.foreground_color", &colorPref)) { mDefaultColor = (nscolor)colorPref; } @@ -257,13 +269,56 @@ nsPresContext::GetUserPreferences() mDefaultBackgroundColor = (nscolor)colorPref; } } + if (NS_OK == mPrefs->GetBoolPref("browser.display.use_document_colors", &boolPref)) { + mUseDocumentColors = boolPref; + } + // * link colors + if (NS_OK == mPrefs->GetBoolPref("browser.underline_anchors", &boolPref)) { + mUnderlineLinks = boolPref; + } + if (NS_OK == mPrefs->GetColorPrefDWord("browser.anchor_color", &colorPref)) { + mLinkColor = (nscolor)colorPref; + } + if (NS_OK == mPrefs->GetColorPrefDWord("browser.visited_color", &colorPref)) { + mVisitedLinkColor = (nscolor)colorPref; + } + + // * use fonts? + if (NS_OK == mPrefs->GetIntPref("browser.display.use_document_fonts", &prefInt)) { + mUseDocumentFonts = prefInt == 0 ? PR_FALSE : PR_TRUE; + } + // * direction if (NS_OK == mPrefs->GetIntPref("browser.display.direction", &prefInt)) { mDefaultDirection = prefInt; } - + GetFontPreferences(); } +NS_IMETHODIMP +nsPresContext::GetCachedBoolPref(PRUint32 prefType, PRBool &aValue) +{ + nsresult rv = NS_ERROR_FAILURE; + + switch(prefType) { + case kPresContext_UseDocumentFonts : + aValue = mUseDocumentFonts; + rv = NS_OK; + break; + case kPresContext_UseDocumentColors: + aValue = mUseDocumentColors; + rv = NS_OK; + break; + case kPresContext_UnderlineLinks: + aValue = mUnderlineLinks; + rv = NS_OK; + break; + default : + rv = NS_ERROR_FAILURE; + } + return rv; +} + NS_IMETHODIMP nsPresContext::RemapStyleAndReflow() { @@ -308,6 +363,12 @@ nsPresContext::PreferenceChanged(const char* aPrefName) { // Initialize our state from the user preferences GetUserPreferences(); + + // update the presShell: tell it to set the preference style rules up + if (mShell) { + mShell->SetPreferenceStyleRules(PR_TRUE); + } + if (mDeviceContext) { mDeviceContext->FlushFontCache(); RemapStyleAndReflow(); @@ -327,6 +388,9 @@ nsPresContext::Init(nsIDeviceContext* aDeviceContext) // Register callbacks so we're notified when the preferences change mPrefs->RegisterCallback("font.", PrefChangedCallback, (void*)this); mPrefs->RegisterCallback("browser.display.", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.underline_anchors", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.link_color", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.visited_color", PrefChangedCallback, (void*)this); // Initialize our state from the user preferences GetUserPreferences(); @@ -750,6 +814,28 @@ nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment) return NS_OK; } +NS_IMETHODIMP +nsPresContext::GetDefaultLinkColor(nscolor* aColor) +{ + NS_PRECONDITION(nsnull != aColor, "null argument"); + if (aColor) { + *aColor = mLinkColor; + return NS_OK; + } + return NS_ERROR_NULL_POINTER; +} + +NS_IMETHODIMP +nsPresContext::GetDefaultVisitedLinkColor(nscolor* aColor) +{ + NS_PRECONDITION(nsnull != aColor, "null argument"); + if (aColor) { + *aColor = mVisitedLinkColor; + return NS_OK; + } + return NS_ERROR_NULL_POINTER; +} + NS_IMETHODIMP nsPresContext::SetDefaultColor(nscolor aColor) { @@ -793,6 +879,20 @@ nsPresContext::SetDefaultBackgroundImageAttachment(PRUint8 aAttachment) return NS_OK; } +NS_IMETHODIMP +nsPresContext::SetDefaultLinkColor(nscolor aColor) +{ + mLinkColor = aColor; + return NS_OK; +} + +NS_IMETHODIMP +nsPresContext::SetDefaultVisitedLinkColor(nscolor aColor) +{ + mVisitedLinkColor = aColor; + return NS_OK; +} + NS_IMETHODIMP nsPresContext::GetVisibleArea(nsRect& aResult) { @@ -1182,6 +1282,7 @@ nsPresContext::GetLanguageSpecificTransformType( { NS_ENSURE_ARG_POINTER(aType); *aType = mLanguageSpecificTransformType; + return NS_OK; } diff --git a/mozilla/layout/base/nsPresContext.h b/mozilla/layout/base/nsPresContext.h index ba8b56b3bcf..0525779a121 100644 --- a/mozilla/layout/base/nsPresContext.h +++ b/mozilla/layout/base/nsPresContext.h @@ -90,6 +90,11 @@ enum nsLanguageSpecificTransformType { eLanguageSpecificTransformType_Korean }; +// supported values for cached bool types +const PRUint32 kPresContext_UseDocumentColors = 0x01; +const PRUint32 kPresContext_UseDocumentFonts = 0x02; +const PRUint32 kPresContext_UnderlineLinks = 0x03; + // An interface for presentation contexts. Presentation contexts are // objects that provide an outer context for a presentation shell. class nsIPresContext : public nsISupports { @@ -213,6 +218,13 @@ public: NS_IMETHOD SetDefaultFixedFont(const nsFont& aFont) = 0; virtual const nsFont& GetDefaultFixedFontDeprecated() = 0; + /** Get a cached boolean pref, by its type + if the type is not supported, then NS_ERROR_FAILURE is returned + and the aValue argument is undfined, otherwise aValue is set + to the value of the boolean pref */ + // * - initially created for bugs 31816, 20760, 22963 + NS_IMETHOD GetCachedBoolPref(PRUint32 prefType, PRBool &aValue) = 0; + /** * Access Nav's magic font scaler value */ @@ -220,7 +232,7 @@ public: NS_IMETHOD SetFontScaler(PRInt32 aScaler) = 0; /** - * Get the defualt colors + * Get the default colors */ NS_IMETHOD GetDefaultColor(nscolor* aColor) = 0; NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor) = 0; @@ -228,6 +240,8 @@ public: NS_IMETHOD GetDefaultBackgroundImageRepeat(PRUint8* aRepeat) = 0; NS_IMETHOD GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY) = 0; NS_IMETHOD GetDefaultBackgroundImageAttachment(PRUint8* aRepeat) = 0; + NS_IMETHOD GetDefaultLinkColor(nscolor* aColor) = 0; + NS_IMETHOD GetDefaultVisitedLinkColor(nscolor* aColor) = 0; NS_IMETHOD SetDefaultColor(nscolor aColor) = 0; NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor) = 0; @@ -235,6 +249,8 @@ public: NS_IMETHOD SetDefaultBackgroundImageRepeat(PRUint8 aRepeat) = 0; NS_IMETHOD SetDefaultBackgroundImageOffset(nscoord aX, nscoord aY) = 0; NS_IMETHOD SetDefaultBackgroundImageAttachment(PRUint8 aRepeat) = 0; + NS_IMETHOD SetDefaultLinkColor(nscolor aColor) = 0; + NS_IMETHOD SetDefaultVisitedLinkColor(nscolor aColor) = 0; NS_IMETHOD GetImageGroup(nsIImageGroup** aGroupResult) = 0; diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp index 2aba9405bd3..160341e5f28 100644 --- a/mozilla/layout/base/nsPresShell.cpp +++ b/mozilla/layout/base/nsPresShell.cpp @@ -43,6 +43,8 @@ #include "nsIDocumentObserver.h" #include "nsIStyleSet.h" #include "nsICSSStyleSheet.h" // XXX for UA sheet loading hack, can this go away please? +#include "nsIDOMCSSStyleSheet.h" // for Pref-related rule management (bugs 22963,20760,31816) +#include "nsINameSpaceManager.h" // for Pref-related rule management (bugs 22963,20760,31816) #include "nsIStyleContext.h" #include "nsIServiceManager.h" #include "nsFrame.h" @@ -137,6 +139,25 @@ // SubShell map #include "nsDST.h" +// supporting bugs 31816, 20760, 22963 +// define USE_OVERRIDE to put prefs in as an override stylesheet +// otherwise they go in as a Backstop stylesheets +// - OVERRIDE is better for text and bg colors, but bad for link colors, +// so eventually, we should probably have a backstop and an override and +// put the link colors in the backstop and the text and bg colors in the override, +// but using the backstop stylesheet with !important rules solves 95% of the +// problem and should suffice for RTM +// +// XXX: use backstop stylesheet of link colors and link underline, +// user override stylesheet for forcing background and text colors, post RTM +// +// #define PREFS_USE_OVERRIDE + +// convert a color value to a string, in the CSS format #RRGGBB +// * - initially created for bugs 31816, 20760, 22963 +static void ColorToString(nscolor aColor, nsAutoString &aString); + + // local management of the style watch: // aCtlValue should be set to all actions desired (bitwise OR'd together) // aStyleSet cannot be null @@ -755,6 +776,9 @@ public: NS_IMETHOD GetActiveAlternateStyleSheet(nsString& aSheetTitle); NS_IMETHOD SelectAlternateStyleSheet(const nsString& aSheetTitle); NS_IMETHOD ListAlternateStyleSheets(nsStringArray& aTitleList); + NS_IMETHOD SetPreferenceStyleRules(PRBool aForceRefrlow); + NS_IMETHOD EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType=0xFF); + NS_IMETHOD ArePrefStyleRulesEnabled(PRBool& aEnabled); NS_IMETHOD SetDisplaySelection(PRInt16 aToggle); NS_IMETHOD GetDisplaySelection(PRInt16 *aToggle); @@ -989,6 +1013,15 @@ protected: PRBool mInVerifyReflow; #endif + /** + * methods that manage rules that are used to implement the associated preferences + * - initially created for bugs 31816, 20760, 22963 + */ + nsresult ClearPreferenceStyleRules(void); + nsresult CreatePreferenceStyleSheet(void); + nsresult SetPrefColorRules(void); + nsresult SetPrefLinkRules(void); + // IMPORTANT: The ownership implicit in the following member variables has been // explicitly checked and set using nsCOMPtr for owning pointers and raw COM interface // pointers for weak (ie, non owning) references. If you add any members to this @@ -999,6 +1032,8 @@ protected: nsCOMPtr mDocument; nsCOMPtr mPresContext; nsCOMPtr mStyleSet; + nsICSSStyleSheet* mPrefStyleSheet; // mStyleSet owns it but we maintaina ref, may be null + PRPackedBool mEnablePrefStyleSheet; nsIViewManager* mViewManager; // [WEAK] docViewer owns it so I don't have to nsILayoutHistoryState* mHistoryState; // [WEAK] session history owns this PRUint32 mUpdateCount; @@ -1189,6 +1224,8 @@ PresShell::PresShell():mStackArena(nsnull), mSubShellMap = nsnull; mRCCreatedDuringLoad = 0; mDummyLayoutRequest = nsnull; + mPrefStyleSheet = nsnull; + mEnablePrefStyleSheet = PR_TRUE; #ifdef MOZ_REFLOW_PERF mReflowCountMgr = new ReflowCountMgr(); @@ -1248,6 +1285,9 @@ PresShell::~PresShell() } #endif + // release our pref style sheet, if we have one still + ClearPreferenceStyleRules(); + // if we allocated any stack memory free it. FreeDynamicStack(); @@ -1420,6 +1460,9 @@ PresShell::Init(nsIDocument* aDocument, // cache the drag service so we can check it during reflows mDragService = do_GetService("@mozilla.org/widget/dragservice;1"); + // setup the preference style rules up (no forced reflow) + SetPreferenceStyleRules(PR_FALSE); + return NS_OK; } @@ -1609,6 +1652,366 @@ PresShell::ListAlternateStyleSheets(nsStringArray& aTitleList) return NS_OK; } + +NS_IMETHODIMP +PresShell::EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType/*=0xFF*/) +{ + nsresult result = NS_OK; + + // capture change in state + PRBool bChanging = (mEnablePrefStyleSheet != aEnable) ? PR_TRUE : PR_FALSE; + // set to desired state + mEnablePrefStyleSheet = aEnable; + +#ifdef NS_DEBUG + printf("PrefStyleSheet %s %s\n", + mEnablePrefStyleSheet ? "ENABLED" : "DISABLED", + bChanging ? "(state toggled)" : "(state unchanged)"); +#endif + + // deal with changing state + if(bChanging){ + switch (mEnablePrefStyleSheet){ + case PR_TRUE: + // was off, now on, so create the rules + result = SetPreferenceStyleRules(PR_TRUE); + break; + default : + // was on, now off, so clear the rules + result = ClearPreferenceStyleRules(); + break; + } + } + return result; +} + +NS_IMETHODIMP +PresShell::ArePrefStyleRulesEnabled(PRBool& aEnabled) +{ + aEnabled = mEnablePrefStyleSheet; + return NS_OK; +} + +NS_IMETHODIMP +PresShell::SetPreferenceStyleRules(PRBool aForceReflow) +{ + NS_PRECONDITION(mPresContext, "presContext cannot be null"); + if (mPresContext) { + nsresult result = NS_OK; + + // zeroth, make sure this feature is enabled + // XXX: may get more granularity later + // (i.e. each pref may be controlled independently) + if (!mEnablePrefStyleSheet) { +#ifdef NS_DEBUG + printf("PrefStyleSheet disabled\n"); +#endif + return PR_TRUE; + } + + // first, make sure this is not a chrome shell + nsCOMPtr container; + result = mPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + return NS_OK; + } + } + } + } + if (NS_SUCCEEDED(result)) { + +#ifdef NS_DEBUG + printf("Setting Preference Style Rules:\n"); +#endif + // if here, we need to create rules for the prefs + // - this includes the background-color, the text-color, + // the link color, the visited link color and the link-underlining + + // first clear any exising rules + result = ClearPreferenceStyleRules(); + + // now do the color rules + if (NS_SUCCEEDED(result)) { + result = SetPrefColorRules(); + } + + // now the link rules (must come after the color rules, or links will not be correct color!) + // XXX - when there is both an override and backstop pref stylesheet this won't matter, + // as the color rules will be overrides and the links rules will be backstop + if (NS_SUCCEEDED(result)) { + result = SetPrefLinkRules(); + } + + // update the styleset now that we are done inserting our rules + if (NS_SUCCEEDED(result)) { + if (mStyleSet) { + mStyleSet->NotifyStyleSheetStateChanged(PR_FALSE); + } + } + } +#ifdef NS_DEBUG + printf( "Preference Style Rules set: error=%ld\n", (long)result); +#endif + + if (aForceReflow){ +#ifdef NS_DEBUG + printf( "*** Forcing reframe! ***\n"); +#endif + // this is harsh, but without it the new colors don't appear on the current page + // Fortunately, it only happens when the prefs change, a rare event. + // XXX - determine why the normal PresContext::RemapStyleAndReflow doesn't cut it + ReconstructFrames(); + } + + return result; + + } else { + return NS_ERROR_NULL_POINTER; + } +} + +nsresult PresShell::ClearPreferenceStyleRules(void) +{ + nsresult result = NS_OK; + if (mPrefStyleSheet) { + NS_ASSERTION(mStyleSet, "null styleset entirely unexpected!"); + if (mStyleSet) { + // remove the sheet from the styleset: + // - note that we have to check for success by comparing the count before and after... +#ifdef NS_DEBUG + #ifdef PREFS_USE_OVERRIDE + PRInt32 numBefore = mStyleSet->GetNumberOfOverrideStyleSheets(); + #else + PRInt32 numBefore = mStyleSet->GetNumberOfBackstopStyleSheets(); + #endif + NS_ASSERTION(numBefore > 0, "no override stylesheets in styleset, but we have one!"); +#endif + + #ifdef PREFS_USE_OVERRIDE + mStyleSet->RemoveOverrideStyleSheet(mPrefStyleSheet); + #else + mStyleSet->RemoveBackstopStyleSheet(mPrefStyleSheet); + #endif + +#ifdef NS_DEBUG + #ifdef PREFS_USE_OVERRIDE + NS_ASSERTION((numBefore - 1) == mStyleSet->GetNumberOfOverrideStyleSheets(), + "Pref stylesheet was not removed"); + #else + NS_ASSERTION((numBefore - 1) == mStyleSet->GetNumberOfBackstopStyleSheets(), + "Pref stylesheet was not removed"); + #endif + printf("PrefStyleSheet removed\n"); +#endif + // clear the sheet pointer: it is strictly historical now + NS_IF_RELEASE(mPrefStyleSheet); + } + } + return result; +} + +nsresult PresShell::CreatePreferenceStyleSheet(void) +{ + NS_ASSERTION(mPrefStyleSheet==nsnull, "prefStyleSheet already exists"); + nsresult result = NS_OK; + + result = NS_NewCSSStyleSheet(&mPrefStyleSheet); + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "null but no error"); + nsCOMPtr uri; + result = NS_NewURI(getter_AddRefs(uri), "about:PreferenceStyleSheet", nsnull); + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(uri, "null but no error"); + result = mPrefStyleSheet->Init(uri); + if (NS_SUCCEEDED(result)) { + mPrefStyleSheet->SetDefaultNameSpaceID(kNameSpaceID_HTML); + #ifdef PREFS_USE_OVERRIDE + mStyleSet->AppendOverrideStyleSheet(mPrefStyleSheet); + #else + mStyleSet->AppendBackstopStyleSheet(mPrefStyleSheet); + #endif + } + } + } else { + result = NS_ERROR_OUT_OF_MEMORY; + } + +#ifdef NS_DEBUG + printf("CreatePrefStyleSheet completed: error=%ld\n",(long)result); +#endif + + return result; +} + +nsresult PresShell::SetPrefColorRules(void) +{ + NS_ASSERTION(mPresContext,"null prescontext not allowed"); + if (mPresContext) { + nsresult result = NS_OK; + PRBool useDocColors = PR_TRUE; + + // see if we need to create the rules first + if (NS_SUCCEEDED(mPresContext->GetCachedBoolPref(kPresContext_UseDocumentColors, useDocColors))) { + if (!useDocColors) { + +#ifdef NS_DEBUG + printf(" - Creating rules for document colors\n"); +#endif + + // OK, not using document colors, so we have to force the user's colors via style rules + if (!mPrefStyleSheet) { + result = CreatePreferenceStyleSheet(); + } + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "prefstylesheet should not be null"); + + nscolor bgColor; + nscolor textColor; + result = mPresContext->GetDefaultColor(&textColor); + if (NS_SUCCEEDED(result)) { + result = mPresContext->GetDefaultBackgroundColor(&bgColor); + } + if (NS_SUCCEEDED(result)) { + // get the DOM interface to the stylesheet + nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet,&result)); + if (NS_SUCCEEDED(result)) { + PRUint32 index = 0; + nsAutoString strRule,strColor; + + // create a rule for each color and add it to the style sheet + // - the rules are !important so they override all but author + // important rules (when put into a backstop stylesheet) and + // all (even author important) when put into an override stylesheet + + /////////////////////////////////////////////////////////////// + // - default color: '* {color:#RRGGBB !important;}' + ColorToString(textColor,strColor); + strRule.Append(NS_LITERAL_STRING("* {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + /////////////////////////////////////////////////////////////// + // - default background color: '* {background-color:#RRGGBB !important;}' + ColorToString(bgColor,strColor); + strRule.Append(NS_LITERAL_STRING("* {background-color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + // now insert the rule + result = sheet->InsertRule(strRule,0,&index); + } + } + } + } + } + return result; + } else { + return NS_ERROR_FAILURE; + } +} + +nsresult PresShell::SetPrefLinkRules(void) +{ + NS_ASSERTION(mPresContext,"null prescontext not allowed"); + if (mPresContext) { + nsresult result = NS_OK; + + if (!mPrefStyleSheet) { + result = CreatePreferenceStyleSheet(); + } + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "prefstylesheet should not be null"); + + // get the DOM interface to the stylesheet + nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet,&result)); + if (NS_SUCCEEDED(result)) { + +#ifdef NS_DEBUG + printf(" - Creating rules for link and visited colors\n"); +#endif + + // support default link colors: + // this means the link colors need to be overridable, + // which they are if we put them in the backstop stylesheet, + // though if using an override sheet this will cause authors grief still + // In the backstop stylesheet, they are !important to keep the forced-color rules + // from coloring the links too + // + // XXX: do active links and visited links get another color? + // They were red in the html.css rules + + nscolor linkColor, visitedColor; + result = mPresContext->GetDefaultLinkColor(&linkColor); + if (NS_SUCCEEDED(result)) { + result = mPresContext->GetDefaultVisitedLinkColor(&visitedColor); + } + if (NS_SUCCEEDED(result)) { + // insert a rule to make links the preferred color + PRUint32 index = 0; + nsAutoString strRule, strColor; + + /////////////////////////////////////////////////////////////// + // - links: '*:link, *:link:active {color: #RRGGBB !important;}' + ColorToString(linkColor,strColor); + strRule.Append(NS_LITERAL_STRING("*:link, *:link:active {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + /////////////////////////////////////////////////////////////// + // - visited links '*:visited, *:visited:active {color: #RRGGBB !important;}' + ColorToString(visitedColor,strColor); + strRule.Append(NS_LITERAL_STRING("*:visited, *:visited:active {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + // insert the rules + result = sheet->InsertRule(strRule,0,&index); + } + + if (NS_SUCCEEDED(result)) { + PRBool underlineLinks = PR_TRUE; + result = mPresContext->GetCachedBoolPref(kPresContext_UnderlineLinks,underlineLinks); + if (NS_SUCCEEDED(result)) { + // create a rule for underline: on or off + PRUint32 index = 0; + nsAutoString strRule; + if (underlineLinks) { + // create a rule to make underlining happen + // ':link, :visited {text-decoration:[underline|none];}' + // no need for important, we want these to be overridable + // NOTE: these must go in the backstop stylesheet or they cannot be + // overridden by authors + #ifdef NS_DEBUG + printf (" - Creating rules for enabling link underlines\n"); + #endif + // make a rule to make text-decoration: underline happen for links + strRule.Append(NS_LITERAL_STRING(":link, :visited {text-decoration:underline;}")); + } else { + #ifdef NS_DEBUG + printf (" - Creating rules for disabling link underlines\n"); + #endif + // make a rule to make text-decoration: none happen for links + strRule.Append(NS_LITERAL_STRING(":link, :visited {text-decoration:none;}")); + } + + // ...now insert the rule + result = sheet->InsertRule(strRule,0,&index); + } + } + } + } + return result; + } else { + return NS_ERROR_FAILURE; + } +} + NS_IMETHODIMP PresShell::SetDisplaySelection(PRInt16 aToggle) { @@ -5942,3 +6345,27 @@ void ReflowCountMgr::DisplayDiffsInTotals(const char * aStr) } #endif // MOZ_REFLOW_PERF + +// make a color string like #RRGGBB +void ColorToString(nscolor aColor, nsAutoString &aString) +{ + nsAutoString tmp; + aString.SetLength(0); + + // # + aString.Append(NS_LITERAL_STRING("#")); + // RR + tmp.AppendInt((PRInt32)NS_GET_R(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); + tmp.SetLength(0); + // GG + tmp.AppendInt((PRInt32)NS_GET_G(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); + tmp.SetLength(0); + // BB + tmp.AppendInt((PRInt32)NS_GET_B(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); +} diff --git a/mozilla/layout/base/public/nsIPresContext.h b/mozilla/layout/base/public/nsIPresContext.h index ba8b56b3bcf..0525779a121 100644 --- a/mozilla/layout/base/public/nsIPresContext.h +++ b/mozilla/layout/base/public/nsIPresContext.h @@ -90,6 +90,11 @@ enum nsLanguageSpecificTransformType { eLanguageSpecificTransformType_Korean }; +// supported values for cached bool types +const PRUint32 kPresContext_UseDocumentColors = 0x01; +const PRUint32 kPresContext_UseDocumentFonts = 0x02; +const PRUint32 kPresContext_UnderlineLinks = 0x03; + // An interface for presentation contexts. Presentation contexts are // objects that provide an outer context for a presentation shell. class nsIPresContext : public nsISupports { @@ -213,6 +218,13 @@ public: NS_IMETHOD SetDefaultFixedFont(const nsFont& aFont) = 0; virtual const nsFont& GetDefaultFixedFontDeprecated() = 0; + /** Get a cached boolean pref, by its type + if the type is not supported, then NS_ERROR_FAILURE is returned + and the aValue argument is undfined, otherwise aValue is set + to the value of the boolean pref */ + // * - initially created for bugs 31816, 20760, 22963 + NS_IMETHOD GetCachedBoolPref(PRUint32 prefType, PRBool &aValue) = 0; + /** * Access Nav's magic font scaler value */ @@ -220,7 +232,7 @@ public: NS_IMETHOD SetFontScaler(PRInt32 aScaler) = 0; /** - * Get the defualt colors + * Get the default colors */ NS_IMETHOD GetDefaultColor(nscolor* aColor) = 0; NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor) = 0; @@ -228,6 +240,8 @@ public: NS_IMETHOD GetDefaultBackgroundImageRepeat(PRUint8* aRepeat) = 0; NS_IMETHOD GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY) = 0; NS_IMETHOD GetDefaultBackgroundImageAttachment(PRUint8* aRepeat) = 0; + NS_IMETHOD GetDefaultLinkColor(nscolor* aColor) = 0; + NS_IMETHOD GetDefaultVisitedLinkColor(nscolor* aColor) = 0; NS_IMETHOD SetDefaultColor(nscolor aColor) = 0; NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor) = 0; @@ -235,6 +249,8 @@ public: NS_IMETHOD SetDefaultBackgroundImageRepeat(PRUint8 aRepeat) = 0; NS_IMETHOD SetDefaultBackgroundImageOffset(nscoord aX, nscoord aY) = 0; NS_IMETHOD SetDefaultBackgroundImageAttachment(PRUint8 aRepeat) = 0; + NS_IMETHOD SetDefaultLinkColor(nscolor aColor) = 0; + NS_IMETHOD SetDefaultVisitedLinkColor(nscolor aColor) = 0; NS_IMETHOD GetImageGroup(nsIImageGroup** aGroupResult) = 0; diff --git a/mozilla/layout/base/public/nsIPresShell.h b/mozilla/layout/base/public/nsIPresShell.h index 04aa6754189..99f5b665311 100644 --- a/mozilla/layout/base/public/nsIPresShell.h +++ b/mozilla/layout/base/public/nsIPresShell.h @@ -146,6 +146,26 @@ public: NS_IMETHOD SelectAlternateStyleSheet(const nsString& aSheetTitle) = 0; + /** Setup all style rules required to implement preferences + * - used for background/text/link colors and link underlining + * may be extended for any prefs that are implemented via style rules + * - aForceReflow argument is used to force a full reframe to make the rules show + * (only used when the current page needs to reflect changed pref rules) + * + * - initially created for bugs 31816, 20760, 22963 + */ + NS_IMETHOD SetPreferenceStyleRules(PRBool aForceReflow) = 0; + + /** Allow client to enable and disable the use of the preference style rules, + * by type. + * NOTE: type argument is currently ignored, but is in the API for + * future refinement + * + * - initially created for bugs 31816, 20760, 22963 + */ + NS_IMETHOD EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType=0xFF) = 0; + NS_IMETHOD ArePrefStyleRulesEnabled(PRBool& aEnabled) = 0; + /** * Gather titles of all selectable (alternate and preferred) style sheets * fills void array with nsString* caller must free strings diff --git a/mozilla/layout/base/public/nsPresContext.h b/mozilla/layout/base/public/nsPresContext.h index ba8b56b3bcf..0525779a121 100644 --- a/mozilla/layout/base/public/nsPresContext.h +++ b/mozilla/layout/base/public/nsPresContext.h @@ -90,6 +90,11 @@ enum nsLanguageSpecificTransformType { eLanguageSpecificTransformType_Korean }; +// supported values for cached bool types +const PRUint32 kPresContext_UseDocumentColors = 0x01; +const PRUint32 kPresContext_UseDocumentFonts = 0x02; +const PRUint32 kPresContext_UnderlineLinks = 0x03; + // An interface for presentation contexts. Presentation contexts are // objects that provide an outer context for a presentation shell. class nsIPresContext : public nsISupports { @@ -213,6 +218,13 @@ public: NS_IMETHOD SetDefaultFixedFont(const nsFont& aFont) = 0; virtual const nsFont& GetDefaultFixedFontDeprecated() = 0; + /** Get a cached boolean pref, by its type + if the type is not supported, then NS_ERROR_FAILURE is returned + and the aValue argument is undfined, otherwise aValue is set + to the value of the boolean pref */ + // * - initially created for bugs 31816, 20760, 22963 + NS_IMETHOD GetCachedBoolPref(PRUint32 prefType, PRBool &aValue) = 0; + /** * Access Nav's magic font scaler value */ @@ -220,7 +232,7 @@ public: NS_IMETHOD SetFontScaler(PRInt32 aScaler) = 0; /** - * Get the defualt colors + * Get the default colors */ NS_IMETHOD GetDefaultColor(nscolor* aColor) = 0; NS_IMETHOD GetDefaultBackgroundColor(nscolor* aColor) = 0; @@ -228,6 +240,8 @@ public: NS_IMETHOD GetDefaultBackgroundImageRepeat(PRUint8* aRepeat) = 0; NS_IMETHOD GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY) = 0; NS_IMETHOD GetDefaultBackgroundImageAttachment(PRUint8* aRepeat) = 0; + NS_IMETHOD GetDefaultLinkColor(nscolor* aColor) = 0; + NS_IMETHOD GetDefaultVisitedLinkColor(nscolor* aColor) = 0; NS_IMETHOD SetDefaultColor(nscolor aColor) = 0; NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor) = 0; @@ -235,6 +249,8 @@ public: NS_IMETHOD SetDefaultBackgroundImageRepeat(PRUint8 aRepeat) = 0; NS_IMETHOD SetDefaultBackgroundImageOffset(nscoord aX, nscoord aY) = 0; NS_IMETHOD SetDefaultBackgroundImageAttachment(PRUint8 aRepeat) = 0; + NS_IMETHOD SetDefaultLinkColor(nscolor aColor) = 0; + NS_IMETHOD SetDefaultVisitedLinkColor(nscolor aColor) = 0; NS_IMETHOD GetImageGroup(nsIImageGroup** aGroupResult) = 0; diff --git a/mozilla/layout/base/src/nsPresContext.cpp b/mozilla/layout/base/src/nsPresContext.cpp index cd874619131..043258ff9e8 100644 --- a/mozilla/layout/base/src/nsPresContext.cpp +++ b/mozilla/layout/base/src/nsPresContext.cpp @@ -110,6 +110,14 @@ nsPresContext::nsPresContext() mDefaultColor = NS_RGB(0x00, 0x00, 0x00); mDefaultBackgroundColor = NS_RGB(0xFF, 0xFF, 0xFF); #endif + + mUseDocumentColors = PR_TRUE; + mUseDocumentFonts = PR_TRUE; + + mLinkColor = NS_RGB(0x33, 0x33, 0xFF); + mVisitedLinkColor = NS_RGB(0x66, 0x00, 0xCC); + mUnderlineLinks = PR_TRUE; + mDefaultBackgroundImageAttachment = NS_STYLE_BG_ATTACHMENT_SCROLL; mDefaultBackgroundImageRepeat = NS_STYLE_BG_REPEAT_XY; mDefaultBackgroundImageOffsetX = mDefaultBackgroundImageOffsetY = 0; @@ -144,6 +152,9 @@ nsPresContext::~nsPresContext() if (mPrefs) { mPrefs->UnregisterCallback("font.", PrefChangedCallback, (void*)this); mPrefs->UnregisterCallback("browser.display.", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.underline_anchors", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.link_color", PrefChangedCallback, (void*)this); + mPrefs->UnregisterCallback("browser.visited_color", PrefChangedCallback, (void*)this); } } @@ -240,16 +251,17 @@ nsPresContext::GetUserPreferences() mWidgetRenderingMode = (enum nsWidgetRendering)prefInt; // bad cast } + // * document colors PRBool usePrefColors = PR_TRUE; -#ifdef _WIN32 + PRUint32 colorPref; PRBool boolPref; +#ifdef _WIN32 // XXX Is Windows the only platform that uses this? if (NS_OK == mPrefs->GetBoolPref("browser.display.wfe.use_windows_colors", &boolPref)) { usePrefColors = !boolPref; } #endif if (usePrefColors) { - PRUint32 colorPref; if (NS_OK == mPrefs->GetColorPrefDWord("browser.display.foreground_color", &colorPref)) { mDefaultColor = (nscolor)colorPref; } @@ -257,13 +269,56 @@ nsPresContext::GetUserPreferences() mDefaultBackgroundColor = (nscolor)colorPref; } } + if (NS_OK == mPrefs->GetBoolPref("browser.display.use_document_colors", &boolPref)) { + mUseDocumentColors = boolPref; + } + // * link colors + if (NS_OK == mPrefs->GetBoolPref("browser.underline_anchors", &boolPref)) { + mUnderlineLinks = boolPref; + } + if (NS_OK == mPrefs->GetColorPrefDWord("browser.anchor_color", &colorPref)) { + mLinkColor = (nscolor)colorPref; + } + if (NS_OK == mPrefs->GetColorPrefDWord("browser.visited_color", &colorPref)) { + mVisitedLinkColor = (nscolor)colorPref; + } + + // * use fonts? + if (NS_OK == mPrefs->GetIntPref("browser.display.use_document_fonts", &prefInt)) { + mUseDocumentFonts = prefInt == 0 ? PR_FALSE : PR_TRUE; + } + // * direction if (NS_OK == mPrefs->GetIntPref("browser.display.direction", &prefInt)) { mDefaultDirection = prefInt; } - + GetFontPreferences(); } +NS_IMETHODIMP +nsPresContext::GetCachedBoolPref(PRUint32 prefType, PRBool &aValue) +{ + nsresult rv = NS_ERROR_FAILURE; + + switch(prefType) { + case kPresContext_UseDocumentFonts : + aValue = mUseDocumentFonts; + rv = NS_OK; + break; + case kPresContext_UseDocumentColors: + aValue = mUseDocumentColors; + rv = NS_OK; + break; + case kPresContext_UnderlineLinks: + aValue = mUnderlineLinks; + rv = NS_OK; + break; + default : + rv = NS_ERROR_FAILURE; + } + return rv; +} + NS_IMETHODIMP nsPresContext::RemapStyleAndReflow() { @@ -308,6 +363,12 @@ nsPresContext::PreferenceChanged(const char* aPrefName) { // Initialize our state from the user preferences GetUserPreferences(); + + // update the presShell: tell it to set the preference style rules up + if (mShell) { + mShell->SetPreferenceStyleRules(PR_TRUE); + } + if (mDeviceContext) { mDeviceContext->FlushFontCache(); RemapStyleAndReflow(); @@ -327,6 +388,9 @@ nsPresContext::Init(nsIDeviceContext* aDeviceContext) // Register callbacks so we're notified when the preferences change mPrefs->RegisterCallback("font.", PrefChangedCallback, (void*)this); mPrefs->RegisterCallback("browser.display.", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.underline_anchors", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.link_color", PrefChangedCallback, (void*)this); + mPrefs->RegisterCallback("browser.visited_color", PrefChangedCallback, (void*)this); // Initialize our state from the user preferences GetUserPreferences(); @@ -750,6 +814,28 @@ nsPresContext::GetDefaultBackgroundImageAttachment(PRUint8* aAttachment) return NS_OK; } +NS_IMETHODIMP +nsPresContext::GetDefaultLinkColor(nscolor* aColor) +{ + NS_PRECONDITION(nsnull != aColor, "null argument"); + if (aColor) { + *aColor = mLinkColor; + return NS_OK; + } + return NS_ERROR_NULL_POINTER; +} + +NS_IMETHODIMP +nsPresContext::GetDefaultVisitedLinkColor(nscolor* aColor) +{ + NS_PRECONDITION(nsnull != aColor, "null argument"); + if (aColor) { + *aColor = mVisitedLinkColor; + return NS_OK; + } + return NS_ERROR_NULL_POINTER; +} + NS_IMETHODIMP nsPresContext::SetDefaultColor(nscolor aColor) { @@ -793,6 +879,20 @@ nsPresContext::SetDefaultBackgroundImageAttachment(PRUint8 aAttachment) return NS_OK; } +NS_IMETHODIMP +nsPresContext::SetDefaultLinkColor(nscolor aColor) +{ + mLinkColor = aColor; + return NS_OK; +} + +NS_IMETHODIMP +nsPresContext::SetDefaultVisitedLinkColor(nscolor aColor) +{ + mVisitedLinkColor = aColor; + return NS_OK; +} + NS_IMETHODIMP nsPresContext::GetVisibleArea(nsRect& aResult) { @@ -1182,6 +1282,7 @@ nsPresContext::GetLanguageSpecificTransformType( { NS_ENSURE_ARG_POINTER(aType); *aType = mLanguageSpecificTransformType; + return NS_OK; } diff --git a/mozilla/layout/base/src/nsPresContext.h b/mozilla/layout/base/src/nsPresContext.h index c1e4191fddf..0c67dcd5bfc 100644 --- a/mozilla/layout/base/src/nsPresContext.h +++ b/mozilla/layout/base/src/nsPresContext.h @@ -97,6 +97,8 @@ public: NS_IMETHOD GetDefaultFixedFont(nsFont& aResult); NS_IMETHOD SetDefaultFixedFont(const nsFont& aFont); virtual const nsFont& GetDefaultFixedFontDeprecated(); + NS_IMETHOD GetCachedBoolPref(PRUint32 prefType, PRBool &aValue); + NS_IMETHOD GetFontScaler(PRInt32* aResult); NS_IMETHOD SetFontScaler(PRInt32 aScaler); NS_IMETHOD GetDefaultColor(nscolor* aColor); @@ -105,6 +107,8 @@ public: NS_IMETHOD GetDefaultBackgroundImageRepeat(PRUint8* aRepeat); NS_IMETHOD GetDefaultBackgroundImageOffset(nscoord* aX, nscoord* aY); NS_IMETHOD GetDefaultBackgroundImageAttachment(PRUint8* aRepeat); + NS_IMETHOD GetDefaultLinkColor(nscolor* aColor); + NS_IMETHOD GetDefaultVisitedLinkColor(nscolor* aColor); NS_IMETHOD SetDefaultColor(nscolor aColor); NS_IMETHOD SetDefaultBackgroundColor(nscolor aColor); @@ -112,6 +116,8 @@ public: NS_IMETHOD SetDefaultBackgroundImageRepeat(PRUint8 aRepeat); NS_IMETHOD SetDefaultBackgroundImageOffset(nscoord aX, nscoord aY); NS_IMETHOD SetDefaultBackgroundImageAttachment(PRUint8 aRepeat); + NS_IMETHOD SetDefaultLinkColor(nscolor aColor); + NS_IMETHOD SetDefaultVisitedLinkColor(nscolor aColor); NS_IMETHOD GetImageGroup(nsIImageGroup** aGroupResult); NS_IMETHOD StartLoadImage(const nsString& aURL, @@ -176,8 +182,13 @@ protected: nsFont mDefaultFont; nsFont mDefaultFixedFont; PRInt32 mFontScaler; - nscolor mDefaultColor; - nscolor mDefaultBackgroundColor; + PRPackedBool mUseDocumentFonts; // set in GetUserPrefs + nscolor mDefaultColor; // set in GetUserPrefs + nscolor mDefaultBackgroundColor; // set in GetUserPrefs + PRPackedBool mUseDocumentColors; // set in GetUserPrefs + nscolor mLinkColor; // set in GetUserPrefs + nscolor mVisitedLinkColor; // set in GetUserPrefs + PRPackedBool mUnderlineLinks; // set in GetUserPrefs nsString mDefaultBackgroundImage; PRUint8 mDefaultBackgroundImageRepeat; nscoord mDefaultBackgroundImageOffsetX; @@ -194,7 +205,7 @@ protected: PRPackedBool mStopped; // loading stopped PRPackedBool mStopChrome; // should we stop chrome? PRUint8 mDefaultDirection; - + #ifdef DEBUG PRBool mInitialized; #endif diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp index 2aba9405bd3..160341e5f28 100644 --- a/mozilla/layout/html/base/src/nsPresShell.cpp +++ b/mozilla/layout/html/base/src/nsPresShell.cpp @@ -43,6 +43,8 @@ #include "nsIDocumentObserver.h" #include "nsIStyleSet.h" #include "nsICSSStyleSheet.h" // XXX for UA sheet loading hack, can this go away please? +#include "nsIDOMCSSStyleSheet.h" // for Pref-related rule management (bugs 22963,20760,31816) +#include "nsINameSpaceManager.h" // for Pref-related rule management (bugs 22963,20760,31816) #include "nsIStyleContext.h" #include "nsIServiceManager.h" #include "nsFrame.h" @@ -137,6 +139,25 @@ // SubShell map #include "nsDST.h" +// supporting bugs 31816, 20760, 22963 +// define USE_OVERRIDE to put prefs in as an override stylesheet +// otherwise they go in as a Backstop stylesheets +// - OVERRIDE is better for text and bg colors, but bad for link colors, +// so eventually, we should probably have a backstop and an override and +// put the link colors in the backstop and the text and bg colors in the override, +// but using the backstop stylesheet with !important rules solves 95% of the +// problem and should suffice for RTM +// +// XXX: use backstop stylesheet of link colors and link underline, +// user override stylesheet for forcing background and text colors, post RTM +// +// #define PREFS_USE_OVERRIDE + +// convert a color value to a string, in the CSS format #RRGGBB +// * - initially created for bugs 31816, 20760, 22963 +static void ColorToString(nscolor aColor, nsAutoString &aString); + + // local management of the style watch: // aCtlValue should be set to all actions desired (bitwise OR'd together) // aStyleSet cannot be null @@ -755,6 +776,9 @@ public: NS_IMETHOD GetActiveAlternateStyleSheet(nsString& aSheetTitle); NS_IMETHOD SelectAlternateStyleSheet(const nsString& aSheetTitle); NS_IMETHOD ListAlternateStyleSheets(nsStringArray& aTitleList); + NS_IMETHOD SetPreferenceStyleRules(PRBool aForceRefrlow); + NS_IMETHOD EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType=0xFF); + NS_IMETHOD ArePrefStyleRulesEnabled(PRBool& aEnabled); NS_IMETHOD SetDisplaySelection(PRInt16 aToggle); NS_IMETHOD GetDisplaySelection(PRInt16 *aToggle); @@ -989,6 +1013,15 @@ protected: PRBool mInVerifyReflow; #endif + /** + * methods that manage rules that are used to implement the associated preferences + * - initially created for bugs 31816, 20760, 22963 + */ + nsresult ClearPreferenceStyleRules(void); + nsresult CreatePreferenceStyleSheet(void); + nsresult SetPrefColorRules(void); + nsresult SetPrefLinkRules(void); + // IMPORTANT: The ownership implicit in the following member variables has been // explicitly checked and set using nsCOMPtr for owning pointers and raw COM interface // pointers for weak (ie, non owning) references. If you add any members to this @@ -999,6 +1032,8 @@ protected: nsCOMPtr mDocument; nsCOMPtr mPresContext; nsCOMPtr mStyleSet; + nsICSSStyleSheet* mPrefStyleSheet; // mStyleSet owns it but we maintaina ref, may be null + PRPackedBool mEnablePrefStyleSheet; nsIViewManager* mViewManager; // [WEAK] docViewer owns it so I don't have to nsILayoutHistoryState* mHistoryState; // [WEAK] session history owns this PRUint32 mUpdateCount; @@ -1189,6 +1224,8 @@ PresShell::PresShell():mStackArena(nsnull), mSubShellMap = nsnull; mRCCreatedDuringLoad = 0; mDummyLayoutRequest = nsnull; + mPrefStyleSheet = nsnull; + mEnablePrefStyleSheet = PR_TRUE; #ifdef MOZ_REFLOW_PERF mReflowCountMgr = new ReflowCountMgr(); @@ -1248,6 +1285,9 @@ PresShell::~PresShell() } #endif + // release our pref style sheet, if we have one still + ClearPreferenceStyleRules(); + // if we allocated any stack memory free it. FreeDynamicStack(); @@ -1420,6 +1460,9 @@ PresShell::Init(nsIDocument* aDocument, // cache the drag service so we can check it during reflows mDragService = do_GetService("@mozilla.org/widget/dragservice;1"); + // setup the preference style rules up (no forced reflow) + SetPreferenceStyleRules(PR_FALSE); + return NS_OK; } @@ -1609,6 +1652,366 @@ PresShell::ListAlternateStyleSheets(nsStringArray& aTitleList) return NS_OK; } + +NS_IMETHODIMP +PresShell::EnablePrefStyleRules(PRBool aEnable, PRUint8 aPrefType/*=0xFF*/) +{ + nsresult result = NS_OK; + + // capture change in state + PRBool bChanging = (mEnablePrefStyleSheet != aEnable) ? PR_TRUE : PR_FALSE; + // set to desired state + mEnablePrefStyleSheet = aEnable; + +#ifdef NS_DEBUG + printf("PrefStyleSheet %s %s\n", + mEnablePrefStyleSheet ? "ENABLED" : "DISABLED", + bChanging ? "(state toggled)" : "(state unchanged)"); +#endif + + // deal with changing state + if(bChanging){ + switch (mEnablePrefStyleSheet){ + case PR_TRUE: + // was off, now on, so create the rules + result = SetPreferenceStyleRules(PR_TRUE); + break; + default : + // was on, now off, so clear the rules + result = ClearPreferenceStyleRules(); + break; + } + } + return result; +} + +NS_IMETHODIMP +PresShell::ArePrefStyleRulesEnabled(PRBool& aEnabled) +{ + aEnabled = mEnablePrefStyleSheet; + return NS_OK; +} + +NS_IMETHODIMP +PresShell::SetPreferenceStyleRules(PRBool aForceReflow) +{ + NS_PRECONDITION(mPresContext, "presContext cannot be null"); + if (mPresContext) { + nsresult result = NS_OK; + + // zeroth, make sure this feature is enabled + // XXX: may get more granularity later + // (i.e. each pref may be controlled independently) + if (!mEnablePrefStyleSheet) { +#ifdef NS_DEBUG + printf("PrefStyleSheet disabled\n"); +#endif + return PR_TRUE; + } + + // first, make sure this is not a chrome shell + nsCOMPtr container; + result = mPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + return NS_OK; + } + } + } + } + if (NS_SUCCEEDED(result)) { + +#ifdef NS_DEBUG + printf("Setting Preference Style Rules:\n"); +#endif + // if here, we need to create rules for the prefs + // - this includes the background-color, the text-color, + // the link color, the visited link color and the link-underlining + + // first clear any exising rules + result = ClearPreferenceStyleRules(); + + // now do the color rules + if (NS_SUCCEEDED(result)) { + result = SetPrefColorRules(); + } + + // now the link rules (must come after the color rules, or links will not be correct color!) + // XXX - when there is both an override and backstop pref stylesheet this won't matter, + // as the color rules will be overrides and the links rules will be backstop + if (NS_SUCCEEDED(result)) { + result = SetPrefLinkRules(); + } + + // update the styleset now that we are done inserting our rules + if (NS_SUCCEEDED(result)) { + if (mStyleSet) { + mStyleSet->NotifyStyleSheetStateChanged(PR_FALSE); + } + } + } +#ifdef NS_DEBUG + printf( "Preference Style Rules set: error=%ld\n", (long)result); +#endif + + if (aForceReflow){ +#ifdef NS_DEBUG + printf( "*** Forcing reframe! ***\n"); +#endif + // this is harsh, but without it the new colors don't appear on the current page + // Fortunately, it only happens when the prefs change, a rare event. + // XXX - determine why the normal PresContext::RemapStyleAndReflow doesn't cut it + ReconstructFrames(); + } + + return result; + + } else { + return NS_ERROR_NULL_POINTER; + } +} + +nsresult PresShell::ClearPreferenceStyleRules(void) +{ + nsresult result = NS_OK; + if (mPrefStyleSheet) { + NS_ASSERTION(mStyleSet, "null styleset entirely unexpected!"); + if (mStyleSet) { + // remove the sheet from the styleset: + // - note that we have to check for success by comparing the count before and after... +#ifdef NS_DEBUG + #ifdef PREFS_USE_OVERRIDE + PRInt32 numBefore = mStyleSet->GetNumberOfOverrideStyleSheets(); + #else + PRInt32 numBefore = mStyleSet->GetNumberOfBackstopStyleSheets(); + #endif + NS_ASSERTION(numBefore > 0, "no override stylesheets in styleset, but we have one!"); +#endif + + #ifdef PREFS_USE_OVERRIDE + mStyleSet->RemoveOverrideStyleSheet(mPrefStyleSheet); + #else + mStyleSet->RemoveBackstopStyleSheet(mPrefStyleSheet); + #endif + +#ifdef NS_DEBUG + #ifdef PREFS_USE_OVERRIDE + NS_ASSERTION((numBefore - 1) == mStyleSet->GetNumberOfOverrideStyleSheets(), + "Pref stylesheet was not removed"); + #else + NS_ASSERTION((numBefore - 1) == mStyleSet->GetNumberOfBackstopStyleSheets(), + "Pref stylesheet was not removed"); + #endif + printf("PrefStyleSheet removed\n"); +#endif + // clear the sheet pointer: it is strictly historical now + NS_IF_RELEASE(mPrefStyleSheet); + } + } + return result; +} + +nsresult PresShell::CreatePreferenceStyleSheet(void) +{ + NS_ASSERTION(mPrefStyleSheet==nsnull, "prefStyleSheet already exists"); + nsresult result = NS_OK; + + result = NS_NewCSSStyleSheet(&mPrefStyleSheet); + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "null but no error"); + nsCOMPtr uri; + result = NS_NewURI(getter_AddRefs(uri), "about:PreferenceStyleSheet", nsnull); + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(uri, "null but no error"); + result = mPrefStyleSheet->Init(uri); + if (NS_SUCCEEDED(result)) { + mPrefStyleSheet->SetDefaultNameSpaceID(kNameSpaceID_HTML); + #ifdef PREFS_USE_OVERRIDE + mStyleSet->AppendOverrideStyleSheet(mPrefStyleSheet); + #else + mStyleSet->AppendBackstopStyleSheet(mPrefStyleSheet); + #endif + } + } + } else { + result = NS_ERROR_OUT_OF_MEMORY; + } + +#ifdef NS_DEBUG + printf("CreatePrefStyleSheet completed: error=%ld\n",(long)result); +#endif + + return result; +} + +nsresult PresShell::SetPrefColorRules(void) +{ + NS_ASSERTION(mPresContext,"null prescontext not allowed"); + if (mPresContext) { + nsresult result = NS_OK; + PRBool useDocColors = PR_TRUE; + + // see if we need to create the rules first + if (NS_SUCCEEDED(mPresContext->GetCachedBoolPref(kPresContext_UseDocumentColors, useDocColors))) { + if (!useDocColors) { + +#ifdef NS_DEBUG + printf(" - Creating rules for document colors\n"); +#endif + + // OK, not using document colors, so we have to force the user's colors via style rules + if (!mPrefStyleSheet) { + result = CreatePreferenceStyleSheet(); + } + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "prefstylesheet should not be null"); + + nscolor bgColor; + nscolor textColor; + result = mPresContext->GetDefaultColor(&textColor); + if (NS_SUCCEEDED(result)) { + result = mPresContext->GetDefaultBackgroundColor(&bgColor); + } + if (NS_SUCCEEDED(result)) { + // get the DOM interface to the stylesheet + nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet,&result)); + if (NS_SUCCEEDED(result)) { + PRUint32 index = 0; + nsAutoString strRule,strColor; + + // create a rule for each color and add it to the style sheet + // - the rules are !important so they override all but author + // important rules (when put into a backstop stylesheet) and + // all (even author important) when put into an override stylesheet + + /////////////////////////////////////////////////////////////// + // - default color: '* {color:#RRGGBB !important;}' + ColorToString(textColor,strColor); + strRule.Append(NS_LITERAL_STRING("* {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + /////////////////////////////////////////////////////////////// + // - default background color: '* {background-color:#RRGGBB !important;}' + ColorToString(bgColor,strColor); + strRule.Append(NS_LITERAL_STRING("* {background-color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + // now insert the rule + result = sheet->InsertRule(strRule,0,&index); + } + } + } + } + } + return result; + } else { + return NS_ERROR_FAILURE; + } +} + +nsresult PresShell::SetPrefLinkRules(void) +{ + NS_ASSERTION(mPresContext,"null prescontext not allowed"); + if (mPresContext) { + nsresult result = NS_OK; + + if (!mPrefStyleSheet) { + result = CreatePreferenceStyleSheet(); + } + if (NS_SUCCEEDED(result)) { + NS_ASSERTION(mPrefStyleSheet, "prefstylesheet should not be null"); + + // get the DOM interface to the stylesheet + nsCOMPtr sheet(do_QueryInterface(mPrefStyleSheet,&result)); + if (NS_SUCCEEDED(result)) { + +#ifdef NS_DEBUG + printf(" - Creating rules for link and visited colors\n"); +#endif + + // support default link colors: + // this means the link colors need to be overridable, + // which they are if we put them in the backstop stylesheet, + // though if using an override sheet this will cause authors grief still + // In the backstop stylesheet, they are !important to keep the forced-color rules + // from coloring the links too + // + // XXX: do active links and visited links get another color? + // They were red in the html.css rules + + nscolor linkColor, visitedColor; + result = mPresContext->GetDefaultLinkColor(&linkColor); + if (NS_SUCCEEDED(result)) { + result = mPresContext->GetDefaultVisitedLinkColor(&visitedColor); + } + if (NS_SUCCEEDED(result)) { + // insert a rule to make links the preferred color + PRUint32 index = 0; + nsAutoString strRule, strColor; + + /////////////////////////////////////////////////////////////// + // - links: '*:link, *:link:active {color: #RRGGBB !important;}' + ColorToString(linkColor,strColor); + strRule.Append(NS_LITERAL_STRING("*:link, *:link:active {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + /////////////////////////////////////////////////////////////// + // - visited links '*:visited, *:visited:active {color: #RRGGBB !important;}' + ColorToString(visitedColor,strColor); + strRule.Append(NS_LITERAL_STRING("*:visited, *:visited:active {color:")); + strRule.Append(strColor); + strRule.Append(NS_LITERAL_STRING(" !important;} ")); + + // insert the rules + result = sheet->InsertRule(strRule,0,&index); + } + + if (NS_SUCCEEDED(result)) { + PRBool underlineLinks = PR_TRUE; + result = mPresContext->GetCachedBoolPref(kPresContext_UnderlineLinks,underlineLinks); + if (NS_SUCCEEDED(result)) { + // create a rule for underline: on or off + PRUint32 index = 0; + nsAutoString strRule; + if (underlineLinks) { + // create a rule to make underlining happen + // ':link, :visited {text-decoration:[underline|none];}' + // no need for important, we want these to be overridable + // NOTE: these must go in the backstop stylesheet or they cannot be + // overridden by authors + #ifdef NS_DEBUG + printf (" - Creating rules for enabling link underlines\n"); + #endif + // make a rule to make text-decoration: underline happen for links + strRule.Append(NS_LITERAL_STRING(":link, :visited {text-decoration:underline;}")); + } else { + #ifdef NS_DEBUG + printf (" - Creating rules for disabling link underlines\n"); + #endif + // make a rule to make text-decoration: none happen for links + strRule.Append(NS_LITERAL_STRING(":link, :visited {text-decoration:none;}")); + } + + // ...now insert the rule + result = sheet->InsertRule(strRule,0,&index); + } + } + } + } + return result; + } else { + return NS_ERROR_FAILURE; + } +} + NS_IMETHODIMP PresShell::SetDisplaySelection(PRInt16 aToggle) { @@ -5942,3 +6345,27 @@ void ReflowCountMgr::DisplayDiffsInTotals(const char * aStr) } #endif // MOZ_REFLOW_PERF + +// make a color string like #RRGGBB +void ColorToString(nscolor aColor, nsAutoString &aString) +{ + nsAutoString tmp; + aString.SetLength(0); + + // # + aString.Append(NS_LITERAL_STRING("#")); + // RR + tmp.AppendInt((PRInt32)NS_GET_R(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); + tmp.SetLength(0); + // GG + tmp.AppendInt((PRInt32)NS_GET_G(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); + tmp.SetLength(0); + // BB + tmp.AppendInt((PRInt32)NS_GET_B(aColor), 16); + if (tmp.Length() < 2) tmp.AppendInt(0,16); + aString.Append(tmp); +} diff --git a/mozilla/layout/html/content/src/nsHTMLFontElement.cpp b/mozilla/layout/html/content/src/nsHTMLFontElement.cpp index 8ab5b4f278b..031c8ebbf5d 100644 --- a/mozilla/layout/html/content/src/nsHTMLFontElement.cpp +++ b/mozilla/layout/html/content/src/nsHTMLFontElement.cpp @@ -35,6 +35,10 @@ #include "nsIPresContext.h" #include "nsIHTMLAttributes.h" +// MJA: bug 31816 +#include "nsIPresShell.h" +#include "nsIDocShellTreeItem.h" +// - END MJA class nsHTMLFontElement : public nsIDOMHTMLFontElement, public nsIJSScriptObject, @@ -218,7 +222,48 @@ MapFontAttributesInto(const nsIHTMLMappedAttributes* aAttributes, font->mFont.name = familyList; nsAutoString face; - if (NS_OK == dc->FirstExistingFont(font->mFont, face)) { + + // MJA: bug 31816 + // if we are not using document fonts, but this is a xul document, + // then we set the chromeOverride bit so we use the document fonts anyway + PRBool chromeOverride = PR_FALSE; + PRBool useDocumentFonts = PR_TRUE; + aPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts,useDocumentFonts); + if (!useDocumentFonts) { + // check if the prefs have been disabled for this shell + // - if prefs are disabled then we use the document fonts anyway (yet another override) + PRBool prefsEnabled = PR_TRUE; + nsCOMPtr shell; + aPresContext->GetShell(getter_AddRefs(shell)); + if (shell) { + shell->ArePrefStyleRulesEnabled(prefsEnabled); + } + if (!prefsEnabled) { + useDocumentFonts = PR_TRUE; + } else { + // see if we are in the chrome, if so, use the document fonts (override the useDocFonts setting) + nsresult result = NS_OK; + nsCOMPtr container; + result = aPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + chromeOverride = PR_TRUE; + } + } + } + } + } + } + + // find the correct font if we are usingDocumentFonts OR we are overriding for XUL + // MJA: bug 31816 + if ((chromeOverride || useDocumentFonts) && + NS_OK == dc->FirstExistingFont(font->mFont, face)) { if (face.EqualsIgnoreCase("-moz-fixed")) { font->mFlags |= NS_STYLE_FONT_USE_FIXED; } else { diff --git a/mozilla/layout/html/document/src/html.css b/mozilla/layout/html/document/src/html.css index d77db499c2d..ebbc5278b1c 100644 --- a/mozilla/layout/html/document/src/html.css +++ b/mozilla/layout/html/document/src/html.css @@ -401,15 +401,11 @@ fieldset { /* links */ :link { - color: blue; - text-decoration: underline; cursor: pointer; -moz-user-focus: normal; } :visited { - color: purple; - text-decoration: underline; cursor: pointer; -moz-user-focus: normal; } diff --git a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp index 8e7467fecc0..3576882a33b 100644 --- a/mozilla/layout/html/style/src/nsCSSStyleRule.cpp +++ b/mozilla/layout/html/style/src/nsCSSStyleRule.cpp @@ -55,6 +55,11 @@ #include "nsIStyleSet.h" #include "nsISizeOfHandler.h" +// MJA: bug 31816 +#include "nsIPresShell.h" +#include "nsIDocShellTreeItem.h" +// - END MJA + // #define DEBUG_REFS static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); @@ -1599,7 +1604,48 @@ MapDeclarationFontInto(nsICSSDeclaration* aDeclaration, font->mFont.name = familyList; nsAutoString face; - if (NS_OK == dc->FirstExistingFont(font->mFont, face)) { + + // MJA: bug 31816 + // if we are not using document fonts, but this is a xul document, + // then we set the chromeOverride bit so we use the document fonts anyway + PRBool chromeOverride = PR_FALSE; + PRBool useDocumentFonts = PR_TRUE; + aPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts,useDocumentFonts); + if (!useDocumentFonts) { + // check if the prefs have been disabled for this shell + // - if prefs are disabled then we use the document fonts anyway (yet another override) + PRBool prefsEnabled = PR_TRUE; + nsCOMPtr shell; + aPresContext->GetShell(getter_AddRefs(shell)); + if (shell) { + shell->ArePrefStyleRulesEnabled(prefsEnabled); + } + if (!prefsEnabled) { + useDocumentFonts = PR_TRUE; + } else { + // see if we are in the chrome, if so, use the document fonts (override the useDocFonts setting) + nsresult result = NS_OK; + nsCOMPtr container; + result = aPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + chromeOverride = PR_TRUE; + } + } + } + } + } + } + + // find the correct font if we are usingDocumentFonts OR we are overriding for XUL + // MJA: bug 31816 + if ((chromeOverride || useDocumentFonts) && + (NS_OK == dc->FirstExistingFont(font->mFont, face))) { if (face.EqualsIgnoreCase("-moz-fixed")) { font->mFlags |= NS_STYLE_FONT_USE_FIXED; } diff --git a/mozilla/layout/style/html.css b/mozilla/layout/style/html.css index d77db499c2d..ebbc5278b1c 100644 --- a/mozilla/layout/style/html.css +++ b/mozilla/layout/style/html.css @@ -401,15 +401,11 @@ fieldset { /* links */ :link { - color: blue; - text-decoration: underline; cursor: pointer; -moz-user-focus: normal; } :visited { - color: purple; - text-decoration: underline; cursor: pointer; -moz-user-focus: normal; } diff --git a/mozilla/layout/style/nsCSSStyleRule.cpp b/mozilla/layout/style/nsCSSStyleRule.cpp index 8e7467fecc0..3576882a33b 100644 --- a/mozilla/layout/style/nsCSSStyleRule.cpp +++ b/mozilla/layout/style/nsCSSStyleRule.cpp @@ -55,6 +55,11 @@ #include "nsIStyleSet.h" #include "nsISizeOfHandler.h" +// MJA: bug 31816 +#include "nsIPresShell.h" +#include "nsIDocShellTreeItem.h" +// - END MJA + // #define DEBUG_REFS static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); @@ -1599,7 +1604,48 @@ MapDeclarationFontInto(nsICSSDeclaration* aDeclaration, font->mFont.name = familyList; nsAutoString face; - if (NS_OK == dc->FirstExistingFont(font->mFont, face)) { + + // MJA: bug 31816 + // if we are not using document fonts, but this is a xul document, + // then we set the chromeOverride bit so we use the document fonts anyway + PRBool chromeOverride = PR_FALSE; + PRBool useDocumentFonts = PR_TRUE; + aPresContext->GetCachedBoolPref(kPresContext_UseDocumentFonts,useDocumentFonts); + if (!useDocumentFonts) { + // check if the prefs have been disabled for this shell + // - if prefs are disabled then we use the document fonts anyway (yet another override) + PRBool prefsEnabled = PR_TRUE; + nsCOMPtr shell; + aPresContext->GetShell(getter_AddRefs(shell)); + if (shell) { + shell->ArePrefStyleRulesEnabled(prefsEnabled); + } + if (!prefsEnabled) { + useDocumentFonts = PR_TRUE; + } else { + // see if we are in the chrome, if so, use the document fonts (override the useDocFonts setting) + nsresult result = NS_OK; + nsCOMPtr container; + result = aPresContext->GetContainer(getter_AddRefs(container)); + if (NS_SUCCEEDED(result) && container) { + nsCOMPtr docShell(do_QueryInterface(container, &result)); + if (NS_SUCCEEDED(result) && docShell){ + PRInt32 docShellType; + result = docShell->GetItemType(&docShellType); + if (NS_SUCCEEDED(result)){ + if (nsIDocShellTreeItem::typeChrome == docShellType){ + chromeOverride = PR_TRUE; + } + } + } + } + } + } + + // find the correct font if we are usingDocumentFonts OR we are overriding for XUL + // MJA: bug 31816 + if ((chromeOverride || useDocumentFonts) && + (NS_OK == dc->FirstExistingFont(font->mFont, face))) { if (face.EqualsIgnoreCase("-moz-fixed")) { font->mFlags |= NS_STYLE_FONT_USE_FIXED; }