Ho ho ho, it's a lump of hg coal. Merge.
Ho ho ho, it's a lump of hg coal. Merge.
--- a/.hgtags
+++ b/.hgtags
@@ -21,8 +21,9 @@ 15cb5d25db054d2d0b56869a2f6351388bfcddcd
0000000000000000000000000000000000000000 -m
0000000000000000000000000000000000000000 Adding UPDATE_PACKAGING_R5 tag in order to make patcher work.
f197b51bbc29a30860e750ee87fd0a047a024f2e UPDATE_PACKAGING_R6
d7d64f68423b68a671f623f123e90057ebc49dac UPDATE_PACKAGING_R6
0000000000000000000000000000000000000000 THUNDERBIRD_3_0a3_BUILD1
0000000000000000000000000000000000000000 THUNDERBIRD_3_0a3_RELEASE
0cd41f5990807fb6ab52cb59ba3c8e8247281045 GECKO_1_9_1_BASE
8df5a90281cd4d75835e4b7696da200555eed15f GECKO_1_9_1_BASE
+8a601ed6bc4c7b3d1e35aa9e81f257512d984bd5 FENNEC_A2
--- a/accessible/src/atk/nsAppRootAccessible.cpp
+++ b/accessible/src/atk/nsAppRootAccessible.cpp
@@ -558,16 +558,19 @@ nsApplicationAccessibleWrap::Init()
MAI_LOG_DEBUG(("Fail to load lib: %s\n", sGail.libName));
}
MAI_LOG_DEBUG(("Mozilla Atk Implementation initializing\n"));
// Initialize the MAI Utility class
// it will overwrite gail_util
g_type_class_unref(g_type_class_ref(MAI_TYPE_UTIL));
+ // Init atk-bridge now
+ PR_SetEnv("NO_AT_BRIDGE=0");
+
// load and initialize atk-bridge library
rv = LoadGtkModule(sAtkBridge);
if (NS_SUCCEEDED(rv)) {
// init atk-bridge
(*sAtkBridge.init)();
}
else
MAI_LOG_DEBUG(("Fail to load lib: %s\n", sAtkBridge.libName));
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -426,17 +426,17 @@ pref("network.cookie.cookieBehavior", 0)
// l12n and i18n
pref("intl.accept_languages", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.static", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more1", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more3", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more4", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more5", "chrome://global/locale/intl.properties");
-pref("intl.charsetmenu.browser.unicode", "chrome://global/locale/intl.properties");
+pref("intl.charsetmenu.browser.unicode", "UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE");
pref("intl.charset.detector", "chrome://global/locale/intl.properties");
pref("intl.charset.default", "chrome://global-platform/locale/intl.properties");
pref("font.language.group", "chrome://global/locale/intl.properties");
pref("intl.menuitems.alwaysappendaccesskeys","chrome://global/locale/intl.properties");
pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/intl.properties");
// simple gestures support
pref("browser.gesture.swipe.left", "Browser:BackOrBackDuplicate");
index 0cf87d712919a07e9be01bf4024c1a598cbd7e6f..f35501684ad17e4cfd4dc8777bea49100abb7340
GIT binary patch
literal 7884
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
--- a/browser/components/feeds/test/Makefile.in
+++ b/browser/components/feeds/test/Makefile.in
@@ -40,16 +40,20 @@ srcdir = @srcdir@
VPATH = @srcdir@
relativesrcdir = browser/components/feeds/test
include $(DEPTH)/config/autoconf.mk
MODULE = test_browser_feeds
XPCSHELL_TESTS = unit
+DIRS = \
+ chrome \
+ $(NULL)
+
include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_bug408328.html \
bug408328-data.xml \
test_bug368464.html \
bug368464-data.xml \
test_registerHandler.html \
$(NULL)
copy from toolkit/components/places/tests/chrome/Makefile.in
copy to browser/components/feeds/test/chrome/Makefile.in
--- a/toolkit/components/places/tests/chrome/Makefile.in
+++ b/browser/components/feeds/test/chrome/Makefile.in
@@ -34,34 +34,27 @@
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****
DEPTH = ../../../../..
topsrcdir = @top_srcdir@
srcdir = @srcdir@
VPATH = @srcdir@
-relativesrcdir = toolkit/components/places/tests/chrome
+relativesrcdir = browser/components/feeds/test/chrome
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
+# sample_feed.atom was copied from toolkit/components/places/tests/chrome
_HTTP_FILES = \
sample_feed.atom \
- bad_links.atom \
- rss_as_html.rss \
- rss_as_html.rss^headers^ \
$(NULL)
_CHROME_FILES = \
- test_329534.xul \
- test_371798.xul \
- test_342484.xul \
- test_341972a.xul \
- test_381357.xul \
test_423060.xul \
$(NULL)
libs:: $(_HTTP_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
libs:: $(_CHROME_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir)
copy from toolkit/components/places/tests/chrome/sample_feed.atom
copy to browser/components/feeds/test/chrome/sample_feed.atom
rename from toolkit/components/places/tests/chrome/test_423060.xul
rename to browser/components/feeds/test/chrome/test_423060.xul
--- a/browser/installer/windows/nsis/installer.nsi
+++ b/browser/installer/windows/nsis/installer.nsi
@@ -52,47 +52,42 @@ RequestExecutionLevel user
!addplugindir ./
; empty files - except for the comment line - for generating custom pages.
!system 'echo ; > options.ini'
!system 'echo ; > shortcuts.ini'
!system 'echo ; > summary.ini'
-; USE_UAC_PLUGIN is temporary until Thunderbird has been updated to use the UAC plugin
+; USE_UAC_PLUGIN is temporary until all applications have been updated to use
+; the UAC plugin
!define USE_UAC_PLUGIN
Var TmpVal
Var StartMenuDir
Var InstallType
Var AddStartMenuSC
Var AddQuickLaunchSC
Var AddDesktopSC
; Other included files may depend upon these includes!
; The following includes are provided by NSIS.
!include FileFunc.nsh
!include LogicLib.nsh
!include MUI.nsh
-!include TextFunc.nsh
!include WinMessages.nsh
!include WinVer.nsh
!include WordFunc.nsh
!insertmacro GetOptions
!insertmacro GetParameters
!insertmacro GetSize
!insertmacro StrFilter
!insertmacro WordReplace
-; NSIS provided macros that we have overridden
-!include overrides.nsh
-!insertmacro LocateNoDetails
-!insertmacro TextCompareNoDetails
-
; The following includes are custom.
!include branding.nsi
!include defines.nsi
!include common.nsh
!include locales.nsi
!include version.nsh
VIAddVersionKey "FileDescription" "${BrandShortName} Installer"
@@ -100,17 +95,16 @@ VIAddVersionKey "OriginalFilename" "setu
; Must be inserted before other macros that use logging
!insertmacro _LoggingCommon
!insertmacro AddDDEHandlerValues
!insertmacro ChangeMUIHeaderImage
!insertmacro CheckForFilesInUse
!insertmacro CleanUpdatesDir
-!insertmacro CloseApp
!insertmacro CopyFilesFromDir
!insertmacro CreateRegKey
!insertmacro GetPathFromString
!insertmacro GetParent
!insertmacro IsHandlerForInstallDir
!insertmacro ManualCloseAppPrompt
!insertmacro RegCleanAppHandler
!insertmacro RegCleanMain
@@ -284,20 +278,19 @@ Section "-Application" APP_IDX
"$(ERROR_CREATE_DIRECTORY_SUFFIX)"
${LogHeader} "Adding Additional Files"
; Check if QuickTime is installed and copy the nsIQTScriptablePlugin.xpt from
; its plugins directory into the app's components directory.
ClearErrors
ReadRegStr $R0 HKLM "Software\Apple Computer, Inc.\QuickTime" "InstallDir"
${Unless} ${Errors}
- Push $R0
- ${GetPathFromRegStr}
- Pop $R0
- ${Unless} ${Errors}
+ ${GetLongPath} $R0 "$R0"
+ ${Unless} $R0 == ""
+ ClearErrors
GetFullPathName $R0 "$R0\Plugins\nsIQTScriptablePlugin.xpt"
${Unless} ${Errors}
${LogHeader} "Copying QuickTime Scriptable Component"
CopyFiles /SILENT "$R0" "$INSTDIR\components"
${If} ${Errors}
${LogMsg} "** ERROR Installing File: $INSTDIR\components\nsIQTScriptablePlugin.xpt **"
${Else}
${LogMsg} "Installed File: $INSTDIR\components\nsIQTScriptablePlugin.xpt"
@@ -363,18 +356,22 @@ Section "-Application" APP_IDX
; XXXrstrong - this should be set in shared.nsh along with "Create Quick
; Launch Shortcut" and Create Desktop Shortcut.
StrCpy $0 "Software\Mozilla\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Uninstall"
${WriteRegDWORD2} $TmpVal "$0" "Create Start Menu Shortcut" $AddStartMenuSC 0
${FixClassKeys}
; On install always add the FirefoxHTML and FirefoxURL keys.
- ; An empty string is used for the 5th param because FirefoxHTML is not a
- ; protocol handler.
+ ; An empty string is used for the 5th param because FirefoxHTML and FirefoxURL
+ ; are not protocol handlers.
+ ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8
+ StrCpy $2 "$\"$8$\" -requestPending -osint -url $\"%1$\""
+ StrCpy $3 "$\"%1$\",,0,0,,,,"
+
${AddDDEHandlerValues} "FirefoxHTML" "$2" "$8,1" "${AppRegName} Document" "" \
"${DDEApplication}" "$3" "WWW_OpenURL"
${AddDDEHandlerValues} "FirefoxURL" "$2" "$8,1" "${AppRegName} URL" "true" \
"${DDEApplication}" "$3" "WWW_OpenURL"
${FixShellIconHandler}
--- a/browser/installer/windows/nsis/uninstaller.nsi
+++ b/browser/installer/windows/nsis/uninstaller.nsi
@@ -47,30 +47,30 @@
SetDatablockOptimize on
SetCompress off
CRCCheck on
RequestExecutionLevel user
!addplugindir ./
-; USE_UAC_PLUGIN is temporary until Thunderbird has been updated to use the UAC plugin
+; USE_UAC_PLUGIN is temporary until all applications have been updated to use
+; the UAC plugin
!define USE_UAC_PLUGIN
; prevents compiling of the reg write logging.
!define NO_LOG
Var TmpVal
; Other included files may depend upon these includes!
; The following includes are provided by NSIS.
!include FileFunc.nsh
!include LogicLib.nsh
!include MUI.nsh
-!include TextFunc.nsh
!include WinMessages.nsh
!include WinVer.nsh
!include WordFunc.nsh
!insertmacro StrFilter
!insertmacro WordReplace
!insertmacro un.GetParent
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -79,21 +79,22 @@ endif
AB = $(firstword $(subst -, ,$(AB_CD)))
APP_VERSION := $(shell cat $(srcdir)/../config/version.txt)
PWD := $(shell pwd)
core_abspath = $(if $(findstring :,$(1)),$(1),$(if $(filter /%,$(1)),$(1),$(PWD)/$(1)))
-# ZIP_IN is defaulted to be compatible with the files the wget-en-US target
-# pulls. You may override ZIP_IN if you provide your own files. You also _must_
-# override ZIP_IN when MOZ_PKG_PRETTYNAMES is defined - the default will not
+# These are defaulted to be compatible with the files the wget-en-US target
+# pulls. You may override them if you provide your own files. You _must_
+# override them when MOZ_PKG_PRETTYNAMES is defined - the defaults will not
# work in that case.
ZIP_IN ?= $(_ABS_DIST)/$(PACKAGE)
+WIN32_INSTALLER_IN ?= $(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe
DEFINES += \
-DAB_CD=$(AB_CD) \
-DMOZ_LANGPACK_EID=langpack-$(AB_CD)@firefox.mozilla.org \
-DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \
-DLOCALE_SRCDIR=$(call core_abspath,$(LOCALE_SRCDIR)) \
-DPKG_BASENAME="$(PKG_BASENAME)" \
-DPKG_INST_BASENAME="$(PKG_INST_BASENAME)" \
@@ -235,27 +236,26 @@ endif
cd l10n-stage && \
$(CYGWIN_WRAPPER) 7z a -r -t7z ../app.7z -mx -m0=BCJ2 -m1=LZMA:d24 -m2=LZMA:d19 -m3=LZMA:d19 -mb0:1 -mb0s1:2 -mb0s2:3
cat ../installer/windows/l10ngen/7zSD.sfx \
$(topsrcdir)/browser/installer/windows/app.tag \
app.7z > $(WIN32_INSTALLER_OUT)
chmod 0755 $(WIN32_INSTALLER_OUT)
ifeq (WINNT,$(OS_ARCH))
-repackage-win32-installer-%: WIN32_INSTALLER_IN=$(_ABS_DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe
repackage-win32-installer-%: $(WIN32_INSTALLER_IN) libs-%
@$(MAKE) repackage-win32-installer AB_CD=$* WIN32_INSTALLER_IN=$(WIN32_INSTALLER_IN)
else
repackage-win32-installer-%: ;
endif
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
STAGEDIST = $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)/$(_APPNAME)/Contents/MacOS
else
-STAGEDIST = $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)
+STAGEDIST = $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_DIR)
endif
$(STAGEDIST): AB_CD:=en-US
$(STAGEDIST): UNPACKAGE=$(ZIP_IN)
$(STAGEDIST): $(ZIP_IN)
# only mac needs to remove the parent of STAGEDIST...
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
if test -d $(DIST)/l10n-stage; then \
@@ -313,29 +313,28 @@ ifneq (en,$(AB))
ifneq (,$(filter mac cocoa,$(MOZ_WIDGET_TOOLKIT)))
mv $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)/$(_APPNAME)/Contents/Resources/$(AB).lproj $(_ABS_DIST)/l10n-stage/$(MOZ_PKG_APPNAME)/$(_APPNAME)/Contents/Resources/en.lproj
endif
endif
$(MAKE) clobber-zip AB_CD=$(AB_CD)
$(NSINSTALL) -D $(DIST)/$(PKG_PATH)
mv -f "$(DIST)/l10n-stage/$(PACKAGE)" "$(DIST)/$(PACKAGE)"
-repackage-zip-%: ZIP_IN=$(_ABS_DIST)/$(PACKAGE)
repackage-zip-%: $(ZIP_IN) $(STAGEDIST) libs-%
@$(MAKE) repackage-zip AB_CD=$* ZIP_IN=$(ZIP_IN)
langpack-%: LANGPACK_FILE=$(_ABS_DIST)/$(PKG_LANGPACK_PATH)$(PKG_LANGPACK_BASENAME).xpi
langpack-%: AB_CD=$*
langpack-%: XPI_NAME=locale-$*
langpack-%: libs-%
@echo "Making langpack $(LANGPACK_FILE)"
$(NSINSTALL) -D $(DIST)/$(PKG_LANGPACK_PATH)
$(PERL) $(topsrcdir)/config/preprocessor.pl $(DEFINES) $(ACDEFINES) -I$(call EXPAND_LOCALE_SRCDIR,toolkit/locales)/defines.inc -I$(LOCALE_SRCDIR)/defines.inc $(srcdir)/generic/install.rdf > $(FINAL_TARGET)/install.rdf
cd $(DIST)/xpi-stage/locale-$(AB_CD) && \
- $(ZIP) -r9D $(LANGPACK_FILE) install.rdf chrome/$(AB_CD).jar chrome.manifest
+ $(ZIP) -r9D $(LANGPACK_FILE) install.rdf chrome chrome.manifest -x chrome/$(AB_CD).manifest
# This is a generic target that will make a langpack, repack ZIP (+tarball)
# builds, and repack an installer if applicable. It is called from the
# tinderbox scripts. Alter it with caution.
installers-%: clobber-% langpack-% repackage-win32-installer-% repackage-zip-%
@echo "repackaging done"
@@ -420,14 +419,25 @@ endif
# Move the windows installer
ifeq (WINNT, $(OS_ARCH))
mv $(DIST)/install/sea/firefox-$(MOZ_APP_VERSION).$*.win32.installer.exe \
$(UPLOAD_DIR)/.
endif
# Set the permissions that the folders will have in ftp once uploaded
chmod -vR 775 $(UPLOAD_DIR)
+l10n-upload-%: AB_CD=$*
+l10n-upload-%:
+ $(PYTHON) $(topsrcdir)/build/upload.py --base-path $(DIST) "$(DIST)/$(PACKAGE)" $(DIST)/$(LANGPACK)
+ifdef MOZ_MAKE_COMPLETE_MAR
+ $(PYTHON) $(topsrcdir)/build/upload.py --base-path $(DIST) $(DIST)/$(COMPLETE_MAR)
+endif
+ifeq (WINNT, $(OS_ARCH))
+ $(PYTHON) $(topsrcdir)/build/upload.py --base-path $(DIST) "$(INSTALLER_PACKAGE)"
+endif
+
+
merge-%:
ifdef LOCALE_MERGEDIR
$(RM) -rf $(LOCALE_MERGEDIR)
MACOSX_DEPLOYMENT_TARGET= compare-locales -m $(LOCALE_MERGEDIR) $(srcdir)/l10n.ini $(L10NBASEDIR) $*
endif
@echo
index 650986c94cbfdada768d78d8a48b167981d99af3..70c5dae5fb87938b53f9f2f620a0a15c86ddcefb
GIT binary patch
literal 708
zc$@*m0z3VQP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00007bV*G`2iOY>
z6$=#xtlmig000JJOGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K0#Qjs
zK~y-)jg#w3lTjSU*ZqG<qu%zeAP|BGN~6rJH&Snvin25zYVP(tb6Au_Qf$mQn#~Zp
zzG+(R2BK|kwi~-U=jEAh&fWZW&PimCtLO_~9uEAzpL3qy?;MGQNU4^e*6_-NLiG@T
zvPv_srREfyTAjv5)+Z&qMZ)RDYzF^QC>+Fh&n$F9e4f*)I1zyELgf#7;SYFze~IVo
zY#ATJ(n=PBunKaL4U%bT00hE5Vn1^*LOs9Z@d+~$$ryy(DqL<mG+L#j0T7M`wjD$y
zR__qLIj0%KY%#&<veUkl8vxOG7|}!ot~oE-d-P~-<<Q*5L3Y=GnIAsPd1hdDenoM!
z2+~wE01~Mv+#Vl}T~MQ2_XscF%JIrJh5I8~9KFb6*7p;sg#@eJp3oi<Ae~9#QjY=s
z!`EQ?)QthtEKE}-ymz04{Ka+1dX30r)2x<^ev9PxiU5mC3pjj^!_(I{(e?N<x}G>N
z>ADKbv=sVxQZ%*lSSFLG1MCw4=$I&A&^!TtREkc`B!;ZF@aD^L3|og7K*+7IT6(z}
z0IR|>+HV`sN`B*+^#txc@5L3xM;Jex!sY%E$ofXHo?m0Nq=_|>+b;s-)&zKiaWtLR
zpo_l&h292*!GX>P131#gBNWeIqgbd191sC0JzrRdFPuWh9U}qp%+kIwM3PyQ%Oz$i
za{a3$cTfbN;lf6q?Luc=Ds8errBXq)T1Bl^W2PeSfdURO09mAjoPhsTzL2MY?9M$P
q9c|$U)v>=l=iMf?Nz#KeH2VuqQO6~C42seK0000<MNUMnLSTZR**&cQ
index 01fb204fd6be02c981df6565e5fc0ef91ffe747c..6f3687d0ac4c6a5dd0ab5a63992769f30eb3d1f0
GIT binary patch
literal 757
zc$@+C0t)?!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00007bV*G`2iO4^
z4<{)JUk?@l000JJOGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K0)k0I
zK~y+Tol#j&6Hyp#O#C0b`QWR+!T4?rfmXu<5f!5e5FrwU$YN>PiY28R)3S?N5m_vY
z$^!}vrC=A9mQrX1G7N<oTRN23<GqawRMf<WlgZ?sbH4MPPX<7C8kDN43j`JdcWr%5
zoP3=GMuPLld8Y}_5>yyWx~*_Hv=EEMcuA5Fmkzec|GZAG-68Kq1ZVzaQ1Qk-<cjQz
z(NgmVPVso;NM1b(d6oUBoSEX{QbOqKw=EG~;co^sw!x^|;v+&-p&X0nHGhQa<szDg
zeXzU@;8C{|SyguFFp=2PHfwmoKbLM`S>FgQRCco59sLXn7-!1h>Es5cR(Lr45vZTL
zpzLyRs{#KE;VaV(+=8&r-_=bXs{0mE-s47Dj|;D6!tia12<^l$<k&=xYWy%771s!V
z?1TYrTl^xTz%UK-SO86fE2w<tftIY$&xSEDy9w*N0CLphNlA)J#2}cSz)2Ep-)Go_
zZ7PJ0i6FE?K2*Q(qT%&&stbzinh8k|_WXoDoNi$Bdfls98=EwZ_%KK&w!aTTGq8-Z
zZZ|4=J-BCPVHosm6CO)1cEaG+?HhTTC-q5ghevtGEcEsj^pXM%BYr4tUgWn-qtGxd
zk~O);raF3sjGy8wnU^nR$ukd1AC$miZ3V}1Fb&KlA9gsTVyh!r%&@Vx(WTFVC~%!!
z?Li{WrMeU1woV47))o|(6rrK9HtC$7TaH9_*GS{i?k?|ldtB`I$tiKlfQT>t5Stl2
z>Kar~T+5E%%+JfEcc!PJZPUW&&NTM%wPo3gOpdV{$>d*Rn&>#`Z;;8aW__wrSAYE<
nams)QGN=hnLf1(r{0rXzrYP3${U=-N00000NkvXXu0mjf*6&!3
index 8a10dbe5de957af28003db22d53c2f371b9612fc..dceffee8562ee88939c1300da104bd39746fdc5f
GIT binary patch
literal 5240
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
index 85910b16ee4ff1c2c0dd8b81b04a45cb1b306ee7..a1dca6a7220fdd93b188631cff019b00595616ff
GIT binary patch
literal 8345
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
index 44dbb88b359ab5b5e8a6a0b3f3be1bc273596cdd..f3f790e9efd49151ff45365e8c08713fcef0f232
GIT binary patch
literal 9690
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
YPA=6b$%w*ehl5>8a_X}6(&mx>1B$Eif&c&j
index c77b368c73d003f0675b896b26fc44aa1991ffc0..2cbb15df97fd249270cf0735d862ab3dafb7e999
GIT binary patch
literal 8849
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
T{`-qk00000NkvXXu0mjfhB`!;
index 4ffe4dceaa1e83961b3e0b738b53fc3b4b29c8fc..a32fb7a3dee9bf455a34b0d18267fb063b8286b6
GIT binary patch
literal 12309
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
index 11cd60fe49c6d4820c20512654c0f9fae1f02fb5..ec75f5cdf424df52f3390716389a60acf917ed7d
GIT binary patch
literal 10017
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Ĺt|aJ)MD
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
index e2a388d5dff773967f4322dfab21c8e338ea4f8c..032e3ff2856efe35bdc97b202a089b2622406a26
GIT binary patch
literal 791
zc$@(j1L*vTP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00007bV*G`2iOS`
z5HcJf?qbOR000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA02y>e
zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00MtWL_t(I%cYYsh+K6L#((pF
z|F`${-tJ}ZvO!iwawJU%CZM7TT3Dn|<g^e$8%0Se0h^?~fQ4W}Dg`?`!Ah(}i&Mxc
z2oe<}dgc;y$$D{f?q+W{`~EYNVv{0pBH{<r%<v8KeS9PQ3nrT{?h7g%5h>h#oMo~h
zdp=vcH<y1RdiUiA%+u2@c6c=S@g*eY^~Ql!MApT)FrN5V<s+Zpj60GymfA_G=L9)6
z9{%!Zt^M91Co%4wPDOd3;lln}LDT<w{?i>7Sdb?t+rPf0X|z|XzxUM3X9a}O^%MJD
ze`sX+T(?$VOw}as3c%TO@4uT;b;{l2>`dawq3<|&@F+#=^{LL-0US>oxEqtLkLlm|
z@@l)i`&?XJUXH5i<cYW6iA7Q1dIcLa8TD6S{y37gz=z-!5=!vf==cKtai_D}Z+8L^
zflw3$!{Lza;VqICWVJT^-yZ|(Lv?XlD1)`5<V71~mzYU$p9iW6mJ@sir%tVW0c;Zw
zEx-}IPHY?_WG&z(KtJ4Po+-)ZNWK74$8CsKT?Xq*4Az&>st2}>g!(ii6Zt*@xI6BS
zs$vHCLx?QmewopqXNip^+?4IjGf0?2WR_mPq`N6!#Ih_iqq-|0VP+(M5M@X$hnQc(
zeHyti^Y}C;agm?aGP`p5R*Gc0(wuExG}C>m>6)3jo0EJm70s*`F3n`piy{*-uUq90
zPxAbkg^+!+UT;*ZQIr1s<{QV4R8{&zlb$zIyXQ$_o}}}Di3qp{pI+)uy!y&(@xzZk
zSdGAnrpmXrdf$Ru2w{h8PJ43qb9%iS=jU4sPXXUV;A>UA+HCIPzd%(l0l)EoaR=Vi
VK~nzkapnL3002ovPDHLkV1kA!YXJZN
index 52300d11fadbe7b341a26595186d6e3fa52a3ca0..3bfdac1427491de6617f01c8accc25570f0a0fc7
GIT binary patch
literal 340
zc%17D@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4v6p!Iy0YKk6cXg%ku*B?7%0S+
z<n8Xl@E-&h>|H(?D8gCb5n0T@z%2~Ij105pNB{*Ndb&7<NL)_Nh$)@N*!K7Kw*Tyj
z@1L#xZ!2Z?-&{ZL<cH7S;|<bo)O_QVX%>0A;{#8R?CR@_wQ4?nlRmsRJpO>hvVyxO
z-DhwmUOTwvPQ|Z}|6SSN|J$w^|2f{g`eS`>59|M<%FF+_Z{$n4^yhE+KmR*bZ|yIf
z{m=b;{ttQk%>VTlKY0F^bXfKvXo}5K1&PmWU;d;s{N!75V`Uoi4XYVSD`#Z>Z*@}t
z^ZeWEU*}(5{y6{Owj^B{=_k5>=i9%xxFK?I!oU9thC9*|cm%GUj%C`;w?rV4&vjwY
jCz%aX6<ifwPk72;Y|425FpC~2m>4`={an^LB{Ts5s{)kK
index f31f7d05e2ac17c881dea0d2243ceb7d1d9f799a..53fbe3c125619460c2b021edaed061a074dd0ce1
GIT binary patch
literal 363
zc$@)i0hIoUP)<h;3K|Lk000e1NJLTq000UA000UI1^@s6jWW-@00007bV*G`2iOS`
z5IG?1b;pGO000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA0QgBn
zK~xyiW7xZQF9Qra9A)?q!nTK4{@d*3_}|{%&hY>Le=ugaefu^XgA{H0I17v|w)3GX
z{QC7P!{^VR89sje2v@l7Z6BsWm~}8K*S+ieKmTRbf0GTu|MeG$|JRu%_Ftn#`ag<w
zAd}|5sQTacDD{8MZNL8+S55whoRRylUZ?b*!S)a{R8bF#qRgwN|HIG8|BnD-l@g8r
z3?Scuth5BW$rNZ^&21mBBF$E{|LT=m|CRIf{wrqc{AcLt>49Uz#Zvz>ub6^OQLE7U
z-`(Af@C=Lr!Ul_^;MS>?YyC%-Ls6(RQSQH1t18$urEEPEg#b1)@R$|Htd{@)002ov
JPDHLkV1g9|sjC10
--- a/build/upload.py
+++ b/build/upload.py
@@ -52,16 +52,17 @@
#
# All files to be uploaded should be passed as commandline arguments to this
# script. The script takes one other parameter, --base-path, which you can use
# to indicate that files should be uploaded including their paths relative
# to the base path.
import sys, os
from optparse import OptionParser
+from subprocess import Popen, PIPE
from util import check_call
def RequireEnvironmentVariable(v):
"""Return the value of the environment variable named v, or print
an error and exit if it's unset (or empty)."""
if not v in os.environ or os.environ[v] == "":
print "Error: required environment variable %s not set" % v
sys.exit(1)
@@ -99,25 +100,33 @@ def WindowsPathToMsysPath(path):
return "/" + drive[0] + path.replace('\\','/')
def AppendOptionalArgsToSSHCommandline(cmdline, port, ssh_key):
"""Given optional port and ssh key values, append valid OpenSSH
commandline arguments to the list cmdline if the values are not None."""
if port is not None:
cmdline.append("-P%d" % port)
if ssh_key is not None:
- cmdline.extend(["-i", WindowsPathToMsysPath(ssh_key)])
+ # Don't interpret ~ paths - ssh can handle that on its own
+ if not ssh_key.startswith('~'):
+ ssh_key = WindowsPathToMsysPath(ssh_key)
+ cmdline.extend(["-o", "IdentityFile=%s" % ssh_key])
def DoSSHCommand(command, user, host, port=None, ssh_key=None):
"""Execute command on user@host using ssh. Optionally use
port and ssh_key, if provided."""
cmdline = ["ssh"]
AppendOptionalArgsToSSHCommandline(cmdline, port, ssh_key)
cmdline.extend(["%s@%s" % (user, host), command])
- check_call(cmdline)
+ cmd = Popen(cmdline, stdout=PIPE)
+ retcode = cmd.wait()
+ if retcode != 0:
+ raise Exception("Command %s returned non-zero exit code: %i" % \
+ (cmdline, retcode))
+ return cmd.stdout.read().strip()
def DoSCPFile(file, remote_path, user, host, port=None, ssh_key=None):
"""Upload file to user@host:remote_path using scp. Optionally use
port and ssh_key, if provided."""
cmdline = ["scp"]
AppendOptionalArgsToSSHCommandline(cmdline, port, ssh_key)
cmdline.extend([WindowsPathToMsysPath(file),
"%s@%s:%s" % (user, host, remote_path)])
@@ -130,23 +139,29 @@ def GetRemotePath(path, local_file, base
the relative path from base_path to file."""
if base_path is None or not local_file.startswith(base_path):
return path
dir = os.path.dirname(local_file)
# strip base_path + extra slash and make it unixy
dir = dir[len(base_path)+1:].replace('\\','/')
return path + dir
-def UploadFiles(user, host, path, files, verbose=False, port=None, ssh_key=None, base_path=None, post_upload_command=None):
+def UploadFiles(user, host, path, files, verbose=False, port=None, ssh_key=None, base_path=None, upload_to_temp_dir=False, post_upload_command=None):
"""Upload each file in the list files to user@host:path. Optionally pass
port and ssh_key to the ssh commands. If base_path is not None, upload
- files including their path relative to base_path. If post_upload_command
- is not None, execute that command on the remote host after uploading
- all files, passing it the upload path, and the full paths to all files
- uploaded. If verbose is True, print status updates while working."""
+ files including their path relative to base_path. If upload_to_temp_dir is
+ True files will be uploaded to a temporary directory on the remote server.
+ Generally, you should have a post upload command specified in these cases
+ that can move them around to their correct location(s).
+ If post_upload_command is not None, execute that command on the remote host
+ after uploading all files, passing it the upload path, and the full paths to
+ all files uploaded.
+ If verbose is True, print status updates while working."""
+ if upload_to_temp_dir:
+ path = DoSSHCommand("mktemp -d", user, host, port=port, ssh_key=ssh_key)
if not path.endswith("/"):
path += "/"
if base_path is not None:
base_path = os.path.abspath(base_path)
remote_files = []
for file in files:
file = os.path.abspath(file)
if not os.path.isfile(file):
@@ -158,42 +173,50 @@ def UploadFiles(user, host, path, files,
print "Uploading " + file
DoSCPFile(file, remote_path, user, host, port=port, ssh_key=ssh_key)
remote_files.append(remote_path + '/' + os.path.basename(file))
if post_upload_command is not None:
if verbose:
print "Running post-upload command: " + post_upload_command
file_list = '"' + '" "'.join(remote_files) + '"'
DoSSHCommand('%s "%s" %s' % (post_upload_command, path, file_list), user, host, port=port, ssh_key=ssh_key)
+ if upload_to_temp_dir:
+ DoSSHCommand("rm -rf %s" % path, user, host, port=port, ssh_key=ssh_key)
if verbose:
print "Upload complete"
if __name__ == '__main__':
host = RequireEnvironmentVariable('UPLOAD_HOST')
user = RequireEnvironmentVariable('UPLOAD_USER')
- path = RequireEnvironmentVariable('UPLOAD_PATH')
+ path = OptionalEnvironmentVariable('UPLOAD_PATH')
+ upload_to_temp_dir = OptionalEnvironmentVariable('UPLOAD_TO_TEMP')
port = OptionalEnvironmentVariable('UPLOAD_PORT')
if port is not None:
port = int(port)
key = OptionalEnvironmentVariable('UPLOAD_SSH_KEY')
post_upload_command = OptionalEnvironmentVariable('POST_UPLOAD_CMD')
+ if (not path and not upload_to_temp_dir) or (path and upload_to_temp_dir):
+ print "One (and only one of UPLOAD_PATH or UPLOAD_TO_TEMP must be " + \
+ "defined."
+ sys.exit(1)
if sys.platform == 'win32':
- path = FixupMsysPath(path)
+ if path is not None:
+ path = FixupMsysPath(path)
if post_upload_command is not None:
post_upload_command = FixupMsysPath(post_upload_command)
parser = OptionParser(usage="usage: %prog [options] <files>")
parser.add_option("-b", "--base-path",
action="store", dest="base_path",
help="Preserve file paths relative to this path when uploading. If unset, all files will be uploaded directly to UPLOAD_PATH.")
(options, args) = parser.parse_args()
if len(args) < 1:
print "You must specify at least one file to upload"
sys.exit(1)
try:
UploadFiles(user, host, path, args, base_path=options.base_path,
- port=port, ssh_key=key, post_upload_command=post_upload_command,
+ port=port, ssh_key=key, upload_to_temp_dir=upload_to_temp_dir,
+ post_upload_command=post_upload_command,
verbose=True)
except IOError, (strerror):
print strerror
except Exception, (err):
print err
-
--- a/config/autoconf.mk.in
+++ b/config/autoconf.mk.in
@@ -127,17 +127,16 @@ MOZ_UNIVERSALCHARDET = @MOZ_UNIVERSALCHA
ACCESSIBILITY = @ACCESSIBILITY@
MOZ_VIEW_SOURCE = @MOZ_VIEW_SOURCE@
MOZ_XPINSTALL = @MOZ_XPINSTALL@
MOZ_JSLOADER = @MOZ_JSLOADER@
MOZ_USE_NATIVE_UCONV = @MOZ_USE_NATIVE_UCONV@
MOZ_BRANDING_DIRECTORY = @MOZ_BRANDING_DIRECTORY@
XPCOM_USE_LEA = @XPCOM_USE_LEA@
JS_ULTRASPARC_OPTS = @JS_ULTRASPARC_OPTS@
-JS_STATIC_BUILD = @JS_STATIC_BUILD@
MOZ_ENABLE_POSTSCRIPT = @MOZ_ENABLE_POSTSCRIPT@
MOZ_INSTALLER = @MOZ_INSTALLER@
MOZ_UPDATER = @MOZ_UPDATER@
MOZ_UPDATE_PACKAGING = @MOZ_UPDATE_PACKAGING@
MOZ_NO_ACTIVEX_SUPPORT = @MOZ_NO_ACTIVEX_SUPPORT@
MOZ_ACTIVEX_SCRIPTING_SUPPORT = @MOZ_ACTIVEX_SCRIPTING_SUPPORT@
MOZ_DISABLE_VISTA_SDK_REQUIREMENTS = @MOZ_DISABLE_VISTA_SDK_REQUIREMENTS@
MOZ_DISABLE_PARENTAL_CONTROLS = @MOZ_DISABLE_PARENTAL_CONTROLS@
--- a/config/config.mk
+++ b/config/config.mk
@@ -68,16 +68,18 @@ COMMA = ,
CHECK_VARS := \
XPI_NAME \
LIBRARY_NAME \
MODULE \
DEPTH \
SHORT_LIBNAME \
XPI_PKGNAME \
INSTALL_EXTENSION_ID \
+ SHARED_LIBRARY_NAME \
+ STATIC_LIBRARY_NAME \
$(NULL)
# checks for internal spaces or trailing spaces in the variable
# named by $x
check-variable = $(if $(filter-out 0 1,$(words $($(x))z)),$(error Spaces are not allowed in $(x)))
$(foreach x,$(CHECK_VARS),$(check-variable))
@@ -354,16 +356,28 @@ ifndef _ENABLE_PIC
DSO_CFLAGS=
ifeq ($(OS_ARCH)_$(HAVE_GCC3_ABI),Darwin_1)
DSO_PIC_CFLAGS=-mdynamic-no-pic
else
DSO_PIC_CFLAGS=
endif
endif
+ifndef SHARED_LIBRARY_NAME
+ifdef LIBRARY_NAME
+SHARED_LIBRARY_NAME=$(LIBRARY_NAME)
+endif
+endif
+
+ifndef STATIC_LIBRARY_NAME
+ifdef LIBRARY_NAME
+STATIC_LIBRARY_NAME=$(LIBRARY_NAME)
+endif
+endif
+
# This comes from configure
ifdef MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE
NO_PROFILE_GUIDED_OPTIMIZE = 1
endif
# Enable profile-based feedback
ifndef NO_PROFILE_GUIDED_OPTIMIZE
ifdef MOZ_PROFILE_GENERATE
deleted file mode 100644
--- a/config/mangle.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 1998
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either of the GNU General Public License Version 2 or later (the "GPL"),
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-#include <windows.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-HANDLE hMangleFile;
-
-void Usage(void)
-{
- fprintf(stderr, "MANGLE: <file>\n");
-}
-
-BOOL MangleFile( const char *real_name, const char *mangle_name )
-{
- int len;
- DWORD dwWritten;
- char buffer[2048];
-
- if( mangle_name && *mangle_name && strcmpi(real_name, mangle_name) ) {
- printf("Mangle: renaming %s to %s\n", real_name, mangle_name);
-
- if( ! MoveFile(real_name, "X_MANGLE.TMP") ) {
- fprintf(stderr, "MANGLE: cannot rename %s to X_MANGLE.TMP\n",
- real_name);
- return FALSE;
- }
-
- if( ! MoveFile("X_MANGLE.TMP", mangle_name) ) {
- MoveFile("X_MANGLE.TMP", real_name);
- fprintf(stderr, "MANGLE: cannot rename X_MANGLE.TMP to %s\n",
- mangle_name);
- return FALSE;
- }
-
- len = sprintf(buffer, "mv %s %s\r\n", mangle_name, real_name);
-
- if( (WriteFile( hMangleFile, buffer, len, &dwWritten, NULL ) == FALSE) ||
- (dwWritten != len) ) {
- fprintf(stderr, "MANGLE: error writing to UNMANGLE.BAT\n");
- return FALSE;
- }
- }
- return TRUE;
-}
-
-
-int main( int argc, char *argv[] )
-{
- WIN32_FIND_DATA find_data;
- HANDLE hFoundFile;
-
- if( argc != 1 ) {
- Usage();
- return 2;
- }
-
-
- hMangleFile = CreateFile("unmangle.bat", /* name */
- GENERIC_READ|GENERIC_WRITE, /* access mode */
- 0, /* share mode */
- NULL, /* security descriptor */
- CREATE_NEW, /* how to create */
- FILE_ATTRIBUTE_NORMAL, /* file attributes */
- NULL ); /* template file */
-
- if( hMangleFile == INVALID_HANDLE_VALUE ) {
- if( GetLastError() == ERROR_FILE_EXISTS ) {
- fprintf(stderr, "MANGLE: UNMANGLE.BAT already exists\n");
- } else {
- fprintf(stderr, "MANGLE: cannot open UNMANGLE.BAT\n");
- }
- return 1;
- }
-
- if( (hFoundFile = FindFirstFile("*.*", &find_data)) == INVALID_HANDLE_VALUE ) {
- fprintf(stderr, "MANGLE: cannot read directory\n");
- return 1;
- }
-
- do {
- if( !MangleFile(find_data.cFileName, find_data.cAlternateFileName) ) {
- fprintf(stderr, "MANGLE: cannot rename %s to %s\n",
- find_data.cFileName, find_data.cAlternateFileName );
-
- FindClose( hFoundFile );
- CloseHandle( hMangleFile );
- return 1;
- }
- } while( FindNextFile(hFoundFile, &find_data) );
- FindClose( hFoundFile );
-
- {
- int len;
- DWORD dwWritten;
- char buffer[255];
-
- len = sprintf(buffer, "del unmangle.bat\r\n");
- WriteFile ( hMangleFile, buffer, len, &dwWritten, NULL );
- }
- CloseHandle( hMangleFile );
-
- return 0;
-}
deleted file mode 100755
index de63cd81d88b7d430dc0510351e7081b986034ba..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -214,52 +214,52 @@ endif # ENABLE_TESTS
#
# Library rules
#
# If BUILD_STATIC_LIBS or FORCE_STATIC_LIB is set, build a static library.
# Otherwise, build a shared library.
#
ifndef LIBRARY
-ifdef LIBRARY_NAME
+ifdef STATIC_LIBRARY_NAME
ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH)))
ifdef SHORT_LIBNAME
-LIBRARY_NAME := $(SHORT_LIBNAME)
+STATIC_LIBRARY_NAME := $(SHORT_LIBNAME)
endif
endif
-LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(LIB_SUFFIX)
-endif
-endif
+LIBRARY := $(LIB_PREFIX)$(STATIC_LIBRARY_NAME).$(LIB_SUFFIX)
+endif # STATIC_LIBRARY_NAME
+endif # LIBRARY
ifndef HOST_LIBRARY
ifdef HOST_LIBRARY_NAME
HOST_LIBRARY := $(LIB_PREFIX)$(HOST_LIBRARY_NAME).$(LIB_SUFFIX)
endif
endif
ifdef LIBRARY
ifneq (_1,$(FORCE_SHARED_LIB)_$(BUILD_STATIC_LIBS))
ifdef MKSHLIB
ifdef LIB_IS_C_ONLY
MKSHLIB = $(MKCSHLIB)
endif
ifdef MAKE_FRAMEWORK
-SHARED_LIBRARY := $(LIBRARY_NAME)
+SHARED_LIBRARY := $(SHARED_LIBRARY_NAME)
else
-SHARED_LIBRARY := $(DLL_PREFIX)$(LIBRARY_NAME)$(DLL_SUFFIX)
+SHARED_LIBRARY := $(DLL_PREFIX)$(SHARED_LIBRARY_NAME)$(DLL_SUFFIX)
endif
ifeq ($(OS_ARCH),OS2)
DEF_FILE := $(SHARED_LIBRARY:.dll=.def)
endif
ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH)))
-IMPORT_LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(IMPORT_LIB_SUFFIX)
+IMPORT_LIBRARY := $(LIB_PREFIX)$(SHARED_LIBRARY_NAME).$(IMPORT_LIB_SUFFIX)
endif
ifdef MOZ_ENABLE_LIBXUL
EMBED_MANIFEST_AT=2
endif
endif # MKSHLIB
endif # FORCE_SHARED_LIB && !BUILD_STATIC_LIBS
@@ -314,39 +314,32 @@ COMPILE_PDBFILE = generated.pdb
endif
LINK_PDBFILE = $(basename $(@F)).pdb
ifdef MOZ_DEBUG
CODFILE=$(basename $(@F)).cod
endif
ifdef MOZ_MAPINFO
-ifdef LIBRARY_NAME
-MAPFILE=$(LIBRARY_NAME).map
+ifdef SHARED_LIBRARY_NAME
+MAPFILE=$(SHARED_LIBRARY_NAME).map
else
MAPFILE=$(basename $(@F)).map
endif # LIBRARY_NAME
endif # MOZ_MAPINFO
ifdef DEFFILE
OS_LDFLAGS += -DEF:$(DEFFILE)
EXTRA_DEPS += $(DEFFILE)
endif
ifdef MAPFILE
OS_LDFLAGS += -MAP:$(MAPFILE)
-#CFLAGS += -Fm$(MAPFILE)
-#CXXFLAGS += -Fm$(MAPFILE)
endif
-#ifdef CODFILE
-#CFLAGS += -Fa$(CODFILE) -FAsc
-#CFLAGS += -Fa$(CODFILE) -FAsc
-#endif
-
endif # !GNU_CC
ifdef ENABLE_CXX_EXCEPTIONS
ifdef GNU_CC
CXXFLAGS += -fexceptions
else
ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER)))
CXXFLAGS += -GX
@@ -836,23 +829,23 @@ endif
#
# Rule to create list of libraries for final link
#
export::
ifdef LIBRARY_NAME
ifdef EXPORT_LIBRARY
ifdef IS_COMPONENT
ifdef BUILD_STATIC_LIBS
- @$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMPS) $(LIBRARY_NAME)
+ @$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMPS) $(STATIC_LIBRARY_NAME)
ifdef MODULE_NAME
@$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMP_NAMES) $(MODULE_NAME)
endif
-endif
-else
- $(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_LIBS) $(LIBRARY_NAME)
+endif # BUILD_STATIC_LIBS
+else # !IS_COMPONENT
+ $(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_LIBS) $(STATIC_LIBRARY_NAME)
endif # IS_COMPONENT
endif # EXPORT_LIBRARY
endif # LIBRARY_NAME
# Create dependencies on static (and shared EXTRA_DSO_LIBS) libraries
LIBS_DEPS = $(filter %.$(LIB_SUFFIX), $(LIBS))
HOST_LIBS_DEPS = $(filter %.$(LIB_SUFFIX), $(HOST_LIBS))
DSO_LDOPTS_DEPS = $(EXTRA_DSO_LIBS) $(filter %.$(LIB_SUFFIX), $(EXTRA_DSO_LDOPTS))
@@ -1178,17 +1171,17 @@ endif
ifeq (,$(filter-out WINNT WINCE, $(OS_ARCH)))
$(IMPORT_LIBRARY): $(SHARED_LIBRARY)
endif
ifeq ($(OS_ARCH),OS2)
$(DEF_FILE): $(OBJS) $(SHARED_LIBRARY_LIBS)
rm -f $@
- echo LIBRARY $(LIBRARY_NAME) INITINSTANCE TERMINSTANCE > $@
+ echo LIBRARY $(SHARED_LIBRARY_NAME) INITINSTANCE TERMINSTANCE > $@
echo PROTMODE >> $@
echo CODE LOADONCALL MOVEABLE DISCARDABLE >> $@
echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $@
echo EXPORTS >> $@
ifeq ($(IS_COMPONENT),1)
ifeq ($(HAS_EXTRAEXPORTS),1)
ifndef MOZ_OS2_USE_DECLSPEC
$(FILTER) $(OBJS) $(SHARED_LIBRARY_LIBS) >> $@
--- a/config/system-headers
+++ b/config/system-headers
@@ -299,24 +299,27 @@ gssapi/gssapi_generic.h
gssapi/gssapi.h
gssapi.h
gtk/gtkbindings.h
gtk/gtkbutton.h
gtk/gtkclipboard.h
gtk/gtkcontainer.h
gtk/gtkdialog.h
gtk/gtkentry.h
+gtk/gtkfilechooser.h
+gtk/gtkfilechooserdialog.h
gtk/gtkfixed.h
gtk/gtk.h
gtk/gtkiconfactory.h
gtk/gtkimage.h
gtk/gtkimmulticontext.h
gtk/gtkinvisible.h
gtk/gtkmain.h
gtk/gtkmessagedialog.h
+gtk/gtkmisc.h
gtk/gtkobject.h
gtk/gtkprinter.h
gtk/gtkprintjob.h
gtk/gtkprintunixdialog.h
gtk/gtkprivate.h
gtk/gtkselection.h
gtk/gtksignal.h
gtk/gtksocket.h
--- a/configure.in
+++ b/configure.in
@@ -2953,27 +2953,16 @@ AC_CHECK_HEADERS(X11/XKBlib.h)
dnl These are all the places some variant of statfs can be hiding.
AC_CHECK_HEADERS(sys/statvfs.h sys/statfs.h sys/vfs.h sys/mount.h)
dnl Try for MMX support
dnl NB - later gcc versions require -mmmx for this header to be successfully
dnl included (or another option which implies it, such as -march=pentium-mmx)
AC_CHECK_HEADERS(mmintrin.h)
-AC_MSG_CHECKING(for ARM SIMD support)
-AC_TRY_COMPILE([],
- [asm("uqadd8 r1, r1, r2");],
- result="yes", result="no")
-AC_MSG_RESULT("$result")
-if test "$result" = "yes"; then
- AC_DEFINE(HAVE_ARM_SIMD)
- HAVE_ARM_SIMD=1
-fi
-AC_SUBST(HAVE_ARM_SIMD)
-
dnl Check whether the compiler supports the new-style C++ standard
dnl library headers (i.e. <new>) or needs the old "new.h"
AC_LANG_CPLUSPLUS
NEW_H=new.h
AC_CHECK_HEADER(new, [NEW_H=new])
AC_DEFINE_UNQUOTED(NEW_H, <$NEW_H>)
AC_LANG_C
@@ -3153,16 +3142,27 @@ else
fi # $no_x
AC_SUBST(XCFLAGS)
AC_SUBST(XLDFLAGS)
AC_SUBST(XLIBS)
AC_SUBST(XT_LIBS)
+AC_MSG_CHECKING(for ARM SIMD support)
+AC_TRY_COMPILE([],
+ [asm("uqadd8 r1, r1, r2");],
+ result="yes", result="no")
+AC_MSG_RESULT("$result")
+if test "$result" = "yes"; then
+ AC_DEFINE(HAVE_ARM_SIMD)
+ HAVE_ARM_SIMD=1
+fi
+AC_SUBST(HAVE_ARM_SIMD)
+
dnl ========================================================
dnl = pthread support
dnl = Start by checking whether the system support pthreads
dnl ========================================================
case "$target_os" in
darwin*)
USE_PTHREADS=1
;;
@@ -4374,17 +4374,16 @@ MOZ_XTF=1
MOZ_XUL=1
MOZ_XUL_APP=1
MOZ_ZIPWRITER=1
NS_PRINTING=1
NECKO_COOKIES=1
NECKO_DISK_CACHE=1
NECKO_PROTOCOLS_DEFAULT="about data file ftp gopher http res viewsource"
NECKO_SMALL_BUFFERS=
-JS_STATIC_BUILD=
XPC_IDISPATCH_SUPPORT=
case "$target_os" in
darwin*)
ACCESSIBILITY=
;;
*)
@@ -4467,17 +4466,16 @@ basic)
MOZ_XPINSTALL=
MOZ_XTF=
MOZ_ZIPWRITER=
NECKO_DISK_CACHE=
NECKO_PROTOCOLS_DEFAULT="about data http file res"
NECKO_SMALL_BUFFERS=1
NS_DISABLE_LOGGING=1
NS_PRINTING=
- JS_STATIC_BUILD=1
;;
minimal)
MOZ_EMBEDDING_LEVEL_DEFAULT=
MOZ_EMBEDDING_LEVEL_BASIC=
MOZ_EMBEDDING_LEVEL_MINIMAL=1
AC_DEFINE(MOZ_EMBEDDING_LEVEL_MINIMAL)
ENABLE_TESTS=
@@ -4515,17 +4513,16 @@ minimal)
MOZ_XUL=
MOZ_ZIPWRITER=
MOZ_RDF=
NECKO_DISK_CACHE=
NECKO_PROTOCOLS_DEFAULT="about data http file res"
NECKO_SMALL_BUFFERS=1
NS_DISABLE_LOGGING=1
NS_PRINTING=
- JS_STATIC_BUILD=1
;;
*)
AC_MSG_ERROR([Unrecognized value: --with-embedding-profile=$MOZ_EMBEDDING_PROFILE])
;;
esac
AC_SUBST(MOZ_EMBEDDING_LEVEL_DEFAULT)
@@ -7183,35 +7180,16 @@ if test -n "$MOZ_ENABLE_LIBXUL"; then
else
if test -n "$BUILD_STATIC_LIBS"; then
AC_DEFINE(MOZ_STATIC_BUILD)
fi
XPCOM_LIBS="$DYNAMIC_XPCOM_LIBS"
fi
dnl ========================================================
-dnl = Force JS to be a static lib
-dnl ========================================================
-MOZ_ARG_ENABLE_BOOL(js-static-build,
-[ --enable-js-static-build Force js to be a static lib],
- JS_STATIC_BUILD=1,
- JS_STATIC_BUILD= )
-
-AC_SUBST(JS_STATIC_BUILD)
-
-if test -n "$JS_STATIC_BUILD"; then
- AC_DEFINE(EXPORT_JS_API)
-
-if test -z "$BUILD_STATIC_LIBS"; then
- AC_MSG_ERROR([--enable-js-static-build is only compatible with --enable-static])
-fi
-
-fi
-
-dnl ========================================================
dnl =
dnl = Standalone module options
dnl =
dnl ========================================================
MOZ_ARG_HEADER(Standalone module options (Not for building Mozilla))
dnl Check for GLib and libIDL.
dnl ========================================================
@@ -8329,16 +8307,17 @@ fi
# Run the SpiderMonkey 'configure' script.
dist=$MOZ_BUILD_ROOT/dist
ac_configure_args="$_SUBDIR_CONFIG_ARGS"
ac_configure_args="$ac_configure_args --enable-threadsafe"
if test -z "$MOZ_NATIVE_NSPR"; then
ac_configure_args="$ac_configure_args --with-nspr-cflags='$NSPR_CFLAGS'"
ac_configure_args="$ac_configure_args --with-nspr-libs='$NSPR_LIBS'"
fi
+ac_configure_args="$ac_configure_args --with-dist-dir=../../dist"
ac_configure_args="$ac_configure_args --includedir=$dist/include"
ac_configure_args="$ac_configure_args --bindir=$dist/bin"
ac_configure_args="$ac_configure_args --libdir=$dist/lib"
ac_configure_args="$ac_configure_args --with-sync-build-files=$_topsrcdir"
if test "$MOZ_MEMORY"; then
ac_configure_args="$ac_configure_args --enable-jemalloc"
fi
AC_OUTPUT_SUBDIRS(js/src)
--- a/content/base/src/nsGkAtomList.h
+++ b/content/base/src/nsGkAtomList.h
@@ -295,17 +295,17 @@ GK_ATOM(distinct, "distinct")
GK_ATOM(div, "div")
GK_ATOM(dl, "dl")
GK_ATOM(doctypePublic, "doctype-public")
GK_ATOM(doctypeSystem, "doctype-system")
GK_ATOM(document, "document")
GK_ATOM(DOMAttrModified, "DOMAttrModified")
GK_ATOM(DOMCharacterDataModified, "DOMCharacterDataModified")
GK_ATOM(DOMNodeInserted, "DOMNodeInserted")
-GK_ATOM(DOMNodeInsertedIntoDocument, "DOMNodeInsertedInfoDocument")
+GK_ATOM(DOMNodeInsertedIntoDocument, "DOMNodeInsertedIntoDocument")
GK_ATOM(DOMNodeRemoved, "DOMNodeRemoved")
GK_ATOM(DOMNodeRemovedFromDocument, "DOMNodeRemovedFromDocument")
GK_ATOM(DOMSubtreeModified, "DOMSubtreeModified")
GK_ATOM(double_, "double")
GK_ATOM(drag, "drag")
GK_ATOM(dragdrop, "dragdrop")
GK_ATOM(dragend, "dragend")
GK_ATOM(dragenter, "dragenter")
--- a/content/base/src/nsImageLoadingContent.cpp
+++ b/content/base/src/nsImageLoadingContent.cpp
@@ -116,21 +116,21 @@ nsImageLoadingContent::nsImageLoadingCon
}
}
void
nsImageLoadingContent::DestroyImageLoadingContent()
{
// Cancel our requests so they won't hold stale refs to us
if (mCurrentRequest) {
- mCurrentRequest->Cancel(NS_ERROR_FAILURE);
+ mCurrentRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
mCurrentRequest = nsnull;
}
if (mPendingRequest) {
- mPendingRequest->Cancel(NS_ERROR_FAILURE);
+ mPendingRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
mPendingRequest = nsnull;
}
}
nsImageLoadingContent::~nsImageLoadingContent()
{
NS_ASSERTION(!mCurrentRequest && !mPendingRequest,
"DestroyImageLoadingContent not called");
--- a/content/base/test/Makefile.in
+++ b/content/base/test/Makefile.in
@@ -265,16 +265,18 @@ include $(topsrcdir)/config/rules.mk
test_w3element_traversal.html \
test_w3element_traversal.xhtml \
test_bug469020.html \
test_w3element_traversal_svg.html \
w3element_traversal.svg \
test_bug444322.html \
bug444322.txt \
bug444322.js \
+ test_bug455629.html \
+ bug455629-helper.svg \
$(NULL)
# Disabled for now. Mochitest isn't reliable enough for these.
# test_bug444546.html \
# bug444546.sjs \
libs:: $(_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/content/base/test/bug455629-helper.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0"?>
+<svg xmlns="http://www.w3.org/2000/svg">
+ <g transform="scale(0.5)">
+ <foreignObject id="f" width="100" height="100"/>
+ </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/content/base/test/test_bug455629.html
@@ -0,0 +1,64 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=455629
+-->
+<head>
+ <title>Test for Bug 455629</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=455629">Mozilla Bug 455629</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+/** Test for Bug 455629 **/
+SimpleTest.waitForExplicitFinish();
+
+var done = 0;
+function doTest(name) {
+ var elem = $(name);
+ var doc = elem.getSVGDocument();
+ try {
+ doc.foopy = 42;
+ fail("Able to set cross origin property!");
+ } catch (e) {
+ ok(true, "unable to set non-allAccess property cross origin");
+ }
+
+ if (elem instanceof HTMLObjectElement) {
+ doc = elem.contentDocument;
+ try {
+ doc.foopy = 42;
+ fail("Able to set cross origin property!");
+ } catch (e) {
+ ok(true, "unable to set non-allAccess property cross origin");
+ }
+ }
+
+ if (++done == 2) {
+ SimpleTest.finish();
+ }
+}
+</script>
+
+<object id="obj"
+ type="image/svg+xml"
+ onload="doTest('obj')"
+ data="http://example.org/tests/content/base/test/bug455629-helper.svg">
+</object>
+
+<embed id="emb"
+ type="image/svg+xml"
+ onload="doTest('emb')"
+ src="http://example.org/tests/content/base/test/bug455629-helper.svg">
+</embed>
+
+</pre>
+</body>
+</html>
--- a/content/events/src/nsDOMMouseScrollEvent.cpp
+++ b/content/events/src/nsDOMMouseScrollEvent.cpp
@@ -41,16 +41,24 @@
#include "nsIEventStateManager.h"
#include "nsContentUtils.h"
nsDOMMouseScrollEvent::nsDOMMouseScrollEvent(nsPresContext* aPresContext,
nsInputEvent* aEvent)
: nsDOMMouseEvent(aPresContext, aEvent ? aEvent :
new nsMouseScrollEvent(PR_FALSE, 0, nsnull))
{
+ if (aEvent) {
+ mEventIsInternal = PR_FALSE;
+ } else {
+ mEventIsInternal = PR_TRUE;
+ mEvent->time = PR_Now();
+ mEvent->refPoint.x = mEvent->refPoint.y = 0;
+ }
+
if(mEvent->eventStructType == NS_MOUSE_SCROLL_EVENT) {
nsMouseScrollEvent* mouseEvent = static_cast<nsMouseScrollEvent*>(mEvent);
mDetail = mouseEvent->delta;
}
}
nsDOMMouseScrollEvent::~nsDOMMouseScrollEvent()
{
--- a/content/html/document/src/nsHTMLContentSink.cpp
+++ b/content/html/document/src/nsHTMLContentSink.cpp
@@ -329,17 +329,17 @@ public:
SinkContext(HTMLContentSink* aSink);
~SinkContext();
nsresult Begin(nsHTMLTag aNodeType, nsGenericHTMLElement* aRoot,
PRUint32 aNumFlushed, PRInt32 aInsertionPoint);
nsresult OpenContainer(const nsIParserNode& aNode);
nsresult CloseContainer(const nsHTMLTag aTag, PRBool aMalformed);
nsresult AddLeaf(const nsIParserNode& aNode);
- nsresult AddLeaf(nsGenericHTMLElement* aContent);
+ nsresult AddLeaf(nsIContent* aContent);
nsresult AddComment(const nsIParserNode& aNode);
nsresult End();
nsresult GrowStack();
nsresult AddText(const nsAString& aText);
nsresult FlushText(PRBool* aDidFlush = nsnull,
PRBool aReleaseLast = PR_FALSE);
nsresult FlushTextAndRelease(PRBool* aDidFlush = nsnull)
@@ -893,16 +893,17 @@ SinkContext::HaveNotifiedForCurrentConte
}
return PR_TRUE;
}
nsIContent *
SinkContext::Node::Add(nsIContent *child)
{
+ NS_ASSERTION(mContent, "No parent to insert/append into!");
if (mInsertionPoint != -1) {
NS_ASSERTION(mNumFlushed == mContent->GetChildCount(),
"Inserting multiple children without flushing.");
mContent->InsertChildAt(child, mInsertionPoint++, PR_FALSE);
} else {
mContent->AppendChildTo(child, PR_FALSE);
}
return child;
@@ -1148,17 +1149,17 @@ SinkContext::AddLeaf(const nsIParserNode
default:
break;
}
return rv;
}
nsresult
-SinkContext::AddLeaf(nsGenericHTMLElement* aContent)
+SinkContext::AddLeaf(nsIContent* aContent)
{
NS_ASSERTION(mStackPos > 0, "leaf w/o container");
if (mStackPos <= 0) {
return NS_ERROR_FAILURE;
}
DidAddContent(mStack[mStackPos - 1].Add(aContent));
@@ -1465,23 +1466,18 @@ SinkContext::FlushText(PRBool* aDidFlush
// Set the text in the text node
mLastTextNode->SetText(mText, mTextLength, PR_FALSE);
// Eat up the rest of the text up in state.
mLastTextNodeSize += mTextLength;
mTextLength = 0;
- // Add text to its parent
- NS_ASSERTION(mStackPos > 0, "leaf w/o container");
- if (mStackPos <= 0) {
- return NS_ERROR_FAILURE;
- }
-
- DidAddContent(mStack[mStackPos - 1].Add(mLastTextNode));
+ rv = AddLeaf(mLastTextNode);
+ NS_ENSURE_SUCCESS(rv, rv);
didFlush = PR_TRUE;
}
}
if (aDidFlush) {
*aDidFlush = didFlush;
}
@@ -2884,23 +2880,18 @@ HTMLContentSink::ProcessBASEElement(nsGe
}
}
}
nsresult
HTMLContentSink::ProcessLINKTag(const nsIParserNode& aNode)
{
nsresult result = NS_OK;
- nsGenericHTMLElement* parent = nsnull;
if (mCurrentContext) {
- parent = mCurrentContext->mStack[mCurrentContext->mStackPos - 1].mContent;
- }
-
- if (parent) {
// Create content object
nsCOMPtr<nsIContent> element;
nsCOMPtr<nsINodeInfo> nodeInfo;
nodeInfo = mNodeInfoManager->GetNodeInfo(nsGkAtoms::link, nsnull, kNameSpaceID_None);
result = NS_NewHTMLElement(getter_AddRefs(element), nodeInfo, PR_FALSE);
NS_ENSURE_SUCCESS(result, result);
@@ -2918,17 +2909,18 @@ HTMLContentSink::ProcessLINKTag(const ns
// Add in the attributes and add the style content object to the
// head container.
AddBaseTagInfo(element);
result = AddAttributes(aNode, element);
if (NS_FAILED(result)) {
return result;
}
- parent->AppendChildTo(element, PR_FALSE);
+
+ mCurrentContext->AddLeaf(element); // <link>s are leaves
if (ssle) {
ssle->SetEnableUpdates(PR_TRUE);
PRBool willNotify;
PRBool isAlternate;
result = ssle->UpdateStyleSheet(this, &willNotify, &isAlternate);
if (NS_SUCCEEDED(result) && willNotify && !isAlternate) {
++mPendingSheetCount;
new file mode 100644
--- /dev/null
+++ b/content/mathml/content/crashtests/462929-1.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script type="text/javascript">
+
+var a = document.createElementNS("http://www.w3.org/2000/svg", "foo");
+var b = document.createElementNS("http://www.w3.org/1998/Math/MathML", "math");
+
+</script>
+</head>
+<body></body>
+</html>
new file mode 100644
--- /dev/null
+++ b/content/mathml/content/crashtests/crashtests.list
@@ -0,0 +1,1 @@
+load 462929-1.html
--- a/content/xbl/src/nsXBLBinding.cpp
+++ b/content/xbl/src/nsXBLBinding.cpp
@@ -720,16 +720,31 @@ nsXBLBinding::GenerateAnonymousContent()
// We were unable to place this child. All anonymous content
// should be thrown out. Special-case template and observes.
nsINodeInfo *ni = childContent->NodeInfo();
nsIAtom *localName = ni->NameAtom();
if (ni->NamespaceID() != kNameSpaceID_XUL ||
(localName != nsGkAtoms::observes &&
localName != nsGkAtoms::_template)) {
+ // Undo InstallAnonymousContent
+ PRUint32 childCount = mContent->GetChildCount();
+#ifdef MOZ_XUL
+ nsCOMPtr<nsIXULDocument> xuldoc(do_QueryInterface(doc));
+#endif
+ for (PRUint32 k = 0; k < childCount; ++k) {
+ nsIContent* child = mContent->GetChildAt(k);
+ child->UnbindFromTree();
+#ifdef MOZ_XUL
+ if (xuldoc) {
+ xuldoc->RemoveSubtreeFromDocument(child);
+ }
+#endif
+ }
+
// Kill all anonymous content.
mContent = nsnull;
bindingManager->SetContentListFor(mBoundElement, nsnull);
bindingManager->SetAnonymousNodesFor(mBoundElement, nsnull);
return;
}
}
}
--- a/content/xbl/src/nsXBLEventHandler.cpp
+++ b/content/xbl/src/nsXBLEventHandler.cpp
@@ -98,17 +98,17 @@ nsXBLMouseEventHandler::nsXBLMouseEventH
nsXBLMouseEventHandler::~nsXBLMouseEventHandler()
{
}
PRBool
nsXBLMouseEventHandler::EventMatched(nsIDOMEvent* aEvent)
{
nsCOMPtr<nsIDOMMouseEvent> mouse(do_QueryInterface(aEvent));
- return mProtoHandler->MouseEventMatched(mouse);
+ return mouse && mProtoHandler->MouseEventMatched(mouse);
}
nsXBLKeyEventHandler::nsXBLKeyEventHandler(nsIAtom* aEventType, PRUint8 aPhase,
PRUint8 aType)
: mEventType(aEventType),
mPhase(aPhase),
mType(aType),
mIsBoundToChrome(PR_FALSE)
--- a/content/xslt/src/xslt/txStylesheet.h
+++ b/content/xslt/src/xslt/txStylesheet.h
@@ -186,17 +186,17 @@ private:
// Map with all global variables and parameters
txOwningExpandedNameMap<GlobalVariable> mGlobalVariables;
// Map with all keys
txOwningExpandedNameMap<txXSLKey> mKeys;
// Array of all txStripSpaceTests, sorted in acending order
- nsTPtrArray<txStripSpaceTest> mStripSpaceTests;
+ nsTArray<nsAutoPtr<txStripSpaceTest> > mStripSpaceTests;
// Default templates
nsAutoPtr<txInstruction> mContainerTemplate;
nsAutoPtr<txInstruction> mCharactersTemplate;
nsAutoPtr<txInstruction> mEmptyTemplate;
};
--- a/content/xslt/tests/mochitest/Makefile.in
+++ b/content/xslt/tests/mochitest/Makefile.in
@@ -41,12 +41,13 @@ srcdir = @srcdir@
VPATH = @srcdir@
relativesrcdir = content/xslt/tests/mochitest
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_bug319374.xhtml \
test_bug440974.html \
+ test_bug427060.html \
$(NULL)
libs:: $(_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/content/xslt/tests/mochitest/test_bug427060.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=427060
+-->
+<head>
+ <title>Test for Bug 427060</title>
+ <script type="text/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=427060">Mozilla Bug 427060</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script class="testbody" type="text/javascript">
+
+/** Test for Bug 427060 **/
+
+var xmldoc, xsltdoc;
+[ xmldoc, xsltdoc ] = [ new DOMParser().parseFromString(String(xml), "text/xml") for each (xml in [
+
+ <opml version="1.0"><body></body></opml> ,
+
+ <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:template match="/opml">
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <base target="_blank"></base>
+ </head>
+ <body></body>
+ </html>
+ </xsl:template>
+ </xsl:stylesheet>
+
+]) ];
+
+var processor = new XSLTProcessor;
+processor.importStylesheet(xsltdoc);
+try
+{
+ var result = processor.transformToDocument(xmldoc);
+}
+catch (e)
+{
+}
+ok(result && result instanceof Document, "XSLT transform should have created a document");
+</script>
+</pre>
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/dom/src/base/crashtests/462947.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script type="text/javascript">
+
+navigator.mimeTypes.length;
+navigator.mimeTypes.length;
+
+</script>
+</head>
+
+<body></body>
+</html>
--- a/dom/src/base/crashtests/crashtests.list
+++ b/dom/src/base/crashtests/crashtests.list
@@ -2,9 +2,10 @@ load 327571-1.html
load 327695-1.html
load 329481-1.xhtml
load 338674-1.xhtml
load 346381-1.html
load 359432-1.xhtml
load 369413-1.html
load 372554-1.html
load 404869-1.xul
+load 462947.html
load 439206-1.html
--- a/dom/tests/mochitest/Makefile.in
+++ b/dom/tests/mochitest/Makefile.in
@@ -41,22 +41,19 @@ srcdir = @srcdir@
VPATH = @srcdir@
include $(DEPTH)/config/autoconf.mk
DIRS += \
dom-level0 \
dom-level1-core \
dom-level2-core \
+ dom-level2-html \
ajax \
bugs \
chrome \
general \
whatwg \
geolocation \
$(NULL)
-# dom-level2-html disabled due to failures on multiple platforms
-# (bug 427878)
-# dom-level2-html \
-
include $(topsrcdir)/config/rules.mk
--- a/dom/tests/mochitest/dom-level2-html/Makefile.in
+++ b/dom/tests/mochitest/dom-level2-html/Makefile.in
@@ -129,31 +129,33 @@ include $(topsrcdir)/config/rules.mk
test_HTMLCollection07.html \
test_HTMLCollection08.html \
test_HTMLCollection09.html \
test_HTMLCollection10.html \
test_HTMLCollection11.html \
test_HTMLCollection12.html \
$(NULL)
+# This test is failing on all platforms -- bug 471139
+# test_HTMLDocument12.html \
+#
_TEST_FILES_B = \
test_HTMLDirectoryElement01.html \
test_HTMLDivElement01.html \
test_HTMLDlistElement01.html \
test_HTMLDocument01.html \
test_HTMLDocument02.html \
test_HTMLDocument03.html \
test_HTMLDocument04.html \
test_HTMLDocument05.html \
test_HTMLDocument07.html \
test_HTMLDocument08.html \
test_HTMLDocument09.html \
test_HTMLDocument10.html \
test_HTMLDocument11.html \
- test_HTMLDocument12.html \
test_HTMLDocument13.html \
test_HTMLDocument14.html \
test_HTMLDocument15.html \
test_HTMLDocument16.html \
test_HTMLDocument17.html \
test_HTMLDocument18.html \
test_HTMLDocument19.html \
test_HTMLDocument20.html \
--- a/extensions/layout-debug/ui/jar.mn
+++ b/extensions/layout-debug/ui/jar.mn
@@ -1,8 +1,10 @@
layoutdebug.jar:
+% content layoutdebug %content/layoutdebug/
+% locale layoutdebug en-US %locale/en-US/layoutdebug/
content/layoutdebug/contents.rdf (content/contents.rdf)
content/layoutdebug/layoutdebug.xul (content/layoutdebug.xul)
content/layoutdebug/layoutdebug.js (content/layoutdebug.js)
content/layoutdebug/layoutdebug-overlay.xul (content/layoutdebug-overlay.xul)
locale/en-US/layoutdebug/contents.rdf (locale/en-US/contents.rdf)
locale/en-US/layoutdebug/layoutdebug.dtd (locale/en-US/layoutdebug.dtd)
locale/en-US/layoutdebug/layoutdebug-overlay.dtd (locale/en-US/layoutdebug-overlay.dtd)
--- a/gfx/cairo/cairo/src/cairo-win32-font.c
+++ b/gfx/cairo/cairo/src/cairo-win32-font.c
@@ -153,25 +153,27 @@ static HDC
}
static cairo_status_t
_compute_transform (cairo_win32_scaled_font_t *scaled_font,
cairo_matrix_t *sc)
{
cairo_status_t status;
- if (NEARLY_ZERO (sc->yx) && NEARLY_ZERO (sc->xy)) {
+ if (NEARLY_ZERO (sc->yx) && NEARLY_ZERO (sc->xy) &&
+ !NEARLY_ZERO (sc->xx) && !NEARLY_ZERO (sc->yy)) {
scaled_font->preserve_axes = TRUE;
scaled_font->x_scale = sc->xx;
scaled_font->swap_x = (sc->xx < 0);
scaled_font->y_scale = sc->yy;
scaled_font->swap_y = (sc->yy < 0);
scaled_font->swap_axes = FALSE;
- } else if (NEARLY_ZERO (sc->xx) && NEARLY_ZERO (sc->yy)) {
+ } else if (NEARLY_ZERO (sc->xx) && NEARLY_ZERO (sc->yy) &&
+ !NEARLY_ZERO (sc->yx) && !NEARLY_ZERO (sc->xy)) {
scaled_font->preserve_axes = TRUE;
scaled_font->x_scale = sc->yx;
scaled_font->swap_x = (sc->yx < 0);
scaled_font->y_scale = sc->xy;
scaled_font->swap_y = (sc->xy < 0);
scaled_font->swap_axes = TRUE;
} else {
--- a/gfx/src/thebes/nsThebesDeviceContext.cpp
+++ b/gfx/src/thebes/nsThebesDeviceContext.cpp
@@ -235,17 +235,17 @@ nsThebesDeviceContext::SetDPI()
if (dpi < 0) // something didn't work before, fall back to hardcoded DPI value
dpi = 96;
#elif defined(XP_MACOSX)
// we probably want to actually get a real DPI here?
dpi = 96;
#elif defined(MOZ_WIDGET_QT)
- // TODO: get real DPI here with Qt methods
+ // TODO: get real DPI here with Qt methods
dpi = 96;
#else
#error undefined platform dpi
#endif
if (prefDPI > 0 && !mPrintingSurface)
dpi = prefDPI;
}
@@ -440,18 +440,18 @@ NS_IMETHODIMP
nsThebesDeviceContext::CheckFontExistence(const nsString& aFaceName)
{
return NS_OK;
}
NS_IMETHODIMP
nsThebesDeviceContext::GetDepth(PRUint32& aDepth)
{
- nsCOMPtr<nsIScreen> primaryScreen;
if (mDepth == 0) {
+ nsCOMPtr<nsIScreen> primaryScreen;
mScreenManager->GetPrimaryScreen(getter_AddRefs(primaryScreen));
primaryScreen->GetColorDepth(reinterpret_cast<PRInt32 *>(&mDepth));
}
aDepth = mDepth;
return NS_OK;
}
--- a/gfx/thebes/public/gfxFont.h
+++ b/gfx/thebes/public/gfxFont.h
@@ -1603,17 +1603,17 @@ public:
const nsString& GetFamilies() { return mFamilies; }
// This returns the preferred underline for this font group.
// Some CJK fonts have wrong underline offset in its metrics.
// If this group has such "bad" font, each platform's gfxFontGroup initialized mUnderlineOffset.
// The value should be lower value of first font's metrics and the bad font's metrics.
// Otherwise, this returns from first font's metrics.
enum { UNDERLINE_OFFSET_NOT_SET = PR_INT16_MAX };
- gfxFloat GetUnderlineOffset() {
+ virtual gfxFloat GetUnderlineOffset() {
if (mUnderlineOffset == UNDERLINE_OFFSET_NOT_SET)
mUnderlineOffset = GetFontAt(0)->GetMetrics().underlineOffset;
return mUnderlineOffset;
}
already_AddRefed<gfxFont> FindFontForChar(PRUint32 ch, PRUint32 prevCh, PRUint32 nextCh, gfxFont *aPrevMatchedFont);
virtual already_AddRefed<gfxFont> WhichPrefFontSupportsChar(PRUint32 aCh) { return nsnull; }
--- a/gfx/thebes/public/gfxFontUtils.h
+++ b/gfx/thebes/public/gfxFontUtils.h
@@ -328,27 +328,33 @@ public:
ReadCMAP(PRUint8 *aBuf, PRUint32 aBufLength, gfxSparseBitSet& aCharacterMap,
PRPackedBool& aUnicodeFont, PRPackedBool& aSymbolFont);
#ifdef XP_WIN
// given a TrueType/OpenType data file, produce a EOT-format header
// for use with Windows T2Embed API AddFontResource type API's
// effectively hide existing fonts with matching names aHeaderLen is
// the size of the header buffer on input, the actual size of the
- // EOT header on output aIsCFF returns whether the font has PS style
- // glyphs or not (as opposed to TrueType glyphs)
+ // EOT header on output
static nsresult
MakeEOTHeader(const PRUint8 *aFontData, PRUint32 aFontDataLength,
- nsTArray<PRUint8> *aHeader, PRBool *aIsCFF);
+ nsTArray<PRUint8> *aHeader);
#endif
// checks for valid SFNT table structure, returns true if valid
// does *not* guarantee that all font data is valid
static PRBool
- ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLength);
+ ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLength,
+ PRBool *aIsCFF = nsnull);
+
+ // create a new name table and build a new font with that name table
+ // appended on the end, returns true on success
+ static nsresult
+ RenameFont(const nsAString& aName, const PRUint8 *aFontData,
+ PRUint32 aFontDataLength, nsTArray<PRUint8> *aNewFont);
static inline bool IsJoiner(PRUint32 ch) {
return (ch == 0x200C ||
ch == 0x200D ||
ch == 0x2060);
}
static inline bool IsInvalid(PRUint32 ch) {
--- a/gfx/thebes/public/gfxWindowsFonts.h
+++ b/gfx/thebes/public/gfxWindowsFonts.h
@@ -365,16 +365,18 @@ public:
virtual gfxWindowsFont *GetFontAt(PRInt32 i);
void GroupFamilyListToArrayList(nsTArray<nsRefPtr<FontEntry> > *list);
void FamilyListToArrayList(const nsString& aFamilies,
const nsCString& aLangGroup,
nsTArray<nsRefPtr<FontEntry> > *list);
void UpdateFontList();
+ virtual gfxFloat GetUnderlineOffset();
+
protected:
void InitFontList();
void InitTextRunGDI(gfxContext *aContext, gfxTextRun *aRun, const char *aString, PRUint32 aLength);
void InitTextRunGDI(gfxContext *aContext, gfxTextRun *aRun, const PRUnichar *aString, PRUint32 aLength);
void InitTextRunUniscribe(gfxContext *aContext, gfxTextRun *aRun, const PRUnichar *aString, PRUint32 aLength);
--- a/gfx/thebes/src/gfxFontUtils.cpp
+++ b/gfx/thebes/src/gfxFontUtils.cpp
@@ -41,17 +41,17 @@
#include "nsIPref.h" // for pref handling code
#include "nsServiceManagerUtils.h"
#include "nsIPrefBranch.h"
#include "nsIPrefService.h"
#include "nsIPrefLocalizedString.h"
#include "nsISupportsPrimitives.h"
#include "nsIStreamBufferAccess.h"
-#include "nsILocalFile.h"
+#include "nsMemory.h"
#define NO_RANGE_FOUND 126 // bit 126 in the font unicode ranges is required to be 0
/* Unicode subrange table
* from: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_63ub.asp
*
* Use something like:
* perl -pi -e 's/^(\d+)\s+([\dA-Fa-f]+)\s+-\s+([\dA-Fa-f]+)\s+\b(.*)/ { \1, 0x\2, 0x\3,\"\4\" },/' < unicoderanges.txt
@@ -472,34 +472,38 @@ void gfxFontUtils::GetPrefsFontList(cons
}
// TrueType/OpenType table handling code
// need byte aligned structs
#pragma pack(1)
struct AutoSwap_PRUint16 {
+ AutoSwap_PRUint16(PRUint16 aValue) { value = NS_SWAP16(aValue); }
operator PRUint16() const { return NS_SWAP16(value); }
operator PRUint32() const { return NS_SWAP16(value); }
operator PRUint64() const { return NS_SWAP16(value); }
PRUint16 value;
};
struct AutoSwap_PRInt16 {
+ AutoSwap_PRInt16(PRInt16 aValue) { value = NS_SWAP16(aValue); }
operator PRInt16() const { return NS_SWAP16(value); }
operator PRUint32() const { return NS_SWAP16(value); }
PRInt16 value;
};
struct AutoSwap_PRUint32 {
+ AutoSwap_PRUint32(PRUint32 aValue) { value = NS_SWAP32(aValue); }
operator PRUint32() const { return NS_SWAP32(value); }
PRUint32 value;
};
struct AutoSwap_PRUint64 {
+ AutoSwap_PRUint64(PRUint64 aValue) { value = NS_SWAP64(aValue); }
operator PRUint64() const { return NS_SWAP64(value); }
PRUint64 value;
};
struct SFNTHeader {
AutoSwap_PRUint32 sfntVersion; // Fixed, 0x00010000 for version 1.0.
AutoSwap_PRUint16 numTables; // Number of tables.
AutoSwap_PRUint16 searchRange; // (Maximum power of 2 <= numTables) x 16.
@@ -552,18 +556,20 @@ struct NameRecord {
AutoSwap_PRUint16 languageID; // Language ID
AutoSwap_PRUint16 nameID; // Name ID.
AutoSwap_PRUint16 length; // String length (in bytes).
AutoSwap_PRUint16 offset; // String offset from start of storage area (in bytes).
enum {
NAME_ID_FAMILY = 1,
NAME_ID_STYLE = 2,
+ NAME_ID_UNIQUE = 3,
NAME_ID_FULL = 4,
NAME_ID_VERSION = 5,
+ NAME_ID_POSTSCRIPT = 6,
PLATFORM_ID_UNICODE = 0, // Mac OS uses this typically
PLATFORM_ID_MICROSOFT = 3,
ENCODING_ID_MICROSOFT_UNICODEBMP = 1, // with Microsoft platformID, BMP-only Unicode encoding
LANG_ID_MICROSOFT_EN_US = 0x0409 // with Microsoft platformID, EN US lang code
};
};
// name table stores set of name record structures, followed by
@@ -632,17 +638,19 @@ CopySwapUTF16(const PRUint16 *aInBuf, PR
PRUint16 value = *aInBuf;
*aOutBuf = (value >> 8) | (value & 0xff) << 8;
aOutBuf++;
aInBuf++;
}
}
PRBool
-gfxFontUtils::ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLength)
+gfxFontUtils::ValidateSFNTHeaders(const PRUint8 *aFontData,
+ PRUint32 aFontDataLength,
+ PRBool *aIsCFF)
{
NS_ASSERTION(aFontData && aFontDataLength != 0, "null font data");
PRUint64 dataLength(aFontDataLength);
// read in the sfnt header
if (sizeof(SFNTHeader) > aFontDataLength) {
NS_WARNING("invalid font (insufficient data)");
@@ -650,36 +658,41 @@ gfxFontUtils::ValidateSFNTHeaders(const
}
const SFNTHeader *sfntHeader = reinterpret_cast<const SFNTHeader*>(aFontData);
PRUint32 sfntVersion = sfntHeader->sfntVersion;
if (!IsValidSFNTVersion(sfntVersion)) {
NS_WARNING("invalid font (SFNT version)");
return PR_FALSE;
}
+
+ if (aIsCFF)
+ *aIsCFF = (sfntVersion == 'OTTO');
// iterate through the table headers to find the head, name and OS/2 tables
PRBool foundHead = PR_FALSE, foundOS2 = PR_FALSE, foundName = PR_FALSE;
PRBool foundGlyphs = PR_FALSE, foundCFF = PR_FALSE;
PRUint32 headOffset, headLen, nameOffset, nameLen;
PRUint32 i, numTables;
numTables = sfntHeader->numTables;
PRUint32 headerLen = sizeof(SFNTHeader) + sizeof(TableDirEntry) * numTables;
if (headerLen > aFontDataLength) {
NS_WARNING("invalid font (table directory)");
return PR_FALSE;
}
// table directory entries begin immediately following SFNT header
- const TableDirEntry *dirEntry = reinterpret_cast<const TableDirEntry*>(aFontData + sizeof(SFNTHeader));
+ const TableDirEntry *dirEntry =
+ reinterpret_cast<const TableDirEntry*>(aFontData + sizeof(SFNTHeader));
PRUint32 checksum = 0;
// checksum for font = (checksum of header) + (checksum of tables)
- const AutoSwap_PRUint32 *headerData = reinterpret_cast<const AutoSwap_PRUint32*>(aFontData);
+ const AutoSwap_PRUint32 *headerData =
+ reinterpret_cast<const AutoSwap_PRUint32*>(aFontData);
// header length is in bytes, checksum calculated in longwords
for (i = 0; i < (headerLen >> 2); i++, headerData++) {
checksum += *headerData;
}
for (i = 0; i < numTables; i++, dirEntry++) {
@@ -793,16 +806,159 @@ gfxFontUtils::ValidateSFNTHeaders(const
return PR_FALSE;
}
}
// everything seems consistent
return PR_TRUE;
}
+nsresult
+gfxFontUtils::RenameFont(const nsAString& aName, const PRUint8 *aFontData,
+ PRUint32 aFontDataLength, nsTArray<PRUint8> *aNewFont)
+{
+ NS_ASSERTION(aNewFont, "null font data array");
+
+ PRUint64 dataLength(aFontDataLength);
+
+ // new name table
+ static const PRUint32 neededNameIDs[] = {NameRecord::NAME_ID_FAMILY,
+ NameRecord::NAME_ID_STYLE,
+ NameRecord::NAME_ID_UNIQUE,
+ NameRecord::NAME_ID_FULL,
+ NameRecord::NAME_ID_POSTSCRIPT};
+
+ // calculate new name table size
+ PRUint16 nameCount = NS_ARRAY_LENGTH(neededNameIDs);
+
+ // leave room for null-terminator
+ PRUint16 nameStrLength = (aName.Length() + 1) * sizeof(PRUnichar);
+
+ // round name table size up to 4-byte multiple
+ PRUint32 nameTableSize = (sizeof(NameHeader) +
+ sizeof(NameRecord) * nameCount +
+ nameStrLength +
+ 3) & ~3;
+
+ if (dataLength + nameTableSize > PR_UINT32_MAX)
+ return NS_ERROR_FAILURE;
+
+ PRUint32 adjFontDataSize = aFontDataLength + nameTableSize;
+
+ // create new buffer: old font data plus new name table
+ if (!aNewFont->AppendElements(adjFontDataSize))
+ return NS_ERROR_OUT_OF_MEMORY;
+
+ // copy the old font data
+ PRUint8 *newFontData = reinterpret_cast<PRUint8*>(aNewFont->Elements());
+
+ memcpy(newFontData, aFontData, aFontDataLength);
+
+ // null out the last 4 bytes for checksum calculations
+ memset(newFontData + adjFontDataSize - 4, 0, 4);
+
+ NameHeader *nameHeader = reinterpret_cast<NameHeader*>(newFontData +
+ aFontDataLength);
+
+ // -- name header
+ nameHeader->format = 0;
+ nameHeader->count = nameCount;
+ nameHeader->stringOffset = sizeof(NameHeader) + nameCount * sizeof(NameRecord);
+
+ // -- name records
+ PRUint32 i;
+ NameRecord *nameRecord = reinterpret_cast<NameRecord*>(nameHeader + 1);
+
+ for (i = 0; i < nameCount; i++, nameRecord++) {
+ nameRecord->platformID = NameRecord::PLATFORM_ID_MICROSOFT;
+ nameRecord->encodingID = NameRecord::ENCODING_ID_MICROSOFT_UNICODEBMP;
+ nameRecord->languageID = NameRecord::LANG_ID_MICROSOFT_EN_US;
+ nameRecord->nameID = neededNameIDs[i];
+ nameRecord->offset = 0;
+ nameRecord->length = nameStrLength;
+ }
+
+ // -- string data, located after the name records, stored in big-endian form
+ PRUnichar *strData = reinterpret_cast<PRUnichar*>(nameRecord);
+
+ const PRUnichar *nameStr = aName.BeginReading();
+ const PRUnichar *nameStrEnd = aName.EndReading();
+ while (nameStr < nameStrEnd) {
+ PRUnichar ch = *nameStr++;
+ *strData++ = NS_SWAP16(ch);
+ }
+ *strData = 0; // add null termination
+
+ // adjust name table header to point to the new name table
+ SFNTHeader *sfntHeader = reinterpret_cast<SFNTHeader*>(newFontData);
+
+ // table directory entries begin immediately following SFNT header
+ TableDirEntry *dirEntry =
+ reinterpret_cast<TableDirEntry*>(newFontData + sizeof(SFNTHeader));
+
+ PRUint32 numTables = sfntHeader->numTables;
+ PRBool foundName = PR_FALSE;
+
+ for (i = 0; i < numTables; i++, dirEntry++) {
+ if (dirEntry->tag == 'name') {
+ foundName = PR_TRUE;
+ break;
+ }
+ }
+
+ // function only called if font validates, so this should always be true
+ NS_ASSERTION(foundName, "attempt to rename font with no name table");
+
+ // note: dirEntry now points to name record
+
+ // recalculate name table checksum
+ PRUint32 checkSum = 0;
+ AutoSwap_PRUint32 *nameData = reinterpret_cast<AutoSwap_PRUint32*> (nameHeader);
+ AutoSwap_PRUint32 *nameDataEnd = nameData + (nameTableSize >> 2);
+
+ while (nameData < nameDataEnd)
+ checkSum = checkSum + *nameData++;
+
+ // adjust name table entry to point to new name table
+ dirEntry->offset = aFontDataLength;
+ dirEntry->length = nameTableSize;
+ dirEntry->checkSum = checkSum;
+
+ // fix up checksums
+ PRUint32 checksum = 0;
+
+ // checksum for font = (checksum of header) + (checksum of tables)
+ PRUint32 headerLen = sizeof(SFNTHeader) + sizeof(TableDirEntry) * numTables;
+ const AutoSwap_PRUint32 *headerData =
+ reinterpret_cast<const AutoSwap_PRUint32*>(newFontData);
+
+ // header length is in bytes, checksum calculated in longwords
+ for (i = 0; i < (headerLen >> 2); i++, headerData++) {
+ checksum += *headerData;
+ }
+
+ PRUint32 headOffset = 0;
+ dirEntry = reinterpret_cast<TableDirEntry*>(newFontData + sizeof(SFNTHeader));
+
+ for (i = 0; i < numTables; i++, dirEntry++) {
+ if (dirEntry->tag == 'head') {
+ headOffset = dirEntry->offset;
+ }
+ checksum += dirEntry->checkSum;
+ }
+
+ NS_ASSERTION(headOffset != 0, "no head table for font");
+
+ HeadTable *headData = reinterpret_cast<HeadTable*>(newFontData + headOffset);
+
+ headData->checkSumAdjustment = HeadTable::HEAD_CHECKSUM_CALC_CONST - checksum;
+
+ return NS_OK;
+}
+
// Embedded OpenType (EOT) handling
// needed for dealing with downloadable fonts on Windows
//
// EOT version 0x00020001
// based on http://www.w3.org/Submission/2008/SUBM-EOT-20080305/
//
// EOT header consists of a fixed-size portion containing general font
// info, followed by a variable-sized portion containing name data,
@@ -887,31 +1043,27 @@ DumpEOTHeader(PRUint8 *aHeader, PRUint32
printf("\n");
offset += 16;
}
}
#endif
nsresult
gfxFontUtils::MakeEOTHeader(const PRUint8 *aFontData, PRUint32 aFontDataLength,
- nsTArray<PRUint8> *aHeader, PRBool *aIsCFF)
+ nsTArray<PRUint8> *aHeader)
{
NS_ASSERTION(aFontData && aFontDataLength != 0, "null font data");
NS_ASSERTION(aHeader, "null header");
NS_ASSERTION(aHeader->Length() == 0, "non-empty header passed in");
- NS_ASSERTION(aIsCFF, "null boolean ptr");
-
- // assume TrueType
- *aIsCFF = PR_FALSE;
if (!aHeader->AppendElements(sizeof(EOTFixedHeader)))
return NS_ERROR_OUT_OF_MEMORY;
- EOTFixedHeader *eotHeader = reinterpret_cast<EOTFixedHeader*> (aHeader->Elements());
+ EOTFixedHeader *eotHeader = reinterpret_cast<EOTFixedHeader*>(aHeader->Elements());
memset(eotHeader, 0, sizeof(EOTFixedHeader));
PRUint32 fontDataSize = aFontDataLength;
// set up header fields
eotHeader->fontDataSize = fontDataSize;
eotHeader->version = EOTFixedHeader::EOT_VERSION;
eotHeader->flags = 0; // don't specify any special processing
@@ -970,17 +1122,16 @@ gfxFontUtils::MakeEOTHeader(const PRUint
break;
case 'glyf': // TrueType-style quadratic glyph table
foundGlyphs = PR_TRUE;
break;
case 'CFF ': // PS-style cubic glyph table
foundGlyphs = PR_TRUE;
- *aIsCFF = PR_TRUE;
break;
default:
break;
}
if (foundHead && foundName && foundOS2 && foundGlyphs)
break;
--- a/gfx/thebes/src/gfxQuartzFontCache.h
+++ b/gfx/thebes/src/gfxQuartzFontCache.h
@@ -80,17 +80,19 @@ public:
PRUint32 Traits() { return mTraits; }
ATSUFontID GetFontID();
nsresult ReadCMAP();
protected:
// for use with data fonts
- MacOSFontEntry(ATSUFontID aFontID, PRUint16 aWeight, PRUint16 aStretch, PRUint32 aItalicStyle, gfxUserFontData *aUserFontData);
+ MacOSFontEntry(const nsAString& aPostscriptName, ATSUFontID aFontID,
+ PRUint16 aWeight, PRUint16 aStretch, PRUint32 aItalicStyle,
+ gfxUserFontData *aUserFontData);
PRUint32 mTraits;
MacOSFamilyEntry *mFamily;
ATSUFontID mATSUFontID;
PRPackedBool mATSUIDInitialized;
};
--- a/gfx/thebes/src/gfxQuartzFontCache.mm
+++ b/gfx/thebes/src/gfxQuartzFontCache.mm
@@ -1,18 +1,19 @@
/* -*- Mode: ObjC; tab-width: 20; indent-tabs-mode: nil; c-basic-offset: 4 -*-
* ***** BEGIN LICENSE BLOCK *****
* Version: BSD
*
- * Copyright (C) 2006 Mozilla Corporation. All rights reserved.
+ * Copyright (C) 2006-2008 Mozilla Corporation. All rights reserved.
*
* Contributor(s):
* Vladimir Vukicevic <vladimir@pobox.com>
* Masayuki Nakano <masayuki@d-toybox.com>
* John Daggett <jdaggett@mozilla.com>
+ * Jonathan Kew <jfkthame@gmail.com>
*
* Copyright (C) 2006 Apple Computer, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
@@ -112,59 +113,45 @@ gfxQuartzFontCache::GenerateFontListKey(
aResult = aKeyName;
ToLowerCase(aResult);
}
/* MacOSFontEntry */
#pragma mark-
MacOSFontEntry::MacOSFontEntry(const nsAString& aPostscriptName,
- PRInt32 aAppleWeight, PRUint32 aTraits, MacOSFamilyEntry *aFamily)
+ PRInt32 aAppleWeight, PRUint32 aTraits, MacOSFamilyEntry *aFamily)
: gfxFontEntry(aPostscriptName), mTraits(aTraits), mFamily(aFamily), mATSUFontID(0),
mATSUIDInitialized(0)
{
mWeight = gfxQuartzFontCache::AppleWeightToCSSWeight(aAppleWeight) * 100;
mItalic = (mTraits & NSItalicFontMask ? 1 : 0);
mFixedPitch = (mTraits & NSFixedPitchFontMask ? 1 : 0);
}
-MacOSFontEntry::MacOSFontEntry(ATSUFontID aFontID, PRUint16 aWeight, PRUint16 aStretch, PRUint32 aItalicStyle, gfxUserFontData *aUserFontData)
+MacOSFontEntry::MacOSFontEntry(const nsAString& aPostscriptName, ATSUFontID aFontID,
+ PRUint16 aWeight, PRUint16 aStretch, PRUint32 aItalicStyle,
+ gfxUserFontData *aUserFontData)
{
// xxx - stretch is basically ignored for now
-
+
mATSUIDInitialized = PR_TRUE;
mATSUFontID = aFontID;
mUserFontData = aUserFontData;
mWeight = aWeight;
mStretch = aStretch;
mFixedPitch = PR_FALSE; // xxx - do we need this for downloaded fonts?
mItalic = (aItalicStyle & (FONT_STYLE_ITALIC | FONT_STYLE_OBLIQUE)) != 0;
mTraits = (mItalic ? NSItalicFontMask : NSUnitalicFontMask) |
(mFixedPitch ? NSFixedPitchFontMask : 0) |
(mWeight >= 600 ? NSBoldFontMask : NSUnboldFontMask);
- // get the postscript name
- OSStatus err;
- NSString *psname = NULL;
-
- // now lookup the Postscript name
- err = ATSFontGetPostScriptName((ATSFontRef) aFontID, kATSOptionFlagsDefault, (CFStringRef*) (&psname));
- if (err == noErr) {
- GetStringForNSString(psname, mName);
- [psname release];
- } else {
- mIsValid = PR_FALSE;
-#ifdef DEBUG
- char warnBuf[1024];
- sprintf(warnBuf, "ATSFontGetPostScriptName err = %d", (PRInt32)err);
- NS_WARNING(warnBuf);
-#endif
- }
+ mName = aPostscriptName;
}
const nsString&
MacOSFontEntry::FamilyName()
{
return mFamily->Name();
}
@@ -701,17 +688,17 @@ gfxQuartzFontCache::gfxQuartzFontCache()
}
const PRUint32 kNonNormalTraits = NSItalicFontMask | NSBoldFontMask | NSNarrowFontMask | NSExpandedFontMask | NSCondensedFontMask | NSCompressedFontMask;
void
gfxQuartzFontCache::InitFontList()
{
- ATSGeneration currentGeneration = ATSGeneration();
+ ATSGeneration currentGeneration = ATSGetGeneration();
// need to ignore notifications after adding each font
if (mATSGeneration == currentGeneration)
return;
mATSGeneration = currentGeneration;
PR_LOG(gFontInfoLog, PR_LOG_DEBUG, ("(fontinit) updating to generation: %d", mATSGeneration));
@@ -1333,96 +1320,136 @@ gfxQuartzFontCache::MakePlatformFont(con
static_cast<const gfxProxyFontEntry*> (aProxyEntry);
sprintf(warnBuf, "downloaded font error, invalid font data for (%s)",
NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
NS_WARNING(warnBuf);
#endif
return nsnull;
}
- ATSUFontID fontID;
+ ATSFontRef fontRef;
ATSFontContainerRef containerRef;
- err = ATSFontActivateFromMemory(const_cast<PRUint8*>(aFontData), aLength,
- kPrivateATSFontContextPrivate,
- kATSFontFormatUnspecified,
- NULL,
- kATSOptionFlagsDoNotNotify,
- &containerRef);
+ // we get occasional failures when multiple fonts are activated in quick succession
+ // if the ATS font cache is damaged; to work around this, we can retry the activation
+ const PRUint32 kMaxRetries = 3;
+ PRUint32 retryCount = 0;
+ while (retryCount++ < kMaxRetries) {
+ err = ATSFontActivateFromMemory(const_cast<PRUint8*>(aFontData), aLength,
+ kPrivateATSFontContextPrivate,
+ kATSFontFormatUnspecified,
+ NULL,
+ kATSOptionFlagsDoNotNotify,
+ &containerRef);
+ mATSGeneration = ATSGetGeneration();
- if (err != noErr) {
+ if (err != noErr) {
#if DEBUG
- char warnBuf[1024];
- const gfxProxyFontEntry *proxyEntry =
- static_cast<const gfxProxyFontEntry*> (aProxyEntry);
- sprintf(warnBuf, "downloaded font error, ATSFontActivateFromMemory err: %d for (%s)",
- PRInt32(err),
- NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
- NS_WARNING(warnBuf);
+ char warnBuf[1024];
+ const gfxProxyFontEntry *proxyEntry =
+ static_cast<const gfxProxyFontEntry*> (aProxyEntry);
+ sprintf(warnBuf, "downloaded font error, ATSFontActivateFromMemory err: %d for (%s)",
+ PRInt32(err),
+ NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
+ NS_WARNING(warnBuf);
#endif
- return nsnull;
- }
-
- mATSGeneration = ATSGeneration();
+ return nsnull;
+ }
- // ignoring containers with multiple fonts, use the first face only for now
- err = ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 1,
- (ATSFontRef*)&fontID, NULL);
- if (err != noErr) {
+ // ignoring containers with multiple fonts, use the first face only for now
+ err = ATSFontFindFromContainer(containerRef, kATSOptionFlagsDefault, 1,
+ &fontRef, NULL);
+ if (err != noErr) {
#if DEBUG
- char warnBuf[1024];
- const gfxProxyFontEntry *proxyEntry =
- static_cast<const gfxProxyFontEntry*> (aProxyEntry);
- sprintf(warnBuf, "downloaded font error, ATSFontFindFromContainer err: %d for (%s)",
- PRInt32(err),
- NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
- NS_WARNING(warnBuf);
+ char warnBuf[1024];
+ const gfxProxyFontEntry *proxyEntry =
+ static_cast<const gfxProxyFontEntry*> (aProxyEntry);
+ sprintf(warnBuf, "downloaded font error, ATSFontFindFromContainer err: %d for (%s)",
+ PRInt32(err),
+ NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
+ NS_WARNING(warnBuf);
#endif
- ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
- return nsnull;
- }
-
- // font entry will own this
- MacOSUserFontData *userFontData = new MacOSUserFontData(containerRef);
+ ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
+ return nsnull;
+ }
- if (!userFontData) {
- ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
- return nsnull;
- }
+ // now lookup the Postscript name; this may fail if the font cache is bad
+ OSStatus err;
+ NSString *psname = NULL;
+ nsAutoString postscriptName;
+ err = ATSFontGetPostScriptName(fontRef, kATSOptionFlagsDefault, (CFStringRef*) (&psname));
+ if (err == noErr) {
+ GetStringForNSString(psname, postscriptName);
+ [psname release];
+ } else {
+#ifdef DEBUG
+ char warnBuf[1024];
+ const gfxProxyFontEntry *proxyEntry =
+ static_cast<const gfxProxyFontEntry*> (aProxyEntry);
+ sprintf(warnBuf, "ATSFontGetPostScriptName err = %d for (%s), retries = %d", (PRInt32)err,
+ NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get(), retryCount);
+ NS_WARNING(warnBuf);
+#endif
+ ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
+ // retry the activation a couple of times if this fails
+ // (may be a transient failure due to ATS font cache issues)
+ continue;
+ }
- PRUint16 w = aProxyEntry->mWeight;
- NS_ASSERTION(w >= 100 && w <= 900, "bogus font weight value!");
+ // font entry will own this
+ MacOSUserFontData *userFontData = new MacOSUserFontData(containerRef);
- MacOSFontEntry *newFontEntry =
- new MacOSFontEntry(fontID, w, aProxyEntry->mStretch,
- (PRUint32(aProxyEntry->mItalic) ?
- FONT_STYLE_ITALIC :
- FONT_STYLE_NORMAL),
- userFontData);
+ if (!userFontData) {
+ ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault);
+ return nsnull;
+ }
+
+ PRUint16 w = aProxyEntry->mWeight;
+ NS_ASSERTION(w >= 100 && w <= 900, "bogus font weight value!");
- if (!newFontEntry) {
- delete userFontData;
- return nsnull;
- }
-
- // if something is funky about this font, delete immediately
- if (newFontEntry && !newFontEntry->mIsValid) {
+ // create the font entry
+ MacOSFontEntry *newFontEntry =
+ new MacOSFontEntry(postscriptName,
+ FMGetFontFromATSFontRef(fontRef),
+ w, aProxyEntry->mStretch,
+ (PRUint32(aProxyEntry->mItalic) ?
+ FONT_STYLE_ITALIC :
+ FONT_STYLE_NORMAL),
+ userFontData);
+
+ if (!newFontEntry) {
+ delete userFontData;
+ return nsnull;
+ }
+
+ // if we succeeded (which should always be the case), return the new font
+ if (newFontEntry->mIsValid)
+ return newFontEntry;
+
+ // if something is funky about this font, delete immediately
#if DEBUG
char warnBuf[1024];
const gfxProxyFontEntry *proxyEntry =
static_cast<const gfxProxyFontEntry*> (aProxyEntry);
sprintf(warnBuf, "downloaded font not loaded properly, removed face for (%s)",
NS_ConvertUTF16toUTF8(proxyEntry->mFamily->Name()).get());
NS_WARNING(warnBuf);
#endif
delete newFontEntry;
- return nsnull;
+
+ // We don't retry from here; the ATS font cache issue would have caused failure earlier
+ // so if we get here, there's something else bad going on within our font data structures.
+ // Currently, there should be no way to reach here, as fontentry creation cannot fail
+ // except by memory allocation failure.
+ NS_WARNING("invalid font entry for a newly activated font");
+ break;
}
- return newFontEntry;
+ // if we get here, the activation failed (even with possible retries); can't use this font
+ return nsnull;
}
void
gfxQuartzFontCache::InitLoader()
{
GetFontFamilyList(mFontFamiliesToLoad);
mStartIndex = 0;
--- a/gfx/thebes/src/gfxWindowsFonts.cpp
+++ b/gfx/thebes/src/gfxWindowsFonts.cpp
@@ -976,27 +976,42 @@ gfxWindowsFontGroup::InitFontList()
// but if the resulting gfxWindowsFont is invalid then we can't
// do much anyway. In that case the font will return zero metrics,
// its mUnknownCMAP will be set to true, and HasCharacter will
// just report false for all characters, so the fact that the font
// is bogus should not cause problems.
mFonts.AppendElements(mFontEntries.Length());
}
+ // force the underline offset to get recalculated
+ mUnderlineOffset = UNDERLINE_OFFSET_NOT_SET;
+}
+
+gfxFloat
+gfxWindowsFontGroup::GetUnderlineOffset()
+{
+ if (mUnderlineOffset != UNDERLINE_OFFSET_NOT_SET)
+ return mUnderlineOffset;
+
+ // not yet initialized, need to calculate
if (!mStyle.systemFont) {
for (PRUint32 i = 0; i < mFontEntries.Length(); ++i) {
if (mFontEntries[i]->mIsBadUnderlineFont) {
gfxFloat first = GetFontAt(0)->GetMetrics().underlineOffset;
gfxFloat bad = GetFontAt(i)->GetMetrics().underlineOffset;
mUnderlineOffset = PR_MIN(first, bad);
break;
}
}
}
+ if (mUnderlineOffset == UNDERLINE_OFFSET_NOT_SET)
+ mUnderlineOffset = GetFontAt(0)->GetMetrics().underlineOffset;
+
+ return mUnderlineOffset;
}
static PRBool
CanTakeFastPath(PRUint32 aFlags)
{
// Can take fast path only if OPTIMIZE_SPEED is set and IS_RTL isn't
// We need to always use Uniscribe for RTL text, in case glyph mirroring is required
return (aFlags &
@@ -1346,17 +1361,17 @@ public:
const PRUnichar *aString, PRUint32 aLength,
SCRIPT_ITEM *aItem,
gfxWindowsFontGroup *aGroup) :
mContext(aContext), mDC(aDC), mRangeString(nsnull), mRangeLength(0),
mItemString(aString), mItemLength(aLength),
mAlternativeString(nsnull), mScriptItem(aItem),
mScript(aItem->a.eScript), mGroup(aGroup),
mNumGlyphs(0), mMaxGlyphs(ESTIMATE_MAX_GLYPHS(aLength)),
- mFontSelected(PR_FALSE)
+ mFontSelected(PR_FALSE), mForceGDIPlace(PR_FALSE)
{
NS_ASSERTION(mMaxGlyphs < 65535, "UniscribeItem is too big, ScriptShape() will fail!");
mGlyphs.SetLength(mMaxGlyphs);
mClusters.SetLength(mItemLength + 1);
mAttr.SetLength(mMaxGlyphs);
}
~UniscribeItem() {
@@ -1399,16 +1414,29 @@ public:
if (rv == E_OUTOFMEMORY) {
mMaxGlyphs *= 2;
mGlyphs.SetLength(mMaxGlyphs);
mAttr.SetLength(mMaxGlyphs);
continue;
}
+ // Uniscribe can't do shaping with some fonts, so it sets the
+ // fNoGlyphIndex flag in the SCRIPT_ANALYSIS structure to indicate
+ // this. This occurs with CFF fonts loaded with
+ // AddFontMemResourceEx but it's not clear what the other cases
+ // are, so just log a warning for now.
+ // see http://msdn.microsoft.com/en-us/library/ms776520(VS.85).aspx
+
+ if (sa.fNoGlyphIndex) {
+ mForceGDIPlace = PR_TRUE;
+ NS_WARNING("Uniscribe refuses to shape with given font");
+ return ShapeGDI();
+ }
+
if (rv == E_PENDING) {
if (shapeDC == mDC) {
// we already tried this once, something failed, give up
return E_PENDING;
}
SelectFont();
@@ -1523,16 +1551,19 @@ public:
}
return 0;
}
HRESULT Place() {
mOffsets.SetLength(mNumGlyphs);
mAdvances.SetLength(mNumGlyphs);
+ if (mForceGDIPlace)
+ return PlaceGDI();
+
PRBool allCJK = PR_TRUE;
// Some fonts don't get along with Uniscribe so we'll use GDI to
// render them.
if (!mCurrentFont->GetFontEntry()->mForceGDI) {
for (PRUint32 i = 0; i < mRangeLength; i++) {
const PRUnichar ch = mRangeString[i];
if (ch == ' ' || FindCharUnicodeRange(ch) == kRangeSetCJK)
@@ -1766,16 +1797,21 @@ private:
int mMaxGlyphs;
int mNumGlyphs;
nsRefPtr<gfxWindowsFont> mCurrentFont;
PRPackedBool mFontSelected;
+ // when shaping, Uniscribe refuses to shape with some fonts
+ // (e.g. CFF fonts loaded with AddFontMemResourceEx), so need
+ // to force GDI placement
+ PRPackedBool mForceGDIPlace;
+
nsTArray<gfxTextRange> mRanges;
};
#define MAX_ITEM_LENGTH 32768
--- a/gfx/thebes/src/gfxWindowsPlatform.cpp
+++ b/gfx/thebes/src/gfxWindowsPlatform.cpp
@@ -628,31 +628,25 @@ gfxWindowsPlatform::LookupLocalFont(cons
mFonts.Enumerate(FindFullName, &data);
if (data.mDC)
ReleaseDC(nsnull, data.mDC);
return data.mFontEntry;
}
-// make a unique font name, limited on Windows to 31 two-byte characters
-static void MakeUniqueFontName(PRUnichar aName[LF_FACESIZE])
+static void MakeUniqueFontName(nsAString& aName)
{
+ char buf[50];
+
static PRUint32 fontCount = 0;
++fontCount;
- char buf[LF_FACESIZE];
-
sprintf(buf, "mozfont%8.8x%8.8x", ::GetTickCount(), fontCount); // slightly retarded, figure something better later...
-
- nsCAutoString fontName(buf);
-
- PRUint32 nameLen = PR_MIN(fontName.Length(), LF_FACESIZE - 1);
- memcpy(aName, nsPromiseFlatString(NS_ConvertUTF8toUTF16(fontName)).get(), nameLen * 2);
- aName[nameLen] = 0;
+ aName.AssignASCII(buf);
}
// from t2embapi.h, included in Platform SDK 6.1 but not 6.0
#ifndef __t2embapi__
#define TTLOAD_PRIVATE 0x00000001
#define LICENSE_PREVIEWPRINT 0x0004
@@ -700,27 +694,32 @@ static void InitializeFontEmbeddingProcs
if (!fontlib)
return;
TTLoadEmbeddedFontPtr = (TTLoadEmbeddedFontProc) GetProcAddress(fontlib, "TTLoadEmbeddedFont");
TTDeleteEmbeddedFontPtr = (TTDeleteEmbeddedFontProc) GetProcAddress(fontlib, "TTDeleteEmbeddedFont");
}
class WinUserFontData : public gfxUserFontData {
public:
- WinUserFontData(HANDLE aFontRef)
- : mFontRef(aFontRef)
+ WinUserFontData(HANDLE aFontRef, PRBool aIsCFF)
+ : mFontRef(aFontRef), mIsCFF(aIsCFF)
{ }
virtual ~WinUserFontData()
{
- ULONG pulStatus;
- TTDeleteEmbeddedFontPtr(mFontRef, 0, &pulStatus);
+ if (mIsCFF) {
+ RemoveFontMemResourceEx(mFontRef);
+ } else {
+ ULONG pulStatus;
+ TTDeleteEmbeddedFontPtr(mFontRef, 0, &pulStatus);
+ }
}
HANDLE mFontRef;
+ PRPackedBool mIsCFF;
};
// used to control stream read by Windows TTLoadEmbeddedFont API
class EOTFontStreamReader {
public:
EOTFontStreamReader(const PRUint8 *aFontData, PRUint32 aLength, PRUint8 *aEOTHeader,
PRUint32 aEOTHeaderLen)
@@ -786,60 +785,98 @@ gfxFontEntry*
gfxWindowsPlatform::MakePlatformFont(const gfxProxyFontEntry *aProxyEntry,
nsISupports *aLoader,
const PRUint8 *aFontData, PRUint32 aLength)
{
// if calls aren't available, bail
if (!TTLoadEmbeddedFontPtr || !TTDeleteEmbeddedFontPtr)
return nsnull;
- if (!gfxFontUtils::ValidateSFNTHeaders(aFontData, aLength))
+ PRBool isCFF;
+ if (!gfxFontUtils::ValidateSFNTHeaders(aFontData, aLength, &isCFF))
return nsnull;
- // create an eot header
- nsAutoTArray<PRUint8,2048> eotHeader;
- PRUint8 *buffer;
- PRUint32 eotlen;
- PRUnichar fontName[LF_FACESIZE];
- PRBool isCFF;
-
nsresult rv;
HANDLE fontRef;
- PRInt32 ret;
+
+ nsAutoString uniqueName;
+ MakeUniqueFontName(uniqueName);
+
+ if (isCFF) {
+ // Postscript-style glyphs, swizzle name table, load directly
+ nsTArray<PRUint8> newFontData;
+
+ rv = gfxFontUtils::RenameFont(uniqueName, aFontData, aLength, &newFontData);
+
+ if (NS_FAILED(rv))
+ return nsnull;
+
+ DWORD numFonts = 0;
+
+ PRUint8 *fontData = reinterpret_cast<PRUint8*> (newFontData.Elements());
+ PRUint32 fontLength = newFontData.Length();
+ NS_ASSERTION(fontData, "null font data after renaming");
- {
- rv = gfxFontUtils::MakeEOTHeader(aFontData, aLength, &eotHeader, &isCFF);
+ // http://msdn.microsoft.com/en-us/library/ms533942(VS.85).aspx
+ // "A font that is added by AddFontMemResourceEx is always private
+ // to the process that made the call and is not enumerable."
+ fontRef = AddFontMemResourceEx(fontData, fontLength,
+ 0 /* reserved */, &numFonts);
+
+ if (!fontRef)
+ return nsnull;
+
+ // only load fonts with a single face contained in the data
+ if (fontRef && numFonts != 1) {
+ RemoveFontMemResourceEx(fontRef);
+ return nsnull;
+ }
+ } else {
+ // TrueType-style glyphs, use EOT library
+ nsAutoTArray<PRUint8,2048> eotHeader;
+ PRUint8 *buffer;
+ PRUint32 eotlen;
+
+ PRUint32 nameLen = PR_MIN(uniqueName.Length(), LF_FACESIZE - 1);
+ nsPromiseFlatString fontName(Substring(uniqueName, 0, nameLen));
+
+ rv = gfxFontUtils::MakeEOTHeader(aFontData, aLength, &eotHeader);
if (NS_FAILED(rv))
return nsnull;
// load in embedded font data
eotlen = eotHeader.Length();
buffer = reinterpret_cast<PRUint8*> (eotHeader.Elements());
+ PRInt32 ret;
ULONG privStatus, pulStatus;
- MakeUniqueFontName(fontName);
EOTFontStreamReader eotReader(aFontData, aLength, buffer, eotlen);
ret = TTLoadEmbeddedFontPtr(&fontRef, TTLOAD_PRIVATE, &privStatus,
LICENSE_PREVIEWPRINT, &pulStatus,
EOTFontStreamReader::ReadEOTStream,
- &eotReader, fontName, 0, 0);
+ &eotReader, (PRUnichar*)(fontName.get()), 0, 0);
+ if (ret != E_NONE)
+ return nsnull;
}
- if (ret != E_NONE)
- return nsnull;
// make a new font entry using the unique name
- WinUserFontData *winUserFontData = new WinUserFontData(fontRef);
+ WinUserFontData *winUserFontData = new WinUserFontData(fontRef, isCFF);
PRUint16 w = (aProxyEntry->mWeight == 0 ? 400 : aProxyEntry->mWeight);
- return FontEntry::CreateFontEntry(nsDependentString(fontName),
+ FontEntry *fe = FontEntry::CreateFontEntry(uniqueName,
gfxWindowsFontType(isCFF ? GFX_FONT_TYPE_PS_OPENTYPE : GFX_FONT_TYPE_TRUETYPE) /*type*/,
PRUint32(aProxyEntry->mItalic ? FONT_STYLE_ITALIC : FONT_STYLE_NORMAL),
w, winUserFontData);
+
+ if (fe && isCFF)
+ fe->mForceGDI = PR_TRUE;
+
+ return fe;
}
PRBool
gfxWindowsPlatform::IsFontFormatSupported(nsIURI *aFontURI, PRUint32 aFormatFlags)
{
// reject based on format flags
if (aFormatFlags & (gfxUserFontSet::FLAG_FORMAT_EOT | gfxUserFontSet::FLAG_FORMAT_SVG)) {
return PR_FALSE;
--- a/js/src/Makefile.in
+++ b/js/src/Makefile.in
@@ -51,25 +51,28 @@ endif
ifndef JS_MOZ_INSTALL
# This is the appropriate behavior for GNU-style 'make install'. For
# Mozilla in-tree behavior, leaving NSDISTMODE unset is the right
# thing; config/js/Makefile.in sets JS_MOZ_INSTALL in that case.
NSDISTMODE = copy
endif
-MODULE = js
-LIBRARY_NAME = mozjs
-GRE_MODULE = 1
+ifdef JS_NATIVE_EDITLINE
+DIRS += editline
+endif
-PROGRAM = js$(BIN_SUFFIX)
-# The shell uses some 'HIDDEN' symbols to produce statistics, so we
-# link directly against the .o files, not against the JS shared
-# library.
-PROGOBJS = js.$(OBJ_SUFFIX) $(OBJS)
+# editline needs to get built before the shell
+DIRS += shell
+
+MODULE = js
+LIBRARY_NAME = mozjs
+STATIC_LIBRARY_NAME = js_static
+GRE_MODULE = 1
+
LIBS = $(NSPR_LIBS)
ifdef GNU_CXX
ifdef INTEL_CXX
# icc gets special optimize flags
ifdef MOZ_PROFILE_GENERATE
MODULE_OPTIMIZE_FLAGS = -O0
else
@@ -99,20 +102,22 @@ endif
ifeq (,$(filter-out WINNT WINCE,$(OS_ARCH)))
LIBRARY_NAME = js$(MOZ_BITS)$(VERSION_NUMBER)
endif
# JavaScript must be built shared, even for static builds, as it is used by
# other modules which are always built shared. Failure to do so results in
# the js code getting copied into xpinstall and jsd as well as mozilla-bin,
# and then the static data cells used for locking no longer work.
+#
+# In fact, we now build both a static and a shared library, as the
+# JS shell would like to link to the static library.
-ifndef JS_STATIC_BUILD
FORCE_SHARED_LIB = 1
-endif
+FORCE_STATIC_LIB = 1
ifeq (86,$(findstring 86,$(OS_TEST)))
ifeq (64,$(findstring 64,$(OS_TEST)))
else
DEFINES += -DAVMPLUS_IA32
NANOJIT_ARCH = i386
ENABLE_JIT = 1
endif
@@ -614,30 +619,32 @@ js-config: js-config.in Makefile $(DEPTH
SCRIPTS = js-config
install:: $(INSTALLED_HEADERS)
$(INSTALL) $(IFLAGS1) $^ $(includedir)/$(MODULE)
install:: $(SCRIPTS) $(PROGRAM)
$(INSTALL) $(IFLAGS2) $^ $(bindir)
+install:: $(LIBRARY)
+ifneq (,$(LIBRARY))
+ $(INSTALL) $(IFLAGS1) $(LIBRARY) $(libdir)
+endif
+ifneq (,$(IMPORT_LIBRARY))
+ $(INSTALL) $(IFLAGS2) $(IMPORT_LIBRARY) $(libdir)
+endif
+
# The Mozilla top-level makefiles use install-runtime-libs directly to
# place an additional copy of the libraries in the 'dist/bin'
# directory.
install:: install-runtime-libs
install-runtime-libs:: $(LIBRARY) $(SHARED_LIBRARY) $(IMPORT_LIBRARY)
-ifneq (,$(LIBRARY))
- $(INSTALL) $(IFLAGS1) $(LIBRARY) $(libdir)
-endif
ifneq (,$(SHARED_LIBRARY))
$(INSTALL) $(IFLAGS2) $(SHARED_LIBRARY) $(libdir)
endif
-ifneq (,$(IMPORT_LIBRARY))
- $(INSTALL) $(IFLAGS2) $(IMPORT_LIBRARY) $(libdir)
-endif
# Extra dependancies and rules for auto-generated headers
host_jskwgen.$(OBJ_SUFFIX): jsversion.h jskeyword.tbl
# Use CURDIR to avoid finding a jsautokw.h in the source tree (from a
# previous build?) via VPATH when we're building in a separate tree.
$(CURDIR)/jsautokw.h: host_jskwgen$(HOST_BIN_SUFFIX)
./host_jskwgen$(HOST_BIN_SUFFIX) $@
--- a/js/src/config/autoconf.mk.in
+++ b/js/src/config/autoconf.mk.in
@@ -59,17 +59,22 @@ bindir = @bindir@
includedir = @includedir@
libdir = @libdir@
datadir = @datadir@
mandir = @mandir@
installdir = $(libdir)/$(MOZ_APP_NAME)-$(MOZ_APP_VERSION)
sdkdir = $(libdir)/$(MOZ_APP_NAME)-devel-$(MOZ_APP_VERSION)
-DIST = $(DEPTH)/dist
+TOP_DIST = @TOP_DIST@
+ifneq (,$(filter /%,$(TOP_DIST)))
+DIST = $(TOP_DIST)
+else
+DIST = $(DEPTH)/$(TOP_DIST)
+endif
MOZ_JS_LIBS = @MOZ_JS_LIBS@
MOZ_SYNC_BUILD_FILES = @MOZ_SYNC_BUILD_FILES@
MOZ_DEBUG = @MOZ_DEBUG@
MOZ_DEBUG_MODULES = @MOZ_DEBUG_MODULES@
MOZ_PROFILE_MODULES = @MOZ_PROFILE_MODULES@
@@ -96,17 +101,16 @@ EAZEL_PROFILER_CFLAGS=@EAZEL_PROFILER_CF
EAZEL_PROFILER_LIBS=@EAZEL_PROFILER_LIBS@
GC_LEAK_DETECTOR = @GC_LEAK_DETECTOR@
NS_TRACE_MALLOC = @NS_TRACE_MALLOC@
INCREMENTAL_LINKER = @INCREMENTAL_LINKER@
MACOSX_DEPLOYMENT_TARGET = @MACOSX_DEPLOYMENT_TARGET@
BUILD_STATIC_LIBS = @BUILD_STATIC_LIBS@
ENABLE_TESTS = @ENABLE_TESTS@
JS_ULTRASPARC_OPTS = @JS_ULTRASPARC_OPTS@
-JS_STATIC_BUILD = @JS_STATIC_BUILD@
TAR=@TAR@
# The MOZ_UI_LOCALE var is used to build a particular locale. Do *not*
# use the var to change any binary files. Do *not* use this var unless you
# write rules for the "clean-locale" and "locale" targets.
MOZ_UI_LOCALE = @MOZ_UI_LOCALE@
@@ -259,16 +263,19 @@ SDP = @SDP@
NSINSTALL_BIN = @NSINSTALL_BIN@
NSPR_CONFIG = @NSPR_CONFIG@
NSPR_CFLAGS = @NSPR_CFLAGS@
NSPR_LIBS = @NSPR_LIBS@
USE_DEPENDENT_LIBS = @USE_DEPENDENT_LIBS@
+JS_NATIVE_EDITLINE = @JS_NATIVE_EDITLINE@
+EDITLINE_LIBS = @EDITLINE_LIBS@
+
# MKSHLIB_FORCE_ALL is used to force the linker to include all object
# files present in an archive. MKSHLIB_UNFORCE_ALL reverts the linker
# to normal behavior. Makefile's that create shared libraries out of
# archives use these flags to force in all of the .o files in the
# archives into the shared library.
WRAP_MALLOC_LIB = @WRAP_MALLOC_LIB@
WRAP_MALLOC_CFLAGS = @WRAP_MALLOC_CFLAGS@
DSO_CFLAGS = @DSO_CFLAGS@
--- a/js/src/config/config.mk
+++ b/js/src/config/config.mk
@@ -68,16 +68,18 @@ COMMA = ,
CHECK_VARS := \
XPI_NAME \
LIBRARY_NAME \
MODULE \
DEPTH \
SHORT_LIBNAME \
XPI_PKGNAME \
INSTALL_EXTENSION_ID \
+ SHARED_LIBRARY_NAME \
+ STATIC_LIBRARY_NAME \
$(NULL)
# checks for internal spaces or trailing spaces in the variable
# named by $x
check-variable = $(if $(filter-out 0 1,$(words $($(x))z)),$(error Spaces are not allowed in $(x)))
$(foreach x,$(CHECK_VARS),$(check-variable))
@@ -354,16 +356,28 @@ ifndef _ENABLE_PIC
DSO_CFLAGS=
ifeq ($(OS_ARCH)_$(HAVE_GCC3_ABI),Darwin_1)
DSO_PIC_CFLAGS=-mdynamic-no-pic
else
DSO_PIC_CFLAGS=
endif
endif
+ifndef SHARED_LIBRARY_NAME
+ifdef LIBRARY_NAME
+SHARED_LIBRARY_NAME=$(LIBRARY_NAME)
+endif
+endif
+
+ifndef STATIC_LIBRARY_NAME
+ifdef LIBRARY_NAME
+STATIC_LIBRARY_NAME=$(LIBRARY_NAME)
+endif
+endif
+
# This comes from configure
ifdef MOZ_PROFILE_GUIDED_OPTIMIZE_DISABLE
NO_PROFILE_GUIDED_OPTIMIZE = 1
endif
# Enable profile-based feedback
ifndef NO_PROFILE_GUIDED_OPTIMIZE
ifdef MOZ_PROFILE_GENERATE
--- a/js/src/config/rules.mk
+++ b/js/src/config/rules.mk
@@ -214,52 +214,52 @@ endif # ENABLE_TESTS
#
# Library rules
#
# If BUILD_STATIC_LIBS or FORCE_STATIC_LIB is set, build a static library.
# Otherwise, build a shared library.
#
ifndef LIBRARY
-ifdef LIBRARY_NAME
+ifdef STATIC_LIBRARY_NAME
ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH)))
ifdef SHORT_LIBNAME
-LIBRARY_NAME := $(SHORT_LIBNAME)
+STATIC_LIBRARY_NAME := $(SHORT_LIBNAME)
endif
endif
-LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(LIB_SUFFIX)
-endif
-endif
+LIBRARY := $(LIB_PREFIX)$(STATIC_LIBRARY_NAME).$(LIB_SUFFIX)
+endif # STATIC_LIBRARY_NAME
+endif # LIBRARY
ifndef HOST_LIBRARY
ifdef HOST_LIBRARY_NAME
HOST_LIBRARY := $(LIB_PREFIX)$(HOST_LIBRARY_NAME).$(LIB_SUFFIX)
endif
endif
ifdef LIBRARY
ifneq (_1,$(FORCE_SHARED_LIB)_$(BUILD_STATIC_LIBS))
ifdef MKSHLIB
ifdef LIB_IS_C_ONLY
MKSHLIB = $(MKCSHLIB)
endif
ifdef MAKE_FRAMEWORK
-SHARED_LIBRARY := $(LIBRARY_NAME)
+SHARED_LIBRARY := $(SHARED_LIBRARY_NAME)
else
-SHARED_LIBRARY := $(DLL_PREFIX)$(LIBRARY_NAME)$(DLL_SUFFIX)
+SHARED_LIBRARY := $(DLL_PREFIX)$(SHARED_LIBRARY_NAME)$(DLL_SUFFIX)
endif
ifeq ($(OS_ARCH),OS2)
DEF_FILE := $(SHARED_LIBRARY:.dll=.def)
endif
ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH)))
-IMPORT_LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(IMPORT_LIB_SUFFIX)
+IMPORT_LIBRARY := $(LIB_PREFIX)$(SHARED_LIBRARY_NAME).$(IMPORT_LIB_SUFFIX)
endif
ifdef MOZ_ENABLE_LIBXUL
EMBED_MANIFEST_AT=2
endif
endif # MKSHLIB
endif # FORCE_SHARED_LIB && !BUILD_STATIC_LIBS
@@ -314,39 +314,32 @@ COMPILE_PDBFILE = generated.pdb
endif
LINK_PDBFILE = $(basename $(@F)).pdb
ifdef MOZ_DEBUG
CODFILE=$(basename $(@F)).cod
endif
ifdef MOZ_MAPINFO
-ifdef LIBRARY_NAME
-MAPFILE=$(LIBRARY_NAME).map
+ifdef SHARED_LIBRARY_NAME
+MAPFILE=$(SHARED_LIBRARY_NAME).map
else
MAPFILE=$(basename $(@F)).map
endif # LIBRARY_NAME
endif # MOZ_MAPINFO
ifdef DEFFILE
OS_LDFLAGS += -DEF:$(DEFFILE)
EXTRA_DEPS += $(DEFFILE)
endif
ifdef MAPFILE
OS_LDFLAGS += -MAP:$(MAPFILE)
-#CFLAGS += -Fm$(MAPFILE)
-#CXXFLAGS += -Fm$(MAPFILE)
endif
-#ifdef CODFILE
-#CFLAGS += -Fa$(CODFILE) -FAsc
-#CFLAGS += -Fa$(CODFILE) -FAsc
-#endif
-
endif # !GNU_CC
ifdef ENABLE_CXX_EXCEPTIONS
ifdef GNU_CC
CXXFLAGS += -fexceptions
else
ifeq (,$(filter-out 1200 1300 1310,$(_MSC_VER)))
CXXFLAGS += -GX
@@ -836,23 +829,23 @@ endif
#
# Rule to create list of libraries for final link
#
export::
ifdef LIBRARY_NAME
ifdef EXPORT_LIBRARY
ifdef IS_COMPONENT
ifdef BUILD_STATIC_LIBS
- @$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMPS) $(LIBRARY_NAME)
+ @$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMPS) $(STATIC_LIBRARY_NAME)
ifdef MODULE_NAME
@$(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_COMP_NAMES) $(MODULE_NAME)
endif
-endif
-else
- $(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_LIBS) $(LIBRARY_NAME)
+endif # BUILD_STATIC_LIBS
+else # !IS_COMPONENT
+ $(PERL) -I$(MOZILLA_DIR)/config $(MOZILLA_DIR)/config/build-list.pl $(FINAL_LINK_LIBS) $(STATIC_LIBRARY_NAME)
endif # IS_COMPONENT
endif # EXPORT_LIBRARY
endif # LIBRARY_NAME
# Create dependencies on static (and shared EXTRA_DSO_LIBS) libraries
LIBS_DEPS = $(filter %.$(LIB_SUFFIX), $(LIBS))
HOST_LIBS_DEPS = $(filter %.$(LIB_SUFFIX), $(HOST_LIBS))
DSO_LDOPTS_DEPS = $(EXTRA_DSO_LIBS) $(filter %.$(LIB_SUFFIX), $(EXTRA_DSO_LDOPTS))
@@ -1178,17 +1171,17 @@ endif
ifeq (,$(filter-out WINNT WINCE, $(OS_ARCH)))
$(IMPORT_LIBRARY): $(SHARED_LIBRARY)
endif
ifeq ($(OS_ARCH),OS2)
$(DEF_FILE): $(OBJS) $(SHARED_LIBRARY_LIBS)
rm -f $@
- echo LIBRARY $(LIBRARY_NAME) INITINSTANCE TERMINSTANCE > $@
+ echo LIBRARY $(SHARED_LIBRARY_NAME) INITINSTANCE TERMINSTANCE > $@
echo PROTMODE >> $@
echo CODE LOADONCALL MOVEABLE DISCARDABLE >> $@
echo DATA PRELOAD MOVEABLE MULTIPLE NONSHARED >> $@
echo EXPORTS >> $@
ifeq ($(IS_COMPONENT),1)
ifeq ($(HAS_EXTRAEXPORTS),1)
ifndef MOZ_OS2_USE_DECLSPEC
$(FILTER) $(OBJS) $(SHARED_LIBRARY_LIBS) >> $@
--- a/js/src/config/system-headers
+++ b/js/src/config/system-headers
@@ -299,24 +299,27 @@ gssapi/gssapi_generic.h
gssapi/gssapi.h
gssapi.h
gtk/gtkbindings.h
gtk/gtkbutton.h
gtk/gtkclipboard.h
gtk/gtkcontainer.h
gtk/gtkdialog.h
gtk/gtkentry.h
+gtk/gtkfilechooser.h
+gtk/gtkfilechooserdialog.h
gtk/gtkfixed.h
gtk/gtk.h
gtk/gtkiconfactory.h
gtk/gtkimage.h
gtk/gtkimmulticontext.h
gtk/gtkinvisible.h
gtk/gtkmain.h
gtk/gtkmessagedialog.h
+gtk/gtkmisc.h
gtk/gtkobject.h
gtk/gtkprinter.h
gtk/gtkprintjob.h
gtk/gtkprintunixdialog.h
gtk/gtkprivate.h
gtk/gtkselection.h
gtk/gtksignal.h
gtk/gtksocket.h
--- a/js/src/configure.in
+++ b/js/src/configure.in
@@ -155,16 +155,27 @@ then
***
EOF
exit 1
break
fi
fi
MOZ_BUILD_ROOT=`pwd`
+dnl Choose where to put the 'dist' directory.
+dnl ==============================================================
+
+MOZ_ARG_WITH_STRING(dist-dir,
+[ --with-dist-dir=DIR Use DIR as 'dist' staging area. DIR may be
+ relative to the top of SpiderMonkey build tree,
+ or absolute.],
+ TOP_DIST=$withval,
+ TOP_DIST=dist)
+AC_SUBST(TOP_DIST)
+
dnl Default to MSVC for win32
dnl ==============================================================
if test -z "$CROSS_COMPILE"; then
case "$target" in
*-cygwin*|*-mingw*|*-msvc*|*-mks*)
MAKE_VERSION=3.79
if test -z "$CC"; then CC=cl; fi
if test -z "$CXX"; then CXX=cl; fi
@@ -2779,27 +2790,16 @@ AC_CHECK_HEADERS(X11/XKBlib.h)
dnl These are all the places some variant of statfs can be hiding.
AC_CHECK_HEADERS(sys/statvfs.h sys/statfs.h sys/vfs.h sys/mount.h)
dnl Try for MMX support
dnl NB - later gcc versions require -mmmx for this header to be successfully
dnl included (or another option which implies it, such as -march=pentium-mmx)
AC_CHECK_HEADERS(mmintrin.h)
-AC_MSG_CHECKING(for ARM SIMD support)
-AC_TRY_COMPILE([],
- [asm("uqadd8 r1, r1, r2");],
- result="yes", result="no")
-AC_MSG_RESULT("$result")
-if test "$result" = "yes"; then
- AC_DEFINE(HAVE_ARM_SIMD)
- HAVE_ARM_SIMD=1
-fi
-AC_SUBST(HAVE_ARM_SIMD)
-
dnl Check whether the compiler supports the new-style C++ standard
dnl library headers (i.e. <new>) or needs the old "new.h"
AC_LANG_CPLUSPLUS
NEW_H=new.h
AC_CHECK_HEADER(new, [NEW_H=new])
AC_DEFINE_UNQUOTED(NEW_H, <$NEW_H>)
AC_LANG_C
@@ -2875,16 +2875,27 @@ AC_CHECK_LIB(socket, socket)
dnl Enable VFP support on ARM
MOZ_ARG_DISABLE_BOOL(arm-vfp,
[ --disable-arm-vfp Disable ARM VFP instructions in JavaScript JIT],
MOZ_ARM_VFP=, MOZ_ARM_VFP=1, MOZ_ARM_VFP=1)
if test "$MOZ_ARM_VFP"; then
AC_DEFINE(NJ_ARM_VFP)
fi
+AC_MSG_CHECKING(for ARM SIMD support)
+AC_TRY_COMPILE([],
+ [asm("uqadd8 r1, r1, r2");],
+ result="yes", result="no")
+AC_MSG_RESULT("$result")
+if test "$result" = "yes"; then
+ AC_DEFINE(HAVE_ARM_SIMD)
+ HAVE_ARM_SIMD=1
+fi
+AC_SUBST(HAVE_ARM_SIMD)
+
dnl ========================================================
dnl = pthread support
dnl = Start by checking whether the system support pthreads
dnl ========================================================
case "$target_os" in
darwin*)
USE_PTHREADS=1
;;
@@ -3792,17 +3803,16 @@ dnl = Application
dnl =
dnl ========================================================
MOZ_ARG_HEADER(Application)
BUILD_STATIC_LIBS=
ENABLE_TESTS=1
MOZ_DBGRINFO_MODULES=
-JS_STATIC_BUILD=
dnl ========================================================
dnl =
dnl = Components & Features
dnl =
dnl ========================================================
MOZ_ARG_HEADER(Components and Features)
@@ -4730,33 +4740,43 @@ dnl ====================================
MOZ_ARG_HEADER(Static build options)
MOZ_ARG_ENABLE_BOOL(static,
[ --enable-static Enable building of internal static libs],
BUILD_STATIC_LIBS=1,
BUILD_STATIC_LIBS=)
dnl ========================================================
-dnl = Force JS to be a static lib
+dnl = Link js shell to system readline
dnl ========================================================
-MOZ_ARG_ENABLE_BOOL(js-static-build,
-[ --enable-js-static-build Force js to be a static lib],
- JS_STATIC_BUILD=1,
- JS_STATIC_BUILD= )
-
-AC_SUBST(JS_STATIC_BUILD)
-
-if test -n "$JS_STATIC_BUILD"; then
- AC_DEFINE(EXPORT_JS_API)
-
-if test -z "$BUILD_STATIC_LIBS"; then
- AC_MSG_ERROR([--enable-js-static-build is only compatible with --enable-static])
+MOZ_ARG_ENABLE_BOOL(readline,
+[ --enable-readline Link js shell to system readline library],
+ JS_WANT_READLINE=1,
+ JS_WANT_READLINE= )
+
+JS_NATIVE_EDITLINE=
+EDITLINE_LIBS=
+
+dnl Conveniently, Win32 sets SKIP_LIBRARY_CHECKS...
+if test -z "$SKIP_LIBRARY_CHECKS"; then
+ if test -n "$JS_WANT_READLINE"; then
+ AC_CHECK_LIB(readline, readline,
+ EDITLINE_LIBS="-lreadline",
+ AC_MSG_ERROR([No system readline library found.]))
+ else
+ dnl By default, we use editline
+ JS_NATIVE_EDITLINE=1
+ EDITLINE_LIBS='$(DEPTH)/editline/$(LIB_PREFIX)editline.$(LIB_SUFFIX)'
+ fi
+
+ dnl Either way, we want to build with line editing support.
+ AC_DEFINE(EDITLINE)
fi
-
-fi
+AC_SUBST(JS_NATIVE_EDITLINE)
+AC_SUBST(EDITLINE_LIBS)
dnl ========================================================
dnl =
dnl = Standalone module options
dnl =
dnl ========================================================
MOZ_ARG_HEADER(Standalone module options (Not for building Mozilla))
@@ -5131,21 +5151,28 @@ egrep -v "$_EGREP_PATTERN" confdefs.h.sa
AC_OUTPUT_MAKE_DEFS()
MOZ_DEFINES=$DEFS
AC_SUBST(MOZ_DEFINES)
rm -f confdefs.h
mv confdefs.h.save confdefs.h
MAKEFILES="
Makefile
+ shell/Makefile
config/Makefile
config/autoconf.mk
config/mkdepend/Makefile
"
+if test -n "$JS_NATIVE_EDITLINE"; then
+ MAKEFILES="$MAKEFILES
+editline/Makefile
+"
+fi
+
dnl
dnl Run a perl script to quickly create the makefiles.
dnl If it succeeds, it outputs a shell command to set CONFIG_FILES
dnl for the files it cannot handle correctly. This way, config.status
dnl will handle these files.
dnl If it fails, nothing is set and config.status will run as usual.
dnl
dnl This does not change the $MAKEFILES variable.
new file mode 100644
--- /dev/null
+++ b/js/src/editline/Makefile.in
@@ -0,0 +1,55 @@
+# -*- Mode: makefile -*-
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Spidermonkey build system.
+#
+# The Initial Developer of the Original Code is
+# The Mozilla Foundation.
+# Portions created by the Initial Developer are Copyright (C) 2008
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# Ted Mielczarek <ted.mielczarek@gmail.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH = ..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+LIBRARY_NAME = editline
+FORCE_STATIC_LIB = 1
+
+CSRCS = editline.c sysunix.c
+
+DEFINES += -DANSI_ARROWS -DHAVE_TCGETATTR -DHIDE -DUSE_DIRENT -DSYS_UNIX \
+ -DHAVE_STDLIB -DUNIQUE_HISTORY
+
+include $(topsrcdir)/config/rules.mk
--- a/js/src/jsobj.cpp
+++ b/js/src/jsobj.cpp
@@ -1261,17 +1261,17 @@ obj_eval(JSContext *cx, JSObject *obj, u
}
OBJ_TO_INNER_OBJECT(cx, obj);
if (!obj) {
ok = JS_FALSE;
goto out;
}
if (obj != callerScopeChain) {
ok = js_CheckPrincipalsAccess(cx, obj,
- caller->script->principals,
+ JS_StackFramePrincipals(cx, caller),
cx->runtime->atomState.evalAtom);
if (!ok)
goto out;
scopeobj = js_NewWithObject(cx, obj, callerScopeChain, -1);
if (!scopeobj) {
ok = JS_FALSE;
goto out;
new file mode 100644
--- /dev/null
+++ b/js/src/shell/Makefile.in
@@ -0,0 +1,60 @@
+# -*- Mode: makefile -*-
+#
+# ***** BEGIN LICENSE BLOCK *****
+# Version: MPL 1.1/GPL 2.0/LGPL 2.1
+#
+# The contents of this file are subject to the Mozilla Public License Version
+# 1.1 (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+# http://www.mozilla.org/MPL/
+#
+# Software distributed under the License is distributed on an "AS IS" basis,
+# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+# for the specific language governing rights and limitations under the
+# License.
+#
+# The Original Code is Spidermonkey build system.
+#
+# The Initial Developer of the Original Code is
+# The Mozilla Foundation.
+# Portions created by the Initial Developer are Copyright (C) 2008
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+# Ted Mielczarek <ted.mielczarek@gmail.com>
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either of the GNU General Public License Version 2 or later (the "GPL"),
+# or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+# in which case the provisions of the GPL or the LGPL are applicable instead
+# of those above. If you wish to allow use of your version of this file only
+# under the terms of either the GPL or the LGPL, and not to allow others to
+# use your version of this file under the terms of the MPL, indicate your
+# decision by deleting the provisions above and replace them with the notice
+# and other provisions required by the GPL or the LGPL. If you do not delete
+# the provisions above, a recipient may use your version of this file under
+# the terms of any one of the MPL, the GPL or the LGPL.
+#
+# ***** END LICENSE BLOCK *****
+
+DEPTH = ..
+topsrcdir = @top_srcdir@
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+include $(DEPTH)/config/autoconf.mk
+
+PROGRAM = js$(BIN_SUFFIX)
+CPPSRCS = js.cpp
+
+DEFINES += -DEXPORT_JS_API
+
+LIBS = $(NSPR_LIBS) $(EDITLINE_LIBS) $(DEPTH)/$(LIB_PREFIX)js_static.$(LIB_SUFFIX)
+
+LOCAL_INCLUDES += -I$(topsrcdir) -I..
+
+include $(topsrcdir)/config/rules.mk
+
+# People expect the js shell to wind up in the top-level JS dir.
+libs::
+ $(INSTALL) $(IFLAGS2) $(PROGRAM) $(DEPTH)
rename from js/src/js.cpp
rename to js/src/shell/js.cpp
--- a/js/src/xpconnect/src/xpcwrappednative.cpp
+++ b/js/src/xpconnect/src/xpcwrappednative.cpp
@@ -1439,20 +1439,20 @@ return_tearoff:
JSObject *unsafeObj;
if(clazz == &sXPC_XOW_JSClass.base &&
(unsafeObj = XPCWrapper::Unwrap(cx, cur)))
return GetWrappedNativeOfJSObject(cx, unsafeObj, funobj, pobj2,
pTearOff);
if(XPCNativeWrapper::IsNativeWrapperClass(clazz))
{
- if(pobj2)
- *pobj2 = cur;
-
- return XPCNativeWrapper::GetWrappedNative(cur);
+ unsafeObj =
+ XPCNativeWrapper::GetWrappedNative(cur)->GetFlatJSObject();
+ return GetWrappedNativeOfJSObject(cx, unsafeObj, funobj, pobj2,
+ pTearOff);
}
if(IsXPCSafeJSObjectWrapperClass(clazz) &&
(unsafeObj = STOBJ_GET_PARENT(cur)))
return GetWrappedNativeOfJSObject(cx, unsafeObj, funobj, pobj2,
pTearOff);
}
--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -10138,16 +10138,17 @@ nsCSSFrameConstructor::EndUpdate()
{
if (mUpdateCount == 1) {
// This is the end of our last update. Before we decrement
// mUpdateCount, recalc quotes and counters as needed.
RecalcQuotesAndCounters();
NS_ASSERTION(mUpdateCount == 1, "Odd update count");
}
+ --mUpdateCount;
if (mFocusSuppressCount) {
NS_UnsuppressFocusEvent();
--mFocusSuppressCount;
}
}
void
nsCSSFrameConstructor::RecalcQuotesAndCounters()
--- a/layout/base/nsCSSFrameConstructor.h
+++ b/layout/base/nsCSSFrameConstructor.h
@@ -80,17 +80,20 @@ typedef void (nsLazyFrameConstructionCal
class nsFrameConstructorState;
class nsFrameConstructorSaveState;
class nsCSSFrameConstructor
{
public:
nsCSSFrameConstructor(nsIDocument *aDocument, nsIPresShell* aPresShell);
- ~nsCSSFrameConstructor(void) { }
+ ~nsCSSFrameConstructor(void) {
+ NS_ASSERTION(mUpdateCount == 0, "Dying in the middle of our own update?");
+ NS_ASSERTION(mFocusSuppressCount == 0, "Focus suppression will be wrong");
+ }
// Maintain global objects - gXBLService
static nsIXBLService * GetXBLService();
static void ReleaseGlobals() { NS_IF_RELEASE(gXBLService); }
// get the alternate text for a content node
static void GetAlternateTextFor(nsIContent* aContent,
nsIAtom* aTag, // content object's tag
--- a/layout/base/nsDocumentViewer.cpp
+++ b/layout/base/nsDocumentViewer.cpp
@@ -1315,17 +1315,17 @@ DocumentViewerImpl::Close(nsISHEntry *aS
if (mPrintEngine && !mClosingWhilePrinting) {
mClosingWhilePrinting = PR_TRUE;
} else
#endif
{
// out of band cleanup of webshell
mDocument->SetScriptGlobalObject(nsnull);
- if (!mSHEntry)
+ if (!mSHEntry && mDocument)
mDocument->RemovedFromDocShell();
}
if (mFocusListener && mDocument) {
mDocument->RemoveEventListenerByIID(mFocusListener,
NS_GET_IID(nsIDOMFocusListener));
}
--- a/layout/base/nsImageLoader.cpp
+++ b/layout/base/nsImageLoader.cpp
@@ -69,17 +69,17 @@ nsImageLoader::nsImageLoader() :
}
nsImageLoader::~nsImageLoader()
{
mFrame = nsnull;
mPresContext = nsnull;
if (mRequest) {
- mRequest->Cancel(NS_ERROR_FAILURE);
+ mRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
}
}
void
nsImageLoader::Init(nsIFrame *aFrame, nsPresContext *aPresContext,
PRBool aReflowOnLoad)
{
@@ -90,17 +90,17 @@ nsImageLoader::Init(nsIFrame *aFrame, ns
void
nsImageLoader::Destroy()
{
mFrame = nsnull;
mPresContext = nsnull;
if (mRequest) {
- mRequest->Cancel(NS_ERROR_FAILURE);
+ mRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
}
mRequest = nsnull;
}
nsresult
nsImageLoader::Load(imgIRequest *aImage)
{
@@ -117,17 +117,17 @@ nsImageLoader::Load(imgIRequest *aImage)
aImage->GetURI(getter_AddRefs(newURI));
PRBool eq = PR_FALSE;
nsresult rv = newURI->Equals(oldURI, &eq);
if (NS_SUCCEEDED(rv) && eq) {
return NS_OK;
}
// Now cancel the old request so it won't hold a stale ref to us.
- mRequest->Cancel(NS_ERROR_FAILURE);
+ mRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
mRequest = nsnull;
}
// Make sure to clone into a temporary, then set mRequest, since
// cloning may notify and we don't want to trigger paints from this
// code.
nsCOMPtr<imgIRequest> newRequest;
nsresult rv = aImage->Clone(this, getter_AddRefs(newRequest));
--- a/layout/base/nsPresShell.cpp
+++ b/layout/base/nsPresShell.cpp
@@ -757,17 +757,16 @@ FrameArena::FreeFrame(size_t aSize, void
struct nsCallbackEventRequest
{
nsIReflowCallback* callback;
nsCallbackEventRequest* next;
};
// ----------------------------------------------------------------------------
class nsPresShellEventCB;
-class nsAutoCauseReflowNotifier;
class PresShell : public nsIPresShell, public nsIViewObserver,
public nsStubDocumentObserver,
public nsISelectionController, public nsIObserver,
public nsSupportsWeakReference
{
public:
PresShell();
@@ -1008,23 +1007,16 @@ public:
protected:
virtual ~PresShell();
void HandlePostedReflowCallbacks();
void CancelPostedReflowCallbacks();
void UnsuppressAndInvalidate();
- void WillCauseReflow() {
- nsContentUtils::AddScriptBlocker();
- ++mChangeNestCount;
- }
- nsresult DidCauseReflow();
- friend class nsAutoCauseReflowNotifier;
-
void WillDoReflow();
void DidDoReflow();
nsresult ProcessReflowCommands(PRBool aInterruptible);
void ClearReflowEventStatus();
void PostReflowEvent();
void DoReflow(nsIFrame* aFrame);
#ifdef DEBUG
@@ -1128,21 +1120,16 @@ protected:
// reflow roots that need to be reflowed, as both a queue and a hashtable
nsVoidArray mDirtyRoots;
PRPackedBool mDocumentLoading;
PRPackedBool mIsReflowing;
PRPackedBool mIgnoreFrameDestruction;
PRPackedBool mHaveShutDown;
-
- // This is used to protect ourselves from triggering reflow while in the
- // middle of frame construction and the like... it really shouldn't be
- // needed, one hopes, but it is for now.
- PRUint32 mChangeNestCount;
nsIFrame* mCurrentEventFrame;
nsCOMPtr<nsIContent> mCurrentEventContent;
nsVoidArray mCurrentEventFrameStack;
nsCOMArray<nsIContent> mCurrentEventContentStack;
nsCOMPtr<nsIContent> mLastAnchorScrolledTo;
nscoord mLastAnchorScrollPositionY;
@@ -1211,39 +1198,16 @@ private:
nsCOMPtr<nsITimer> mResizeEventTimer;
typedef void (*nsPluginEnumCallback)(PresShell*, nsIContent*);
void EnumeratePlugins(nsIDOMDocument *aDocument,
const nsString &aPluginTag,
nsPluginEnumCallback aCallback);
};
-class nsAutoCauseReflowNotifier
-{
-public:
- nsAutoCauseReflowNotifier(PresShell* aShell)
- : mShell(aShell)
- {
- mShell->WillCauseReflow();
- }
- ~nsAutoCauseReflowNotifier()
- {
- // This check should not be needed. Currently the only place that seem
- // to need it is the code that deals with bug 337586.
- if (!mShell->mHaveShutDown) {
- mShell->DidCauseReflow();
- }
- else {
- nsContentUtils::RemoveScriptBlocker();
- }
- }
-
- PresShell* mShell;
-};
-
class NS_STACK_CLASS nsPresShellEventCB : public nsDispatchingCallback
{
public:
nsPresShellEventCB(PresShell* aPresShell) : mPresShell(aPresShell) {}
virtual void HandleEvent(nsEventChainPostVisitor& aVisitor)
{
if (aVisitor.mPresContext && aVisitor.mEvent->eventStructType != NS_EVENT) {
@@ -2403,17 +2367,17 @@ PresShell::InitialReflow(nscoord aWidth,
if (root) {
MOZ_TIMER_DEBUGLOG(("Reset and start: Frame Creation: PresShell::InitialReflow(), this=%p\n",
(void*)this));
MOZ_TIMER_RESET(mFrameCreationWatch);
MOZ_TIMER_START(mFrameCreationWatch);
{
- nsAutoCauseReflowNotifier reflowNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
mFrameConstructor->BeginUpdate();
if (!rootFrame) {
// Have style sheet processor construct a frame for the
// precursors to the root content object's frame
mFrameConstructor->ConstructRootFrame(root, &rootFrame);
FrameManager()->SetRootFrame(rootFrame);
}
@@ -2549,17 +2513,17 @@ PresShell::ResizeReflow(nscoord aWidth,
// Make sure style is up to date
mFrameConstructor->ProcessPendingRestyles();
if (!mIsDestroying) {
// XXX Do a full invalidate at the beginning so that invalidates along
// the way don't have region accumulation issues?
{
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
WillDoReflow();
// Kick off a top-down reflow
AUTO_LAYOUT_PHASE_ENTRY_POINT(GetPresContext(), Reflow);
mIsReflowing = PR_TRUE;
mDirtyRoots.RemoveElement(rootFrame);
DoReflow(rootFrame);
@@ -3084,32 +3048,29 @@ PresShell::RestoreRootScrollPosition()
// Restore frame state for the root scroll frame
nsCOMPtr<nsILayoutHistoryState> historyState =
mDocument->GetLayoutHistoryState();
// Make sure we don't reenter reflow via the sync paint that happens while
// we're scrolling to our restored position. Entering reflow for the
// scrollable frame will cause it to reenter ScrollToRestoredPosition(), and
// it'll get all confused.
nsAutoScriptBlocker scriptBlocker;
- ++mChangeNestCount;
if (historyState) {
nsIFrame* scrollFrame = GetRootScrollFrame();
if (scrollFrame) {
nsIScrollableFrame* scrollableFrame;
CallQueryInterface(scrollFrame, &scrollableFrame);
if (scrollableFrame) {
FrameManager()->RestoreFrameStateFor(scrollFrame, historyState,
nsIStatefulFrame::eDocumentScrollState);
scrollableFrame->ScrollToRestoredPosition();
}
}
}
-
- --mChangeNestCount;
}
void
PresShell::BeginLoad(nsIDocument *aDocument)
{
#ifdef MOZ_PERF_METRICS
// Reset style resolution stopwatch maintained by style set
MOZ_TIMER_DEBUGLOG(("Reset: Style Resolution: PresShell::BeginLoad(), this=%p\n", (void*)this));
@@ -3379,20 +3340,17 @@ PresShell::RecreateFramesFor(nsIContent*
// start messing with the frame model; otherwise we can get content doubling.
mDocument->FlushPendingNotifications(Flush_ContentAndNotify);
nsAutoScriptBlocker scriptBlocker;
nsStyleChangeList changeList;
changeList.AppendChange(nsnull, aContent, nsChangeHint_ReconstructFrame);
- // Mark ourselves as not safe to flush while we're doing frame construction.
- ++mChangeNestCount;
nsresult rv = mFrameConstructor->ProcessRestyledFrames(changeList);
- --mChangeNestCount;
batch.EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC);
#ifdef ACCESSIBILITY
InvalidateAccessibleSubtree(aContent);
#endif
return rv;
}
@@ -4482,39 +4440,31 @@ PresShell::HandlePostedReflowCallbacks()
if (shouldFlush)
FlushPendingNotifications(Flush_Layout);
}
NS_IMETHODIMP
PresShell::IsSafeToFlush(PRBool& aIsSafeToFlush)
{
- // XXX technically we don't need to check anything but
- // nsContentUtils::IsSafeToRunScript here since that should be false
- // if any of the other flags are set.
-
+ aIsSafeToFlush = nsContentUtils::IsSafeToRunScript();
+#ifdef DEBUG
// Not safe if we are reflowing or in the middle of frame construction
- aIsSafeToFlush = !mIsReflowing &&
- !mChangeNestCount;
-
- if (aIsSafeToFlush) {
- // Not safe if we are painting
- nsIViewManager* viewManager = GetViewManager();
- if (viewManager) {
- PRBool isPainting = PR_FALSE;
- viewManager->IsPainting(isPainting);
- if (isPainting) {
- aIsSafeToFlush = PR_FALSE;
- }
- }
- }
-
- NS_ASSERTION(aIsSafeToFlush == nsContentUtils::IsSafeToRunScript(),
- "Someone forgot to block scripts");
-
+ PRBool isSafeToFlush = !mIsReflowing;
+ // Not safe if we are painting
+ nsIViewManager* viewManager = GetViewManager();
+ if (viewManager) {
+ PRBool isPainting = PR_FALSE;
+ viewManager->IsPainting(isPainting);
+ if (isPainting) {
+ isSafeToFlush = PR_FALSE;
+ }
+ }
+ NS_ASSERTION(!aIsSafeToFlush || isSafeToFlush, "Missing a script blocker!");
+#endif
return NS_OK;
}
NS_IMETHODIMP
PresShell::FlushPendingNotifications(mozFlushType aType)
{
return DoFlushPendingNotifications(aType, PR_FALSE);
@@ -4617,17 +4567,17 @@ PresShell::IsReflowLocked(PRBool* aIsRef
void
PresShell::CharacterDataChanged(nsIDocument *aDocument,
nsIContent* aContent,
CharacterDataChangeInfo* aInfo)
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected CharacterDataChanged");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
if (mCaret) {
// Invalidate the caret's current location before we call into the frame
// constructor. It is important to do this now, and not wait until the
// resulting reflow, because this call causes continuation frames of the
// text frame the caret is in to forget what part of the content they
// refer to, making it hard for them to return the correct continuation
// frame to the caret.
@@ -4659,17 +4609,17 @@ PresShell::ContentStatesChanged(nsIDocum
nsIContent* aContent1,
nsIContent* aContent2,
PRInt32 aStateMask)
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected ContentStatesChanged");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
if (mDidInitialReflow) {
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
mFrameConstructor->ContentStatesChanged(aContent1, aContent2, aStateMask);
VERIFY_STYLE_TREE;
}
}
void
PresShell::AttributeChanged(nsIDocument* aDocument,
@@ -4681,17 +4631,17 @@ PresShell::AttributeChanged(nsIDocument*
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected AttributeChanged");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
// XXXwaterson it might be more elegant to wait until after the
// initial reflow to begin observing the document. That would
// squelch any other inappropriate notifications as well.
if (mDidInitialReflow) {
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
mFrameConstructor->AttributeChanged(aContent, aNameSpaceID,
aAttribute, aModType, aStateMask);
VERIFY_STYLE_TREE;
}
}
void
PresShell::ContentAppended(nsIDocument *aDocument,
@@ -4701,17 +4651,17 @@ PresShell::ContentAppended(nsIDocument *
NS_PRECONDITION(!mIsDocumentGone, "Unexpected ContentAppended");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
NS_PRECONDITION(aContainer, "must have container");
if (!mDidInitialReflow) {
return;
}
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
MOZ_TIMER_DEBUGLOG(("Start: Frame Creation: PresShell::ContentAppended(), this=%p\n", this));
MOZ_TIMER_START(mFrameCreationWatch);
// Call this here so it only happens for real content mutations and
// not cases when the frame constructor calls its own methods to force
// frame reconstruction.
mFrameConstructor->RestyleForAppend(aContainer, aNewIndexInContainer);
@@ -4730,17 +4680,17 @@ PresShell::ContentInserted(nsIDocument*
{
NS_PRECONDITION(!mIsDocumentGone, "Unexpected ContentInserted");
NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument");
if (!mDidInitialReflow) {
return;
}
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
// Call this here so it only happens for real content mutations and
// not cases when the frame constructor calls its own methods to force
// frame reconstruction.
if (aContainer)
mFrameConstructor->RestyleForInsertOrChange(aContainer, aChild);
mFrameConstructor->ContentInserted(aContainer, aChild,
@@ -4761,17 +4711,17 @@ PresShell::ContentRemoved(nsIDocument *a
if (mCaret) {
mCaret->InvalidateOutsideCaret();
}
// Notify the ESM that the content has been removed, so that
// it can clean up any state related to the content.
mPresContext->EventStateManager()->ContentRemoved(aChild);
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
// Call this here so it only happens for real content mutations and
// not cases when the frame constructor calls its own methods to force
// frame reconstruction.
if (aContainer)
mFrameConstructor->RestyleForRemove(aContainer, aChild, aIndexInContainer);
PRBool didReconstruct;
@@ -4779,17 +4729,17 @@ PresShell::ContentRemoved(nsIDocument *a
aIndexInContainer, &didReconstruct);
VERIFY_STYLE_TREE;
}
nsresult
PresShell::ReconstructFrames(void)
{
- nsAutoCauseReflowNotifier crNotifier(this);
+ nsAutoScriptBlocker scriptBlocker;
mFrameConstructor->BeginUpdate();
nsresult rv = mFrameConstructor->ReconstructDocElementHierarchy();
VERIFY_STYLE_TREE;
mFrameConstructor->EndUpdate();
return rv;
}
@@ -5586,31 +5536,28 @@ nsresult PresShell::RetargetEventToParen
NS_IMETHODIMP
PresShell::HandleEvent(nsIView *aView,
nsGUIEvent* aEvent,
nsEventStatus* aEventStatus)
{
NS_ASSERTION(aView, "null view");
- if (mIsDestroying || mIsReflowing || mChangeNestCount) {
+ if (mIsDestroying || !nsContentUtils::IsSafeToRunScript()) {
return NS_OK;
}
#ifdef ACCESSIBILITY
if (aEvent->eventStructType == NS_ACCESSIBLE_EVENT) {
// Accessibility events come through OS requests and not from scripts,
// so it is safe to handle here
return HandleEventInternal(aEvent, aView, aEventStatus);
}
#endif
- NS_ASSERTION(nsContentUtils::IsSafeToRunScript(),
- "How did we get here if it's not safe to run scripts?");
-
// Check for a theme change up front, since the frame type is irrelevant
if (aEvent->message == NS_THEMECHANGED && mPresContext) {
mPresContext->ThemeChanged();
return NS_OK;
}
// Check for a system color change up front, since the frame type is
// irrelevant
@@ -6044,20 +5991,19 @@ PresShell::IsVisible()
PRBool res = PR_TRUE;
bw->GetVisibility(&res);
return res;
}
NS_IMETHODIMP_(void)
PresShell::WillPaint()
{
- // Don't reenter reflow and don't reflow during frame construction. Also
- // don't bother reflowing if some viewmanager in our tree is painting while
+ // Don't bother reflowing if some viewmanager in our tree is painting while
// we still have painting suppressed.
- if (mIsReflowing || mChangeNestCount || mPaintingSuppressed) {
+ if (mPaintingSuppressed) {
return;
}
// Process reflows, if we have them, to reduce flicker due to invalidates and
// reflow being interspersed. Note that we _do_ allow this to be
// interruptible; if we can't do all the reflows it's better to flicker a bit
// than to freeze up.
DoFlushPendingNotifications(Flush_Layout, PR_TRUE);
@@ -6259,35 +6205,16 @@ PresShell::PostReflowEvent()
#ifdef DEBUG
if (VERIFY_REFLOW_NOISY_RC & gVerifyReflowFlags) {
printf("\n*** PresShell::PostReflowEvent(), this=%p, event=%p\n", (void*)this, (void*)ev);
}
#endif
}
}
-nsresult
-PresShell::DidCauseReflow()
-{
- NS_ASSERTION(mChangeNestCount != 0, "Unexpected call to DidCauseReflow()");
- if (--mChangeNestCount == 0) {
- // We may have had more reflow commands appended to the queue during
- // our reflow. Make sure these get processed at some point.
-
- // XXXbz why is this really needed? ProcessReflowCommands handles posting
- // reflow events if there are reflow roots remaining, and FrameNeedsReflow
- // posts events as needed as well. I think we should remove this.
- PostReflowEvent();
- }
-
- nsContentUtils::RemoveScriptBlocker();
-
- return NS_OK;
-}
-
void
PresShell::WillDoReflow()
{
// We just reflowed, tell the caret that its frame might have moved.
// XXXbz that comment makes no sense
if (mCaret) {
mCaret->InvalidateOutsideCaret();
mCaret->UpdateCaretPosition();
@@ -6627,19 +6554,17 @@ PresShell::Observe(nsISupports* aSubject
// frames (hack!).
nsStyleChangeList changeList;
WalkFramesThroughPlaceholders(mPresContext, rootFrame,
ReframeImageBoxes, &changeList);
// Mark ourselves as not safe to flush while we're doing frame
// construction.
{
nsAutoScriptBlocker scriptBlocker;
- ++mChangeNestCount;
mFrameConstructor->ProcessRestyledFrames(changeList);
- --mChangeNestCount;
}
batch.EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC);
#ifdef ACCESSIBILITY
InvalidateAccessibleSubtree(nsnull);
#endif
}
return NS_OK;
@@ -7209,19 +7134,20 @@ PresShell::VerifyIncrementalReflow()
NS_ENSURE_SUCCESS(rv, PR_FALSE);
nsCOMPtr<nsIPresShell> sh;
rv = mDocument->CreateShell(cx, vm, newSet, getter_AddRefs(sh));
NS_ENSURE_SUCCESS(rv, PR_FALSE);
newSet.forget();
// Note that after we create the shell, we must make sure to destroy it
sh->SetVerifyReflowEnable(PR_FALSE); // turn off verify reflow while we're reflowing the test frame tree
vm->SetViewObserver((nsIViewObserver *)((PresShell*)sh.get()));
- WillCauseReflow();
- sh->InitialReflow(r.width, r.height);
- DidCauseReflow();
+ {
+ nsAutoScriptBlocker scriptBlocker;
+ sh->InitialReflow(r.width, r.height);
+ }
mDocument->BindingManager()->ProcessAttachedQueue();
sh->FlushPendingNotifications(Flush_Layout);
sh->SetVerifyReflowEnable(PR_TRUE); // turn on verify reflow again now that we're done reflowing the test frame tree
// Force the non-primary presshell to unsuppress; it doesn't want to normally
// because it thinks it's hidden
((PresShell*)sh.get())->mPaintingSuppressed = PR_FALSE;
if (VERIFY_REFLOW_NOISY & gVerifyReflowFlags) {
printf("Verification Tree built, comparing...\n");
--- a/layout/base/tests/test_bug458898.html
+++ b/layout/base/tests/test_bug458898.html
@@ -17,20 +17,25 @@ https://bugzilla.mozilla.org/show_bug.cg
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
SimpleTest.waitForExplicitFinish();
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var win = window.openDialog("data:text/html,<div style='height:200px; width:100px;'>");
+// doesn't succeed on SeaMonkey currently, see bug 469331
+// mark it todo there instead
+var testfunc_h = (navigator.userAgent.match(/ SeaMonkey\//)) ? todo : ok;
+var testfunc_w = (navigator.userAgent.match(/Windows/)) ? ok : testfunc_h;
+
function loaded() {
win.sizeToContent();
- ok(win.innerWidth >= 100, "innerWidth");
- ok(win.innerHeight >= 200, "innerHeight");
+ testfunc_w(win.innerWidth >= 100, "innerWidth");
+ testfunc_h(win.innerHeight >= 200, "innerHeight");
win.close();
SimpleTest.finish();
}
win.addEventListener("load", loaded, false);
</script>
</pre>
new file mode 100644
--- /dev/null
+++ b/layout/generic/crashtests/435529.html
@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html>
+<head>
+<style type="text/css">
+
+ div {
+ -moz-column-count: 2;
+ white-space: pre;
+ }
+
+ div:first-letter {
+ float: right;
+ }
+
+</style>
+</head>
+
+<body><div> <span>AB</span></div></body>
+
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/generic/crashtests/436823.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<html>
+<head>
+</head>
+<body>
+
+<div style="-moz-column-count: -1;"><div style="float: left;"><div><div style="float: left;">A B</div><div style="clear: both; height: 1px;"></div></div></div></div>
+
+</body>
+</html>
--- a/layout/generic/crashtests/crashtests.list
+++ b/layout/generic/crashtests/crashtests.list
@@ -149,16 +149,18 @@ load 421404-1.html
load 422283-1.html
load 422301-1.html
load 423055-1.html
load 425253-1.html
load 426272-1.html
load 428263-1.html
load 429981-1.html
load 430352-1.html
+load 435529.html
+load 436823.html
load 437156-1.html
load 438259-1.html
load 438509-1.html
load 443528-1.html
load 448903-1.html
load 451334-1.html
load 452157-1.html
load 452157-2.html
--- a/layout/generic/nsFrame.cpp
+++ b/layout/generic/nsFrame.cpp
@@ -94,16 +94,17 @@
#include "nsFrameTraversal.h"
#include "nsStyleChangeList.h"
#include "nsIDOMRange.h"
#include "nsITableLayout.h" //selection neccesity
#include "nsITableCellLayout.h"// "
#include "nsITextControlFrame.h"
#include "nsINameSpaceManager.h"
#include "nsIPercentHeightObserver.h"
+#include "nsStyleStructInlines.h"
#ifdef IBMBIDI
#include "nsBidiPresUtils.h"
#endif
// For triple-click pref
#include "nsIServiceManager.h"
#include "imgIContainer.h"
@@ -548,16 +549,26 @@ nsFrame::GetOffsets(PRInt32 &aStart, PRI
aEnd = 0;
return NS_OK;
}
// Subclass hook for style post processing
/* virtual */ void
nsFrame::DidSetStyleContext(nsStyleContext* aOldStyleContext)
{
+ // We have to start loading the border image before or during reflow,
+ // because the border-image's width overrides only apply once the
+ // image is loaded. Starting the load of the image means we'll get a
+ // reflow when the image loads. (Otherwise, if the image loads
+ // between reflow and paint, we never get the notification and our
+ // size ends up wrong.)
+ imgIRequest *borderImage = GetStyleBorder()->GetBorderImage();
+ if (borderImage) {
+ PresContext()->LoadBorderImage(borderImage, this);
+ }
}
/* virtual */ nsMargin
nsIFrame::GetUsedMargin() const
{
NS_ASSERTION(nsLayoutUtils::sDisableGetUsedXAssertions ||
!NS_SUBTREE_DIRTY(this) ||
(GetStateBits() & NS_FRAME_IN_REFLOW),
--- a/layout/generic/nsHTMLReflowState.cpp
+++ b/layout/generic/nsHTMLReflowState.cpp
@@ -52,17 +52,16 @@
#include "nsLineBox.h"
#include "nsImageFrame.h"
#include "nsTableFrame.h"
#include "nsTableCellFrame.h"
#include "nsIServiceManager.h"
#include "nsIPercentHeightObserver.h"
#include "nsContentUtils.h"
#include "nsLayoutUtils.h"
-#include "nsStyleStructInlines.h"
#ifdef IBMBIDI
#include "nsBidiUtils.h"
#endif
#ifdef NS_DEBUG
#undef NOISY_VERTICAL_ALIGN
#else
#undef NOISY_VERTICAL_ALIGN
@@ -282,27 +281,16 @@ nsHTMLReflowState::Init(nsPresContext* a
InitFrameType();
InitCBReflowState();
InitConstraints(aPresContext, aContainingBlockWidth, aContainingBlockHeight, aBorder, aPadding);
InitResizeFlags(aPresContext);
- // We have to start loading the border image now, because the
- // border-image's width overrides only apply once the image is loaded.
- // Starting the load of the image means we'll get a reflow when the
- // image loads. (If we didn't do it now, and the image loaded between
- // reflow and paint, we'd never get the notification, and our size
- // would be wrong.)
- imgIRequest *borderImage = mStyleBorder->GetBorderImage();
- if (borderImage) {
- aPresContext->LoadBorderImage(borderImage, frame);
- }
-
NS_ASSERTION((mFrameType == NS_CSS_FRAME_TYPE_INLINE &&
!frame->IsFrameOfType(nsIFrame::eReplaced)) ||
frame->GetType() == nsGkAtoms::textFrame ||
mComputedWidth != NS_UNCONSTRAINEDSIZE,
"shouldn't use unconstrained widths anymore");
}
void nsHTMLReflowState::InitCBReflowState()
--- a/layout/generic/nsImageFrame.h
+++ b/layout/generic/nsImageFrame.h
@@ -302,21 +302,21 @@ private:
// broken image and loading image icons
public:
IconLoad(imgIDecoderObserver* aObserver);
void Shutdown()
{
// in case the pref service releases us later
if (mLoadingImage) {
- mLoadingImage->Cancel(NS_ERROR_FAILURE);
+ mLoadingImage->CancelAndForgetObserver(NS_ERROR_FAILURE);
mLoadingImage = nsnull;
}
if (mBrokenImage) {
- mBrokenImage->Cancel(NS_ERROR_FAILURE);
+ mBrokenImage->CancelAndForgetObserver(NS_ERROR_FAILURE);
mBrokenImage = nsnull;
}
}
NS_DECL_ISUPPORTS
NS_DECL_NSIOBSERVER
private:
index a7d888a32188f39fa19befdbd660fc366097f9a2..7940d1abc7c6112500043346d8de1db7fc50cbfc
GIT binary patch
literal 190
zc%17D@N?(olHy`uVBq!ia0vp^AT}!p6OjDO_R1bev6p!Iy0YJ36&5q*KhpK20Vu>-
z;1OBOz`!jG!i)^F=12eqB}-f*N}Tg^b5rw57@Uhz6H8K46v{J8G8EiBeFMT9`NV;W
zEIeHtLpZJ{&)8!w*0k-|J6E^8^ST_4I5<QVHuAAlW`0v#{C)G(#*PVJ-Xv*r{F2xu
gCb{<SAE^$8XC5BEw#+n~1T=%e)78&qol`;+0ITXc@Bjb+
index 9be62f07a0f10aae43601e5d239a753fec9f5316..586102670ad89bb9ed1d34b31679db9392da8992
GIT binary patch
literal 96
zc%17D@N?(olHy`uVBq!ia0vp^%plCc1SD^IDZKzv>Ygr+Asp9}GyZQl>b?1W%J;H1
u&h8ffb*ttU7|cn``{B6Sj&<K38HRgLcxT^oS-1_Tg~8L+&t;ucLK6V<s2}?P
index c2518c3e10c601aa5d0063014ad6aef6e0c230a3..4b817a1264d6d1e2cc79714e2bd9bf458652a6b6
GIT binary patch
literal 104
zc%17D@N?(olHy`uVBq!ia0vp^EFjFm1SHiab7}%9&H|6fVg?4j!ywFfJby(BP*BR#
y#W95Adh(C+2M#bCQ(!vri~r%FqYFNrIK{ANKL5w_{880FRScf4elF{r5}E+96&^hR
index 77a369ec1b286f7f8a9d3025c94433a783e4f5b0..b36c5f4f9922f90b94996fad3bf08546036c9295
GIT binary patch
literal 73
zc%17D@N?(olHy`uVBq!ia0vp^Gl7_qg9%7FanC*sqy#)&977~7CnqHQu<vSPXJUwb
WJ|koEkLv+IIR;NxKbLh*2~7YfR1(Di
index 7a27adf95087278c868aae43aaac9b3f78d89b85..ef3fce2dce3631e892a85158648818e47d0f0afb
GIT binary patch
literal 82
zc%17D@N?(olHy`uVBq!ia0y~yV44DCGjcEi$@eo?ZUR!0o-U3d7N?UF5`Nfsxn0zd
ia$TGu(z{5pg<<ogiQRu^H7)@vV(@hJb6Mw<&;$TEXBZ>^
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/213834-1-ref.html
@@ -0,0 +1,3 @@
+<title>Bug 213834 reftest - reference</title>
+<pre>
+text text</pre>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/213834-1.html
@@ -0,0 +1,3 @@
+<title>Bug 213834 reftest - test</title>
+<pre>
+text<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAAAAAA6fptVAAAACklEQVQI12P4DwABAQEAG7buVgAAAABJRU5ErkJggg==" height="4px" width="10px"> text</pre>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/468473-1-ref.xul
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<window title="Missing repaint when using -moz-border-image on a XUL button"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<hbox>
+<button label="Button" style="min-width: 0; -moz-appearance: none; border: medium solid; padding: 0; margin: 0; visibility:hidden; border-width: 0 8px;"/>
+<box flex="1" style="background: green" />
+</hbox>
+
+</window>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/bugs/468473-1.xul
@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<window title="Missing repaint when using -moz-border-image on a XUL button"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+<hbox>
+<button label="Button" style="min-width: 0; -moz-appearance: none; border-width: 0; padding: 0; margin: 0; visibility:hidden; -moz-border-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAARCAMAAADnhAzLAAAAsVBMVEUAAAAAAAAAAAD///////8QEBAAAAAHBwcQEBD///8GBgYAAAAAAAAAAAAAAAAODg4AAAA2NjYAAAAAAAAGBgYREREAAAAQEBAAAAA4ODiJiYkSEhIAAADExMQAAAAICAhra2stLS0ODg4JCQklJSX///8HBwcGBgb///////98fHz///////+hoaE4ODj////////e3t6np6dxcXFUVFROTk7///////////////////+i+RpeAAAAO3RSTlNKAEwHAlBRbU8Ff2heWVdcZyFPTX1MZE5VIGpIVFdOXFhVWFdaQWp4El1tIGp6YBhhjYNxbWwnVXeDhIrUVQ0AAACvSURBVHheXdDXDoJAEIXhMztL73ZRFBXE3vv7P5hrognrfzdfMjcHRJIT22q5bsuyE5ZEIIe7lecHYRj4XtVlhyA5inuNplA1G704Yglud0yBb8LstBn9uYla5ryPwRBawwFmI51GM4yFTmKMKfQUTKCnIP9/zJEVOhUZytSoi5GWWCxXNTNWywVovdnufrLbbtYEov3heDpfrtfL+XQ87OlDJG/3x/P1ej7uN6nON0ZMDbf0SRXfAAAAAElFTkSuQmCC) 0 8 / 0 8px;"/>
+<box flex="1" style="background: green" />
+</hbox>
+
+</window>
--- a/layout/reftests/bugs/reftest.list
+++ b/layout/reftests/bugs/reftest.list
@@ -133,16 +133,17 @@ fails == 25888-3r.html 25888-3r-ref.html
== 203727.html 203727-ref.html
== 206516-1.html 206516-1-ref.html
== 210094-1a.html 210094-1-ref.html
== 210094-1b.html 210094-1-ref.html
!= 210094-1c.html 210094-1-ref.html
== 210876-1.html 210876-1-ref.html
== 212563-1.html 212563-1-ref.html
== 212563-2.html 212563-2-ref.html
+== 213834-1.html 213834-1-ref.html
== 214077-1a.html 214077-1-ref.html
== 214077-1b.html 214077-1-ref.html
== 218473-1.html 218473-1-ref.html
== 223809-1.html 223809-1-ref.html
== 228856-1.html 228856-1-ref.html
== 228856-2.html 228856-2-ref.html
# == 231823-1.html 231823-1-ref.html
== 234686-1.html 234686-ref.html
@@ -991,8 +992,9 @@ fails == 461512-1.html 461512-1-ref.html
== 463952-1.html 463952-1-ref.html
== 464811-1.html 464811-1-ref.html
== 466258-1.html 466258-1-ref.html
== 466395-1.html 466395-1-ref.html
== 466395-2.html 466395-2-ref.html
== 467084-1.html 467084-1-ref.html
== 467084-2.html 467084-2-ref.html
== 467460-1.html 467460-1-ref.html
+== 468473-1.xul 468473-1-ref.xul
index b42fc158ef69f45ad728195eb1d491e9f3a083cf..a64b6a4255c9f99fd7bb87449a6d798a3c7f039d
GIT binary patch
literal 135
zc%17D@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-MC9V-A
z!TD(=<%vb93;~Imc_n&&t|1C##(D;ZGV4@afoh~YT^vI!PA8`btowi7fiXeGG~r4^
dAah$cBg3=Pl8P(8`~sQG;OXk;vd$@?2>@O)C0qai
index 9998c98b96089d6aefa11febd60f90795a81e434..5da01370015660ee34f6c45d4ce17366707177d2
GIT binary patch
literal 69
zc%17D@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}6B2&#GcYnUGTdBs
RcQa6&!PC{xWt~$(69BT94`ToT
index 144cb3b10aba99f34ec7be4261bc848632008866..917163f409c0ab4a1a75c4e86542b2c13932e771
GIT binary patch
literal 96
zc%17D@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W)ID7sLp+YZJ!{Cwz`()0;H&;x
t&1cFY3YG?@OpOi-0vs$%2e&WCVx0D-iJQ6azduk5gQu&X%Q~loCIAgL81w)D
new file mode 100644
--- /dev/null
+++ b/layout/reftests/font-face/download-2-big-otf.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en-US">
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <style type="text/css">
+
+ @font-face {
+ font-family: "MarkA";
+ src: url(../fonts/markA.otf);
+ }
+
+ body { font-family: "MarkA"; font-size: 50px; }
+
+ </style>
+</head>
+<body>
+
+<p>A</p>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/font-face/download-2-big.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en-US">
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <style type="text/css">
+
+ @font-face {
+ font-family: "MarkA";
+ src: url(../fonts/markA.ttf);
+ }
+
+ body { font-family: "MarkA"; font-size: 50px; }
+
+ </style>
+</head>
+<body>
+
+<p>A</p>
+
+</body>
+</html>
--- a/layout/reftests/font-face/reftest.list
+++ b/layout/reftests/font-face/reftest.list
@@ -1,23 +1,26 @@
# Everything here uses HTTP(..) because they use fonts in ../fonts/. We
# can't use file:/// URLs because of cross-directory access restrictions
# on file: URLs.
HTTP(..) != download-1.html download-1-notref.html
HTTP(..) == download-2.html download-2-ref.html
HTTP(..) != download-2.html about:blank
+fails-if(MOZ_WIDGET_TOOLKIT=="windows") HTTP(..) == download-2-big.html download-2-big-otf.html # bug 470713
+HTTP(..) != download-2-big-otf.html about:blank
HTTP(..) == fallback-to-system-1.html fallback-to-system-1-ref.html
HTTP(..) == name-override-simple-1.html name-override-simple-1-ref.html
HTTP(..) != name-override-simple-1.html download-1-notref.html
fails HTTP(..) == name-override-1.html name-override-1-ref.html
HTTP(..) == multiple-descriptor-1.html multiple-descriptor-1-ref.html
HTTP(..) != multiple-descriptor-1.html multiple-descriptor-1-notref.html
HTTP(..) == src-list-1.html src-list-1-ref.html
HTTP(..) == src-list-2.html src-list-2-ref.html
+fails-if(MOZ_WIDGET_TOOLKIT=="windows") HTTP(..) == src-list-2-big-otf.html src-list-2-big-ref.html # bug 470713
fails HTTP(..) == src-list-format-1.html src-list-format-1-ref.html # bug 465452
fails HTTP(..) == src-list-format-2.html src-list-format-2-ref.html # bug 465452
HTTP(..) == src-list-format-3.html src-list-format-3-ref.html
HTTP(..) == src-list-format-4.html src-list-format-1-ref.html
HTTP(..) == src-list-format-5.html src-list-format-2-ref.html
fails HTTP(..) == src-list-format-6.html src-list-format-3-ref.html # bug 465452
# FIXME: The behavior here is neither mandated nor specified by the spec, but
# it really ought to be.
new file mode 100644
--- /dev/null
+++ b/layout/reftests/font-face/src-list-2-big-otf.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en-US">
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <style type="text/css">
+
+ @font-face {
+ font-family: "One";
+ src: url(../fonts/markA.otf), url(../fonts/markB.otf);
+ }
+
+ body { font-family: "One"; font-size: 50px; }
+
+ </style>
+</head>
+<body>
+
+<p>ABC</p>
+
+</body>
+</html>
new file mode 100644
--- /dev/null
+++ b/layout/reftests/font-face/src-list-2-big-ref.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
+ "http://www.w3.org/TR/html4/strict.dtd">
+<html lang="en-US">
+<head>
+ <title></title>
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <style type="text/css">
+
+ @font-face {
+ font-family: "MarkD";
+ src: url(../fonts/markD.ttf);
+ }
+
+ body { font-family: MarkD; font-size: 50px; }
+
+ </style>
+</head>
+<body>
+
+<p>DBC</p>
+
+</body>
+</html>
new file mode 100755
--- /dev/null
+++ b/layout/reftests/fonts/README
@@ -0,0 +1,18 @@
+
+Notes about fonts in this directory
+
+Ahem.ttf - ACID3 test font
+
+markXXX.ttf and markXXX.otf
+
+These fonts are autogenerated with FontForge using the Python script mark-generate.py.
+See the comments in that file for more information on how to run the script.
+
+The markX.ttf and markX.otf fonts contain a single glyph for the X character consisting
+of three stacked boxes. The mark2X.ttf and mark2X.otf files also contain just a glyph for the
+character X but the glyph is similar to the space mark character. The markXmark2Y.ttf has
+two glyphs, the first glyph for X and the second glyph for Y.
+
+The markA.eot and markB.eot files are for EOT-related testing. The markA.eot file is just
+a copy of markA.ttf while markB.eot is a valid EOT file embedding the contents of markB.ttf
+with a null root string (so it can be used in IE without domain-specific restrictions).
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..66f5fee2e4f29f68a13d286a3d790561581f100d
GIT binary patch
literal 1528
zc%02tO=uHA6#iy^(jT?9*y6>*28*^r<0hpNN)&4~BA8ZaDdI(zBuzq-ZrG;M76e5_
zP!AsTQhMmoQ?bR1;6X%by?gAT$6mA`@#IhZW_A-5B6xI$$@|`W^WJ<j`(7Xb9KbE;
zxROjxrpDHG-vj10tw+WuPR6F3OgkX1QlCnfoH7pTd(>ZZolD=SSO{y2fNs!l<ea&3
zt;S3+KTvPY6&I&lBg^CTcT<0q&pMgCzSYCTGXJSO4XuyOo6IHsz4=mQq3a3mQGZUo
zv*@NBlrhQpR_g5~XQ7NsI8A??x;5*RvP+#k!}PBLT1(lTtJKyo#Pgrge**GuT(Lu+
zUtT|$_=0`<E-iQ$kCYlRTw5_0v{#ZZH28xt+N;_MuBmr`xu7!rJ`80suwUMmLsL=G
zb`}vohq*1PFzI@rvOn^r*g;fiG9c8}$o5C}E7KP;%rb%z-KxcLjZv9jd&nppNV%j(
z57v=jPlB3Ix&ceE^x2N^+o<2#n|d}8`gOQu)p&uX%>FX;f7tVX4^_jg7dexVufR7J
zC$weWtp$;Ffs=`i76Tt+>mhSHv7u{(Sl6Z5l;(|=kocC^5Yj%_74AAd*mX24+IBZL
zwdL>AVeP7XrA$z1GUq<#9}4$0R#jBLpV#kxePMQs>ekke5B^f@I<VIG4#zMSV8PnD
z9bgs{o(5Pa_niP6FhxgzO>~M=0S?hVA*;lYHF#M?Ni5Kg`2cII?fU`NaSkg1Hqg#%
z`q+fU&h>GK_KO&W%Z^=yhXQiQqrwX8LmK^*G1#1Oq7-*6aYvEUp)R95#>roYF$JPo
zVAL%ydWBrRV)do_t(a}ct(3b|C>9-S)b+})=Tr(V_oW!*VTLV(l;h1vfh=32z{{}F
zQ`t;mo-(PjR+RL}E~_|2$jQR6VpUJ$>q8holyjiL97%V!l61XX)`~@JYuHl9Q4S46
zqXUv)Gcr>=$-`W5D@)~ys&j31Hm0)P94}(ob~Iw!w$&_2y)$cf$fj9e8p^7n*RKxt
Rx>n!!_RPaiQvUwG_Y?g_(Ifx>
new file mode 100755
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fc6334e70d432d2bf3c9757bcac54b95f3b3f987
GIT binary patch
literal 1692
zc%02uO=w$35dQZ4$ab72aY*qchZRj*C1B-A!9f_c6uDI>M2R6mm|V)MBufuVdg4hg
zwrQcIErm9R9@>lXA;+GQ+7xohA%T{p_Z)r5(U-Uv6$)*te!FiayR8E`W*?*ZW_D+G
zc4ua_nE?K90RanYSV&B0Kuuo&4lXYU{Cf=LyL*!<{BIl~`K9Fug%Z(GQmqtJTPp-b
zKq|T1jlw{-JujW{Jn2zYf{zHxvCY1R^8SXe;8WOGC>F1muH4@J6>xW`J$?1s`E2>a
z>LeE}QZ83oe#bs;Kc#%1RH%H^lSo=?fbDSJsr%i|U_eiBA5$K$H`kWN(;HVge~R+W
zM$NDOmbx`fto&bWP%-|k`w4xi`7@1HZ*}TBd`bC7$|ss(#YYF%X+N$)Z~3boypOjy
zpQ9|>eyjHJ$>}`jZ}E1=I$^grxPw{l{{!dG>9dhilY4hRIG+C<llHDU@-Mk`Ys8a-
zO?TD0r{Xnf(l*w;!6t6#dw{!&|E9^&8iy&cO=^{u(!GOp?8Ds=eK7mh*V_Bdn2RUK
z2<u=i97wtz3rp`+>7{^zEeAQ=pjCB$4I@e#u1L+;hEAI`c}hadjxGtuL|b5P^zY!o
z(3?o?Z?2*m-N2!dJ#W}Avgl<Vx`tUV>SG`A7I??voVCHDjUl}ya6Z31=HO{|E8*_s
zw{43MTeecWO1(Xn5P#*jh0<S`N>06bVd}M{nAm;z(As#ml(ZJrB~?wODW9sRW|Oau
zs4x1@-nGB@^C$O|=s$Y&_v4s!bjNUel!rHP#bCkO`pjS!6TUatX6#Q4cHoL*2D>;R
zE*hMm{+g;1N7dkEZKbf_^RQyD#oGSLV4KyrX|RJMJZ6ktNOo?F6VzYAJVJKt8sD1$
zbu`dp1*TBJS@JAAemSBNSFLkJlb=snSw*x{zdmgOqBbxecGjYx-ss6x<*dwlUQU+6
z^`P1G<$M@*!pQFhVf(-XN9ae(ilN5V2zVGadZ|_oR$A(XR9<_UM~tqfV@fk7i8&qB
z&`m7QVg?z0Go#2+4BNe87}aYsoA%_K)Z3BI&SWw(D!{{nDRZX?U2`g_eP#5%p57bf
wTGZu1q~~SQ9v|()oD4g2@HwM7tS=qJe>AVh)xlo3hU<QQ`<p$*559Z<06zlb`Tzg`
index 144cb3b10aba99f34ec7be4261bc848632008866..917163f409c0ab4a1a75c4e86542b2c13932e771
GIT binary patch
literal 96
zc%17D@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={W)ID7sLp+YZJ!{Cwz`()0;H&;x
t&1cFY3YG?@OpOi-0vs$%2e&WCVx0D-iJQ6azduk5gQu&X%Q~loCIAgL81w)D
index bed9056cb61b959cf70e0318b1b47ec2744a5ffa..f9be106e07c93af259be3c6e70ed66f4de8f384a
GIT binary patch
literal 98
zc%17D@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={WG(BA$Lp+YZJ?qHGU?9Mx@K*lT
v)Ej>nFx<VQlddJe!NSz&pdi3u$F^KfW=GsZyGU<-pe6=SS3j3^P6<r_cp4e@
index df6590fa0429781f671fe4cb8e6cb85553fadf11..97cedba6cac41ee462562428d43343ae3e216e86
GIT binary patch
literal 99
zc%17D@N?(olHy`uVBq!ia0vp^3LwnE1SJ1Ryj={Wv^-rLLp+YZJ?qHGU?9Mx@K*lT
x)Ej>nFx)L#wNqvq7YkFPgMt7DOH=$o<}$^&hqZ<ajexosJYD@<);T3K0RX+A8`J;*
index a91d31a838e20b490f68a7444147a9494304300f..466588ade136851e2cdafae95489b693e3a02e32
GIT binary patch
literal 378
zc$@)x0fqjFP)<h;3K|Lk000e1NJLTq000UA000UI0ssI20#I1$0003&Nkl<Z7}EhZ
z0m=RV+)_+cNFOG+bBw-xPJjOXRhOrJBr@prQt31YTde?yYNf#ht__O@cSu49T%lss
zX-uDn%Il+eH0nJnxBw0*W)aUP%v+HvDdEU+<>wEvRH~3IH={5nlfKeB0FGN467!05
zjM7-Gue>ZFucLTl(y}pOm2x7XV~TwM7!IrvwgV27UDU)KvV8PKo`E$%1{8Y|%Ql0{
zl#c-W<@}T`F8%k!uDW;#1`2<U0EI5pTcEROY-G{_>HuCJ9j(#e>=_gLiIYWN9vg$)
z)E%0&RDrC|{JJ8u0IjKWE(cn()e&E9a2ZOHfH~j(GctA@Odw2n!_@5n@Q^;Xavk?}
zare!Ijr6`H6DudmGvNBRgT2o1c=-SjU)LsLJeBb>?lOJIll$Tlkspx;IIdJN;jiBM
YS$Qy$-)b>l4gdfE07*qoM6N<$f=u?I&j0`b
index 9ac1548c8a68bc2031d7c3a89a7a1c5f8bdde7ba..1b019db984c730737f779ba17e5ed5f00987ce4e
GIT binary patch
literal 13153
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
Hu0mjfVtd}N
--- a/layout/style/nsCSSDeclaration.cpp
+++ b/layout/style/nsCSSDeclaration.cpp
@@ -54,40 +54,16 @@
#include "nsFont.h"
#include "nsReadableUtils.h"
#include "nsStyleUtil.h"
#include "nsStyleConsts.h"
#include "nsCOMPtr.h"
-#define B_BORDER_TOP_STYLE 0x001
-#define B_BORDER_LEFT_STYLE 0x002
-#define B_BORDER_RIGHT_STYLE 0x004
-#define B_BORDER_BOTTOM_STYLE 0x008
-#define B_BORDER_TOP_COLOR 0x010
-#define B_BORDER_LEFT_COLOR 0x020
-#define B_BORDER_RIGHT_COLOR 0x040
-#define B_BORDER_BOTTOM_COLOR 0x080
-#define B_BORDER_TOP_WIDTH 0x100
-#define B_BORDER_LEFT_WIDTH 0x200
-#define B_BORDER_RIGHT_WIDTH 0x400
-#define B_BORDER_BOTTOM_WIDTH 0x800
-
-#define B_BORDER_STYLE 0x00f
-#define B_BORDER_COLOR 0x0f0
-#define B_BORDER_WIDTH 0xf00
-
-#define B_BORDER_TOP 0x111
-#define B_BORDER_LEFT 0x222
-#define B_BORDER_RIGHT 0x444
-#define B_BORDER_BOTTOM 0x888
-
-#define B_BORDER 0xfff
-
nsCSSDeclaration::nsCSSDeclaration()
: mData(nsnull),
mImportantData(nsnull)
{
// check that we can fit all the CSS properties into a PRUint8
// for the mOrder array - if not, might need to use PRUint16!
PR_STATIC_ASSERT(eCSSProperty_COUNT_no_shorthands - 1 <= PR_UINT8_MAX);
@@ -616,56 +592,76 @@ nsCSSDeclaration::GetValue(nsCSSProperty
aValue);
return NS_OK;
}
if (initialCount != 0 || inheritCount != 0) {
// Case (2): partially initial or inherit.
return NS_OK;
}
-
- // XXX What about checking the consistency of '!important'?
- // XXX What about checking that we don't serialize inherit,
- // -moz-initial, or other illegal values?
- // XXXldb Can we share shorthand logic with ToString?
+ nsCSSCompressedDataBlock *data = importantCount ? mImportantData : mData;
switch (aProperty) {
case eCSSProperty_margin:
case eCSSProperty_padding:
case eCSSProperty_border_color:
case eCSSProperty_border_style:
case eCSSProperty_border_width: {
const nsCSSProperty* subprops =
nsCSSProps::SubpropertyEntryFor(aProperty);
NS_ASSERTION(nsCSSProps::kTypeTable[subprops[0]] == eCSSType_Value &&
nsCSSProps::kTypeTable[subprops[1]] == eCSSType_Value &&
nsCSSProps::kTypeTable[subprops[2]] == eCSSType_Value &&
nsCSSProps::kTypeTable[subprops[3]] == eCSSType_Value,
"type mismatch");
- if (!AppendValueToString(subprops[0], aValue) ||
- !(aValue.Append(PRUnichar(' ')),
- AppendValueToString(subprops[1], aValue)) ||
- !(aValue.Append(PRUnichar(' ')),
- AppendValueToString(subprops[2], aValue)) ||
- !(aValue.Append(PRUnichar(' ')),
- AppendValueToString(subprops[3], aValue))) {
- aValue.Truncate();
+ NS_ASSERTION(nsCSSProps::GetStringValue(subprops[0]).Find("-top") !=
+ kNotFound, "first subprop must be top");
+ NS_ASSERTION(nsCSSProps::GetStringValue(subprops[1]).Find("-right") !=
+ kNotFound, "second subprop must be right");
+ NS_ASSERTION(nsCSSProps::GetStringValue(subprops[2]).Find("-bottom") !=
+ kNotFound, "third subprop must be bottom");
+ NS_ASSERTION(nsCSSProps::GetStringValue(subprops[3]).Find("-left") !=
+ kNotFound, "fourth subprop must be left");
+ const nsCSSValue &topValue =
+ *static_cast<const nsCSSValue*>(data->StorageFor(subprops[0]));
+ const nsCSSValue &rightValue =
+ *static_cast<const nsCSSValue*>(data->StorageFor(subprops[1]));
+ const nsCSSValue &bottomValue =
+ *static_cast<const nsCSSValue*>(data->StorageFor(subprops[2]));
+ const nsCSSValue &leftValue =
+ *static_cast<const nsCSSValue*>(data->StorageFor(subprops[3]));
+ PRBool haveValue;
+ haveValue = AppendCSSValueToString(subprops[0], topValue, aValue);
+ NS_ASSERTION(haveValue, "should have bailed before");
+ if (topValue != rightValue || topValue != leftValue ||
+ topValue != bottomValue) {
+ aValue.Append(PRUnichar(' '));
+ haveValue = AppendCSSValueToString(subprops[1], rightValue, aValue);
+ NS_ASSERTION(haveValue, "should have bailed before");
+ if (topValue != bottomValue || rightValue != leftValue) {
+ aValue.Append(PRUnichar(' '));
+ haveValue = AppendCSSValueToString(subprops[2], bottomValue, aValue);
+ NS_ASSERTION(haveValue, "should have bailed before");
+ if (rightValue != leftValue) {
+ aValue.Append(PRUnichar(' '));
+ haveValue = AppendCSSValueToString(subprops[3], leftValue, aValue);
+ NS_ASSERTION(haveValue, "should have bailed before");
+ }
+ }
}
break;
}
case eCSSProperty__moz_border_radius:
case eCSSProperty__moz_outline_radius: {
const nsCSSProperty* subprops =
nsCSSProps::SubpropertyEntryFor(aProperty);
NS_ASSERTION(nsCSSProps::kTypeTable[subprops[0]] == eCSSType_ValuePair &&
nsCSSProps::kTypeTable[subprops[1]] == eCSSType_ValuePair &&
nsCSSProps::kTypeTable[subprops[2]] == eCSSType_ValuePair &&
nsCSSProps::kTypeTable[subprops[3]] == eCSSType_ValuePair,
"type mismatch");
- nsCSSCompressedDataBlock *data = GetValueIsImportant(aProperty)
- ? mImportantData : mData;
const nsCSSValuePair* vals[4] = {
static_cast<const nsCSSValuePair*>(data->StorageFor(subprops[0])),
static_cast<const nsCSSValuePair*>(data->StorageFor(subprops[1])),
static_cast<const nsCSSValuePair*>(data->StorageFor(subprops[2])),
static_cast<const nsCSSValuePair*>(data->StorageFor(subprops[3]))
};
AppendCSSValueToString(aProperty, vals[0]->mXValue, aValue);
@@ -688,38 +684,75 @@ nsCSSDeclaration::GetValue(nsCSSProperty
AppendCSSValueToString(aProperty, vals[1]->mYValue, aValue);
aValue.Append(PRUnichar(' '));
AppendCSSValueToString(aProperty, vals[2]->mYValue, aValue);
aValue.Append(PRUnichar(' '));
AppendCSSValueToString(aProperty, vals[3]->mYValue, aValue);
}
break;
}
- case eCSSProperty_border:
- // XXX More consistency checking needed before falling through.
+ case eCSSProperty_border: {
+ const nsCSSProperty* subproptables[3] = {
+ nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_color),
+ nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_style),
+ nsCSSProps::SubpropertyEntryFor(eCSSProperty_border_width)
+ };
+ PRBool match = PR_TRUE;
+ for (const nsCSSProperty** subprops = subproptables,
+ **subprops_end = subproptables + NS_ARRAY_LENGTH(subproptables);
+ subprops < subprops_end; ++subprops) {
+ // Check only the first four subprops in each table, since the
+ // others are extras for dimensional box properties.
+ const nsCSSValue *firstSide =
+ static_cast<const nsCSSValue*>(data->StorageFor((*subprops)[0]));
+ for (PRInt32 side = 1; side < 4; ++side) {
+ const nsCSSValue *otherSide =
+ static_cast<const nsCSSValue*>(data->StorageFor((*subprops)[side]));
+ if (*firstSide != *otherSide)
+ match = PR_FALSE;
+ }
+ }
+ if (!match) {
+ // We can't express what we have in the border shorthand
+ break;
+ }
+ // tweak aProperty and fall through
aProperty = eCSSProperty_border_top;
+ }
case eCSSProperty_border_top:
case eCSSProperty_border_right:
case eCSSProperty_border_bottom:
case eCSSProperty_border_left:
case eCSSProperty_border_start:
case eCSSProperty_border_end:
case eCSSProperty__moz_column_rule:
case eCSSProperty_outline: {
const nsCSSProperty* subprops =
nsCSSProps::SubpropertyEntryFor(aProperty);
NS_ASSERTION(nsCSSProps::kTypeTable[subprops[0]] == eCSSType_Value &&
nsCSSProps::kTypeTable[subprops[1]] == eCSSType_Value &&
nsCSSProps::kTypeTable[subprops[2]] == eCSSType_Value,
"type mismatch");
+ NS_ASSERTION(StringEndsWith(nsCSSProps::GetStringValue(subprops[2]),
+ NS_LITERAL_CSTRING("-color")) ||
+ StringEndsWith(nsCSSProps::GetStringValue(subprops[2]),
+ NS_LITERAL_CSTRING("-color-value")),
+ "third subprop must be the color property");
+ const nsCSSValue *colorValue =
+ static_cast<const nsCSSValue*>(data->StorageFor(subprops[2]));
+ PRBool isMozUseTextColor =
+ colorValue->GetUnit() == eCSSUnit_Enumerated &&
+ colorValue->GetIntValue() == NS_STYLE_COLOR_MOZ_USE_TEXT_COLOR;
if (!AppendValueToString(subprops[0], aValue) ||
!(aValue.Append(PRUnichar(' ')),
AppendValueToString(subprops[1], aValue)) ||
- !(aValue.Append(PRUnichar(' ')),
- AppendValueToString(subprops[2], aValue))) {
+ // Don't output a third value when it's -moz-use-text-color.
+ !(isMozUseTextColor ||
+ (aValue.Append(PRUnichar(' ')),
+ AppendValueToString(subprops[2], aValue)))) {
aValue.Truncate();
}
break;
}
case eCSSProperty_margin_left:
case eCSSProperty_margin_right:
case eCSSProperty_margin_start:
case eCSSProperty_margin_end:
@@ -742,16 +775,36 @@ nsCSSDeclaration::GetValue(nsCSSProperty
const nsCSSProperty* subprops =
nsCSSProps::SubpropertyEntryFor(aProperty);
NS_ASSERTION(subprops[3] == eCSSProperty_UNKNOWN,
"not box property with physical vs. logical cascading");
AppendValueToString(subprops[0], aValue);
break;
}
case eCSSProperty_background: {
+ // The -moz-background-clip, -moz-background-origin, and
+ // -moz-background-inline-policy properties are reset by this
+ // shorthand property to their initial values, but can't be
+ // represented in its syntax.
+ const nsCSSValue *clipValue = static_cast<const nsCSSValue*>(
+ data->StorageFor(eCSSProperty__moz_background_clip));
+ const nsCSSValue *originValue = static_cast<const nsCSSValue*>(
+ data->StorageFor(eCSSProperty__moz_background_origin));
+ const nsCSSValue *inlinePolicyValue = static_cast<const nsCSSValue*>(
+ data->StorageFor(eCSSProperty__moz_background_inline_policy));
+ if (*clipValue !=
+ nsCSSValue(NS_STYLE_BG_CLIP_BORDER, eCSSUnit_Enumerated) ||
+ *originValue !=
+ nsCSSValue(NS_STYLE_BG_ORIGIN_PADDING, eCSSUnit_Enumerated) ||
+ *inlinePolicyValue !=
+ nsCSSValue(NS_STYLE_BG_INLINE_POLICY_CONTINUOUS,
+ eCSSUnit_Enumerated)) {
+ return NS_OK;
+ }
+
PRBool appendedSomething = PR_FALSE;
if (AppendValueToString(eCSSProperty_background_color, aValue)) {
appendedSomething = PR_TRUE;
aValue.Append(PRUnichar(' '));
}
if (AppendValueToString(eCSSProperty_background_image, aValue)) {
aValue.Append(PRUnichar(' '));
appendedSomething = PR_TRUE;
@@ -790,16 +843,28 @@ nsCSSDeclaration::GetValue(nsCSSProperty
GetValueOrImportantValue(eCSSProperty_font_size, size);
GetValueOrImportantValue(eCSSProperty_line_height, lh);
GetValueOrImportantValue(eCSSProperty_font_family, family);
if (systemFont.GetUnit() != eCSSUnit_None &&
systemFont.GetUnit() != eCSSUnit_Null) {
AppendCSSValueToString(eCSSProperty__x_system_font, systemFont, aValue);
} else {
+ // The font-stretch and font-size-adjust
+ // properties are reset by this shorthand property to their
+ // initial values, but can't be represented in its syntax.
+ const nsCSSValue *stretchValue = static_cast<const nsCSSValue*>(
+ data->StorageFor(eCSSProperty_font_stretch));
+ const nsCSSValue *sizeAdjustValue = static_cast<const nsCSSValue*>(
+ data->StorageFor(eCSSProperty_font_size_adjust));
+ if (*stretchValue != nsCSSValue(eCSSUnit_Normal) ||
+ *sizeAdjustValue != nsCSSValue(eCSSUnit_None)) {
+ return NS_OK;
+ }
+
if (style.GetUnit() != eCSSUnit_Normal) {
AppendCSSValueToString(eCSSProperty_font_style, style, aValue);
aValue.Append(PRUnichar(' '));
}
if (variant.GetUnit() != eCSSUnit_Normal) {
AppendCSSValueToString(eCSSProperty_font_variant, variant, aValue);
aValue.Append(PRUnichar(' '));
}
@@ -824,17 +889,17 @@ nsCSSDeclaration::GetValue(nsCSSProperty
aValue.Append(PRUnichar(' '));
AppendValueToString(eCSSProperty_list_style_image, aValue);
break;
case eCSSProperty_overflow: {
nsCSSValue xValue, yValue;
GetValueOrImportantValue(eCSSProperty_overflow_x, xValue);
GetValueOrImportantValue(eCSSProperty_overflow_y, yValue);
if (xValue == yValue)
- AppendValueToString(eCSSProperty_overflow_x, aValue);
+ AppendCSSValueToString(eCSSProperty_overflow_x, xValue, aValue);
break;
}
case eCSSProperty_pause: {
if (AppendValueToString(eCSSProperty_pause_before, aValue)) {
aValue.Append(PRUnichar(' '));
if (!AppendValueToString(eCSSProperty_pause_after, aValue))
aValue.Truncate();
}
@@ -885,701 +950,95 @@ nsCSSDeclaration::GetValueIsImportant(ns
}
}
return PR_TRUE;
}
return mImportantData->StorageFor(aProperty) != nsnull;
}
-// XXXldb Bug 376075 All callers of AllPropertiesSameImportance also
-// need to check for 'inherit' and 'initial' values, since you can't
-// output a mix of either mixed with other values in the same shorthand!
-PRBool
-nsCSSDeclaration::AllPropertiesSameImportance(PRInt32 aFirst, PRInt32 aSecond,
- PRInt32 aThird, PRInt32 aFourth,
- PRInt32 aFifth,
- PRBool & aImportance) const
-{
- aImportance = GetValueIsImportant(OrderValueAt(aFirst-1));
- if ((aSecond && aImportance != GetValueIsImportant(OrderValueAt(aSecond-1))) ||
- (aThird && aImportance != GetValueIsImportant(OrderValueAt(aThird-1))) ||
- (aFourth && aImportance != GetValueIsImportant(OrderValueAt(aFourth-1))) ||
- (aFifth && aImportance != GetValueIsImportant(OrderValueAt(aFifth-1)))) {
- return PR_FALSE;
- }
- return PR_TRUE;
-}
-
-PRBool
-nsCSSDeclaration::AllPropertiesSameValue(PRInt32 aFirst, PRInt32 aSecond,
- PRInt32 aThird, PRInt32 aFourth) const
-{
- nsCSSValue firstValue, otherValue;
- // TryBorderShorthand does the bounds-checking for us; valid values there
- // are > 0; 0 is a flag for "not set". We here are passed the actual
- // index, which comes from finding the value in the mOrder property array.
- // Of course, re-getting the mOrder value here is pretty silly.
- GetValueOrImportantValue(OrderValueAt(aFirst-1), firstValue);
- GetValueOrImportantValue(OrderValueAt(aSecond-1), otherValue);
- if (firstValue != otherValue) {
- return PR_FALSE;
- }
- GetValueOrImportantValue(OrderValueAt(aThird-1), otherValue);
- if (firstValue != otherValue) {
- return PR_FALSE;
- }
- GetValueOrImportantValue(OrderValueAt(aFourth-1), otherValue);
- if (firstValue != otherValue) {
- return PR_FALSE;
- }
- return PR_TRUE;
-}
-
/* static */ void
nsCSSDeclaration::AppendImportanceToString(PRBool aIsImportant,
nsAString& aString)
{
if (aIsImportant) {
aString.AppendLiteral(" ! important");
}
}
void
nsCSSDeclaration::AppendPropertyAndValueToString(nsCSSProperty aProperty,
- nsCSSProperty aPropertyName,
+ nsAutoString& aValue,
nsAString& aResult) const
{
- NS_ASSERTION(0 <= aProperty && aProperty < eCSSProperty_COUNT_no_shorthands,
+ NS_ASSERTION(0 <= aProperty && aProperty < eCSSProperty_COUNT,
"property enum out of range");
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(aPropertyName), aResult);
+ NS_ASSERTION((aProperty < eCSSProperty_COUNT_no_shorthands) ==
+ aValue.IsEmpty(),
+ "aValue should be given for shorthands but not longhands");
+ AppendASCIItoUTF16(nsCSSProps::GetStringValue(aProperty), aResult);
aResult.AppendLiteral(": ");
- AppendValueToString(aProperty, aResult);
+ if (aValue.IsEmpty())
+ AppendValueToString(aProperty, aResult);
+ else
+ aResult.Append(aValue);
PRBool isImportant = GetValueIsImportant(aProperty);
AppendImportanceToString(isImportant, aResult);
aResult.AppendLiteral("; ");
}
-PRBool
-nsCSSDeclaration::TryBorderShorthand(nsAString & aString, PRUint32 aPropertiesSet,
- PRInt32 aBorderTopWidth,
- PRInt32 aBorderTopStyle,
- PRInt32 aBorderTopColor,
- PRInt32 aBorderBottomWidth,
- PRInt32 aBorderBottomStyle,
- PRInt32 aBorderBottomColor,
- PRInt32 aBorderLeftWidth,
- PRInt32 aBorderLeftStyle,
- PRInt32 aBorderLeftColor,
- PRInt32 aBorderRightWidth,
- PRInt32 aBorderRightStyle,
- PRInt32 aBorderRightColor) const
-{
- PRBool border = PR_FALSE, isImportant = PR_FALSE;
- // 0 means not in the mOrder array; otherwise it's index+1
- if (B_BORDER == aPropertiesSet
- && AllPropertiesSameValue(aBorderTopWidth, aBorderBottomWidth,
- aBorderLeftWidth, aBorderRightWidth)
- && AllPropertiesSameValue(aBorderTopStyle, aBorderBottomStyle,
- aBorderLeftStyle, aBorderRightStyle)
- && AllPropertiesSameValue(aBorderTopColor, aBorderBottomColor,
- aBorderLeftColor, aBorderRightColor)) {
- border = PR_TRUE;
- }
- if (border) {
- border = PR_FALSE;
- PRBool isWidthImportant, isStyleImportant, isColorImportant;
- if (AllPropertiesSameImportance(aBorderTopWidth, aBorderBottomWidth,
- aBorderLeftWidth, aBorderRightWidth,
- 0,
- isWidthImportant) &&
- AllPropertiesSameImportance(aBorderTopStyle, aBorderBottomStyle,
- aBorderLeftStyle, aBorderRightStyle,
- 0,
- isStyleImportant) &&
- AllPropertiesSameImportance(aBorderTopColor, aBorderBottomColor,
- aBorderLeftColor, aBorderRightColor,
- 0,
- isColorImportant)) {
- if (isWidthImportant == isStyleImportant && isWidthImportant == isColorImportant) {
- border = PR_TRUE;
- isImportant = isWidthImportant;
- }
- }
- }
- if (border) {
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(eCSSProperty_border), aString);
- aString.AppendLiteral(": ");
-
- AppendValueToString(eCSSProperty_border_top_width, aString);
- aString.Append(PRUnichar(' '));
-
- AppendValueToString(eCSSProperty_border_top_style, aString);
- aString.Append(PRUnichar(' '));
-
- nsAutoString valueString;
- AppendValueToString(eCSSProperty_border_top_color, valueString);
- if (!valueString.EqualsLiteral("-moz-use-text-color")) {
- /* don't output this value, it's proprietary Mozilla and */
- /* not intended to be exposed ; we can remove it from the */
- /* values of the shorthand since this value represents the */
- /* initial value of border-*-color */
- aString.Append(valueString);
- }
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- }
- return border;
-}
-
-PRBool
-nsCSSDeclaration::TryBorderSideShorthand(nsAString & aString,
- nsCSSProperty aShorthand,
- PRInt32 aBorderWidth,
- PRInt32 aBorderStyle,
- PRInt32 aBorderColor) const
-{
- PRBool isImportant;
- if (AllPropertiesSameImportance(aBorderWidth, aBorderStyle, aBorderColor,
- 0, 0,
- isImportant)) {
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(aShorthand), aString);
- aString.AppendLiteral(": ");
-
- AppendValueToString(OrderValueAt(aBorderWidth-1), aString);
-
- aString.Append(PRUnichar(' '));
- AppendValueToString(OrderValueAt(aBorderStyle-1), aString);
-
- nsAutoString valueString;
- AppendValueToString(OrderValueAt(aBorderColor-1), valueString);
- if (!valueString.EqualsLiteral("-moz-use-text-color")) {
- aString.AppendLiteral(" ");
- aString.Append(valueString);
- }
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- return PR_TRUE;
- }
- return PR_FALSE;
-}
-
-PRBool
-nsCSSDeclaration::TryFourSidesShorthand(nsAString & aString,
- nsCSSProperty aShorthand,
- PRInt32 & aTop,
- PRInt32 & aBottom,
- PRInt32 & aLeft,
- PRInt32 & aRight,
- PRBool aClearIndexes) const
-{
- // 0 means not in the mOrder array; otherwise it's index+1
- PRBool isImportant;
- if (aTop && aBottom && aLeft && aRight &&
- AllPropertiesSameImportance(aTop, aBottom, aLeft, aRight,
- 0,
- isImportant)) {
- // all 4 properties are set, we can output a shorthand
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(aShorthand), aString);
- aString.AppendLiteral(": ");
- nsCSSValue topValue, bottomValue, leftValue, rightValue;
- nsCSSProperty topProp = OrderValueAt(aTop-1);
- nsCSSProperty bottomProp = OrderValueAt(aBottom-1);
- nsCSSProperty leftProp = OrderValueAt(aLeft-1);
- nsCSSProperty rightProp = OrderValueAt(aRight-1);
- GetValueOrImportantValue(topProp, topValue);
- GetValueOrImportantValue(bottomProp, bottomValue);
- GetValueOrImportantValue(leftProp, leftValue);
- GetValueOrImportantValue(rightProp, rightValue);
- AppendCSSValueToString(topProp, topValue, aString);
- if (topValue != rightValue || topValue != leftValue || topValue != bottomValue) {
- aString.Append(PRUnichar(' '));
- AppendCSSValueToString(rightProp, rightValue, aString);
- if (topValue != bottomValue || rightValue != leftValue) {
- aString.Append(PRUnichar(' '));
- AppendCSSValueToString(bottomProp, bottomValue, aString);
- if (rightValue != leftValue) {
- aString.Append(PRUnichar(' '));
- AppendCSSValueToString(leftProp, leftValue, aString);
- }
- }
- }
- if (aClearIndexes) {
- aTop = 0; aBottom = 0; aLeft = 0; aRight = 0;
- }
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- return PR_TRUE;
- }
- return PR_FALSE;
-}
-
-void
-nsCSSDeclaration::TryBackgroundShorthand(nsAString & aString,
- PRInt32 & aBgColor,
- PRInt32 & aBgImage,
- PRInt32 & aBgRepeat,
- PRInt32 & aBgAttachment,
- PRInt32 & aBgPosition) const
-{
- // 0 means not in the mOrder array; otherwise it's index+1
- // check if we have at least two properties set; otherwise, no need to
- // use a shorthand
- PRBool isImportant;
- if (aBgColor && aBgImage && aBgRepeat && aBgAttachment && aBgPosition &&
- AllPropertiesSameImportance(aBgColor, aBgImage, aBgRepeat, aBgAttachment,
- aBgPosition, isImportant)) {
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(eCSSProperty_background), aString);
- aString.AppendLiteral(": ");
-
- AppendValueToString(eCSSProperty_background_color, aString);
- aBgColor = 0;
-
- aString.Append(PRUnichar(' '));
- AppendValueToString(eCSSProperty_background_image, aString);
- aBgImage = 0;
-
- aString.Append(PRUnichar(' '));
- AppendValueToString(eCSSProperty_background_repeat, aString);
- aBgRepeat = 0;
-
- aString.Append(PRUnichar(' '));
- AppendValueToString(eCSSProperty_background_attachment, aString);
- aBgAttachment = 0;
-
- aString.Append(PRUnichar(' '));
- AppendValueToString(eCSSProperty_background_position, aString);
- aBgPosition = 0;
-
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- }
-}
-
-void
-nsCSSDeclaration::TryOverflowShorthand(nsAString & aString,
- PRInt32 & aOverflowX,
- PRInt32 & aOverflowY) const
-{
- PRBool isImportant;
- if (aOverflowX && aOverflowY &&
- AllPropertiesSameImportance(aOverflowX, aOverflowY,
- 0, 0, 0, isImportant)) {
- nsCSSValue xValue, yValue;
- GetValueOrImportantValue(eCSSProperty_overflow_x, xValue);
- GetValueOrImportantValue(eCSSProperty_overflow_y, yValue);
- if (xValue == yValue) {
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(eCSSProperty_overflow),
- aString);
- aString.AppendLiteral(": ");
-
- AppendCSSValueToString(eCSSProperty_overflow_x, xValue, aString);
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- aOverflowX = aOverflowY = 0;
- }
- }
-}
-
-#ifdef MOZ_SVG
-void
-nsCSSDeclaration::TryMarkerShorthand(nsAString & aString,
- PRInt32 & aMarkerEnd,
- PRInt32 & aMarkerMid,
- PRInt32 & aMarkerStart) const
-{
- PRBool isImportant;
- if (aMarkerEnd && aMarkerMid && aMarkerEnd &&
- AllPropertiesSameImportance(aMarkerEnd, aMarkerMid, aMarkerStart,
- 0, 0, isImportant)) {
- nsCSSValue endValue, midValue, startValue;
- GetValueOrImportantValue(eCSSProperty_marker_end, endValue);
- GetValueOrImportantValue(eCSSProperty_marker_mid, midValue);
- GetValueOrImportantValue(eCSSProperty_marker_start, startValue);
- if (endValue == midValue && midValue == startValue) {
- AppendASCIItoUTF16(nsCSSProps::GetStringValue(eCSSProperty_marker),
- aString);
- aString.AppendLiteral(": ");
-
- AppendCSSValueToString(eCSSProperty_marker_end, endValue, aString);
- AppendImportanceToString(isImportant, aString);
- aString.AppendLiteral("; ");
- aMarkerEnd = aMarkerMid = aMarkerStart = 0;
- }
- }
-}
-#endif
-
-#define NS_CASE_OUTPUT_PROPERTY_VALUE(_prop, _index) \
-case _prop: \
- if (_index) { \
- AppendPropertyAndValueToString(property, aString); \
- _index = 0; \
- } \
- break;
-
-#define NS_CASE_OUTPUT_PROPERTY_VALUE_AS(_prop, _propas, _index) \
-case _prop: \
- if (_index) { \
- AppendPropertyAndValueToString(property, _propas, aString); \
- _index = 0; \
- } \
- break;
-
-#define NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(_condition, _prop, _index) \
-case _prop: \
- if ((_condition) && _index) { \
- AppendPropertyAndValueToString(property, aString); \
- _index = 0; \
- } \
- break;
-
-#define NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(_condition, _prop, _propas, _index) \
-case _prop: \
- if ((_condition) && _index) { \
- AppendPropertyAndValueToString(property, _propas, aString); \
- _index = 0; \
- } \
- break;
-
-void nsCSSDeclaration::PropertyIsSet(PRInt32 & aPropertyIndex, PRInt32 aIndex, PRUint32 & aSet, PRUint32 aValue) const
-{
- aPropertyIndex = aIndex + 1;
- aSet |= aValue;
-}
-
nsresult
nsCSSDeclaration::ToString(nsAString& aString) const
{
PRInt32 count = mOrder.Length();
PRInt32 index;
- // 0 means not in the mOrder array; otherwise it's index+1
- PRInt32 borderTopWidth = 0, borderTopStyle = 0, borderTopColor = 0;
- PRInt32 borderBottomWidth = 0, borderBottomStyle = 0, borderBottomColor = 0;
- PRInt32 borderLeftWidth = 0, borderLeftStyle = 0, borderLeftColor = 0;
- PRInt32 borderRightWidth = 0, borderRightStyle = 0, borderRightColor = 0;
- PRInt32 borderStartWidth = 0, borderStartStyle = 0, borderStartColor = 0;
- PRInt32 borderEndWidth = 0, borderEndStyle = 0, borderEndColor = 0;
- PRInt32 marginTop = 0, marginBottom = 0, marginLeft = 0, marginRight = 0;
- PRInt32 paddingTop = 0, paddingBottom = 0, paddingLeft = 0, paddingRight = 0;
- PRInt32 bgColor = 0, bgImage = 0, bgRepeat = 0, bgAttachment = 0;
- PRInt32 bgPosition = 0;
- PRInt32 overflowX = 0, overflowY = 0;
- PRInt32 columnRuleWidth = 0, columnRuleStyle = 0, columnRuleColor = 0;
- PRUint32 borderPropertiesSet = 0, finalBorderPropertiesToSet = 0;
-#ifdef MOZ_SVG
- PRInt32 markerEnd = 0, markerMid = 0, markerStart = 0;
-#endif
-
+ nsAutoTArray<nsCSSProperty, 16> shorthandsUsed;
for (index = 0; index < count; index++) {
nsCSSProperty property = OrderValueAt(index);
- switch (property) {
- case eCSSProperty_border_top_width:
- PropertyIsSet(borderTopWidth, index, borderPropertiesSet, B_BORDER_TOP_WIDTH);
- break;
- case eCSSProperty_border_bottom_width:
- PropertyIsSet(borderBottomWidth, index, borderPropertiesSet, B_BORDER_BOTTOM_WIDTH);
- break;
- case eCSSProperty_border_left_width_value:
- PropertyIsSet(borderLeftWidth, index, borderPropertiesSet, B_BORDER_LEFT_WIDTH);
- break;
- case eCSSProperty_border_right_width_value:
- PropertyIsSet(borderRightWidth, index, borderPropertiesSet, B_BORDER_RIGHT_WIDTH);
- break;
- case eCSSProperty_border_start_width_value:
- borderStartWidth = index+1;
- break;
- case eCSSProperty_border_end_width_value:
- borderEndWidth = index+1;
- break;
-
- case eCSSProperty_border_top_style:
- PropertyIsSet(borderTopStyle, index, borderPropertiesSet, B_BORDER_TOP_STYLE);
- break;
- case eCSSProperty_border_bottom_style:
- PropertyIsSet(borderBottomStyle, index, borderPropertiesSet, B_BORDER_BOTTOM_STYLE);
- break;
- case eCSSProperty_border_left_style_value:
- PropertyIsSet(borderLeftStyle, index, borderPropertiesSet, B_BORDER_LEFT_STYLE);
- break;
- case eCSSProperty_border_right_style_value:
- PropertyIsSet(borderRightStyle, index, borderPropertiesSet, B_BORDER_RIGHT_STYLE);
- break;
- case eCSSProperty_border_start_style_value:
- borderStartStyle = index+1;
- break;
- case eCSSProperty_border_end_style_value:
- borderEndStyle = index+1;
- break;
-
- case eCSSProperty_border_top_color:
- PropertyIsSet(borderTopColor, index, borderPropertiesSet, B_BORDER_TOP_COLOR);
- break;
- case eCSSProperty_border_bottom_color:
- PropertyIsSet(borderBottomColor, index, borderPropertiesSet, B_BORDER_BOTTOM_COLOR);
- break;
- case eCSSProperty_border_left_color_value:
- PropertyIsSet(borderLeftColor, index, borderPropertiesSet, B_BORDER_LEFT_COLOR);
- break;
- case eCSSProperty_border_right_color_value:
- PropertyIsSet(borderRightColor, index, borderPropertiesSet, B_BORDER_RIGHT_COLOR);
- break;
- case eCSSProperty_border_start_color_value:
- borderStartColor = index+1;
- break;
- case eCSSProperty_border_end_color_value:
- borderEndColor = index+1;
- break;
-
- case eCSSProperty_margin_top: marginTop = index+1; break;
- case eCSSProperty_margin_bottom: marginBottom = index+1; break;
- case eCSSProperty_margin_left_value: marginLeft = index+1; break;
- case eCSSProperty_margin_right_value: marginRight = index+1; break;
-
- case eCSSProperty_padding_top: paddingTop = index+1; break;
- case eCSSProperty_padding_bottom: paddingBottom = index+1; break;
- case eCSSProperty_padding_left_value: paddingLeft = index+1; break;
- case eCSSProperty_padding_right_value: paddingRight = index+1; break;
+ PRBool doneProperty = PR_FALSE;
- case eCSSProperty_background_color: bgColor = index+1; break;
- case eCSSProperty_background_image: bgImage = index+1; break;
- case eCSSProperty_background_repeat: bgRepeat = index+1; break;
- case eCSSProperty_background_attachment: bgAttachment = index+1; break;
- case eCSSProperty_background_position: bgPosition = index+1; break;
-
- case eCSSProperty_overflow_x: overflowX = index+1; break;
- case eCSSProperty_overflow_y: overflowY = index+1; break;
-
- case eCSSProperty__moz_column_rule_width: columnRuleWidth = index+1; break;
- case eCSSProperty__moz_column_rule_style: columnRuleStyle = index+1; break;
- case eCSSProperty__moz_column_rule_color: columnRuleColor = index+1; break;
-
-#ifdef MOZ_SVG
- case eCSSProperty_marker_end: markerEnd = index+1; break;
- case eCSSProperty_marker_mid: markerMid = index+1; break;
- case eCSSProperty_marker_start: markerStart = index+1; break;
-#endif
-
- default: break;
- }
- }
-
- if (!TryBorderShorthand(aString, borderPropertiesSet,
- borderTopWidth, borderTopStyle, borderTopColor,
- borderBottomWidth, borderBottomStyle, borderBottomColor,
- borderLeftWidth, borderLeftStyle, borderLeftColor,
- borderRightWidth, borderRightStyle, borderRightColor)) {
- PRUint32 borderPropertiesToSet = 0;
- if ((borderPropertiesSet & B_BORDER_STYLE) != B_BORDER_STYLE ||
- !TryFourSidesShorthand(aString, eCSSProperty_border_style,
- borderTopStyle, borderBottomStyle,
- borderLeftStyle, borderRightStyle,
- PR_FALSE)) {
- borderPropertiesToSet |= B_BORDER_STYLE;
+ // If we already used this property in a shorthand, skip it.
+ if (shorthandsUsed.Length() > 0) {
+ for (const nsCSSProperty *shorthands =
+ nsCSSProps::ShorthandsContaining(property);
+ *shorthands != eCSSProperty_UNKNOWN; ++shorthands) {
+ if (shorthandsUsed.Contains(*shorthands)) {
+ doneProperty = PR_TRUE;
+ break;
+ }
+ }
+ if (doneProperty)
+ continue;
}
- if ((borderPropertiesSet & B_BORDER_COLOR) != B_BORDER_COLOR ||
- !TryFourSidesShorthand(aString, eCSSProperty_border_color,
- borderTopColor, borderBottomColor,
- borderLeftColor, borderRightColor,
- PR_FALSE)) {
- borderPropertiesToSet |= B_BORDER_COLOR;
- }
- if ((borderPropertiesSet & B_BORDER_WIDTH) != B_BORDER_WIDTH ||
- !TryFourSidesShorthand(aString, eCSSProperty_border_width,
- borderTopWidth, borderBottomWidth,
- borderLeftWidth, borderRightWidth,
- PR_FALSE)) {
- borderPropertiesToSet |= B_BORDER_WIDTH;
- }
- borderPropertiesToSet &= borderPropertiesSet;
- if (borderPropertiesToSet) {
- if ((borderPropertiesSet & B_BORDER_TOP) != B_BORDER_TOP ||
- !TryBorderSideShorthand(aString, eCSSProperty_border_top,
- borderTopWidth, borderTopStyle, borderTopColor)) {
- finalBorderPropertiesToSet |= B_BORDER_TOP;
- }
- if ((borderPropertiesSet & B_BORDER_LEFT) != B_BORDER_LEFT ||
- !TryBorderSideShorthand(aString, eCSSProperty_border_left,
- borderLeftWidth, borderLeftStyle, borderLeftColor)) {
- finalBorderPropertiesToSet |= B_BORDER_LEFT;
- }
- if ((borderPropertiesSet & B_BORDER_RIGHT) != B_BORDER_RIGHT ||
- !TryBorderSideShorthand(aString, eCSSProperty_border_right,
- borderRightWidth, borderRightStyle, borderRightColor)) {
- finalBorderPropertiesToSet |= B_BORDER_RIGHT;
- }
- if ((borderPropertiesSet & B_BORDER_BOTTOM) != B_BORDER_BOTTOM ||
- !TryBorderSideShorthand(aString, eCSSProperty_border_bottom,
- borderBottomWidth, borderBottomStyle, borderBottomColor)) {
- finalBorderPropertiesToSet |= B_BORDER_BOTTOM;
- }
- finalBorderPropertiesToSet &= borderPropertiesToSet;
- }
- }
- TryFourSidesShorthand(aString, eCSSProperty_margin,
- marginTop, marginBottom,
- marginLeft, marginRight,
- PR_TRUE);
- TryFourSidesShorthand(aString, eCSSProperty_padding,
- paddingTop, paddingBottom,
- paddingLeft, paddingRight,
- PR_TRUE);
- TryBackgroundShorthand(aString,
- bgColor, bgImage, bgRepeat, bgAttachment,
- bgPosition);
- TryOverflowShorthand(aString, overflowX, overflowY);
-#ifdef MOZ_SVG
- TryMarkerShorthand(aString, markerEnd, markerMid, markerStart);
-#endif
-
- if (columnRuleColor && columnRuleStyle && columnRuleWidth) {
- TryBorderSideShorthand(aString, eCSSProperty__moz_column_rule,
- columnRuleWidth, columnRuleStyle, columnRuleColor);
- columnRuleWidth = columnRuleStyle = columnRuleColor = 0;
- }
-
- // FIXME The order of the declarations should depend on the *-source
- // properties.
- if (borderStartWidth && borderStartStyle && borderStartColor &&
- TryBorderSideShorthand(aString, eCSSProperty_border_start,
- borderStartWidth, borderStartStyle, borderStartColor))
- borderStartWidth = borderStartStyle = borderStartColor = 0;
- if (borderEndWidth && borderEndStyle && borderEndColor &&
- TryBorderSideShorthand(aString, eCSSProperty_border_end,
- borderEndWidth, borderEndStyle, borderEndColor))
- borderEndWidth = borderEndStyle = borderEndColor = 0;
-
- for (index = 0; index < count; index++) {
- nsCSSProperty property = OrderValueAt(index);
- switch (property) {
-
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_TOP_STYLE,
- eCSSProperty_border_top_style, borderTopStyle)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_LEFT_STYLE,
- eCSSProperty_border_left_style_value,
- eCSSProperty_border_left_style, borderLeftStyle)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_RIGHT_STYLE,
- eCSSProperty_border_right_style_value,
- eCSSProperty_border_right_style, borderRightStyle)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_BOTTOM_STYLE,
- eCSSProperty_border_bottom_style, borderBottomStyle)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_start_style_value,
- eCSSProperty_border_start_style, borderStartStyle)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_end_style_value,
- eCSSProperty_border_end_style, borderEndStyle)
-
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_TOP_COLOR,
- eCSSProperty_border_top_color, borderTopColor)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_LEFT_COLOR,
- eCSSProperty_border_left_color_value,
- eCSSProperty_border_left_color, borderLeftColor)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_RIGHT_COLOR,
- eCSSProperty_border_right_color_value,
- eCSSProperty_border_right_color, borderRightColor)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_BOTTOM_COLOR,
- eCSSProperty_border_bottom_color, borderBottomColor)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_start_color_value,
- eCSSProperty_border_start_color, borderStartColor)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_end_color_value,
- eCSSProperty_border_end_color, borderEndColor)
+ // Try to use this property in a shorthand.
+ nsAutoString value;
+ for (const nsCSSProperty *shorthands =
+ nsCSSProps::ShorthandsContaining(property);
+ *shorthands != eCSSProperty_UNKNOWN; ++shorthands) {
+ // ShorthandsContaining returns the shorthands in order from those
+ // that contain the most subproperties to those that contain the
+ // least, which is exactly the order we want to test them.
+ nsCSSProperty shorthand = *shorthands;
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_TOP_WIDTH,
- eCSSProperty_border_top_width, borderTopWidth)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_LEFT_WIDTH,
- eCSSProperty_border_left_width_value,
- eCSSProperty_border_left_width, borderLeftWidth)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE_AS(finalBorderPropertiesToSet & B_BORDER_RIGHT_WIDTH,
- eCSSProperty_border_right_width_value,
- eCSSProperty_border_right_width, borderRightWidth)
- NS_CASE_CONDITIONAL_OUTPUT_PROPERTY_VALUE(finalBorderPropertiesToSet & B_BORDER_BOTTOM_WIDTH,
- eCSSProperty_border_bottom_width, borderBottomWidth)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_start_width_value,
- eCSSProperty_border_start_width, borderStartWidth)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_border_end_width_value,
- eCSSProperty_border_end_width, borderEndWidth)
-
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_margin_top, marginTop)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_margin_bottom, marginBottom)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_margin_left_value,
- eCSSProperty_margin_left, marginLeft)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_margin_right_value,
- eCSSProperty_margin_right, marginRight)
-
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_padding_top, paddingTop)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_padding_bottom, paddingBottom)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_padding_left_value,
- eCSSProperty_padding_left, paddingLeft)
- NS_CASE_OUTPUT_PROPERTY_VALUE_AS(eCSSProperty_padding_right_value,
- eCSSProperty_padding_right, paddingRight)
-
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_background_color, bgColor)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_background_image, bgImage)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_background_repeat, bgRepeat)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_background_attachment, bgAttachment)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_background_position, bgPosition)
-
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_overflow_x, overflowX)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_overflow_y, overflowY)
-
-#ifdef MOZ_SVG
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_marker_end, markerEnd)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_marker_mid, markerMid)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty_marker_start, markerStart)
-#endif
-
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty__moz_column_rule_width, columnRuleWidth)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty__moz_column_rule_style, columnRuleStyle)
- NS_CASE_OUTPUT_PROPERTY_VALUE(eCSSProperty__moz_column_rule_color, columnRuleColor)
-
- case eCSSProperty_margin_left_ltr_source:
- case eCSSProperty_margin_left_rtl_source:
- case eCSSProperty_margin_right_ltr_source:
- case eCSSProperty_margin_right_rtl_source:
- case eCSSProperty_padding_left_ltr_source:
- case eCSSProperty_padding_left_rtl_source:
- case eCSSProperty_padding_right_ltr_source:
- case eCSSProperty_padding_right_rtl_source:
- case eCSSProperty_border_left_color_ltr_source:
- case eCSSProperty_border_left_color_rtl_source:
- case eCSSProperty_border_left_style_ltr_source:
- case eCSSProperty_border_left_style_rtl_source:
- case eCSSProperty_border_left_width_ltr_source:
- case eCSSProperty_border_left_width_rtl_source:
- case eCSSProperty_border_right_color_ltr_source:
- case eCSSProperty_border_right_color_rtl_source:
- case eCSSProperty_border_right_style_ltr_source:
- case eCSSProperty_border_right_style_rtl_source:
- case eCSSProperty_border_right_width_ltr_source:
- case eCSSProperty_border_right_width_rtl_source:
+ // If GetValue gives us a non-empty string back, we can use that
+ // value; otherwise it's not possible to use this shorthand.
+ GetValue(shorthand, value);
+ if (!value.IsEmpty()) {
+ AppendPropertyAndValueToString(shorthand, value, aString);
+ shorthandsUsed.AppendElement(shorthand);
+ doneProperty = PR_TRUE;
break;
-
- case eCSSProperty_margin_start_value:
- AppendPropertyAndValueToString(property, eCSSProperty_margin_start,
- aString);
- break;
- case eCSSProperty_margin_end_value:
- AppendPropertyAndValueToString(property, eCSSProperty_margin_end,
- aString);
- break;
- case eCSSProperty_padding_start_value:
- AppendPropertyAndValueToString(property, eCSSProperty_padding_start,
- aString);
- break;
- case eCSSProperty_padding_end_value:
- AppendPropertyAndValueToString(property, eCSSProperty_padding_end,
- aString);
- break;
-
- default:
- if (0 <= property) {
- AppendPropertyAndValueToString(property, aString);
- }
- break;
+ }
}
+ if (doneProperty)
+ continue;
+
+ NS_ASSERTION(value.IsEmpty(), "value should be empty now");
+ AppendPropertyAndValueToString(property, value, aString);
}
if (! aString.IsEmpty()) {
// if the string is not empty, we have a trailing whitespace we should remove
aString.Truncate(aString.Length() - 1);
}
return NS_OK;
}
--- a/layout/style/nsCSSDeclaration.h
+++ b/layout/style/nsCSSDeclaration.h
@@ -160,68 +160,19 @@ private:
PRBool operator==(const nsCSSDeclaration& aCopy) const;
static void AppendImportanceToString(PRBool aIsImportant, nsAString& aString);
// return whether there was a value in |aValue| (i.e., it had a non-null unit)
PRBool AppendValueToString(nsCSSProperty aProperty, nsAString& aResult) const;
// May be called only for properties whose type is eCSSType_Value.
nsresult GetValueOrImportantValue(nsCSSProperty aProperty, nsCSSValue& aValue) const;
- void PropertyIsSet(PRInt32 & aPropertyIndex, PRInt32 aIndex, PRUint32 & aSet, PRUint32 aValue) const;
- PRBool TryBorderShorthand(nsAString & aString, PRUint32 aPropertiesSet,
- PRInt32 aBorderTopWidth,
- PRInt32 aBorderTopStyle,
- PRInt32 aBorderTopColor,
- PRInt32 aBorderBottomWidth,
- PRInt32 aBorderBottomStyle,
- PRInt32 aBorderBottomColor,
- PRInt32 aBorderLeftWidth,
- PRInt32 aBorderLeftStyle,
- PRInt32 aBorderLeftColor,
- PRInt32 aBorderRightWidth,
- PRInt32 aBorderRightStyle,
- PRInt32 aBorderRightColor) const;
- PRBool TryBorderSideShorthand(nsAString & aString,
- nsCSSProperty aShorthand,
- PRInt32 aBorderWidth,
- PRInt32 aBorderStyle,
- PRInt32 aBorderColor) const;
- PRBool TryFourSidesShorthand(nsAString & aString,
- nsCSSProperty aShorthand,
- PRInt32 & aTop,
- PRInt32 & aBottom,
- PRInt32 & aLeft,
- PRInt32 & aRight,
- PRBool aClearIndexes) const;
- void TryBackgroundShorthand(nsAString & aString,
- PRInt32 & aBgColor, PRInt32 & aBgImage,
- PRInt32 & aBgRepeat, PRInt32 & aBgAttachment,
- PRInt32 & aBgPosition) const;
- void TryOverflowShorthand(nsAString & aString,
- PRInt32 & aOverflowX, PRInt32 & aOverflowY) const;
-#ifdef MOZ_SVG
- void TryMarkerShorthand(nsAString & aString,
- PRInt32 & aMarkerEnd,
- PRInt32 & aMarkerMid,
- PRInt32 & aMarkerStart) const;
-#endif
-
- PRBool AllPropertiesSameImportance(PRInt32 aFirst, PRInt32 aSecond,
- PRInt32 aThird, PRInt32 aFourth,
- PRInt32 aFifth,
- PRBool & aImportance) const;
- PRBool AllPropertiesSameValue(PRInt32 aFirst, PRInt32 aSecond,
- PRInt32 aThird, PRInt32 aFourth) const;
+ // Helper for ToString with strange semantics regarding aValue.
void AppendPropertyAndValueToString(nsCSSProperty aProperty,
- nsAString& aResult) const
- {
- AppendPropertyAndValueToString(aProperty, aProperty, aResult);
- }
- void AppendPropertyAndValueToString(nsCSSProperty aProperty,
- nsCSSProperty aPropertyName,
+ nsAutoString& aValue,
nsAString& aResult) const;
private:
//
// Specialized ref counting.
// We do not want everyone to ref count us, only the rules which hold
// onto us (our well defined lifetime is when the last rule releases
// us).
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -5370,17 +5370,17 @@ CSSParserImpl::ParseSingleValueProperty(
return ParsePositiveVariant(aValue, VARIANT_HN, nsnull);
case eCSSProperty_box_orient:
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kBoxOrientKTable);
case eCSSProperty_box_pack:
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kBoxPackKTable);
case eCSSProperty_box_ordinal_group:
- return ParseVariant(aValue, VARIANT_HI, nsnull);
+ return ParsePositiveVariant(aValue, VARIANT_HI, nsnull);
#ifdef MOZ_SVG
case eCSSProperty_clip_path:
return ParseVariant(aValue, VARIANT_HUO, nsnull);
case eCSSProperty_clip_rule:
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kFillRuleKTable);
case eCSSProperty_color_interpolation:
case eCSSProperty_color_interpolation_filters:
@@ -5426,18 +5426,20 @@ CSSParserImpl::ParseSingleValueProperty(
nsnull);
case eCSSProperty_stroke_linecap:
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kStrokeLinecapKTable);
case eCSSProperty_stroke_linejoin:
return ParseVariant(aValue, VARIANT_HK,
nsCSSProps::kStrokeLinejoinKTable);
case eCSSProperty_stroke_miterlimit:
- return ParsePositiveVariant(aValue, VARIANT_HN,
- nsnull);
+ return ParseVariant(aValue, VARIANT_HN, nsnull) &&
+ // Enforce the restriction that the value is greater than 1.
+ (aValue.GetUnit() != eCSSUnit_Number ||
+ aValue.GetFloatValue() >= 1.0f);
case eCSSProperty_stroke_opacity:
return ParseVariant(aValue, VARIANT_HN,
nsnull);
case eCSSProperty_stroke_width:
return ParsePositiveVariant(aValue, VARIANT_HLPN,
nsnull);
case eCSSProperty_text_anchor:
return ParseVariant(aValue, VARIANT_HK,
@@ -6358,47 +6360,46 @@ CSSParserImpl::ParseBorderWidth()
return ParseBoxProperties(mTempData.mMargin.mBorderWidth,
kBorderWidthIDs);
}
PRBool
CSSParserImpl::ParseBorderColors(nsCSSValueList** aResult,
nsCSSProperty aProperty)
{
- nsCSSValue value;
- if (ParseVariant(value, VARIANT_HCK|VARIANT_NONE, nsCSSProps::kBorderColorKTable)) {
- nsCSSValueList* listHead = new nsCSSValueList();
- nsCSSValueList* list = listHead;
- if (!list) {
+ nsCSSValueList *list = nsnull;
+ for (nsCSSValueList **curp = &list, *cur; ; curp = &cur->mNext) {
+ cur = *curp = new nsCSSValueList();
+ if (!cur) {
mScanner.SetLowLevelError(NS_ERROR_OUT_OF_MEMORY);
- return PR_FALSE;
- }
- list->mValue = value;
-
- while (list) {
- if (ExpectEndProperty()) {
- mTempData.SetPropertyBit(aProperty);
- *aResult = listHead;
- return PR_TRUE;
- }
- // FIXME Bug 389404: We should not accept inherit, -moz-initial,
- // or none as anything other than the first value.
- if (ParseVariant(value, VARIANT_HCK|VARIANT_NONE, nsCSSProps::kBorderColorKTable)) {
- list->mNext = new nsCSSValueList();
- list = list->mNext;
- if (list)
- list->mValue = value;
- else
- mScanner.SetLowLevelError(NS_ERROR_OUT_OF_MEMORY);
- }
- else
- break;
- }
- delete listHead;
- }
+ break;
+ }
+ if (!ParseVariant(cur->mValue,
+ (cur == list)
+ ? (VARIANT_HCK | VARIANT_NONE)
+ : (VARIANT_COLOR | VARIANT_KEYWORD),
+ nsCSSProps::kBorderColorKTable)) {
+ break;
+ }
+ if (ExpectEndProperty()) {
+ // Only success case here, since having the failure case at the
+ // end allows more sharing of code.
+ mTempData.SetPropertyBit(aProperty);
+ *aResult = list;
+ return PR_TRUE;
+ }
+ if (cur->mValue.GetUnit() == eCSSUnit_Inherit ||
+ cur->mValue.GetUnit() == eCSSUnit_Initial ||
+ cur->mValue.GetUnit() == eCSSUnit_None) {
+ // 'inherit', 'initial', and 'none' are only allowed on their own
+ break;
+ }
+ }
+ // Have failure case at the end so we can |break| to get to it.
+ delete list;
return PR_FALSE;
}
PRBool
CSSParserImpl::ParseRect(nsCSSRect& aRect, nsCSSProperty aPropID)
{
nsCSSRect rect;
PRBool result;
@@ -7623,17 +7624,22 @@ CSSParserImpl::ParseTextDecoration(nsCSS
{
if (ParseVariant(aValue, VARIANT_HOK, nsCSSProps::kTextDecorationKTable)) {
if (eCSSUnit_Enumerated == aValue.GetUnit()) { // look for more keywords
PRInt32 intValue = aValue.GetIntValue();
nsCSSValue keyword;
PRInt32 index;
for (index = 0; index < 3; index++) {
if (ParseEnum(keyword, nsCSSProps::kTextDecorationKTable)) {
- intValue |= keyword.GetIntValue();
+ PRInt32 newValue = keyword.GetIntValue();
+ if (newValue & intValue) {
+ // duplicate keyword is not allowed
+ return PR_FALSE;
+ }
+ intValue |= newValue;
}
else {
break;
}
}
aValue.SetIntValue(intValue, eCSSUnit_Enumerated);
}
return PR_TRUE;
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -65,26 +65,47 @@ const char* const kCSSRawProperties[] =
#undef CSS_PROP_SHORTHAND
};
static PRInt32 gTableRefCount;
static nsStaticCaseInsensitiveNameTable* gPropertyTable;
static nsStaticCaseInsensitiveNameTable* gFontDescTable;
+/* static */ nsCSSProperty *
+ nsCSSProps::gShorthandsContainingTable[eCSSProperty_COUNT_no_shorthands];
+/* static */ nsCSSProperty* nsCSSProps::gShorthandsContainingPool = nsnull;
+
// Keep in sync with enum nsCSSFontDesc in nsCSSProperty.h.
static const char* const kCSSRawFontDescs[] = {
"font-family",
"font-style",
"font-weight",
"font-stretch",
"src",
"unicode-range"
};
+struct PropertyAndCount {
+ nsCSSProperty property;
+ PRUint32 count;
+};
+
+static int
+SortPropertyAndCount(const void* s1, const void* s2, void *closure)
+{
+ const PropertyAndCount *pc1 = static_cast<const PropertyAndCount*>(s1);
+ const PropertyAndCount *pc2 = static_cast<const PropertyAndCount*>(s2);
+ // Primary sort by count (lowest to highest)
+ if (pc1->count != pc2->count)
+ return pc1->count - pc2->count;
+ // Secondary sort by property index (highest to lowest)
+ return pc2->property - pc1->property;
+}
+
void
nsCSSProps::AddRefTable(void)
{
if (0 == gTableRefCount++) {
NS_ASSERTION(!gPropertyTable, "pre existing array!");
NS_ASSERTION(!gFontDescTable, "pre existing array!");
gPropertyTable = new nsStaticCaseInsensitiveNameTable();
@@ -115,31 +136,180 @@ nsCSSProps::AddRefTable(void)
ToLowerCase(temp1);
NS_ASSERTION(temp1.Equals(temp2), "upper case char in desc table");
NS_ASSERTION(-1 == temp1.FindChar('_'), "underscore char in desc table");
}
}
#endif
gFontDescTable->Init(kCSSRawFontDescs, eCSSFontDesc_COUNT);
}
+
+ BuildShorthandsContainingTable();
}
}
+#undef DEBUG_SHORTHANDS_CONTAINING
+
+PRBool
+nsCSSProps::BuildShorthandsContainingTable()
+{
+ PRUint32 occurrenceCounts[eCSSProperty_COUNT_no_shorthands];
+ memset(occurrenceCounts, 0, sizeof(occurrenceCounts));
+ PropertyAndCount subpropCounts[eCSSProperty_COUNT -
+ eCSSProperty_COUNT_no_shorthands];
+ for (nsCSSProperty shorthand = eCSSProperty_COUNT_no_shorthands;
+ shorthand < eCSSProperty_COUNT;
+ shorthand = nsCSSProperty(shorthand + 1)) {
+#ifdef DEBUG_SHORTHANDS_CONTAINING
+ printf("Considering shorthand property '%s'.\n",
+ nsCSSProps::GetStringValue(shorthand).get());
+#endif
+ PropertyAndCount &subpropCountsEntry =
+ subpropCounts[shorthand - eCSSProperty_COUNT_no_shorthands];
+ subpropCountsEntry.property = shorthand;
+ subpropCountsEntry.count = 0;
+ for (const nsCSSProperty* subprops = SubpropertyEntryFor(shorthand);
+ *subprops != eCSSProperty_UNKNOWN;
+ ++subprops) {
+ NS_ASSERTION(0 < *subprops &&
+ *subprops < eCSSProperty_COUNT_no_shorthands,
+ "subproperty must be a longhand");
+ ++occurrenceCounts[*subprops];
+ ++subpropCountsEntry.count;
+ }
+ }
+
+ PRUint32 poolEntries = 0;
+ for (nsCSSProperty longhand = nsCSSProperty(0);
+ longhand < eCSSProperty_COUNT_no_shorthands;
+ longhand = nsCSSProperty(longhand + 1)) {
+ PRUint32 count = occurrenceCounts[longhand];
+ if (count > 0)
+ // leave room for terminator
+ poolEntries += count + 1;
+ }
+
+ gShorthandsContainingPool = new nsCSSProperty[poolEntries];
+ if (!gShorthandsContainingPool)
+ return PR_FALSE;
+
+ // Initialize all entries to point to their null-terminator.
+ {
+ nsCSSProperty *poolCursor = gShorthandsContainingPool - 1;
+ nsCSSProperty *lastTerminator =
+ gShorthandsContainingPool + poolEntries - 1;
+ for (nsCSSProperty longhand = nsCSSProperty(0);
+ longhand < eCSSProperty_COUNT_no_shorthands;
+ longhand = nsCSSProperty(longhand + 1)) {
+ PRUint32 count = occurrenceCounts[longhand];
+ if (count > 0) {
+ poolCursor += count + 1;
+ gShorthandsContainingTable[longhand] = poolCursor;
+ *poolCursor = eCSSProperty_UNKNOWN;
+ } else {
+ gShorthandsContainingTable[longhand] = lastTerminator;
+ }
+ }
+ NS_ASSERTION(poolCursor == lastTerminator, "miscalculation");
+ }
+
+ // Sort with lowest count at the start and highest at the end, and
+ // within counts sort in reverse property index order.
+ NS_QuickSort(&subpropCounts, NS_ARRAY_LENGTH(subpropCounts),
+ sizeof(subpropCounts[0]), SortPropertyAndCount, nsnull);
+
+ // Fill in all the entries in gShorthandsContainingTable
+ for (const PropertyAndCount *shorthandAndCount = subpropCounts,
+ *shorthandAndCountEnd =
+ subpropCounts + NS_ARRAY_LENGTH(subpropCounts);
+ shorthandAndCount < shorthandAndCountEnd;
+ ++shorthandAndCount) {
+#ifdef DEBUG_SHORTHANDS_CONTAINING
+ printf("Entering %u subprops for '%s'.\n",
+ shorthandAndCount->count,
+ nsCSSProps::GetStringValue(shorthandAndCount->property).get());
+#endif
+ for (const nsCSSProperty* subprops =
+ SubpropertyEntryFor(shorthandAndCount->property);
+ *subprops != eCSSProperty_UNKNOWN;
+ ++subprops) {
+ *(--gShorthandsContainingTable[*subprops]) = shorthandAndCount->property;
+ }
+ }
+
+#ifdef DEBUG_SHORTHANDS_CONTAINING
+ for (nsCSSProperty longhand = nsCSSProperty(0);
+ longhand < eCSSProperty_COUNT_no_shorthands;
+ longhand = nsCSSProperty(longhand + 1)) {
+ printf("Property %s is in %d shorthands.\n",
+ nsCSSProps::GetStringValue(longhand).get(),
+ occurrenceCounts[longhand]);
+ for (const nsCSSProperty *shorthands = ShorthandsContaining(longhand);
+ *shorthands != eCSSProperty_UNKNOWN;
+ ++shorthands) {
+ printf(" %s\n", nsCSSProps::GetStringValue(*shorthands).get());
+ }
+ }
+#endif
+
+#ifdef DEBUG
+ // Verify that all values that should be are present.
+ for (nsCSSProperty shorthand = eCSSProperty_COUNT_no_shorthands;
+ shorthand < eCSSProperty_COUNT;
+ shorthand = nsCSSProperty(shorthand + 1)) {
+ for (const nsCSSProperty* subprops = SubpropertyEntryFor(shorthand);
+ *subprops != eCSSProperty_UNKNOWN;
+ ++subprops) {
+ PRUint32 count = 0;
+ for (const nsCSSProperty *shcont = ShorthandsContaining(*subprops);
+ *shcont != eCSSProperty_UNKNOWN;
+ ++shcont) {
+ if (*shcont == shorthand)
+ ++count;
+ }
+ NS_ASSERTION(count == 1, "subproperty of shorthand should have shorthand"
+ " in its ShorthandsContaining() table");
+ }
+ }
+
+ // Verify that there are no extra values
+ for (nsCSSProperty longhand = nsCSSProperty(0);
+ longhand < eCSSProperty_COUNT_no_shorthands;
+ longhand = nsCSSProperty(longhand + 1)) {
+ for (const nsCSSProperty *shorthands = ShorthandsContaining(longhand);
+ *shorthands != eCSSProperty_UNKNOWN;
+ ++shorthands) {
+ PRUint32 count = 0;
+ for (const nsCSSProperty* subprops = SubpropertyEntryFor(*shorthands);
+ *subprops != eCSSProperty_UNKNOWN;
+ ++subprops) {
+ if (*subprops == longhand)
+ ++count;
+ }
+ NS_ASSERTION(count == 1, "longhand should be in subproperty table of "
+ "property in its ShorthandsContaining() table");
+ }
+ }
+#endif
+
+ return PR_TRUE;
+}
+
void
nsCSSProps::ReleaseTable(void)
{
if (0 == --gTableRefCount) {
- if (gPropertyTable) {
- delete gPropertyTable;
- gPropertyTable = nsnull;
- }
- if (gFontDescTable) {
- delete gFontDescTable;
- gFontDescTable = nsnull;
- }
+ delete gPropertyTable;
+ gPropertyTable = nsnull;
+
+ delete gFontDescTable;
+ gFontDescTable = nsnull;
+
+ delete gShorthandsContainingPool;
+ gShorthandsContainingPool = nsnull;
}
}
nsCSSProperty
nsCSSProps::LookupProperty(const nsACString& aProperty)
{
NS_ASSERTION(gPropertyTable, "no lookup table, needs addref");
@@ -1344,16 +1514,17 @@ static const nsCSSProperty gBorderSubpro
eCSSProperty_border_left_color_value,
eCSSProperty_border_left_color_ltr_source,
eCSSProperty_border_left_color_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderBottomSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_bottom_width,
eCSSProperty_border_bottom_style,
eCSSProperty_border_bottom_color,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderColorSubpropTable[] = {
// Code relies on these being in top-right-bottom-left order.
@@ -1398,61 +1569,65 @@ static const nsCSSProperty gMozBorderSta
eCSSProperty_border_start_color_value,
eCSSProperty_border_left_color_ltr_source,
eCSSProperty_border_right_color_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gMozBorderEndSubpropTable[] = {
// nsCSSDeclaration.cpp output the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_end_width_value,
eCSSProperty_border_end_style_value,
eCSSProperty_border_end_color_value,
// extras:
eCSSProperty_border_right_width_ltr_source,
eCSSProperty_border_left_width_rtl_source,
eCSSProperty_border_right_style_ltr_source,
eCSSProperty_border_left_style_rtl_source,
eCSSProperty_border_right_color_ltr_source,
eCSSProperty_border_left_color_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderLeftSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_left_width_value,
eCSSProperty_border_left_style_value,
eCSSProperty_border_left_color_value,
// extras:
eCSSProperty_border_left_width_ltr_source,
eCSSProperty_border_left_width_rtl_source,
eCSSProperty_border_left_style_ltr_source,
eCSSProperty_border_left_style_rtl_source,
eCSSProperty_border_left_color_ltr_source,
eCSSProperty_border_left_color_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderRightSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_right_width_value,
eCSSProperty_border_right_style_value,
eCSSProperty_border_right_color_value,
// extras:
eCSSProperty_border_right_width_ltr_source,
eCSSProperty_border_right_width_rtl_source,
eCSSProperty_border_right_style_ltr_source,
eCSSProperty_border_right_style_rtl_source,
eCSSProperty_border_right_color_ltr_source,
eCSSProperty_border_right_color_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gMozBorderStartSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_start_width_value,
eCSSProperty_border_start_style_value,
eCSSProperty_border_start_color_value,
// extras:
eCSSProperty_border_left_width_ltr_source,
eCSSProperty_border_right_width_rtl_source,
eCSSProperty_border_left_style_ltr_source,
eCSSProperty_border_right_style_rtl_source,
@@ -1504,16 +1679,17 @@ static const nsCSSProperty gMozBorderEnd
eCSSProperty_border_end_style_value,
eCSSProperty_border_right_style_ltr_source,
eCSSProperty_border_left_style_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderTopSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty_border_top_width,
eCSSProperty_border_top_style,
eCSSProperty_border_top_color,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gBorderWidthSubpropTable[] = {
// Code relies on these being in top-right-bottom-left order.
@@ -1631,23 +1807,26 @@ static const nsCSSProperty gMozMarginEnd
eCSSProperty_margin_right_ltr_source,
eCSSProperty_margin_left_rtl_source,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gOutlineSubpropTable[] = {
// nsCSSDeclaration.cpp outputs the subproperties in this order.
- eCSSProperty_outline_color,
+ // It also depends on the color being third.
+ eCSSProperty_outline_width,
eCSSProperty_outline_style,
- eCSSProperty_outline_width,
+ eCSSProperty_outline_color,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gMozColumnRuleSubpropTable[] = {
+ // nsCSSDeclaration.cpp outputs the subproperties in this order.
+ // It also depends on the color being third.
eCSSProperty__moz_column_rule_width,
eCSSProperty__moz_column_rule_style,
eCSSProperty__moz_column_rule_color,
eCSSProperty_UNKNOWN
};
static const nsCSSProperty gOverflowSubpropTable[] = {
eCSSProperty_overflow_x,
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -100,38 +100,64 @@ public:
// Return |eCSSKeyword_UNKNOWN| if not found.
static nsCSSKeyword ValueToKeywordEnum(PRInt32 aValue, const PRInt32 aTable[]);
// Ditto but as a string, return "" when not found.
static const nsAFlatCString& ValueToKeyword(PRInt32 aValue, const PRInt32 aTable[]);
static const nsCSSType kTypeTable[eCSSProperty_COUNT_no_shorthands];
static const nsStyleStructID kSIDTable[eCSSProperty_COUNT_no_shorthands];
static const PRInt32* const kKeywordTableTable[eCSSProperty_COUNT_no_shorthands];
+
private:
static const PRUint32 kFlagsTable[eCSSProperty_COUNT];
+public:
+ static inline PRBool PropHasFlags(nsCSSProperty aProperty, PRUint32 aFlags)
+ {
+ NS_ASSERTION(0 <= aProperty && aProperty < eCSSProperty_COUNT,
+ "out of range");
+ return (nsCSSProps::kFlagsTable[aProperty] & aFlags) == aFlags;
+ }
+
+private:
// A table for shorthand properties. The appropriate index is the
// property ID minus eCSSProperty_COUNT_no_shorthands.
static const nsCSSProperty *const
kSubpropertyTable[eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands];
public:
static inline
- const nsCSSProperty *const SubpropertyEntryFor(nsCSSProperty aProperty) {
+ const nsCSSProperty * SubpropertyEntryFor(nsCSSProperty aProperty) {
NS_ASSERTION(eCSSProperty_COUNT_no_shorthands <= aProperty &&
aProperty < eCSSProperty_COUNT,
"out of range");
return nsCSSProps::kSubpropertyTable[aProperty -
eCSSProperty_COUNT_no_shorthands];
}
- static inline PRBool PropHasFlags(nsCSSProperty aProperty, PRUint32 aFlags)
- {
- return (nsCSSProps::kFlagsTable[aProperty] & aFlags) == aFlags;
+ // Returns an eCSSProperty_UNKNOWN-terminated array of the shorthand
+ // properties containing |aProperty|, sorted from those that contain
+ // the most properties to those that contain the least.
+ static const nsCSSProperty * ShorthandsContaining(nsCSSProperty aProperty) {
+ NS_ASSERTION(gShorthandsContainingPool, "uninitialized");
+ NS_ASSERTION(0 <= aProperty && aProperty < eCSSProperty_COUNT_no_shorthands,
+ "out of range");
+ return gShorthandsContainingTable[aProperty];
}
+private:
+ // gShorthandsContainingTable is an array of the return values for
+ // ShorthandsContaining (arrays of nsCSSProperty terminated by
+ // eCSSProperty_UNKNOWN) pointing into memory in
+ // gShorthandsContainingPool (which contains all of those arrays in a
+ // single allocation, and is the one pointer that should be |free|d).
+ static nsCSSProperty *gShorthandsContainingTable[eCSSProperty_COUNT_no_shorthands];
+ static nsCSSProperty* gShorthandsContainingPool;
+ static PRBool BuildShorthandsContainingTable();
+
+public:
#define CSSPROPS_FOR_SHORTHAND_SUBPROPERTIES(iter_, prop_) \
for (const nsCSSProperty* iter_ = nsCSSProps::SubpropertyEntryFor(prop_); \
*iter_ != eCSSProperty_UNKNOWN; ++iter_)
// Keyword/Enum value tables
static const PRInt32 kAppearanceKTable[];
static const PRInt32 kAzimuthKTable[];
--- a/layout/style/nsMediaFeatures.cpp
+++ b/layout/style/nsMediaFeatures.cpp
@@ -188,21 +188,16 @@ GetColor(nsPresContext* aPresContext, ns
{
// FIXME: This implementation is bogus. nsThebesDeviceContext
// doesn't provide reliable information (should be fixed in bug
// 424386).
// FIXME: On a monochrome device, return 0!
nsIDeviceContext *dx = GetDeviceContextFor(aPresContext);
PRUint32 depth;
dx->GetDepth(depth);
- // Some graphics backends may claim 32-bit depth when it's really 24
- // (because they're counting the Alpha component).
- if (depth == 32) {
- depth = 24;
- }
// The spec says to use bits *per color component*, so divide by 3,
// and round down, since the spec says to use the smallest when the
// color components differ.
depth /= 3;
aResult.SetIntValue(PRInt32(depth), eCSSUnit_Integer);
return NS_OK;
}
--- a/layout/style/nsRuleNode.cpp
+++ b/layout/style/nsRuleNode.cpp
@@ -3814,27 +3814,29 @@ nsRuleNode::ComputeBorderData(void* aSta
nsStyleContext* aContext,
nsRuleNode* aHighestNode,
const RuleDetail aRuleDetail, PRBool aInherited)
{
COMPUTE_START_RESET(Border, (mPresContext), border, parentBorder,
Margin, marginData)
// -moz-box-shadow: none, list, inherit, initial
- nsCSSValueList* list = marginData.mBoxShadow;
- if (list) {
- // This handles 'none' and 'initial'
- border->mBoxShadow = nsnull;
-
- if (eCSSUnit_Inherit == list->mValue.GetUnit()) {
- inherited = PR_TRUE;
- border->mBoxShadow = parentBorder->mBoxShadow;
- } else if (eCSSUnit_Array == list->mValue.GetUnit()) {
- // List of arrays
- border->mBoxShadow = GetShadowData(list, aContext, PR_TRUE, inherited);
+ {
+ nsCSSValueList* list = marginData.mBoxShadow;
+ if (list) {
+ // This handles 'none' and 'initial'
+ border->mBoxShadow = nsnull;
+
+ if (eCSSUnit_Inherit == list->mValue.GetUnit()) {
+ inherited = PR_TRUE;
+ border->mBoxShadow = parentBorder->mBoxShadow;
+ } else if (eCSSUnit_Array == list->mValue.GetUnit()) {
+ // List of arrays
+ border->mBoxShadow = GetShadowData(list, aContext, PR_TRUE, inherited);
+ }
}
}
// border-width, border-*-width: length, enum, inherit
nsStyleCoord coord;
nsCSSRect ourBorderWidth(marginData.mBorderWidth);
AdjustLogicalBoxProp(aContext,
marginData.mBorderLeftWidthLTRSource,
@@ -3913,35 +3915,56 @@ nsRuleNode::ComputeBorderData(void* aSta
}
else if (eCSSUnit_Inherit == unit) {
inherited = PR_TRUE;
border->SetBorderStyle(side, parentBorder->GetBorderStyle(side));
}
}
}
- // -moz-border-*-colors: color, string, enum
+ // -moz-border-*-colors: color, string, enum, none, inherit/initial
nscolor borderColor;
nscolor unused = NS_RGB(0,0,0);
{ // scope for compilers with broken |for| loop scoping
NS_FOR_CSS_SIDES(side) {
nsCSSValueList* list =
marginData.mBorderColors.*(nsCSSValueListRect::sides[side]);
- // FIXME Bug 389404: Implement inherit and -moz-initial.
if (list) {
- // Some composite border color information has been specified for this
- // border side.
- border->EnsureBorderColors();
- border->ClearBorderColors(side);
- while (list) {
- if (SetColor(list->mValue, unused, mPresContext,
- aContext, borderColor, inherited))
- border->AppendBorderColor(side, borderColor);
- list = list->mNext;
+ if (eCSSUnit_Initial == list->mValue.GetUnit() ||
+ eCSSUnit_None == list->mValue.GetUnit()) {
+ NS_ASSERTION(!list->mNext, "should have only one item");
+ border->ClearBorderColors(side);
+ }
+ else if (eCSSUnit_Inherit == list->mValue.GetUnit()) {
+ NS_ASSERTION(!list->mNext, "should have only one item");
+ nsBorderColors *parentColors;
+ parentBorder->GetCompositeColors(side, &parentColors);
+ if (parentColors) {
+ border->EnsureBorderColors();
+ border->ClearBorderColors(side);
+ border->mBorderColors[side] = parentColors->Clone();
+ } else {
+ border->ClearBorderColors(side);
+ }
+ }
+ else {
+ // Some composite border color information has been specified for this
+ // border side.
+ border->EnsureBorderColors();
+ border->ClearBorderColors(side);
+ while (list) {
+ if (SetColor(list->mValue, unused, mPresContext,
+ aContext, borderColor, inherited))
+ border->AppendBorderColor(side, borderColor);
+ else {
+ NS_NOTREACHED("unexpected item in -moz-border-*-colors list");
+ }
+ list = list->mNext;
+ }
}
}
}
}
// border-color, border-*-color: color, string, enum, inherit
nsCSSRect ourBorderColor(marginData.mBorderColor);
PRBool foreground;
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -426,17 +426,17 @@ struct nsStyleBorder {
mBorderColors = new nsBorderColors*[4];
if (mBorderColors)
for (PRInt32 i = 0; i < 4; i++)
mBorderColors[i] = nsnull;
}
}
void ClearBorderColors(PRUint8 aSide) {
- if (mBorderColors[aSide]) {
+ if (mBorderColors && mBorderColors[aSide]) {
delete mBorderColors[aSide];
mBorderColors[aSide] = nsnull;
}
}
// Return whether aStyle is a visible style. Invisible styles cause
// the relevant computed border width to be 0.
// Note that this does *not* consider the effects of 'border-image':
--- a/layout/style/test/Makefile.in
+++ b/layout/style/test/Makefile.in
@@ -93,16 +93,17 @@ GARBAGE += css_properties.js
test_bug391221.html \
test_bug397427.html \
test_bug401046.html \
test_bug405818.html \
test_bug412901.html \
test_bug437915.html \
test_bug450191.html \
test_bug453896_deck.html \
+ test_bug470769.html \
test_cascade.html \
test_compute_data_with_start_struct.html \
test_css_eof_handling.html \
test_dont_use_document_colors.html \
test_font_face_parser.html \
test_hover.html \
test_inherit_computation.html \
test_inherit_storage.html \
@@ -112,16 +113,17 @@ GARBAGE += css_properties.js
test_media_queries_dynamic_xbl.html \
test_namespace_rule.html \
test_of_type_selectors.xhtml \
test_parse_rule.html \
test_property_database.html \
test_property_syntax_errors.html \
test_selectors.html \
test_selectors_on_anonymous_content.html \
+ test_shorthand_property_getters.html \
test_style_struct_copy_constructors.html \
test_value_computation.html \
test_value_storage.html \
test_visited_pref.html \
css_properties.js \
property_database.js \
unstyled.xml \
unstyled.css \
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -104,17 +104,17 @@ var gCSSProperties = {
invalid_values: []
},
"-moz-border-bottom-colors": {
domProp: "MozBorderBottomColors",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "none" ],
other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
- invalid_values: [ "red none", "red inherit", "red, green" ]
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red" ]
},
"-moz-border-end": {
domProp: "MozBorderEnd",
inherited: false,
type: CSS_TYPE_TRUE_SHORTHAND,
subproperties: [ "-moz-border-end-color", "-moz-border-end-style", "-moz-border-end-width" ],
initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
@@ -167,17 +167,17 @@ var gCSSProperties = {
"url('border.png') 27 27 27 27 /" ]
},
"-moz-border-left-colors": {
domProp: "MozBorderLeftColors",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "none" ],
other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
- invalid_values: [ "red none", "red inherit", "red, green" ]
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red" ]
},
"-moz-border-radius": {
domProp: "MozBorderRadius",
inherited: false,
type: CSS_TYPE_TRUE_SHORTHAND,
subproperties: [ "-moz-border-radius-bottomleft", "-moz-border-radius-bottomright", "-moz-border-radius-topleft", "-moz-border-radius-topright" ],
initial_values: [ "0", "0px", "0px 0 0 0px" ], /* 0% ? */
other_values: [ "3%", "1px", "2em", "3em 2px", "2pt 3% 4em", "2px 2px 2px 2px", // circular
@@ -226,17 +226,17 @@ var gCSSProperties = {
invalid_values: [ "-1px", "4px -2px", "inherit 2px", "2px inherit" ]
},
"-moz-border-right-colors": {
domProp: "MozBorderRightColors",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "none" ],
other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
- invalid_values: [ "red none", "red inherit", "red, green" ]
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red" ]
},
"-moz-border-start": {
domProp: "MozBorderStart",
inherited: false,
type: CSS_TYPE_TRUE_SHORTHAND,
subproperties: [ "-moz-border-start-color", "-moz-border-start-style", "-moz-border-start-width" ],
initial_values: [ "none", "medium", "currentColor", "thin", "none medium currentcolor" ],
other_values: [ "solid", "green", "medium solid", "green solid", "10px solid", "thick solid", "5px green none" ],
@@ -272,17 +272,17 @@ var gCSSProperties = {
invalid_values: [ "5%" ]
},
"-moz-border-top-colors": {
domProp: "MozBorderTopColors",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "none" ],
other_values: [ "red green", "red #fc3", "#ff00cc", "currentColor", "blue currentColor orange currentColor" ],
- invalid_values: [ "red none", "red inherit", "red, green" ]
+ invalid_values: [ "red none", "red inherit", "red, green", "none red", "inherit red" ]
},
"-moz-box-align": {
domProp: "MozBoxAlign",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "stretch" ],
other_values: [ "start", "center", "baseline", "end" ],
invalid_values: []
@@ -303,18 +303,18 @@ var gCSSProperties = {
other_values: [ "1", "100", "0.1" ],
invalid_values: [ "10px", "-1" ]
},
"-moz-box-ordinal-group": {
domProp: "MozBoxOrdinalGroup",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "1" ],
- other_values: [ "0", "-1", "100", "-1000" ],
- invalid_values: [ "1.0" ]
+ other_values: [ "0", "100" ],
+ invalid_values: [ "1.0", "-1", "-1000" ]
},
"-moz-box-orient": {
domProp: "MozBoxOrient",
inherited: false,
type: CSS_TYPE_LONGHAND,
initial_values: [ "horizontal", "inline-axis" ],
other_values: [ "vertical", "block-axis" ],
invalid_values: []
@@ -1952,18 +1952,18 @@ var gCSSProperties = {
other_values: [ "round", "bevel" ],
invalid_values: []
},
"stroke-miterlimit": {
domProp: null,
inherited: true,
type: CSS_TYPE_LONGHAND,
initial_values: [ "4" ],
- other_values: [ "1", "7", "5000" ],
- invalid_values: [ "0.9", "0", "-1", "3px" ]
+ other_values: [ "1", "7", "5000", "1.1" ],
+ invalid_values: [ "0.9", "0", "-1", "3px", "-0.3" ]
},
"stroke-opacity": {
domProp: null,
inherited: true,
type: CSS_TYPE_LONGHAND,
initial_values: [ "1", "2.8", "1.000" ],
other_values: [ "0", "0.3", "-7.3" ],
invalid_values: []
--- a/layout/style/test/test_bug377947.html
+++ b/layout/style/test/test_bug377947.html
@@ -52,27 +52,33 @@ is(s.getPropertyValue("list-style"), "",
is(s.getPropertyValue("font"), "",
"font shorthand should start off empty");
var all_but_one = {
"font-family": "serif",
"font-style": "normal",
"font-variant": "normal",
"font-weight": "bold",
"font-size": "small",
- "font-size-adjust": "0.45",
- "font-stretch": "normal"
+ "font-size-adjust": "none", // has to be default value
+ "font-stretch": "normal" // has to be default value
};
for (var prop in all_but_one) {
s.setProperty(prop, all_but_one[prop], "");
}
is(s.getPropertyValue("font"), "",
"font shorthand should be empty when some subproperties specified");
s.setProperty("line-height", "1.5", "");
isnot(s.getPropertyValue("font"), "",
"font shorthand should produce value when all subproperties set");
+s.setProperty("font-stretch", "condensed", "");
+is(s.getPropertyValue("font"), "",
+ "font shorthand should be empty when font-stretch is non-default");
+s.setProperty("font-stretch", "normal", "");
+isnot(s.getPropertyValue("font"), "",
+ "font shorthand should produce value when all subproperties set");
s.removeProperty("font");
is(s.getPropertyValue("font"), "",
"font shorthand be empty after removal");
s.font="medium serif";
isnot(s.getPropertyValue("font"), "",
"font shorthand should produce value when shorthand set");
s.removeProperty("font");
is(s.getPropertyValue("font"), "",
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_bug470769.html
@@ -0,0 +1,32 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=470769
+-->
+<head>
+ <title>Test for Bug 470769</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=470769">Mozilla Bug 470769</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 470769 **/
+
+var e = document.getElementById("display");
+e.setAttribute("style", "z-index: 2147483647"); // maximum signed 32-bit
+is(e.style.zIndex, "2147483647", "element.style should roundtrip correctly");
+todo_is(window.getComputedStyle(e, "").zIndex, "2147483647",
+ "getComputedStyle should roundtrip correctly");
+
+</script>
+</pre>
+</body>
+</html>
--- a/layout/style/test/test_inherit_computation.html
+++ b/layout/style/test/test_inherit_computation.html
@@ -17,28 +17,16 @@
<div id="testnode"><span id="nparent"><span id="nchild"></span></span></div>
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for computation of CSS 'inherit' **/
-var gBrokenInherit = {
- // Not implemented in nsRuleNode
- "-moz-border-bottom-colors": true,
- "-moz-border-left-colors": true,
- "-moz-border-right-colors": true,
- "-moz-border-top-colors": true,
-};
-
-function xfail_inherit(property, matching_initial) {
- return property in gBrokenInherit;
-}
-
// elements without a frame
var gNParent = document.getElementById("nparent");
var gNChild = document.getElementById("nchild");
// elements with a frame
var gFParent = document.getElementById("fparent");
var gFChild = document.getElementById("fchild");
var gStyleSheet = document.getElementById("stylesheet").sheet;
@@ -81,33 +69,29 @@ function test_property(property)
isnot(other_computed_f, initial_computed_f,
"should be testing with values that compute to different things " +
"for '" + property + "'");
gChildRule3.style.setProperty(property, "inherit", "");
gFChild.className="allother";
gNChild.className="allother";
var inherit_initial_computed_n = get_computed_value_node(gNChild, property);
var inherit_initial_computed_f = get_computed_value_node(gFChild, property);
- (xfail_inherit(property, true) ? todo_is : is)(
- inherit_initial_computed_n, initial_computed_n,
+ is(inherit_initial_computed_n, initial_computed_n,
"inherit should cause inheritance of initial value for '" +
property + "'");
- (xfail_inherit(property, true) ? todo_is : is)(
- inherit_initial_computed_f, initial_computed_f,
+ is(inherit_initial_computed_f, initial_computed_f,
"inherit should cause inheritance of initial value for '" +
property + "'");
gParentRuleTop.style.setProperty(property, info.other_values[0], "");
var inherit_other_computed_n = get_computed_value_node(gNChild, property);
var inherit_other_computed_f = get_computed_value_node(gFChild, property);
- (xfail_inherit(property, false) ? todo_is : is)(
- inherit_other_computed_n, other_computed_n,
+ is(inherit_other_computed_n, other_computed_n,
"inherit should cause inheritance of other value for '" +
property + "'");
- (xfail_inherit(property, false) ? todo_is : is)(
- inherit_other_computed_f, other_computed_f,
+ is(inherit_other_computed_f, other_computed_f,
"inherit should cause inheritance of other value for '" +
property + "'");
gParentRuleTop.style.removeProperty(property);
gChildRule1.style.removeProperty(property);
gChildRule3.style.setProperty(property, info.other_values[0], "");
gFChild.className="";
gNChild.className="";
} else {
@@ -120,34 +104,30 @@ function test_property(property)
"should be testing with values that compute to different things " +
"for '" + property + "'");
isnot(other_computed_f, initial_computed_f,
"should be testing with values that compute to different things " +
"for '" + property + "'");
gChildRule2.style.setProperty(property, "inherit", "");
var inherit_other_computed_n = get_computed_value_node(gNChild, property);
var inherit_other_computed_f = get_computed_value_node(gFChild, property);
- (xfail_inherit(property, false) ? todo_is : is)(
- inherit_other_computed_n, other_computed_n,
+ is(inherit_other_computed_n, other_computed_n,
"inherit should cause inheritance of other value for '" +
property + "'");
- (xfail_inherit(property, false) ? todo_is : is)(
- inherit_other_computed_f, other_computed_f,
+ is(inherit_other_computed_f, other_computed_f,
"inherit should cause inheritance of other value for '" +
property + "'");
gParentRuleTop.style.removeProperty(property);
gChildRule1.style.setProperty(property, info.other_values[0], "");
var inherit_initial_computed_n = get_computed_value_node(gNChild, property);
var inherit_initial_computed_f = get_computed_value_node(gFChild, property);
- (xfail_inherit(property, true) ? todo_is : is)(
- inherit_initial_computed_n, initial_computed_n,
+ is(inherit_initial_computed_n, initial_computed_n,
"inherit should cause inheritance of initial value for '" +
property + "'");
- (xfail_inherit(property, true) ? todo_is : is)(
- inherit_initial_computed_f, initial_computed_f,
+ is(inherit_initial_computed_f, initial_computed_f,
"inherit should cause inheritance of initial value for '" +
property + "'");
gParentRuleTop.style.removeProperty(property);
gChildRule1.style.removeProperty(property);
gChildRule2.style.removeProperty(property);
}
if ("prerequisites" in info) {
--- a/layout/style/test/test_inherit_storage.html
+++ b/layout/style/test/test_inherit_storage.html
@@ -20,35 +20,16 @@ https://bugzilla.mozilla.org/show_bug.cg
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for parsing, storage, and serialization of CSS 'inherit' **/
var gDeclaration = document.getElementById("testnode").style;
-var gKnownFails2 = {
- "-moz-border-end": true,
- "-moz-border-radius": true,
- "-moz-border-start": true,
- "-moz-column-rule": true,
- "-moz-outline-radius": true,
- "background": true,
- "border": true,
- "border-bottom": true,
- "border-left": true,
- "border-right": true,
- "border-top": true,
- "cue": true,
- "font": true,
- "list-style": true,
- "outline": true,
- "pause": true
-};
-
function test_property(property)
{
var info = gCSSProperties[property];
function check_initial(sproperty) {
var sinfo = gCSSProperties[sproperty];
var val = gDeclaration.getPropertyValue(sproperty);
is(val, "", "value of '" + sproperty + "' before we do anything");
@@ -77,20 +58,17 @@ function test_property(property)
}
check_set(property);
if ("subproperties" in info)
for (var idx in info.subproperties)
check_set(info.subproperties[idx]);
// We don't care particularly about the whitespace or the placement of
// semicolons, but for simplicity we'll test the current behavior.
- var cssTextFunc = is;
- if (property in gKnownFails2)
- cssTextFunc = todo_is;
- cssTextFunc(gDeclaration.cssText, property + ": inherit;",
+ is(gDeclaration.cssText, property + ": inherit;",
"declaration should serialize to exactly what went in (for inherit)");
gDeclaration.removeProperty(property);
function check_final(sproperty) {
var sinfo = gCSSProperties[sproperty];
var val = gDeclaration.getPropertyValue(sproperty);
is(val, "", "value of '" + sproperty + "' after removal of value");
--- a/layout/style/test/test_initial_storage.html
+++ b/layout/style/test/test_initial_storage.html
@@ -20,35 +20,16 @@ https://bugzilla.mozilla.org/show_bug.cg
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
/** Test for parsing, storage, and serialization of CSS '-moz-initial' **/
var gDeclaration = document.getElementById("testnode").style;
-var gKnownFails2 = {
- "-moz-border-end": true,
- "-moz-border-radius": true,
- "-moz-border-start": true,
- "-moz-column-rule": true,
- "-moz-outline-radius": true,
- "background": true,
- "border": true,
- "border-bottom": true,
- "border-left": true,
- "border-right": true,
- "border-top": true,
- "cue": true,
- "font": true,
- "list-style": true,
- "outline": true,
- "pause": true
-};
-
function test_property(property)
{
var info = gCSSProperties[property];
function check_initial(sproperty) {
var sinfo = gCSSProperties[sproperty];
var val = gDeclaration.getPropertyValue(sproperty);
is(val, "", "value of '" + sproperty + "' before we do anything");
@@ -77,20 +58,17 @@ function test_property(property)
}
check_set(property);
if ("subproperties" in info)
for (var idx in info.subproperties)
check_set(info.subproperties[idx]);
// We don't care particularly about the whitespace or the placement of
// semicolons, but for simplicity we'll test the current behavior.
- var cssTextFunc = is;
- if (property in gKnownFails2)
- cssTextFunc = todo_is;
- cssTextFunc(gDeclaration.cssText, property + ": -moz-initial;",
+ is(gDeclaration.cssText, property + ": -moz-initial;",
"declaration should serialize to exactly what went in (for -moz-initial)");
gDeclaration.removeProperty(property);
function check_final(sproperty) {
var sinfo = gCSSProperties[sproperty];
var val = gDeclaration.getPropertyValue(sproperty);
is(val, "", "value of '" + sproperty + "' after removal of value");
--- a/layout/style/test/test_property_syntax_errors.html
+++ b/layout/style/test/test_property_syntax_errors.html
@@ -17,26 +17,20 @@
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
var gDeclaration = document.getElementById("testnode").style;
var gKnownFails = {
- "-moz-border-bottom-colors": [ "red none", "red inherit" ],
- "-moz-border-left-colors": [ "red none", "red inherit" ],
- "-moz-border-right-colors": [ "red none", "red inherit" ],
- "-moz-border-top-colors": [ "red none", "red inherit" ],
"pitch-range": [ " -0.01", "100.2", "108", "-3" ],
"richness": [ " -0.01", "100.2", "108", "-3" ],
"stress": [ " -0.01", "100.2", "108", "-3" ],
- "volume": [ " -0.01", "100.2", "108", "-3" ],
- "text-decoration": [ "line-through blink line-through" ],
- "stroke-miterlimit": [ "0.9", "0" ]
+ "volume": [ " -0.01", "100.2", "108", "-3" ]
}
for (var property in gCSSProperties) {
var info = gCSSProperties[property];
for (var idx in info.invalid_values) {
var badval = info.invalid_values[idx];
gDeclaration.setProperty(property, badval, "");
new file mode 100644
--- /dev/null
+++ b/layout/style/test/test_shorthand_property_getters.html
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=376075
+-->
+<head>
+ <title>Test for Bug 376075</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=376075">Mozilla Bug 376075</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+/** Test for Bug 376075 **/
+
+var e = document.getElementById("display");
+
+// Test that we only serialize the 'border' shorthand when appropriate.
+e.setAttribute("style", "border-left: medium solid blue; border-right: medium solid blue; border-top: medium blue solid; border-bottom: blue medium solid");
+isnot(e.style.border, "", "should be able to serialize border");
+e.setAttribute("style", "border-left: medium solid blue; border-right: medium solid blue; border-top: medium blue solid; border-bottom: green medium solid");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid; border-color: green");
+isnot(e.style.border, "", "should be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid; border-color: green blue blue blue");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid; border-color: blue green blue blue");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid; border-color: blue blue green blue");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid; border-color: blue blue blue green");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 2px 3px 3px; border-style: solid; border-color: green");
+is(e.style.border, "", "should not be able to serialize border");
+e.setAttribute("style", "border-width: 3px 3px 3px 3px; border-style: solid dashed; border-color: green");
+is(e.style.border, "", "should not be able to serialize border");
+
+// Test suppression of -moz-use-text-color in border shorthands.
+e.setAttribute("style", "border: medium solid");
+ok(e.style.border == "medium solid" ||
+ e.style.border == "solid medium",
+ "implied default color omitted serializing border");
+ok(e.style.borderLeft == "medium solid" ||
+ e.style.borderLeft == "solid medium",
+ "implied default color omitted serializing border-left");
+ok(e.style.cssText == "border: medium solid;" ||
+ e.style.cssText == "border: solid medium;",
+ "implied default color omitted serializing declaration");
+e.setAttribute("style", "border-right: medium solid");
+ok(e.style.borderRight == "medium solid" ||
+ e.style.borderRight == "solid medium",
+ "implied default color omitted serializing border-right");
+ok(e.style.borderRight == "medium solid" ||
+ e.style.borderRight == "solid medium",
+ "implied default color omitted serializing border-right");
+ok(e.style.cssText == "border-right: medium solid;" ||
+ e.style.cssText == "border-right: solid medium;",
+ "implied default color omitted serializing declaration");
+
+// Test that we shorten box properties to the shortest possible.
+e.setAttribute("style", "margin: 7px");
+is(e.style.margin, "7px", "should condense to shortest possible");
+is(e.style.cssText, "margin: 7px;", "should condense to shortest possible");
+e.setAttribute("style", "padding: 7px 7px 7px");
+is(e.style.padding, "7px", "should condense to shortest possible");
+is(e.style.cssText, "padding: 7px;", "should condense to shortest possible");
+e.setAttribute("style", "border-width: 7px 7px 7px 7px");
+is(e.style.borderWidth, "7px", "should condense to shortest possible");
+is(e.style.cssText, "border-width: 7px;", "should condense to shortest possible");
+e.setAttribute("style", "margin: 7px 7px 7px 6px");
+is(e.style.margin, "7px 7px 7px 6px", "should not condense");
+is(e.style.cssText, "margin: 7px 7px 7px 6px;", "should not condense");
+e.setAttribute("style", "border-style: solid dotted none dotted");
+is(e.style.borderStyle, "solid dotted none", "should condense");
+is(e.style.cssText, "border-style: solid dotted none;", "should condense");
+e.setAttribute("style", "border-color: green blue");
+is(e.style.borderColor, "green blue", "should condense");
+is(e.style.cssText, "border-color: green blue;", "should condense");
+e.setAttribute("style", "border-color: green blue green");
+is(e.style.borderColor, "green blue", "should condense");
+is(e.style.cssText, "border-color: green blue;", "should condense");
+e.setAttribute("style", "border-color: green blue green blue");
+is(e.style.borderColor, "green blue", "should condense");
+is(e.style.cssText, "border-color: green blue;", "should condense");
+e.setAttribute("style", "border-color: currentColor currentColor currentcolor CURRENTcolor");
+is(e.style.borderColor, "currentcolor", "should condense to canonical case");
+is(e.style.cssText, "border-color: currentcolor;", "should condense to canonical case");
+e.setAttribute("style", "border-style: ridge none none none");
+is(e.style.borderStyle, "ridge none none", "should condense");
+is(e.style.cssText, "border-style: ridge none none;", "should condense");
+
+// Test that we refuse to serialize the 'background' and 'font'
+// shorthands when some subproperties that can't be expressed in the
+// shorthand syntax are present.
+e.setAttribute("style", "font: medium serif");
+isnot(e.style.font, "", "should have font shorthand");
+e.setAttribute("style", "font: medium serif; font-size-adjust: 0.45");
+is(e.style.font, "", "should not have font shorthand");
+e.setAttribute("style", "font: medium serif; font-stretch: condensed");
+is(e.style.font, "", "should not have font shorthand");
+
+e.setAttribute("style", "background: red");
+isnot(e.style.background, "", "should have background shorthand");
+e.setAttribute("style", "background: red; -moz-background-origin: border");
+is(e.style.background, "", "should not have background shorthand");
+e.setAttribute("style", "background: red; -moz-background-clip: padding");
+is(e.style.background, "", "should not have background shorthand");
+e.setAttribute("style", "background: red; -moz-background-inline-policy: each-box");
+is(e.style.background, "", "should not have background shorthand");
+
+</script>
+</pre>
+</body>
+</html>
--- a/layout/style/test/test_value_storage.html
+++ b/layout/style/test/test_value_storage.html
@@ -41,27 +41,16 @@
* operation twice. Likewise for parse + compute + cserialize.
*
* Slightly more interestingly, we test that serialize + parse is the
* identity transform by comparing the output of parse + compute +
* cserialize to the output of parse + serialize + parse + compute +
* cserialize.
*/
-var gShorthandsWithoutCondensingSerialize = {
- "-moz-border-radius": true,
- "-moz-outline-radius": true,
- "background": true, // really there, but not complete
- "cue": true,
- "font": true,
- "list-style": true,
- "outline": true,
- "pause": true,
-};
-
var gNotAccepted = {
"-moz-column-width": [ "50%" ],
"list-style": [ "none disc outside" ],
};
var gSystemFont = {
"caption": true,
"icon": true,
@@ -71,21 +60,16 @@ var gSystemFont = {
"status-bar": true,
};
var gBadCompute = {
// output wrapped around to positive, in exponential notation
"-moz-box-ordinal-group": [ "-1", "-1000" ],
};
-var gShortenableValues = {
- "border-color": [ "currentColor currentColor currentcolor CURRENTcolor" ],
- "border-style": [ "none none none none", "groove none none none", "none none double none" ],
-};
-
function xfail_accepted(property, value)
{
if (property in gNotAccepted &&
gNotAccepted[property].indexOf(value) != -1)
return true;
return false;
}
@@ -94,47 +78,16 @@ function xfail_accepted_split(property,
{
if (property in gNotAccepted &&
gNotAccepted[property].indexOf(value) != -1)
return true;
return false;
}
-function xfail_ser_val(property, value)
-{
- if (property != "font" && xfail_accepted(property, value))
- // We already failed the first test, which will make us always pass this
- // one.
- return false;
-
- if (property in gShorthandsWithoutCondensingSerialize)
- return true;
-
- // We output unneeded -moz-use-text-color only in the value getter and
- // not the serialization.
- // XXXbz is there any way we could actually filter for that, so that colors
- // other than green could be used in the property database here?
- if ((property.match(/^border(|-bottom|-left|-right|-top)$/) ||
- property.match(/^-moz-border(|-start|-end)$/)) &&
- !value.match(/(green|currentcolor)/i))
- return true;
-
- // We condense multiple values in the serialization, but not in the
- // value getter.
- if (property.match(/^(border-(color|style|width)|margin|padding)$/) &&
- value.split(" ").length != 4)
- return true;
- if (property in gShortenableValues &&
- gShortenableValues[property].indexOf(value) != -1)
- return true;
-
- return false;
-}
-
function xfail_idparseser(property, value)
{
if (property != "font" && xfail_accepted(property, value))
// We already failed the first test, which will make us always pass this
// one.
return false;
return false;
@@ -206,22 +159,21 @@ function test_property(property)
func = xfail_accepted_split(property, subprop, value)
? todo_isnot : isnot;
func(gDeclaration.getPropertyValue(subprop), "",
"setting '" + value + "' on '" + property + "'");
}
// We don't care particularly about the whitespace or the placement of
// semicolons, but for simplicity we'll test the current behavior.
- func = xfail_ser_val(property, value) ? todo_is : is;
var expected_serialization = "";
if (step1val != "")
expected_serialization = property + ": " + step1val + ";";
- func(step1ser, expected_serialization,
- "serialization should match property value");
+ is(step1ser, expected_serialization,
+ "serialization should match property value");
gDeclaration.removeProperty(property);
gDeclaration.setProperty(property, step1val, "");
func = xfail_idparseser(property, value) ? todo_is : is;
func(gDeclaration.getPropertyValue(property), step1val,
"parse+serialize should be idempotent for '" +
property + ": " + value + "'");
--- a/layout/svg/base/src/nsSVGFilterFrame.cpp
+++ b/layout/svg/base/src/nsSVGFilterFrame.cpp
@@ -117,25 +117,28 @@ nsAutoFilterInstance::nsAutoFilterInstan
nsISVGChildFrame::TRANSFORM_CHANGED);
}
nsSVGFilterElement *filter = static_cast<nsSVGFilterElement*>(
aFilterFrame->GetContent());
PRUint16 units =
filter->mEnumAttributes[nsSVGFilterElement::FILTERUNITS].GetAnimValue();
+ PRUint16 primitiveUnits =
+ filter->mEnumAttributes[nsSVGFilterElement::PRIMITIVEUNITS].GetAnimValue();
nsCOMPtr<nsIDOMSVGRect> bbox;
if (aOverrideSourceBBox) {
NS_NewSVGRect(getter_AddRefs(bbox),
aOverrideSourceBBox->x, aOverrideSourceBBox->y,
aOverrideSourceBBox->width, aOverrideSourceBBox->height);
} else {
bbox = nsSVGUtils::GetBBox(aTarget);
}
- if (!bbox && units == nsIDOMSVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
+ if (!bbox && (units == nsIDOMSVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX ||
+ primitiveUnits == nsIDOMSVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX))
return;
gfxRect filterArea = nsSVGUtils::GetRelativeRect(units,
&filter->mLengthAttributes[nsSVGFilterElement::X], bbox, aTarget);
filterArea.RoundOut();
PRBool resultOverflows;
gfxIntSize filterRes;
@@ -177,18 +180,16 @@ nsAutoFilterInstance::nsAutoFilterInstan
finiM.Invert();
nsIntRect dirtyOutputRect =
MapDeviceRectToFilterSpace(finiM, filterRes, aDirtyOutputRect);
nsIntRect dirtyInputRect =
MapDeviceRectToFilterSpace(finiM, filterRes, aDirtyInputRect);
// Setup instance data
- PRUint16 primitiveUnits =
- filter->mEnumAttributes[nsSVGFilterElement::PRIMITIVEUNITS].GetAnimValue();
mInstance = new nsSVGFilterInstance(aTarget, aPaint, filter, bbox, filterArea,
nsIntSize(filterRes.width, filterRes.height),
fini,
dirtyOutputRect, dirtyInputRect,
primitiveUnits);
}
nsAutoFilterInstance::~nsAutoFilterInstance()
--- a/layout/xul/base/src/nsImageBoxFrame.cpp
+++ b/layout/xul/base/src/nsImageBoxFrame.cpp
@@ -202,17 +202,17 @@ nsImageBoxFrame::MarkIntrinsicWidthsDirt
nsLeafBoxFrame::MarkIntrinsicWidthsDirty();
}
void
nsImageBoxFrame::Destroy()
{
// Release image loader first so that it's refcnt can go to zero
if (mImageRequest)
- mImageRequest->Cancel(NS_ERROR_FAILURE);
+ mImageRequest->CancelAndForgetObserver(NS_ERROR_FAILURE);
if (mListener)
reinterpret_cast<nsImageBoxListener*>(mListener.get())->SetFrame(nsnull); // set the frame to null so we don't send messages to a dead object.
nsLeafBoxFrame::Destroy();
}
--- a/layout/xul/base/src/nsPopupSetFrame.cpp
+++ b/layout/xul/base/src/nsPopupSetFrame.cpp
@@ -72,17 +72,16 @@ nsPopupSetFrame::Init(nsIContent* a
nsIFrame* aParent,
nsIFrame* aPrevInFlow)
{
nsresult rv = nsBoxFrame::Init(aContent, aParent, aPrevInFlow);
// Normally the root box is our grandparent, but in case of wrapping
// it can be our great-grandparent.
nsIRootBox *rootBox = nsIRootBox::GetRootBox(PresContext()->GetPresShell());
- NS_ASSERTION(rootBox, "must have root box");
if (rootBox) {
rootBox->SetPopupSetFrame(this);
}
return rv;
}
nsIAtom*
@@ -143,17 +142,16 @@ nsPopupSetFrame::Destroy()
nsPopupFrameList* temp = mPopupList;
mPopupList = mPopupList->mNextPopup;
delete temp;
}
// Normally the root box is our grandparent, but in case of wrapping
// it can be our great-grandparent.
nsIRootBox *rootBox = nsIRootBox::GetRootBox(PresContext()->GetPresShell());
- NS_ASSERTION(rootBox, "must have root box");
if (rootBox) {
rootBox->SetPopupSetFrame(nsnull);
}
nsBoxFrame::Destroy();
}
NS_IMETHODIMP
new file mode 100644
--- /dev/null
+++ b/layout/xul/base/src/tree/src/crashtests/399227-1.xul
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" class="reftest-wait" onload="setTimeout(boom, 30)">
+
+
+ <script>
+ function boom()
+ {
+ var tree = document.getElementById("thetree");
+ var selection = tree.view.selection;
+
+ selection.select(0);
+ tree.parentNode.removeChild(tree);
+
+ // This is expected to throw an error (it used to crash).
+ try {
+ selection.rangedSelect(1, 1, false);
+ }
+ catch (ex) {}
+
+ document.documentElement.removeAttribute("class");
+ }
+ </script>
+
+<tree flex="1" id="thetree">
+ <treecols>
+ <treecol label="Name"/>
+ </treecols>
+ <treechildren id="TC">
+ <treeitem id="TI1">
+ <treerow>
+ <treecell label="First treecell"/>
+ </treerow>
+ </treeitem>
+ <treeitem id="TI2">
+ <treerow>
+ <treecell label="Second treecell"/>
+ </treerow>
+ </treeitem>
+ </treechildren>
+ </tree>
+</window>
new file mode 100644
--- /dev/null
+++ b/layout/xul/base/src/tree/src/crashtests/399227-2.xul
@@ -0,0 +1,50 @@
+<?xml version="1.0"?>
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+
+<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" class="reftest-wait" onload="setTimeout(boom, 30);">
+
+
+ <script>
+ function boom()
+ {
+ var tree = document.getElementById("thetree");
+ var selection = tree.view.selection;
+ var treecolumn0 = tree.columns[0];
+ var treecolumn1 = tree.columns[1];
+
+ selection.select(0);
+ selection.currentColumn = treecolumn0;
+ tree.parentNode.removeChild(tree);
+
+ // This is expected to throw an error (it used to crash).
+ try {
+ selection.currentColumn = treecolumn1;
+ }
+ catch (ex) {}
+
+ document.documentElement.removeAttribute("class");
+ }
+ </script>
+
+<tree flex="1" id="thetree" seltype="cell">
+ <treecols>
+ <treecol label="Name"/>
+ <treecol label="Test"/>
+ </treecols>
+ <treechildren id="TC">
+ <treeitem id="TI1">
+ <treerow>
+ <treecell label="First treecell"/>
+ <treecell label="Second treecell"/>
+ </treerow>
+ </treeitem>
+ <treeitem id="TI2">
+ <treerow>
+ <treecell label="Third treecell"/>
+ <treecell label="Fourth treecell"/>
+ </treerow>
+ </treeitem>
+ </treechildren>
+ </tree>
+</window>
--- a/layout/xul/base/src/tree/src/crashtests/crashtests.list
+++ b/layout/xul/base/src/tree/src/crashtests/crashtests.list
@@ -1,10 +1,12 @@
load 307298-1.xul
load 309732-1.xul
load 309732-2.xul
load 366583-1.xul
load 380217-1.xul
load 393665-1.xul
+load 399227-1.xul
+load 399227-2.xul
load 399692-1.xhtml
load 399715-1.xhtml
load 409807-1.xul
load 454186-1.xul
--- a/layout/xul/base/src/tree/src/nsTreeSelection.cpp
+++ b/layout/xul/base/src/tree/src/nsTreeSelection.cpp
@@ -294,16 +294,19 @@ NS_IMETHODIMP nsTreeSelection::SetTree(n
mSelectTimer = nsnull;
}
mTree = aTree; // WEAK
return NS_OK;
}
NS_IMETHODIMP nsTreeSelection::GetSingle(PRBool* aSingle)
{
+ if (!mTree)
+ return NS_ERROR_NULL_POINTER;
+
nsCOMPtr<nsIBoxObject> boxObject = do_QueryInterface(mTree);
nsCOMPtr<nsIDOMElement> element;
boxObject->GetElement(getter_AddRefs(element));
nsCOMPtr<nsIContent> content = do_QueryInterface(element);
static nsIContent::AttrValuesArray strings[] =
@@ -405,18 +408,18 @@ NS_IMETHODIMP nsTreeSelection::ToggleSel
if (NS_FAILED(rv))
return rv;
if (!mFirstRange)
Select(aIndex);
else {
if (!mFirstRange->Contains(aIndex)) {
PRBool single;
- GetSingle(&single);
- if (!single)
+ rv = GetSingle(&single);
+ if (NS_SUCCEEDED(rv) && !single)
rv = mFirstRange->Add(aIndex);
}
else
rv = mFirstRange->Remove(aIndex);
if (NS_SUCCEEDED(rv)) {
if (mTree)
mTree->InvalidateRow(aIndex);
@@ -425,17 +428,20 @@ NS_IMETHODIMP nsTreeSelection::ToggleSel
}
return rv;
}
NS_IMETHODIMP nsTreeSelection::RangedSelect(PRInt32 aStartIndex, PRInt32 aEndIndex, PRBool aAugment)
{
PRBool single;
- GetSingle(&single);
+ nsresult rv = GetSingle(&single);
+ if (NS_FAILED(rv))
+ return rv;
+
if ((mFirstRange || (aStartIndex != aEndIndex)) && single)
return NS_OK;
if (!aAugment) {
// Clear our selection.
if (mFirstRange) {
mFirstRange->Invalidate();
delete mFirstRange;
@@ -447,17 +453,17 @@ NS_IMETHODIMP nsTreeSelection::RangedSel
aStartIndex = mShiftSelectPivot;
else if (mCurrentIndex != -1)
aStartIndex = mCurrentIndex;
else
aStartIndex = aEndIndex;
}
mShiftSelectPivot = aStartIndex;
- nsresult rv = SetCurrentIndex(aEndIndex);
+ rv = SetCurrentIndex(aEndIndex);
if (NS_FAILED(rv))
return rv;
PRInt32 start = aStartIndex < aEndIndex ? aStartIndex : aEndIndex;
PRInt32 end = aStartIndex < aEndIndex ? aEndIndex : aStartIndex;
if (aAugment && mFirstRange) {
// We need to remove all the items within our selected range from the selection,
@@ -529,17 +535,20 @@ NS_IMETHODIMP nsTreeSelection::SelectAll
nsCOMPtr<nsITreeView> view;
mTree->GetView(getter_AddRefs(view));
if (!view)
return NS_OK;
PRInt32 rowCount;
view->GetRowCount(&rowCount);
PRBool single;
- GetSingle(&single);
+ nsresult rv = GetSingle(&single);
+ if (NS_FAILED(rv))
+ return rv;
+
if (rowCount == 0 || (rowCount > 1 && single))
return NS_OK;
mShiftSelectPivot = -1;
// Invalidate not necessary when clearing selection, since
// we're going to invalidate the world on the SelectAll.
delete mFirstRange;
@@ -653,16 +662,19 @@ NS_IMETHODIMP nsTreeSelection::SetCurren
NS_IMETHODIMP nsTreeSelection::GetCurrentColumn(nsITreeColumn** aCurrentColumn)
{
NS_IF_ADDREF(*aCurrentColumn = mCurrentColumn);
return NS_OK;
}
NS_IMETHODIMP nsTreeSelection::SetCurrentColumn(nsITreeColumn* aCurrentColumn)
{
+ if (!mTree) {
+ return NS_ERROR_UNEXPECTED;
+ }
if (mCurrentColumn == aCurrentColumn) {
return NS_OK;
}
if (mCurrentColumn) {
if (mFirstRange)
mTree->InvalidateCell(mFirstRange->mMin, mCurrentColumn);
if (mCurrentIndex != -1)
--- a/media/libvorbis/README_MOZILLA
+++ b/media/libvorbis/README_MOZILLA
@@ -4,8 +4,10 @@ were those applied by update.sh and the
files for the Mozilla build system.
Some files are renamed during the copy to prevent clashes with object
file names with other Mozilla libraries.
BUG 455372 - WinCE LibVorbis No FPU Support on WinMobile, removed FPU
support for builds with WINCE defined.
+BUG 469639 - Failed to build firefox trunk on OpenSolaris
+
new file mode 100644
--- /dev/null
+++ b/media/libvorbis/alloca.diff
@@ -0,0 +1,14 @@
+diff -r f33a75da59bd media/libvorbis/lib/os.h
+--- a/media/libvorbis/lib/os.h Sun Dec 07 19:31:40 2008 -0800
++++ b/media/libvorbis/lib/os.h Mon Dec 15 16:26:36 2008 +0800
+@@ -25,6 +25,10 @@
+ #include <ogg/os_types.h>
+
+ #include "misc.h"
++
++#ifdef SOLARIS
++#define HAVE_ALLOCA_H
++#endif
+
+ #ifndef _V_IFDEFJAIL_H_
+ # define _V_IFDEFJAIL_H_
--- a/media/libvorbis/lib/os.h
+++ b/media/libvorbis/lib/os.h
@@ -21,16 +21,20 @@
#include "config.h"
#endif
#include <math.h>
#include <ogg/os_types.h>
#include "misc.h"
+#ifdef SOLARIS
+#define HAVE_ALLOCA_H
+#endif
+
#ifndef _V_IFDEFJAIL_H_
# define _V_IFDEFJAIL_H_
# ifdef __GNUC__
# define STIN static __inline__
# elif _WIN32
# define STIN static __inline
# else
--- a/media/libvorbis/update.sh
+++ b/media/libvorbis/update.sh
@@ -41,8 +41,9 @@ cp $1/lib/registry.h ./lib/registry.h
cp $1/lib/codebook.c ./lib/vorbis_codebook.c
cp $1/lib/bitrate.c ./lib/vorbis_bitrate.c
cp $1/lib/block.c ./lib/vorbis_block.c
cp $1/include/vorbis/codec.h ./include/vorbis/codec.h
cp $1/todo.txt ./todo.txt
cp $1/COPYING ./COPYING
cp $1/README ./README
cp $1/AUTHORS ./AUTHORS
+patch -p3 < ./alloca.diff
--- a/modules/libimg/png/CHANGES
+++ b/modules/libimg/png/CHANGES
@@ -2181,17 +2181,17 @@ version 1.2.30beta03 [July 6, 2008]
Changed PNGMAJ from 0 to 12 in makefile.darwin, which does not like 0.
Added new private function png_read_chunk_header() from 1.4.0beta19.
Merge reading of chunk length and chunk type into a single 8-byte read.
Merge writing of chunk length and chunk type into a single 8-byte write.
version 1.2.30beta04 [July 10, 2008]
Merged more cosmetic whitespace changes from libpng-1.4.0beta19.
-version 1.0.38rc01, 1.2.30rc01 [August 13, 2008]
+version 1.0.38rc01, 1.2.30rc01 [December 18, 2008]
No changes.
version 1.0.38rc02, 1.2.30rc02 [July 21, 2008]
Moved local array "chunkdata" from pngrutil.c to the png_struct, so
it will be freed by png_read_destroy() in case of a read error (Kurt
Christensen).
version 1.0.38rc03, 1.2.30rc03 [July 21, 2008]
@@ -2236,15 +2236,83 @@ version 1.2.31rc02 [August 19, 2008]
version 1.2.31rc03 [August 19, 2008]
Added PNG_WRITE_FLUSH_AFTER_IEND_SUPPORTED block, off by default, around
new png_flush().
version 1.0.39, 1.2.31 [August 21, 2008]
No changes.
+version 1.2.32beta01 [September 6, 2008]
+ Shortened tIME_string to 29 bytes in pngtest.c (bug introduced in
+ libpng-1.2.22).
+ Fixed off-by-one error introduced in png_push_read_zTXt() function in
+ libpng-1.2.30beta04/pngpread.c (Harald van Dijk)
+ These bugs have been given the vulnerability id CVE-2008-3964.
+
+version 1.0.40, 1.2.32 [September 18, 2008]
+ No changes.
+
+version 1.2.33beta01 [October 6, 2008]
+ Revised makefile.darwin to fix shared library numbering.
+ Change png_set_gray_1_2_4_to_8() to png_set_expand_gray_1_2_4_to_8()
+ in example.c (debian bug report)
+
+version 1.2.33rc01 [October 15, 2008]
+ No changes.
+
+version 1.0.41rc01, version 1.2.33rc02 [October 23, 2008]
+ Changed remaining "key" to "png_ptr->chunkdata" in png_handle_tEXt()
+ to avoid memory leak after memory failure while reading tEXt chunk.`
+
+version 1.2.33 [October 31, 2008]
+ No changes.
+
+version 1.2.34beta01 [November 27, 2008]
+ Revised png_warning() to write its message on standard output by default
+ when warning_fn is NULL. This was the behavior prior to libpng-1.2.9beta9.
+ Fixed string vs pointer-to-string error in png_check_keyword().
+ Added png_check_cHRM_fixed() in png.c and moved checking from pngget.c,
+ pngrutil.c, and pngwrite.c, and eliminated floating point cHRM checking.
+ Added check for zero-area RGB cHRM triangle in png_check_cHRM_fixed().
+ In png_check_cHRM_fixed(), ensure white_y is > 0, and removed redundant
+ check for all-zero coordinates that is detected by the triangle check.
+ Revised png_warning() to write its message on standard output by default
+ when warning_fn is NULL.
+
+version 1.2.34beta02 [November 28, 2008]
+ Corrected off-by-one error in bKGD validity check in png_write_bKGD()
+ and in png_handle_bKGD().
+
+version 1.2.34beta03 [December 1, 2008]
+ Revised bKGD validity check to use >= x instead of > x + 1
+ Merged with png_debug from libpng-1.4.0 to remove newlines.
+
+version 1.2.34beta04 [December 2, 2008]
+ More merging with png_debug from libpng-1.4.0 to remove newlines.
+
+version 1.2.34beta05 [December 5, 2008]
+ Removed redundant check for key==NULL before calling png_check_keyword()
+ to ensure that new_key gets initialized and removed extra warning
+ (Arvan Pritchard).
+
+version 1.2.34beta06 [December 9, 2008]
+ In png_write_png(), respect the placement of the filler bytes in an earlier
+ call to png_set_filler() (Jim Barry).
+
+version 1.2.34beta07 [December 9, 2008]
+ Undid previous change and added PNG_TRANSFORM_STRIP_FILLER_BEFORE and
+ PNG_TRANSFORM_STRIP_FILLER_AFTER conditionals and deprecated
+ PNG_TRANSFORM_STRIP_FILLER (Jim Barry).
+
+version 1.0.42rc01, 1.2.34rc01 [December 11, 2008]
+ No changes.
+
+version 1.0.42, 1.2.34 [December 18, 2008]
+ No changes.
+
Send comments/corrections/commendations to png-mng-implement at lists.sf.net
(subscription required; visit
https://lists.sourceforge.net/lists/listinfo/png-mng-implement
to subscribe)
or to glennrp at users.sourceforge.net
Glenn R-P
--- a/modules/libimg/png/LICENSE
+++ b/modules/libimg/png/LICENSE
@@ -3,17 +3,17 @@ This copy of the libpng notices is provi
any discrepancy between this copy and the notices in the file png.h that is
included in the libpng distribution, the latter shall prevail.
COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
If you modify libpng you may insert additional notices immediately following
this sentence.
-libpng versions 1.2.6, August 15, 2004, through 1.2.31, August 21, 2008, are
+libpng versions 1.2.6, August 15, 2004, through 1.2.34, December 18, 2008, are
Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are
distributed according to the same disclaimer and license as libpng-1.2.5
with the following individual added to the list of Contributing Authors
Cosmin Truta
libpng versions 1.0.7, July 1, 2000, through 1.2.5 - October 3, 2002, are
Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
@@ -101,9 +101,9 @@ boxes and the like:
Also, the PNG logo (in PNG format, of course) is supplied in the
files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
certification mark of the Open Source Initiative.
Glenn Randers-Pehrson
glennrp at users.sourceforge.net
-August 21, 2008
+December 18, 2008
--- a/modules/libimg/png/README
+++ b/modules/libimg/png/README
@@ -1,9 +1,9 @@
-README for libpng version 1.2.31 - August 21, 2008 (shared library 12.0)
+README for libpng version 1.2.34 - December 18, 2008 (shared library 12.0)
See the note about version numbers near the top of png.h
See INSTALL for instructions on how to install libpng.
Libpng comes in several distribution formats. Get libpng-*.tar.gz,
libpng-*.tar.lzma, or libpng-*.tar.bz2 if you want UNIX-style line
endings in the text files, or lpng*.7z or lpng*.zip if you want DOS-style
line endings. You can get UNIX-style line endings from the *.zip file
@@ -189,21 +189,21 @@ Files in this distribution:
Netware.
wince.txt => Contains instructions for downloading a Microsoft
Visual C++ (Windows CD Toolkit) workspace for
building libpng and zlib on WindowsCE
scripts => Directory containing scripts for building libpng:
descrip.mms => VMS makefile for MMS or MMK
makefile.std => Generic UNIX makefile (cc, creates static libpng.a)
makefile.elf => Linux/ELF makefile symbol versioning,
- gcc, creates libpng12.so.0.1.2.31)
+ gcc, creates libpng12.so.0.1.2.34)
makefile.linux => Linux/ELF makefile
- (gcc, creates libpng12.so.0.1.2.31)
+ (gcc, creates libpng12.so.0.1.2.34)
makefile.gcmmx => Linux/ELF makefile
- (gcc, creates libpng12.so.0.1.2.31,
+ (gcc, creates libpng12.so.0.1.2.34,
uses assembler code tuned for Intel MMX platform)
makefile.gcc => Generic makefile (gcc, creates static libpng.a)
makefile.knr => Archaic UNIX Makefile that converts files with
ansi2knr (Requires ansi2knr.c from
ftp://ftp.cs.wisc.edu/ghost)
makefile.aix => AIX makefile
makefile.cygwin => Cygwin/gcc makefile
makefile.darwin => Darwin makefile
@@ -215,22 +215,22 @@ Files in this distribution:
makefile.ibmc => IBM C/C++ version 3.x for Win32 and OS/2 (static)
makefile.intel => Intel C/C++ version 4.0 and later
libpng.icc => Project file, IBM VisualAge/C++ 4.0 or later
makefile.netbsd => NetBSD/cc makefile, PNGGCCRD, makes libpng.so.
makefile.ne12bsd => NetBSD/cc makefile, PNGGCCRD, makes libpng12.so
makefile.openbsd => OpenBSD makefile
makefile.sgi => Silicon Graphics IRIX (cc, creates static lib)
makefile.sggcc => Silicon Graphics
- (gcc, creates libpng12.so.0.1.2.31)
+ (gcc, creates libpng12.so.0.1.2.34)
makefile.sunos => Sun makefile
makefile.solaris => Solaris 2.X makefile
- (gcc, creates libpng12.so.0.1.2.31)
+ (gcc, creates libpng12.so.0.1.2.34)
makefile.so9 => Solaris 9 makefile
- (gcc, creates libpng12.so.0.1.2.31)
+ (gcc, creates libpng12.so.0.1.2.34)
makefile.32sunu => Sun Ultra 32-bit makefile
makefile.64sunu => Sun Ultra 64-bit makefile
makefile.sco => For SCO OSr5 ELF and Unixware 7 with Native cc
makefile.mips => MIPS makefile
makefile.acorn => Acorn makefile
makefile.amiga => Amiga makefile
smakefile.ppc => AMIGA smakefile for SAS C V6.58/7.00 PPC
compiler (Requires SCOPTIONS, copied from
--- a/modules/libimg/png/libpng.txt
+++ b/modules/libimg/png/libpng.txt
@@ -1,20 +1,20 @@
-libpng.txt - A description on how to use and modify libpng
-
- libpng version 1.2.31 - August 21, 2008
+ libpng.txt - A description on how to use and modify libpng
+
+ libpng version 1.2.34 - December 18, 2008
Updated and distributed by Glenn Randers-Pehrson
<glennrp at users.sourceforge.net>
Copyright (c) 1998-2008 Glenn Randers-Pehrson
For conditions of distribution and use, see copyright
notice in png.h.
-
+
Based on:
-
- libpng versions 0.97, January 1998, through 1.2.31 - August 21, 2008
+
+ libpng versions 0.97, January 1998, through 1.2.34 - December 18, 2008
Updated and distributed by Glenn Randers-Pehrson
Copyright (c) 1998-2008 Glenn Randers-Pehrson
libpng 1.0 beta 6 version 0.96 May 28, 1997
Updated and distributed by Andreas Dilger
Copyright (c) 1996, 1997 Andreas Dilger
libpng 1.0 beta 2 - version 0.88 January 26, 1996
--- a/modules/libimg/png/png.c
+++ b/modules/libimg/png/png.c
@@ -1,24 +1,24 @@
/* png.c - location for general purpose libpng functions
*
- * Last changed in libpng 1.2.30 [August 13, 2008]
+ * Last changed in libpng 1.2.34 [December 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
#define PNG_INTERNAL
#define PNG_NO_EXTERN
#include "png.h"
/* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_2_31 Your_png_h_is_not_version_1_2_31;
+typedef version_1_2_34 Your_png_h_is_not_version_1_2_34;
/* Version information for C files. This had better match the version
* string defined in png.h. */
#ifdef PNG_USE_GLOBAL_ARRAYS
/* png_libpng_ver was changed to a function in version 1.0.5c */
PNG_CONST char png_libpng_ver[18] = PNG_LIBPNG_VER_STRING;
@@ -91,17 +91,17 @@ PNG_CONST int FARDATA png_pass_dsp_mask[
* or write any of the magic bytes before it starts on the IHDR.
*/
#ifdef PNG_READ_SUPPORTED
void PNGAPI
png_set_sig_bytes(png_structp png_ptr, int num_bytes)
{
if (png_ptr == NULL) return;
- png_debug(1, "in png_set_sig_bytes\n");
+ png_debug(1, "in png_set_sig_bytes");
if (num_bytes > 8)
png_error(png_ptr, "Too many bytes for PNG signature.");
png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
}
/* Checks whether the supplied bytes match the PNG signature. We allow
* checking less than the full 8-byte signature so that those apps that
@@ -238,17 +238,17 @@ png_calculate_crc(png_structp png_ptr, p
* and png_info_init() so that applications that want to use a shared
* libpng don't have to be recompiled if png_info changes size.
*/
png_infop PNGAPI
png_create_info_struct(png_structp png_ptr)
{
png_infop info_ptr;
- png_debug(1, "in png_create_info_struct\n");
+ png_debug(1, "in png_create_info_struct");
if (png_ptr == NULL) return (NULL);
#ifdef PNG_USER_MEM_SUPPORTED
info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
png_ptr->malloc_fn, png_ptr->mem_ptr);
#else
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
#endif
if (info_ptr != NULL)
@@ -263,17 +263,17 @@ png_create_info_struct(png_structp png_p
* useful for some applications.
*/
void PNGAPI
png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
{
png_infop info_ptr = NULL;
if (png_ptr == NULL) return;
- png_debug(1, "in png_destroy_info_struct\n");
+ png_debug(1, "in png_destroy_info_struct");
if (info_ptr_ptr != NULL)
info_ptr = *info_ptr_ptr;
if (info_ptr != NULL)
{
png_info_destroy(png_ptr, info_ptr);
#ifdef PNG_USER_MEM_SUPPORTED
@@ -302,17 +302,17 @@ png_info_init(png_infop info_ptr)
void PNGAPI
png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
{
png_infop info_ptr = *ptr_ptr;
if (info_ptr == NULL) return;
- png_debug(1, "in png_info_init_3\n");
+ png_debug(1, "in png_info_init_3");
if (png_sizeof(png_info) > png_info_struct_size)
{
png_destroy_struct(info_ptr);
info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
*ptr_ptr = info_ptr;
}
@@ -320,34 +320,34 @@ png_info_init_3(png_infopp ptr_ptr, png_
png_memset(info_ptr, 0, png_sizeof(png_info));
}
#ifdef PNG_FREE_ME_SUPPORTED
void PNGAPI
png_data_freer(png_structp png_ptr, png_infop info_ptr,
int freer, png_uint_32 mask)
{
- png_debug(1, "in png_data_freer\n");
+ png_debug(1, "in png_data_freer");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (freer == PNG_DESTROY_WILL_FREE_DATA)
info_ptr->free_me |= mask;
else if (freer == PNG_USER_WILL_FREE_DATA)
info_ptr->free_me &= ~mask;
else
png_warning(png_ptr,
"Unknown freer parameter in png_data_freer.");
}
#endif
void PNGAPI
png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
int num)
{
- png_debug(1, "in png_free_data\n");
+ png_debug(1, "in png_free_data");
if (png_ptr == NULL || info_ptr == NULL)
return;
#if defined(PNG_TEXT_SUPPORTED)
/* free text item num or (if num == -1) all text items */
#ifdef PNG_FREE_ME_SUPPORTED
if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
#else
@@ -591,17 +591,17 @@ if (mask & PNG_FREE_ROWS)
/* This is an internal routine to free any memory that the info struct is
* pointing to before re-using it or freeing the struct itself. Recall
* that png_free() checks for NULL pointers for us.
*/
void /* PRIVATE */
png_info_destroy(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_info_destroy\n");
+ png_debug(1, "in png_info_destroy");
png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
if (png_ptr->num_chunk_list)
{
png_free(png_ptr, png_ptr->chunk_list);
png_ptr->chunk_list=NULL;
@@ -630,17 +630,17 @@ png_get_io_ptr(png_structp png_ptr)
* use your own read or write routines, you can call either png_set_read_fn()
* or png_set_write_fn() instead of png_init_io(). If you have defined
* PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
* necessarily available.
*/
void PNGAPI
png_init_io(png_structp png_ptr, png_FILE_p fp)
{
- png_debug(1, "in png_init_io\n");
+ png_debug(1, "in png_init_io");
if (png_ptr == NULL) return;
png_ptr->io_ptr = (png_voidp)fp;
}
#endif
#if defined(PNG_TIME_RFC1123_SUPPORTED)
/* Convert the supplied time into an RFC 1123 string suitable for use in
* a "Creation Time" or other text-based time string.
@@ -692,17 +692,17 @@ png_convert_to_rfc1123(png_structp png_p
#endif /* PNG_TIME_RFC1123_SUPPORTED */
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
png_charp PNGAPI
png_get_copyright(png_structp png_ptr)
{
png_ptr = png_ptr; /* silence compiler warning about unused png_ptr */
- return ((png_charp) "\n libpng version 1.2.31 - August 21, 2008\n\
+ return ((png_charp) "\n libpng version 1.2.34 - December 18, 2008\n\
Copyright (c) 1998-2008 Glenn Randers-Pehrson\n\
Copyright (c) 1996-1997 Andreas Dilger\n\
Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc.\n");
}
/* The following return the library version as a short string in the
* format 1.0.0 through 99.99.99zz. To get the version of *.h files
* used with your application, print out PNG_LIBPNG_VER_STRING, which
@@ -794,9 +794,121 @@ png_mmx_support(void)
png_size_t PNGAPI
png_convert_size(size_t size)
{
if (size > (png_size_t)-1)
PNG_ABORT(); /* We haven't got access to png_ptr, so no png_error() */
return ((png_size_t)size);
}
#endif /* PNG_SIZE_T */
+
+/* Added at libpng version 1.2.34 and 1.4.0 (moved from pngset.c) */
+#if defined(PNG_cHRM_SUPPORTED)
+#if !defined(PNG_NO_CHECK_cHRM)
+/*
+ Multiply two 32-bit numbers, V1 and V2, using 32-bit
+ arithmetic, to produce a 64 bit result in the HI/LO words.
+
+ A B
+ x C D
+ ------
+ AD || BD
+AC || CB || 0
+
+ where A and B are the high and low 16-bit words of V1,
+ C and D are the 16-bit words of V2, AD is the product of
+ A and D, and X || Y is (X << 16) + Y.
+*/
+
+void png_64bit_product (long v1, long v2, unsigned long *hi_product,
+ unsigned long *lo_product)
+{
+ int a, b, c, d;
+ long lo, hi, x, y;
+
+ a = (v1 >> 16) & 0xffff;
+ b = v1 & 0xffff;
+ c = (v2 >> 16) & 0xffff;
+ d = v2 & 0xffff;
+
+ lo = b * d; /* BD */
+ x = a * d + c * b; /* AD + CB */
+ y = ((lo >> 16) & 0xffff) + x;
+
+ lo = (lo & 0xffff) | ((y & 0xffff) << 16);
+ hi = (y >> 16) & 0xffff;
+
+ hi += a * c; /* AC */
+
+ *hi_product = (unsigned long)hi;
+ *lo_product = (unsigned long)lo;
+}
+int /* private */
+png_check_cHRM_fixed(png_structp png_ptr,
+ png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
+ png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
+ png_fixed_point blue_x, png_fixed_point blue_y)
+{
+ int ret = 1;
+ unsigned long xy_hi,xy_lo,yx_hi,yx_lo;
+
+ png_debug(1, "in function png_check_cHRM_fixed");
+ if (png_ptr == NULL)
+ return 0;
+
+ if (white_x < 0 || white_y <= 0 ||
+ red_x < 0 || red_y < 0 ||
+ green_x < 0 || green_y < 0 ||
+ blue_x < 0 || blue_y < 0)
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set negative chromaticity value");
+ ret = 0;
+ }
+ if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ white_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ red_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ red_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ green_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ green_y > (png_fixed_point) PNG_UINT_31_MAX ||
+ blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
+ blue_y > (png_fixed_point) PNG_UINT_31_MAX )
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set chromaticity value exceeding 21474.83");
+ ret = 0;
+ }
+ if (white_x > 100000L - white_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM white point");
+ ret = 0;
+ }
+ if (red_x > 100000L - red_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM red point");
+ ret = 0;
+ }
+ if (green_x > 100000L - green_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM green point");
+ ret = 0;
+ }
+ if (blue_x > 100000L - blue_y)
+ {
+ png_warning(png_ptr, "Invalid cHRM blue point");
+ ret = 0;
+ }
+
+ png_64bit_product(green_x - red_x, blue_y - red_y, &xy_hi, &xy_lo);
+ png_64bit_product(green_y - red_y, blue_x - red_x, &yx_hi, &yx_lo);
+
+ if (xy_hi == yx_hi && xy_lo == yx_lo)
+ {
+ png_warning(png_ptr,
+ "Ignoring attempt to set cHRM RGB triangle with zero area");
+ ret = 0;
+ }
+
+ return ret;
+}
+#endif /* NO_PNG_CHECK_cHRM */
+#endif /* PNG_cHRM_SUPPORTED */
#endif /* defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED) */
--- a/modules/libimg/png/png.h
+++ b/modules/libimg/png/png.h
@@ -1,19 +1,19 @@
/* png.h - header file for PNG reference library
*
- * libpng version 1.2.31 - August 21, 2008
+ * libpng version 1.2.34 - December 18, 2008
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
* Authors and maintainers:
* libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
* libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.2.31 - August 21, 2008: Glenn
+ * libpng versions 0.97, January 1998, through 1.2.34 - December 18, 2008: Glenn
* See also "Contributing Authors", below.
*
* Note about libpng version numbers:
*
* Due to various miscommunications, unforeseen code incompatibilities
* and occasional factors outside the authors' control, version numbering
* on the library has not always been consistent and straightforward.
* The following table summarizes matters since version 0.89c, which was
@@ -197,16 +197,31 @@
* 1.0.38rc01-08 10 10038 10.so.0.38[.0]
* 1.2.30rc01-08 13 10230 12.so.0.30[.0]
* 1.0.38 10 10038 10.so.0.38[.0]
* 1.2.30 13 10230 12.so.0.30[.0]
* 1.0.39rc01-03 10 10039 10.so.0.39[.0]
* 1.2.31rc01-03 13 10231 12.so.0.31[.0]
* 1.0.39 10 10039 10.so.0.39[.0]
* 1.2.31 13 10231 12.so.0.31[.0]
+ * 1.2.32beta01-02 13 10232 12.so.0.32[.0]
+ * 1.0.40rc01 10 10040 10.so.0.40[.0]
+ * 1.2.32rc01 13 10232 12.so.0.32[.0]
+ * 1.0.40 10 10040 10.so.0.40[.0]
+ * 1.2.32 13 10232 12.so.0.32[.0]
+ * 1.2.33beta01-02 13 10233 12.so.0.33[.0]
+ * 1.2.33rc01-02 13 10233 12.so.0.33[.0]
+ * 1.0.41rc01 10 10041 10.so.0.41[.0]
+ * 1.2.33 13 10233 12.so.0.33[.0]
+ * 1.0.41 10 10041 10.so.0.41[.0]
+ * 1.2.34beta01-07 13 10234 12.so.0.34[.0]
+ * 1.0.42rc01 10 10042 10.so.0.42[.0]
+ * 1.2.34rc01 13 10234 12.so.0.34[.0]
+ * 1.0.42 10 10042 10.so.0.42[.0]
+ * 1.2.34 13 10234 12.so.0.34[.0]
*
* Henceforth the source version will match the shared-library major
* and minor numbers; the shared-library major version number will be
* used for changes in backward compatibility, as it is intended. The
* PNG_LIBPNG_VER macro, which is not used within libpng but is available
* for applications, is an unsigned integer of the form xyyzz corresponding
* to the source version x.y.z (leading zeros in y and z). Beta versions
* were given the previous public release number plus a letter, until
@@ -226,17 +241,17 @@
*/
/*
* COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
*
* If you modify libpng you may insert additional notices immediately following
* this sentence.
*
- * libpng versions 1.2.6, August 15, 2004, through 1.2.31, August 21, 2008, are
+ * libpng versions 1.2.6, August 15, 2004, through 1.2.34, December 18, 2008, are
* Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson, and are
* distributed according to the same disclaimer and license as libpng-1.2.5
* with the following individual added to the list of Contributing Authors:
*
* Cosmin Truta
*
* libpng versions 1.0.7, July 1, 2000, through 1.2.5, October 3, 2002, are
* Copyright (c) 2000-2002 Glenn Randers-Pehrson, and are
@@ -338,23 +353,23 @@
*
* Thanks to Frank J. T. Wojcik for helping with the documentation.
*/
/*
* Y2K compliance in libpng:
* =========================
*
- * August 21, 2008
+ * December 18, 2008
*
* Since the PNG Development group is an ad-hoc body, we can't make
* an official declaration.
*
* This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.2.31 are Y2K compliant. It is my belief that earlier
+ * upward through 1.2.34 are Y2K compliant. It is my belief that earlier
* versions were also Y2K compliant.
*
* Libpng only has three year fields. One is a 2-byte unsigned integer
* that will hold years up to 65535. The other two hold the date in text
* format, and will hold years up to 9999.
*
* The integer is
* "png_uint_16 year" in png_time_struct.
@@ -400,27 +415,27 @@
/* This is not the place to learn how to use libpng. The file libpng.txt
* describes how to use libpng, and the file example.c summarizes it
* with some code on which to build. This file is useful for looking
* at the actual function definitions and structure components.
*/
/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.2.31"
+#define PNG_LIBPNG_VER_STRING "1.2.34"
#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.2.31 - August 21, 2008\n"
+ " libpng version 1.2.34 - December 18, 2008\n"
#define PNG_LIBPNG_VER_SONUM 0
#define PNG_LIBPNG_VER_DLLNUM 13
/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
#define PNG_LIBPNG_VER_MAJOR 1
#define PNG_LIBPNG_VER_MINOR 2
-#define PNG_LIBPNG_VER_RELEASE 31
+#define PNG_LIBPNG_VER_RELEASE 34
/* This should match the numeric part of the final component of
* PNG_LIBPNG_VER_STRING, omitting any leading zero: */
#define PNG_LIBPNG_VER_BUILD 0
/* Release Status */
#define PNG_LIBPNG_BUILD_ALPHA 1
#define PNG_LIBPNG_BUILD_BETA 2
@@ -438,17 +453,17 @@
#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE
/* Careful here. At one time, Guy wanted to use 082, but that would be octal.
* We must not include leading zeros.
* Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
* version 1.0.0 was mis-numbered 100 instead of 10000). From
* version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */
-#define PNG_LIBPNG_VER 10231 /* 1.2.31 */
+#define PNG_LIBPNG_VER 10234 /* 1.2.34 */
#ifndef PNG_VERSION_INFO_ONLY
/* include the compression library's header */
#include "zlib.h"
#endif
/* include all user configurable info, including optional assembler routines */
#include "pngconf.h"
@@ -1158,17 +1173,20 @@ typedef void (PNGAPI *png_unknown_chunk_
#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */
#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */
#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */
#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */
#define PNG_TRANSFORM_BGR 0x0080 /* read and write */
#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */
#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */
#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */
-#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */
+#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only, deprecated */
+/* Added to libpng-1.2.34 */
+#define PNG_TRANSFORM_STRIP_FILLER_BEFORE 0x0800 /* WRITE only */
+#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* WRITE only */
/* Flags for MNG supported features */
#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
#define PNG_FLAG_MNG_FILTER_64 0x04
#define PNG_ALL_MNG_FEATURES 0x05
typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp));
@@ -1511,17 +1529,17 @@ struct png_struct_def
png_charp chunkdata; /* buffer for reading chunk data */
};
/* This triggers a compiler error in png.c, if png.c and png.h
* do not agree upon the version number.
*/
-typedef png_structp version_1_2_31;
+typedef png_structp version_1_2_34;
typedef png_struct FAR * FAR * png_structpp;
/* Here are the function definitions most commonly used. This is not
* the place to find out how to use libpng. See libpng.txt for the
* full explanation, see example.c for the summary. This just provides
* a simple one line description of the use of each function.
*/
@@ -2633,43 +2651,90 @@ extern PNG_EXPORT(void, png_write_png) P
* only been added since version 0.95 so it is not implemented throughout
* libpng yet, but more support will be added as needed.
*/
#ifdef PNG_DEBUG
#if (PNG_DEBUG > 0)
#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
#include <crtdbg.h>
#if (PNG_DEBUG > 1)
-#define png_debug(l,m) _RPT0(_CRT_WARN,m)
-#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1)
-#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
+#ifndef _DEBUG
+# define _DEBUG
+#endif
+#ifndef png_debug
+#define png_debug(l,m) _RPT0(_CRT_WARN,m PNG_STRING_NEWLINE)
+#endif
+#ifndef png_debug1
+#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m PNG_STRING_NEWLINE,p1)
+#endif
+#ifndef png_debug2
+#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m PNG_STRING_NEWLINE,p1,p2)
+#endif
#endif
#else /* PNG_DEBUG_FILE || !_MSC_VER */
#ifndef PNG_DEBUG_FILE
#define PNG_DEBUG_FILE stderr
#endif /* PNG_DEBUG_FILE */
#if (PNG_DEBUG > 1)
+#ifndef png_debug
+/* Note: ["%s"m PNG_STRING_NEWLINE] probably does not work on
+ * non-ISO compilers */
+#ifdef __STDC__
#define png_debug(l,m) \
{ \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
}
+#endif
+#ifndef png_debug1
#define png_debug1(l,m,p1) \
{ \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
}
+#endif
+#ifndef png_debug2
#define png_debug2(l,m,p1,p2) \
{ \
int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
+ fprintf(PNG_DEBUG_FILE,"%s"m PNG_STRING_NEWLINE,(num_tabs==1 ? "\t" : \
(num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
}
+#endif
+#else /* __STDC __ */
+#ifndef png_debug
+#define png_debug(l,m) \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format);
+#endif
+#ifndef png_debug1
+#define png_debug1(l,m,p1) \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format,p1);
+#endif
+#ifndef png_debug2
+#define png_debug2(l,m,p1,p2) \
+ int num_tabs=l; \
+ char format[256]; \
+ snprintf(format,256,"%s%s%s",(num_tabs==1 ? "\t" : \
+ (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))), \
+ m,PNG_STRING_NEWLINE); \
+ fprintf(PNG_DEBUG_FILE,format,p1,p2);
+#endif
+#endif /* __STDC __ */
#endif /* (PNG_DEBUG > 1) */
#endif /* _MSC_VER */
#endif /* (PNG_DEBUG > 0) */
#endif /* PNG_DEBUG */
#ifndef png_debug
#define png_debug(l, m)
#endif
#ifndef png_debug1
@@ -3736,16 +3801,25 @@ png_infop info_ptr));
PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr,
png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
#endif /* PNG_pHYs_SUPPORTED */
#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
/* Read the chunk header (length + type name) */
PNG_EXTERN png_uint_32 png_read_chunk_header PNGARG((png_structp png_ptr));
+/* Added at libpng version 1.2.34 */
+#if defined(PNG_cHRM_SUPPORTED)
+PNG_EXTERN int png_check_cHRM_fixed PNGARG((png_structp png_ptr,
+ png_fixed_point int_white_x, png_fixed_point int_white_y,
+ png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
+ int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
+ png_fixed_point int_blue_y));
+#endif
+
/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
#endif /* PNG_INTERNAL */
#ifdef __cplusplus
}
#endif
--- a/modules/libimg/png/pngconf.h
+++ b/modules/libimg/png/pngconf.h
@@ -1,12 +1,12 @@
/* pngconf.h - machine configurable file for libpng
*
- * libpng version 1.2.31 - August 21, 2008
+ * libpng version 1.2.34 - December 18, 2008
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
/* Any machine specific code is near the front of this file, so if you
* are configuring libpng for a machine, you may want to read the section
@@ -795,16 +795,22 @@
*/
#ifndef PNG_USER_WIDTH_MAX
# define PNG_USER_WIDTH_MAX 1000000L
#endif
#ifndef PNG_USER_HEIGHT_MAX
# define PNG_USER_HEIGHT_MAX 1000000L
#endif
+
+/* Added at libpng-1.2.34 and 1.4.0 */
+#ifndef PNG_STRING_NEWLINE
+#define PNG_STRING_NEWLINE "\n"
+#endif
+
/* These are currently experimental features, define them if you want */
/* very little testing */
/*
#ifdef PNG_READ_SUPPORTED
# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
# endif
--- a/modules/libimg/png/pngerror.c
+++ b/modules/libimg/png/pngerror.c
@@ -1,12 +1,12 @@
/* pngerror.c - stub functions for i/o and memory allocation
*
- * Last changed in libpng 1.2.30 [August 13, 2008]
+ * Last changed in libpng 1.2.34 [December 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
* This file provides a location for all error handling. Users who
* need special error handling are expected to write replacement functions
* and use png_set_error_fn() to use those functions. See the instructions
@@ -111,19 +111,19 @@ png_warning(png_structp png_ptr, png_con
{
if (*warning_message == '#')
{
for (offset = 1; offset < 15; offset++)
if (warning_message[offset] == ' ')
break;
}
}
- if (png_ptr != NULL && png_ptr->warning_fn != NULL)
- (*(png_ptr->warning_fn))(png_ptr, warning_message + offset);
}
+ if (png_ptr != NULL && png_ptr->warning_fn != NULL)
+ (*(png_ptr->warning_fn))(png_ptr, warning_message + offset);
else
png_default_warning(png_ptr, warning_message + offset);
}
#endif /* PNG_NO_WARNINGS */
/* These utilities are used internally to build an error message that relates
* to the current chunk. The chunk name comes from png_ptr->chunk_name,
--- a/modules/libimg/png/pngget.c
+++ b/modules/libimg/png/pngget.c
@@ -115,17 +115,17 @@ png_get_compression_type(png_structp png
png_uint_32 PNGAPI
png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");
+ png_debug1(1, "in %s retrieval function", "png_get_x_pixels_per_meter");
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
return (0);
else return (info_ptr->x_pixels_per_unit);
}
#else
return (0);
#endif
return (0);
@@ -133,17 +133,17 @@ png_get_x_pixels_per_meter(png_structp p
png_uint_32 PNGAPI
png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");
+ png_debug1(1, "in %s retrieval function", "png_get_y_pixels_per_meter");
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
return (0);
else return (info_ptr->y_pixels_per_unit);
}
#else
return (0);
#endif
return (0);
@@ -151,17 +151,17 @@ png_get_y_pixels_per_meter(png_structp p
png_uint_32 PNGAPI
png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
+ png_debug1(1, "in %s retrieval function", "png_get_pixels_per_meter");
if (info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
return (0);
else return (info_ptr->x_pixels_per_unit);
}
#else
return (0);
#endif
@@ -171,17 +171,17 @@ png_get_pixels_per_meter(png_structp png
#ifdef PNG_FLOATING_POINT_SUPPORTED
float PNGAPI
png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_pHYs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_pHYs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
+ png_debug1(1, "in %s retrieval function", "png_get_aspect_ratio");
if (info_ptr->x_pixels_per_unit == 0)
return ((float)0.0);
else
return ((float)((float)info_ptr->y_pixels_per_unit
/(float)info_ptr->x_pixels_per_unit));
}
#else
return (0.0);
@@ -192,17 +192,17 @@ png_get_pixel_aspect_ratio(png_structp p
png_int_32 PNGAPI
png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
+ png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
return (0);
else return (info_ptr->x_offset);
}
#else
return (0);
#endif
return (0);
@@ -210,17 +210,17 @@ png_get_x_offset_microns(png_structp png
png_int_32 PNGAPI
png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
+ png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
if (info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
return (0);
else return (info_ptr->y_offset);
}
#else
return (0);
#endif
return (0);
@@ -228,17 +228,17 @@ png_get_y_offset_microns(png_structp png
png_int_32 PNGAPI
png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
+ png_debug1(1, "in %s retrieval function", "png_get_x_offset_microns");
if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
return (0);
else return (info_ptr->x_offset);
}
#else
return (0);
#endif
return (0);
@@ -246,17 +246,17 @@ png_get_x_offset_pixels(png_structp png_
png_int_32 PNGAPI
png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr != NULL && info_ptr != NULL)
#if defined(PNG_oFFs_SUPPORTED)
if (info_ptr->valid & PNG_INFO_oFFs)
{
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
+ png_debug1(1, "in %s retrieval function", "png_get_y_offset_microns");
if (info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
return (0);
else return (info_ptr->y_offset);
}
#else
return (0);
#endif
return (0);
@@ -302,17 +302,17 @@ png_get_y_offset_inches(png_structp png_
png_uint_32 PNGAPI
png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
png_uint_32 retval = 0;
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
{
- png_debug1(1, "in %s retrieval function\n", "pHYs");
+ png_debug1(1, "in %s retrieval function", "pHYs");
if (res_x != NULL)
{
*res_x = info_ptr->x_pixels_per_unit;
retval |= PNG_INFO_pHYs;
}
if (res_y != NULL)
{
*res_y = info_ptr->y_pixels_per_unit;
@@ -359,34 +359,34 @@ png_get_signature(png_structp png_ptr, p
#if defined(PNG_bKGD_SUPPORTED)
png_uint_32 PNGAPI
png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
png_color_16p *background)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
&& background != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "bKGD");
+ png_debug1(1, "in %s retrieval function", "bKGD");
*background = &(info_ptr->background);
return (PNG_INFO_bKGD);
}
return (0);
}
#endif
#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
double *white_x, double *white_y, double *red_x, double *red_y,
double *green_x, double *green_y, double *blue_x, double *blue_y)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
{
- png_debug1(1, "in %s retrieval function\n", "cHRM");
+ png_debug1(1, "in %s retrieval function", "cHRM");
if (white_x != NULL)
*white_x = (double)info_ptr->x_white;
if (white_y != NULL)
*white_y = (double)info_ptr->y_white;
if (red_x != NULL)
*red_x = (double)info_ptr->x_red;
if (red_y != NULL)
*red_y = (double)info_ptr->y_red;
@@ -407,17 +407,17 @@ png_get_cHRM(png_structp png_ptr, png_in
png_uint_32 PNGAPI
png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
png_fixed_point *blue_x, png_fixed_point *blue_y)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
{
- png_debug1(1, "in %s retrieval function\n", "cHRM");
+ png_debug1(1, "in %s retrieval function", "cHRM");
if (white_x != NULL)
*white_x = info_ptr->int_x_white;
if (white_y != NULL)
*white_y = info_ptr->int_y_white;
if (red_x != NULL)
*red_x = info_ptr->int_x_red;
if (red_y != NULL)
*red_y = info_ptr->int_y_red;
@@ -439,65 +439,65 @@ png_get_cHRM_fixed(png_structp png_ptr,
#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
png_uint_32 PNGAPI
png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
&& file_gamma != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "gAMA");
+ png_debug1(1, "in %s retrieval function", "gAMA");
*file_gamma = (double)info_ptr->gamma;
return (PNG_INFO_gAMA);
}
return (0);
}
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
png_uint_32 PNGAPI
png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
png_fixed_point *int_file_gamma)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
&& int_file_gamma != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "gAMA");
+ png_debug1(1, "in %s retrieval function", "gAMA");
*int_file_gamma = info_ptr->int_gamma;
return (PNG_INFO_gAMA);
}
return (0);
}
#endif
#endif
#if defined(PNG_sRGB_SUPPORTED)
png_uint_32 PNGAPI
png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
&& file_srgb_intent != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "sRGB");
+ png_debug1(1, "in %s retrieval function", "sRGB");
*file_srgb_intent = (int)info_ptr->srgb_intent;
return (PNG_INFO_sRGB);
}
return (0);
}
#endif
#if defined(PNG_iCCP_SUPPORTED)
png_uint_32 PNGAPI
png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
png_charpp name, int *compression_type,
png_charpp profile, png_uint_32 *proflen)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
&& name != NULL && profile != NULL && proflen != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "iCCP");
+ png_debug1(1, "in %s retrieval function", "iCCP");
*name = info_ptr->iccp_name;
*profile = info_ptr->iccp_profile;
/* compression_type is a dummy so the API won't have to change
if we introduce multiple compression types later. */
*proflen = (int)info_ptr->iccp_proflen;
*compression_type = (int)info_ptr->iccp_compression;
return (PNG_INFO_iCCP);
}
@@ -521,17 +521,17 @@ png_get_sPLT(png_structp png_ptr, png_in
#if defined(PNG_hIST_SUPPORTED)
png_uint_32 PNGAPI
png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
&& hist != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "hIST");
+ png_debug1(1, "in %s retrieval function", "hIST");
*hist = info_ptr->hist;
return (PNG_INFO_hIST);
}
return (0);
}
#endif
png_uint_32 PNGAPI
@@ -539,17 +539,17 @@ png_get_IHDR(png_structp png_ptr, png_in
png_uint_32 *width, png_uint_32 *height, int *bit_depth,
int *color_type, int *interlace_type, int *compression_type,
int *filter_type)
{
if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
bit_depth != NULL && color_type != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "IHDR");
+ png_debug1(1, "in %s retrieval function", "IHDR");
*width = info_ptr->width;
*height = info_ptr->height;
*bit_depth = info_ptr->bit_depth;
if (info_ptr->bit_depth < 1 || info_ptr->bit_depth > 16)
png_error(png_ptr, "Invalid bit depth");
*color_type = info_ptr->color_type;
if (info_ptr->color_type > 6)
png_error(png_ptr, "Invalid color type");
@@ -583,17 +583,17 @@ png_get_IHDR(png_structp png_ptr, png_in
#if defined(PNG_oFFs_SUPPORTED)
png_uint_32 PNGAPI
png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
&& offset_x != NULL && offset_y != NULL && unit_type != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "oFFs");
+ png_debug1(1, "in %s retrieval function", "oFFs");
*offset_x = info_ptr->x_offset;
*offset_y = info_ptr->y_offset;
*unit_type = (int)info_ptr->offset_unit_type;
return (PNG_INFO_oFFs);
}
return (0);
}
#endif
@@ -603,17 +603,17 @@ png_uint_32 PNGAPI
png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
png_charp *units, png_charpp *params)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
&& purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
nparams != NULL && units != NULL && params != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "pCAL");
+ png_debug1(1, "in %s retrieval function", "pCAL");
*purpose = info_ptr->pcal_purpose;
*X0 = info_ptr->pcal_X0;
*X1 = info_ptr->pcal_X1;
*type = (int)info_ptr->pcal_type;
*nparams = (int)info_ptr->pcal_nparams;
*units = info_ptr->pcal_units;
*params = info_ptr->pcal_params;
return (PNG_INFO_pCAL);
@@ -663,17 +663,17 @@ png_uint_32 PNGAPI
png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
{
png_uint_32 retval = 0;
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_pHYs))
{
- png_debug1(1, "in %s retrieval function\n", "pHYs");
+ png_debug1(1, "in %s retrieval function", "pHYs");
if (res_x != NULL)
{
*res_x = info_ptr->x_pixels_per_unit;
retval |= PNG_INFO_pHYs;
}
if (res_y != NULL)
{
*res_y = info_ptr->y_pixels_per_unit;
@@ -691,48 +691,48 @@ png_get_pHYs(png_structp png_ptr, png_in
png_uint_32 PNGAPI
png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
int *num_palette)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
&& palette != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "PLTE");
+ png_debug1(1, "in %s retrieval function", "PLTE");
*palette = info_ptr->palette;
*num_palette = info_ptr->num_palette;
- png_debug1(3, "num_palette = %d\n", *num_palette);
+ png_debug1(3, "num_palette = %d", *num_palette);
return (PNG_INFO_PLTE);
}
return (0);
}
#if defined(PNG_sBIT_SUPPORTED)
png_uint_32 PNGAPI
png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
&& sig_bit != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "sBIT");
+ png_debug1(1, "in %s retrieval function", "sBIT");
*sig_bit = &(info_ptr->sig_bit);
return (PNG_INFO_sBIT);
}
return (0);
}
#endif
#if defined(PNG_TEXT_SUPPORTED)
png_uint_32 PNGAPI
png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
int *num_text)
{
if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
{
- png_debug1(1, "in %s retrieval function\n",
+ png_debug1(1, "in %s retrieval function",
(png_ptr->chunk_name[0] == '\0' ? "text"
: (png_const_charp)png_ptr->chunk_name));
if (text_ptr != NULL)
*text_ptr = info_ptr->text;
if (num_text != NULL)
*num_text = info_ptr->num_text;
return ((png_uint_32)info_ptr->num_text);
}
@@ -744,33 +744,33 @@ png_get_text(png_structp png_ptr, png_in
#if defined(PNG_tIME_SUPPORTED)
png_uint_32 PNGAPI
png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
{
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
&& mod_time != NULL)
{
- png_debug1(1, "in %s retrieval function\n", "tIME");
+ png_debug1(1, "in %s retrieval function", "tIME");
*mod_time = &(info_ptr->mod_time);
return (PNG_INFO_tIME);
}
return (0);
}
#endif
#if defined(PNG_tRNS_SUPPORTED)
png_uint_32 PNGAPI
png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
png_bytep *trans, int *num_trans, png_color_16p *trans_values)
{
png_uint_32 retval = 0;
if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
{
- png_debug1(1, "in %s retrieval function\n", "tRNS");
+ png_debug1(1, "in %s retrieval function", "tRNS");
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (trans != NULL)
{
*trans = info_ptr->trans;
retval |= PNG_INFO_tRNS;
}
if (trans_values != NULL)
@@ -796,58 +796,58 @@ png_get_tRNS(png_structp png_ptr, png_in
}
#endif
#if defined(PNG_APNG_SUPPORTED)
png_uint_32 PNGAPI
png_get_acTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *num_frames, png_uint_32 *num_plays)
{
- png_debug1(1, "in %s retrieval function\n", "acTL");
+ png_debug1(1, "in %s retrieval function", "acTL");
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_acTL) &&
num_frames != NULL && num_plays != NULL)
{
*num_frames = info_ptr->num_frames;
*num_plays = info_ptr->num_plays;
return (1);
}
return (0);
}
png_uint_32 PNGAPI
png_get_num_frames(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_num_frames()\n");
+ png_debug(1, "in png_get_num_frames()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->num_frames);
return (0);
}
png_uint_32 PNGAPI
png_get_num_plays(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_num_plays()\n");
+ png_debug(1, "in png_get_num_plays()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->num_plays);
return (0);
}
png_uint_32 PNGAPI
png_get_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 *width, png_uint_32 *height,
png_uint_32 *x_offset, png_uint_32 *y_offset,
png_uint_16 *delay_num, png_uint_16 *delay_den,
png_byte *dispose_op, png_byte *blend_op)
{
- png_debug1(1, "in %s retrieval function\n", "fcTL");
+ png_debug1(1, "in %s retrieval function", "fcTL");
if (png_ptr != NULL && info_ptr != NULL &&
(info_ptr->valid & PNG_INFO_fcTL) &&
width != NULL && height != NULL &&
x_offset != NULL && x_offset != NULL &&
delay_num != NULL && delay_den != NULL &&
dispose_op != NULL && blend_op != NULL)
{
@@ -863,97 +863,97 @@ png_get_next_frame_fcTL(png_structp png_
}
return (0);
}
png_uint_32 PNGAPI
png_get_next_frame_width(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_width()\n");
+ png_debug(1, "in png_get_next_frame_width()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_width);
return (0);
}
png_uint_32 PNGAPI
png_get_next_frame_height(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_height()\n");
+ png_debug(1, "in png_get_next_frame_height()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_height);
return (0);
}
png_uint_32 PNGAPI
png_get_next_frame_x_offset(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_x_offset()\n");
+ png_debug(1, "in png_get_next_frame_x_offset()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_x_offset);
return (0);
}
png_uint_32 PNGAPI
png_get_next_frame_y_offset(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_y_offset()\n");
+ png_debug(1, "in png_get_next_frame_y_offset()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_y_offset);
return (0);
}
png_uint_16 PNGAPI
png_get_next_frame_delay_num(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_delay_num()\n");
+ png_debug(1, "in png_get_next_frame_delay_num()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_delay_num);
return (0);
}
png_uint_16 PNGAPI
png_get_next_frame_delay_den(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_delay_den()\n");
+ png_debug(1, "in png_get_next_frame_delay_den()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_delay_den);
return (0);
}
png_byte PNGAPI
png_get_next_frame_dispose_op(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_dispose_op()\n");
+ png_debug(1, "in png_get_next_frame_dispose_op()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_dispose_op);
return (0);
}
png_byte PNGAPI
png_get_next_frame_blend_op(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_get_next_frame_blend_op()\n");
+ png_debug(1, "in png_get_next_frame_blend_op()");
if (png_ptr != NULL && info_ptr != NULL)
return (info_ptr->next_frame_blend_op);
return (0);
}
png_byte PNGAPI
png_get_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_first_frame_is_hidden()\n");
+ png_debug(1, "in png_first_frame_is_hidden()");
if (png_ptr != NULL)
return (png_byte)(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN);
return 0;
}
#endif /* PNG_APNG_SUPPORTED */
--- a/modules/libimg/png/pngpread.c
+++ b/modules/libimg/png/pngpread.c
@@ -1,12 +1,12 @@
/* pngpread.c - read a png file in push mode
*
- * Last changed in libpng 1.2.30 [August 13, 2008]
+ * Last changed in libpng 1.2.32 [September 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
#define PNG_INTERNAL
#include "png.h"
@@ -1458,17 +1458,17 @@ png_push_read_zTXt(png_structp png_ptr,
}
else
{
png_charp tmp;
tmp = text;
text = (png_charp)png_malloc(png_ptr, text_size +
(png_uint_32)(png_ptr->zbuf_size
- - png_ptr->zstream.avail_out));
+ - png_ptr->zstream.avail_out + 1));
png_memcpy(text, tmp, text_size);
png_free(png_ptr, tmp);
png_memcpy(text + text_size, png_ptr->zbuf,
png_ptr->zbuf_size - png_ptr->zstream.avail_out);
text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
*(text + text_size) = '\0';
}
if (ret != Z_STREAM_END)
--- a/modules/libimg/png/pngread.c
+++ b/modules/libimg/png/pngread.c
@@ -42,17 +42,17 @@ png_create_read_struct_2(png_const_charp
#ifdef PNG_SETJMP_SUPPORTED
#ifdef USE_FAR_KEYWORD
jmp_buf jmpbuf;
#endif
#endif
int i;
- png_debug(1, "in png_create_read_struct\n");
+ png_debug(1, "in png_create_read_struct");
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
(png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
#else
png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
#endif
if (png_ptr == NULL)
return (NULL);
@@ -258,17 +258,17 @@ png_read_init_3(png_structpp ptr_ptr, pn
png_ptr->warning_fn = NULL;
png_warning(png_ptr,
"Application uses deprecated png_read_init() and should be recompiled.");
break;
#endif
}
} while (png_libpng_ver[i++]);
- png_debug(1, "in png_read_init_3\n");
+ png_debug(1, "in png_read_init_3");
#ifdef PNG_SETJMP_SUPPORTED
/* save jump buffer and error functions */
png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
if (png_sizeof(png_struct) > png_struct_size)
{
@@ -322,17 +322,17 @@ png_read_init_3(png_structpp ptr_ptr, pn
* via png_set_sig_bytes(), and we will only check the remaining bytes
* here. The application can then have access to the signature bytes we
* read if it is determined that this isn't a valid PNG file.
*/
void PNGAPI
png_read_info(png_structp png_ptr, png_infop info_ptr)
{
if (png_ptr == NULL || info_ptr == NULL) return;
- png_debug(1, "in png_read_info\n");
+ png_debug(1, "in png_read_info");
/* If we haven't checked all of the PNG signature bytes, do so now. */
if (png_ptr->sig_bytes < 8)
{
png_size_t num_checked = png_ptr->sig_bytes,
num_to_check = 8 - num_checked;
png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
png_ptr->sig_bytes = 8;
@@ -545,17 +545,17 @@ png_read_info(png_structp png_ptr, png_i
#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
#if defined(PNG_READ_APNG_SUPPORTED)
void PNGAPI
png_read_frame_head(png_structp png_ptr, png_infop info_ptr)
{
png_byte have_chunk_after_DAT; /* after IDAT or after fdAT */
- png_debug(0, "Reading frame head\n");
+ png_debug(0, "Reading frame head");
if (!(png_ptr->mode & PNG_HAVE_acTL))
png_error(png_ptr, "attempt to png_read_frame_head() but "
"no acTL present");
/* do nothing for the main IDAT */
if (png_ptr->num_frames_read == 0)
return;
@@ -620,17 +620,17 @@ png_read_frame_head(png_structp png_ptr,
}
}
#endif /* PNG_READ_APNG_SUPPORTED */
/* optional call to update the users info_ptr structure */
void PNGAPI
png_read_update_info(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_read_update_info\n");
+ png_debug(1, "in png_read_update_info");
if (png_ptr == NULL) return;
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
else
png_warning(png_ptr,
"Ignoring extra png_read_update_info() call; row buffer not reallocated");
png_read_transform_info(png_ptr, info_ptr);
@@ -640,17 +640,17 @@ png_read_update_info(png_structp png_ptr
/* Initialize palette, background, etc, after transformations
* are set, but before any reading takes place. This allows
* the user to obtain a gamma-corrected palette, for example.
* If the user doesn't call this, we will do it ourselves.
*/
void PNGAPI
png_start_read_image(png_structp png_ptr)
{
- png_debug(1, "in png_start_read_image\n");
+ png_debug(1, "in png_start_read_image");
if (png_ptr == NULL) return;
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
}
#endif /* PNG_NO_SEQUENTIAL_READ_SUPPORTED */
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
void PNGAPI
@@ -663,17 +663,17 @@ png_read_row(png_structp png_ptr, png_by
PNG_CONST PNG_IEND;
#endif
PNG_CONST int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55,
0xff};
PNG_CONST int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
#endif
int ret;
if (png_ptr == NULL) return;
- png_debug2(1, "in png_read_row (row %lu, pass %d)\n",
+ png_debug2(1, "in png_read_row (row %lu, pass %d)",
png_ptr->row_number, png_ptr->pass);
if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
png_read_start_row(png_ptr);
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
/* check for transforms that have been set but were defined out */
#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
if (png_ptr->transformations & PNG_INVERT_MONO)
@@ -944,17 +944,17 @@ png_read_row(png_structp png_ptr, png_by
void PNGAPI
png_read_rows(png_structp png_ptr, png_bytepp row,
png_bytepp display_row, png_uint_32 num_rows)
{
png_uint_32 i;
png_bytepp rp;
png_bytepp dp;
- png_debug(1, "in png_read_rows\n");
+ png_debug(1, "in png_read_rows");
if (png_ptr == NULL) return;
rp = row;
dp = display_row;
if (rp != NULL && dp != NULL)
for (i = 0; i < num_rows; i++)
{
png_bytep rptr = *rp++;
png_bytep dptr = *dp++;
@@ -993,17 +993,17 @@ png_read_rows(png_structp png_ptr, png_b
*/
void PNGAPI
png_read_image(png_structp png_ptr, png_bytepp image)
{
png_uint_32 i, image_height;
int pass, j;
png_bytepp rp;
- png_debug(1, "in png_read_image\n");
+ png_debug(1, "in png_read_image");
if (png_ptr == NULL) return;
#ifdef PNG_READ_INTERLACING_SUPPORTED
pass = png_set_interlace_handling(png_ptr);
#else
if (png_ptr->interlaced)
png_error(png_ptr,
"Cannot read interlaced image -- interlace handler disabled.");
@@ -1029,17 +1029,17 @@ png_read_image(png_structp png_ptr, png_
#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED
/* Read the end of the PNG file. Will not read past the end of the
* file, will verify the end is accurate, and will read any comments
* or time information at the end of the file, if info is not NULL.
*/
void PNGAPI
png_read_end(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_read_end\n");
+ png_debug(1, "in png_read_end");
if (png_ptr == NULL) return;
png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
do
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_CONST PNG_IHDR;
PNG_CONST PNG_IDAT;
@@ -1222,17 +1222,17 @@ png_destroy_read_struct(png_structpp png
{
png_structp png_ptr = NULL;
png_infop info_ptr = NULL, end_info_ptr = NULL;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn = NULL;
png_voidp mem_ptr = NULL;
#endif
- png_debug(1, "in png_destroy_read_struct\n");
+ png_debug(1, "in png_destroy_read_struct");
if (png_ptr_ptr != NULL)
png_ptr = *png_ptr_ptr;
if (png_ptr == NULL)
return;
#ifdef PNG_USER_MEM_SUPPORTED
free_fn = png_ptr->free_fn;
mem_ptr = png_ptr->mem_ptr;
@@ -1296,17 +1296,17 @@ png_read_destroy(png_structp png_ptr, pn
#endif
png_error_ptr error_fn;
png_error_ptr warning_fn;
png_voidp error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn;
#endif
- png_debug(1, "in png_read_destroy\n");
+ png_debug(1, "in png_read_destroy");
if (info_ptr != NULL)
png_info_destroy(png_ptr, info_ptr);
if (end_info_ptr != NULL)
png_info_destroy(png_ptr, end_info_ptr);
png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->big_row_buf);
--- a/modules/libimg/png/pngrio.c
+++ b/modules/libimg/png/pngrio.c
@@ -22,17 +22,17 @@
/* Read the data from whatever input you are using. The default routine
reads from a file pointer. Note that this routine sometimes gets called
with very small lengths, so you should implement some kind of simple
buffering if you are using unbuffered reads. This should never be asked
to read more then 64K on a 16 bit machine. */
void /* PRIVATE */
png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
- png_debug1(4, "reading %d bytes\n", (int)length);
+ png_debug1(4, "reading %d bytes", (int)length);
if (png_ptr->read_data_fn != NULL)
(*(png_ptr->read_data_fn))(png_ptr, data, length);
else
png_error(png_ptr, "Call to NULL read function");
}
#if !defined(PNG_NO_STDIO)
/* This is the function that does the actual reading of data. If you are
--- a/modules/libimg/png/pngrtran.c
+++ b/modules/libimg/png/pngrtran.c
@@ -16,17 +16,17 @@
#define PNG_INTERNAL
#include "png.h"
#if defined(PNG_READ_SUPPORTED)
/* Set the action on getting a CRC error for an ancillary or critical chunk. */
void PNGAPI
png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
{
- png_debug(1, "in png_set_crc_action\n");
+ png_debug(1, "in png_set_crc_action");
/* Tell libpng how we react to CRC errors in critical chunks */
if (png_ptr == NULL) return;
switch (crit_action)
{
case PNG_CRC_NO_CHANGE: /* leave setting as is */
break;
case PNG_CRC_WARN_USE: /* warn/use data */
png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
@@ -75,17 +75,17 @@ png_set_crc_action(png_structp png_ptr,
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
defined(PNG_FLOATING_POINT_SUPPORTED)
/* handle alpha and tRNS via a background color */
void PNGAPI
png_set_background(png_structp png_ptr,
png_color_16p background_color, int background_gamma_code,
int need_expand, double background_gamma)
{
- png_debug(1, "in png_set_background\n");
+ png_debug(1, "in png_set_background");
if (png_ptr == NULL) return;
if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
{
png_warning(png_ptr, "Application must supply a known background gamma");
return;
}
png_ptr->transformations |= PNG_BACKGROUND;
@@ -97,27 +97,27 @@ png_set_background(png_structp png_ptr,
}
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
/* strip 16 bit depth files to 8 bit depth */
void PNGAPI
png_set_strip_16(png_structp png_ptr)
{
- png_debug(1, "in png_set_strip_16\n");
+ png_debug(1, "in png_set_strip_16");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_16_TO_8;
}
#endif
#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
void PNGAPI
png_set_strip_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_strip_alpha\n");
+ png_debug(1, "in png_set_strip_alpha");
if (png_ptr == NULL) return;
png_ptr->flags |= PNG_FLAG_STRIP_ALPHA;
}
#endif
#if defined(PNG_READ_DITHER_SUPPORTED)
/* Dither file to 8 bit. Supply a palette, the current number
* of elements in the palette, the maximum number of elements
@@ -137,17 +137,17 @@ typedef struct png_dsort_struct
typedef png_dsort FAR * png_dsortp;
typedef png_dsort FAR * FAR * png_dsortpp;
void PNGAPI
png_set_dither(png_structp png_ptr, png_colorp palette,
int num_palette, int maximum_colors, png_uint_16p histogram,
int full_dither)
{
- png_debug(1, "in png_set_dither\n");
+ png_debug(1, "in png_set_dither");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_DITHER;
if (!full_dither)
{
int i;
png_ptr->dither_index = (png_bytep)png_malloc(png_ptr,
@@ -521,17 +521,17 @@ png_set_dither(png_structp png_ptr, png_
*
* We will turn off gamma transformation later if no semitransparent entries
* are present in the tRNS array for palette images. We can't do it here
* because we don't necessarily have the tRNS chunk yet.
*/
void PNGAPI
png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
{
- png_debug(1, "in png_set_gamma\n");
+ png_debug(1, "in png_set_gamma");
if (png_ptr == NULL) return;
if ((fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD) ||
(png_ptr->color_type & PNG_COLOR_MASK_ALPHA) ||
(png_ptr->color_type == PNG_COLOR_TYPE_PALETTE))
png_ptr->transformations |= PNG_GAMMA;
png_ptr->gamma = (float)file_gamma;
png_ptr->screen_gamma = (float)scrn_gamma;
}
@@ -540,17 +540,17 @@ png_set_gamma(png_structp png_ptr, doubl
#if defined(PNG_READ_EXPAND_SUPPORTED)
/* Expand paletted images to RGB, expand grayscale images of
* less than 8-bit depth to 8-bit depth, and expand tRNS chunks
* to alpha channels.
*/
void PNGAPI
png_set_expand(png_structp png_ptr)
{
- png_debug(1, "in png_set_expand\n");
+ png_debug(1, "in png_set_expand");
if (png_ptr == NULL) return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
/* GRR 19990627: the following three functions currently are identical
* to png_set_expand(). However, it is entirely reasonable that someone
* might wish to expand an indexed image to RGB but *not* expand a single,
@@ -567,62 +567,62 @@ png_set_expand(png_structp png_ptr)
* GRP 20060307: In libpng-1.4.0, png_set_gray_1_2_4_to_8() was modified
* to expand only the sample depth but not to expand the tRNS to alpha.
*/
/* Expand paletted images to RGB. */
void PNGAPI
png_set_palette_to_rgb(png_structp png_ptr)
{
- png_debug(1, "in png_set_palette_to_rgb\n");
+ png_debug(1, "in png_set_palette_to_rgb");
if (png_ptr == NULL) return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
#if !defined(PNG_1_0_X)
/* Expand grayscale images of less than 8-bit depth to 8 bits. */
void PNGAPI
png_set_expand_gray_1_2_4_to_8(png_structp png_ptr)
{
- png_debug(1, "in png_set_expand_gray_1_2_4_to_8\n");
+ png_debug(1, "in png_set_expand_gray_1_2_4_to_8");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_EXPAND;
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
#endif
#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
/* Expand grayscale images of less than 8-bit depth to 8 bits. */
/* Deprecated as of libpng-1.2.9 */
void PNGAPI
png_set_gray_1_2_4_to_8(png_structp png_ptr)
{
- png_debug(1, "in png_set_gray_1_2_4_to_8\n");
+ png_debug(1, "in png_set_gray_1_2_4_to_8");
if (png_ptr == NULL) return;
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
}
#endif
/* Expand tRNS chunks to alpha channels. */
void PNGAPI
png_set_tRNS_to_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_tRNS_to_alpha\n");
+ png_debug(1, "in png_set_tRNS_to_alpha");
png_ptr->transformations |= (PNG_EXPAND | PNG_EXPAND_tRNS);
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
void PNGAPI
png_set_gray_to_rgb(png_structp png_ptr)
{
- png_debug(1, "in png_set_gray_to_rgb\n");
+ png_debug(1, "in png_set_gray_to_rgb");
png_ptr->transformations |= PNG_GRAY_TO_RGB;
png_ptr->flags &= ~PNG_FLAG_ROW_INIT;
}
#endif
#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
#if defined(PNG_FLOATING_POINT_SUPPORTED)
/* Convert a RGB image to a grayscale of the same width. This allows us,
@@ -639,17 +639,17 @@ png_set_rgb_to_gray(png_structp png_ptr,
png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed);
}
#endif
void PNGAPI
png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
png_fixed_point red, png_fixed_point green)
{
- png_debug(1, "in png_set_rgb_to_gray\n");
+ png_debug(1, "in png_set_rgb_to_gray");
if (png_ptr == NULL) return;
switch(error_action)
{
case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY;
break;
case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;
break;
case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;
@@ -692,17 +692,17 @@ png_set_rgb_to_gray_fixed(png_structp pn
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_LEGACY_SUPPORTED)
void PNGAPI
png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
read_user_transform_fn)
{
- png_debug(1, "in png_set_read_user_transform_fn\n");
+ png_debug(1, "in png_set_read_user_transform_fn");
if (png_ptr == NULL) return;
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
png_ptr->transformations |= PNG_USER_TRANSFORM;
png_ptr->read_user_transform_fn = read_user_transform_fn;
#endif
#ifdef PNG_LEGACY_SUPPORTED
if (read_user_transform_fn)
png_warning(png_ptr,
@@ -712,17 +712,17 @@ png_set_read_user_transform_fn(png_struc
#endif
/* Initialize everything needed for the read. This includes modifying
* the palette.
*/
void /* PRIVATE */
png_init_read_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_init_read_transformations\n");
+ png_debug(1, "in png_init_read_transformations");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (png_ptr != NULL)
#endif
{
#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \
|| defined(PNG_READ_GAMMA_SUPPORTED)
int color_type = png_ptr->color_type;
#endif
@@ -1119,17 +1119,17 @@ png_init_read_transformations(png_struct
/* Modify the info structure to reflect the transformations. The
* info should be updated so a PNG file could be written with it,
* assuming the transformations result in valid PNG data.
*/
void /* PRIVATE */
png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_read_transform_info\n");
+ png_debug(1, "in png_read_transform_info");
#if defined(PNG_READ_EXPAND_SUPPORTED)
if (png_ptr->transformations & PNG_EXPAND)
{
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (png_ptr->num_trans &&
(png_ptr->transformations & PNG_EXPAND_tRNS))
info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
@@ -1263,17 +1263,17 @@ defined(PNG_READ_USER_TRANSFORM_SUPPORTE
/* Transform the row. The order of transformations is significant,
* and is very touchy. If you add a transformation, take care to
* decide how it fits in with the other transformations here.
*/
void /* PRIVATE */
png_do_read_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_do_read_transformations\n");
+ png_debug(1, "in png_do_read_transformations");
if (png_ptr->row_buf == NULL)
{
#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
char msg[50];
png_snprintf2(msg, 50,
"NULL row buffer for row %ld, pass %d", (long)png_ptr->row_number,
png_ptr->pass);
@@ -1509,17 +1509,17 @@ From Andreas Dilger e-mail to png-implem
* without changing the actual values. Thus, if you had a row with
* a bit depth of 1, you would end up with bytes that only contained
* the numbers 0 or 1. If you would rather they contain 0 and 255, use
* png_do_shift() after this.
*/
void /* PRIVATE */
png_do_unpack(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_unpack\n");
+ png_debug(1, "in png_do_unpack");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && row_info->bit_depth < 8)
#else
if (row_info->bit_depth < 8)
#endif
{
png_uint_32 i;
png_uint_32 row_width=row_info->width;
@@ -1599,17 +1599,17 @@ png_do_unpack(png_row_infop row_info, pn
/* Reverse the effects of png_do_shift. This routine merely shifts the
* pixels back to their significant bits values. Thus, if you have
* a row of bit depth 8, but only 5 are significant, this will shift
* the values back to 0 through 31.
*/
void /* PRIVATE */
png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
{
- png_debug(1, "in png_do_unshift\n");
+ png_debug(1, "in png_do_unshift");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL && sig_bits != NULL &&
#endif
row_info->color_type != PNG_COLOR_TYPE_PALETTE)
{
int shift[4];
int channels = 0;
@@ -1705,17 +1705,17 @@ png_do_unshift(png_row_infop row_info, p
}
#endif
#if defined(PNG_READ_16_TO_8_SUPPORTED)
/* chop rows of bit depth 16 down to 8 */
void /* PRIVATE */
png_do_chop(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_chop\n");
+ png_debug(1, "in png_do_chop");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && row_info->bit_depth == 16)
#else
if (row_info->bit_depth == 16)
#endif
{
png_bytep sp = row;
png_bytep dp = row;
@@ -1759,17 +1759,17 @@ png_do_chop(png_row_infop row_info, png_
}
}
#endif
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
void /* PRIVATE */
png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_swap_alpha\n");
+ png_debug(1, "in png_do_read_swap_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
png_uint_32 row_width = row_info->width;
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{
/* This converts from RGBA to ARGB */
@@ -1851,17 +1851,17 @@ png_do_read_swap_alpha(png_row_infop row
}
}
#endif
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
void /* PRIVATE */
png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_invert_alpha\n");
+ png_debug(1, "in png_do_read_invert_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
png_uint_32 row_width = row_info->width;
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{
/* This inverts the alpha channel in RGBA */
@@ -1957,17 +1957,17 @@ png_do_read_filler(png_row_infop row_inf
png_uint_32 filler, png_uint_32 flags)
{
png_uint_32 i;
png_uint_32 row_width = row_info->width;
png_byte hi_filler = (png_byte)((filler>>8) & 0xff);
png_byte lo_filler = (png_byte)(filler & 0xff);
- png_debug(1, "in png_do_read_filler\n");
+ png_debug(1, "in png_do_read_filler");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
if (row_info->bit_depth == 8)
{
@@ -2129,17 +2129,17 @@ png_do_read_filler(png_row_infop row_inf
#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
/* expand grayscale files to RGB, with or without alpha */
void /* PRIVATE */
png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
{
png_uint_32 i;
png_uint_32 row_width = row_info->width;
- png_debug(1, "in png_do_gray_to_rgb\n");
+ png_debug(1, "in png_do_gray_to_rgb");
if (row_info->bit_depth >= 8 &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
!(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
@@ -2235,17 +2235,17 @@ int /* PRIVATE */
png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
{
png_uint_32 i;
png_uint_32 row_width = row_info->width;
int rgb_error = 0;
- png_debug(1, "in png_do_rgb_to_gray\n");
+ png_debug(1, "in png_do_rgb_to_gray");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
@@ -2473,17 +2473,17 @@ png_do_rgb_to_gray(png_structp png_ptr,
void PNGAPI
png_build_grayscale_palette(int bit_depth, png_colorp palette)
{
int num_palette;
int color_inc;
int i;
int v;
- png_debug(1, "in png_do_build_grayscale_palette\n");
+ png_debug(1, "in png_do_build_grayscale_palette");
if (palette == NULL)
return;
switch (bit_depth)
{
case 1:
num_palette = 2;
color_inc = 0xff;
@@ -2515,17 +2515,17 @@ png_build_grayscale_palette(int bit_dept
}
/* This function is currently unused. Do we really need it? */
#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED)
void /* PRIVATE */
png_correct_palette(png_structp png_ptr, png_colorp palette,
int num_palette)
{
- png_debug(1, "in png_correct_palette\n");
+ png_debug(1, "in png_correct_palette");
#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND))
{
png_color back, back_1;
if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE)
{
@@ -2712,17 +2712,17 @@ png_do_background(png_row_infop row_info
#endif
)
{
png_bytep sp, dp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
int shift;
- png_debug(1, "in png_do_background\n");
+ png_debug(1, "in png_do_background");
if (background != NULL &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
(!(row_info->color_type & PNG_COLOR_MASK_ALPHA) ||
(row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values)))
{
switch (row_info->color_type)
@@ -3394,17 +3394,17 @@ void /* PRIVATE */
png_do_gamma(png_row_infop row_info, png_bytep row,
png_bytep gamma_table, png_uint_16pp gamma_16_table,
int gamma_shift)
{
png_bytep sp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_gamma\n");
+ png_debug(1, "in png_do_gamma");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
((row_info->bit_depth <= 8 && gamma_table != NULL) ||
(row_info->bit_depth == 16 && gamma_16_table != NULL)))
{
switch (row_info->color_type)
@@ -3576,17 +3576,17 @@ void /* PRIVATE */
png_do_expand_palette(png_row_infop row_info, png_bytep row,
png_colorp palette, png_bytep trans, int num_trans)
{
int shift, value;
png_bytep sp, dp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_expand_palette\n");
+ png_debug(1, "in png_do_expand_palette");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->color_type == PNG_COLOR_TYPE_PALETTE)
{
if (row_info->bit_depth < 8)
{
@@ -3719,17 +3719,17 @@ void /* PRIVATE */
png_do_expand(png_row_infop row_info, png_bytep row,
png_color_16p trans_value)
{
int shift, value;
png_bytep sp, dp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_expand\n");
+ png_debug(1, "in png_do_expand");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
{
png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0);
@@ -3925,17 +3925,17 @@ png_do_expand(png_row_infop row_info, pn
void /* PRIVATE */
png_do_dither(png_row_infop row_info, png_bytep row,
png_bytep palette_lookup, png_bytep dither_lookup)
{
png_bytep sp, dp;
png_uint_32 i;
png_uint_32 row_width=row_info->width;
- png_debug(1, "in png_do_dither\n");
+ png_debug(1, "in png_do_dither");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
palette_lookup && row_info->bit_depth == 8)
{
int r, g, b, p;
@@ -4020,17 +4020,17 @@ static PNG_CONST int png_gamma_shift[] =
/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit
* tables, we don't make a full table if we are reducing to 8-bit in
* the future. Note also how the gamma_16 tables are segmented so that
* we don't need to allocate > 64K chunks for a full 16-bit table.
*/
void /* PRIVATE */
png_build_gamma_table(png_structp png_ptr)
{
- png_debug(1, "in png_build_gamma_table\n");
+ png_debug(1, "in png_build_gamma_table");
if (png_ptr->bit_depth <= 8)
{
int i;
double g;
if (png_ptr->screen_gamma > .000001)
g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
@@ -4233,17 +4233,17 @@ png_build_gamma_table(png_structp png_pt
/* To do: install integer version of png_build_gamma_table here */
#endif
#if defined(PNG_MNG_FEATURES_SUPPORTED)
/* undoes intrapixel differencing */
void /* PRIVATE */
png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_read_intrapixel\n");
+ png_debug(1, "in png_do_read_intrapixel");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
int bytes_per_pixel;
png_uint_32 row_width = row_info->width;
--- a/modules/libimg/png/pngrutil.c
+++ b/modules/libimg/png/pngrutil.c
@@ -1,12 +1,12 @@
/* pngrutil.c - utilities to read a PNG file
*
- * Last changed in libpng 1.2.31 [August 21, 2008]
+ * Last changed in libpng 1.2.34 [December 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
* This file contains routines that are only called from within
* libpng itself during the course of reading an image.
*/
@@ -110,17 +110,17 @@ png_read_chunk_header(png_structp png_pt
/* read the length and the chunk name */
png_read_data(png_ptr, buf, 8);
length = png_get_uint_31(png_ptr, buf);
/* put the chunk name into png_ptr->chunk_name */
png_memcpy(png_ptr->chunk_name, buf + 4, 4);
- png_debug2(0, "Reading %s chunk, length = %lu\n",
+ png_debug2(0, "Reading %s chunk, length = %lu",
png_ptr->chunk_name, length);
/* reset the crc and run it over the chunk name */
png_reset_crc(png_ptr);
png_calculate_crc(png_ptr, png_ptr->chunk_name, 4);
/* check to see if chunk name is valid */
png_check_chunk_name(png_ptr, png_ptr->chunk_name);
@@ -387,17 +387,17 @@ png_decompress_chunk(png_structp png_ptr
void /* PRIVATE */
png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte buf[13];
png_uint_32 width, height;
int bit_depth, color_type, compression_type, filter_type;
int interlace_type;
- png_debug(1, "in png_handle_IHDR\n");
+ png_debug(1, "in png_handle_IHDR");
if (png_ptr->mode & PNG_HAVE_IHDR)
png_error(png_ptr, "Out of place IHDR");
/* check the length */
if (length != 13)
png_error(png_ptr, "Invalid IHDR chunk");
@@ -447,34 +447,34 @@ png_handle_IHDR(png_structp png_ptr, png
png_ptr->channels = 4;
break;
}
/* set up other useful info */
png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth *
png_ptr->channels);
png_ptr->rowbytes = PNG_ROWBYTES(png_ptr->pixel_depth, png_ptr->width);
- png_debug1(3, "bit_depth = %d\n", png_ptr->bit_depth);
- png_debug1(3, "channels = %d\n", png_ptr->channels);
- png_debug1(3, "rowbytes = %lu\n", png_ptr->rowbytes);
+ png_debug1(3, "bit_depth = %d", png_ptr->bit_depth);
+ png_debug1(3, "channels = %d", png_ptr->channels);
+ png_debug1(3, "rowbytes = %lu", png_ptr->rowbytes);
png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,
color_type, interlace_type, compression_type, filter_type);
}
/* read and check the palette */
void /* PRIVATE */
png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_color palette[PNG_MAX_PALETTE_LENGTH];
int num, i;
#ifndef PNG_NO_POINTER_INDEXING
png_colorp pal_ptr;
#endif
- png_debug(1, "in png_handle_PLTE\n");
+ png_debug(1, "in png_handle_PLTE");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before PLTE");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid PLTE after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -596,17 +596,17 @@ png_handle_PLTE(png_structp png_ptr, png
}
#endif
}
void /* PRIVATE */
png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
- png_debug(1, "in png_handle_IEND\n");
+ png_debug(1, "in png_handle_IEND");
if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT))
{
png_error(png_ptr, "No image in file");
}
png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND);
@@ -624,17 +624,17 @@ void /* PRIVATE */
png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_fixed_point igamma;
#ifdef PNG_FLOATING_POINT_SUPPORTED
float file_gamma;
#endif
png_byte buf[4];
- png_debug(1, "in png_handle_gAMA\n");
+ png_debug(1, "in png_handle_gAMA");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before gAMA");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid gAMA after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -676,17 +676,17 @@ png_handle_gAMA(png_structp png_ptr, png
#if defined(PNG_READ_sRGB_SUPPORTED)
if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB))
if (PNG_OUT_OF_RANGE(igamma, 45500L, 500))
{
png_warning(png_ptr,
"Ignoring incorrect gAMA value when sRGB is also present");
#ifndef PNG_NO_CONSOLE_IO
- fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma);
+ fprintf(stderr, "gamma = (%d/100000)", (int)igamma);
#endif
return;
}
#endif /* PNG_READ_sRGB_SUPPORTED */
#ifdef PNG_FLOATING_POINT_SUPPORTED
file_gamma = (float)igamma / (float)100000.0;
# ifdef PNG_READ_GAMMA_SUPPORTED
@@ -702,17 +702,17 @@ png_handle_gAMA(png_structp png_ptr, png
#if defined(PNG_READ_sBIT_SUPPORTED)
void /* PRIVATE */
png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_size_t truelen;
png_byte buf[4];
- png_debug(1, "in png_handle_sBIT\n");
+ png_debug(1, "in png_handle_sBIT");
buf[0] = buf[1] = buf[2] = buf[3] = 0;
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sBIT");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid sBIT after IDAT");
@@ -774,17 +774,17 @@ png_handle_cHRM(png_structp png_ptr, png
#ifdef PNG_FLOATING_POINT_SUPPORTED
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
#endif
png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green,
int_y_green, int_x_blue, int_y_blue;
png_uint_32 uint_x, uint_y;
- png_debug(1, "in png_handle_cHRM\n");
+ png_debug(1, "in png_handle_cHRM");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before cHRM");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid cHRM after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -812,52 +812,31 @@ png_handle_cHRM(png_structp png_ptr, png
}
png_crc_read(png_ptr, buf, 32);
if (png_crc_finish(png_ptr, 0))
return;
uint_x = png_get_uint_32(buf);
uint_y = png_get_uint_32(buf + 4);
- if (uint_x > 80000L || uint_y > 80000L ||
- uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM white point");
- return;
- }
int_x_white = (png_fixed_point)uint_x;
int_y_white = (png_fixed_point)uint_y;
uint_x = png_get_uint_32(buf + 8);
uint_y = png_get_uint_32(buf + 12);
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM red point");
- return;
- }
int_x_red = (png_fixed_point)uint_x;
int_y_red = (png_fixed_point)uint_y;
uint_x = png_get_uint_32(buf + 16);
uint_y = png_get_uint_32(buf + 20);
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM green point");
- return;
- }
int_x_green = (png_fixed_point)uint_x;
int_y_green = (png_fixed_point)uint_y;
uint_x = png_get_uint_32(buf + 24);
uint_y = png_get_uint_32(buf + 28);
- if (uint_x + uint_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM blue point");
- return;
- }
int_x_blue = (png_fixed_point)uint_x;
int_y_blue = (png_fixed_point)uint_y;
#ifdef PNG_FLOATING_POINT_SUPPORTED
white_x = (float)int_x_white / (float)100000.0;
white_y = (float)int_y_white / (float)100000.0;
red_x = (float)int_x_red / (float)100000.0;
red_y = (float)int_y_red / (float)100000.0;
@@ -913,17 +892,17 @@ png_handle_cHRM(png_structp png_ptr, png
#if defined(PNG_READ_sRGB_SUPPORTED)
void /* PRIVATE */
png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
int intent;
png_byte buf[1];
- png_debug(1, "in png_handle_sRGB\n");
+ png_debug(1, "in png_handle_sRGB");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sRGB");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid sRGB after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1016,17 +995,17 @@ png_handle_iCCP(png_structp png_ptr, png
{
png_byte compression_type;
png_bytep pC;
png_charp profile;
png_uint_32 skip = 0;
png_uint_32 profile_size, profile_length;
png_size_t slength, prefix_length, data_length;
- png_debug(1, "in png_handle_iCCP\n");
+ png_debug(1, "in png_handle_iCCP");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before iCCP");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid iCCP after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1137,17 +1116,17 @@ png_handle_sPLT(png_structp png_ptr, png
png_sPLT_t new_palette;
#ifdef PNG_NO_POINTER_INDEXING
png_sPLT_entryp pp;
#endif
int data_length, entry_size, i;
png_uint_32 skip = 0;
png_size_t slength;
- png_debug(1, "in png_handle_sPLT\n");
+ png_debug(1, "in png_handle_sPLT");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sPLT");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid sPLT after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1273,17 +1252,17 @@ png_handle_sPLT(png_structp png_ptr, png
#endif /* PNG_READ_sPLT_SUPPORTED */
#if defined(PNG_READ_tRNS_SUPPORTED)
void /* PRIVATE */
png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte readbuf[PNG_MAX_PALETTE_LENGTH];
- png_debug(1, "in png_handle_tRNS\n");
+ png_debug(1, "in png_handle_tRNS");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before tRNS");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid tRNS after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1369,17 +1348,17 @@ png_handle_tRNS(png_structp png_ptr, png
#if defined(PNG_READ_bKGD_SUPPORTED)
void /* PRIVATE */
png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_size_t truelen;
png_byte buf[6];
- png_debug(1, "in png_handle_bKGD\n");
+ png_debug(1, "in png_handle_bKGD");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before bKGD");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid bKGD after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1420,17 +1399,17 @@ png_handle_bKGD(png_structp png_ptr, png
* arbitrary RGB values for background when we have transparency, and
* so it is easy to determine the RGB values of the background color
* from the info_ptr struct. */
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
png_ptr->background.index = buf[0];
if (info_ptr && info_ptr->num_palette)
{
- if (buf[0] > info_ptr->num_palette)
+ if (buf[0] >= info_ptr->num_palette)
{
png_warning(png_ptr, "Incorrect bKGD chunk index value");
return;
}
png_ptr->background.red =
(png_uint_16)png_ptr->palette[buf[0]].red;
png_ptr->background.green =
(png_uint_16)png_ptr->palette[buf[0]].green;
@@ -1458,17 +1437,17 @@ png_handle_bKGD(png_structp png_ptr, png
#if defined(PNG_READ_hIST_SUPPORTED)
void /* PRIVATE */
png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
unsigned int num, i;
png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];
- png_debug(1, "in png_handle_hIST\n");
+ png_debug(1, "in png_handle_hIST");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before hIST");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid hIST after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1513,17 +1492,17 @@ png_handle_hIST(png_structp png_ptr, png
#if defined(PNG_READ_pHYs_SUPPORTED)
void /* PRIVATE */
png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte buf[9];
png_uint_32 res_x, res_y;
int unit_type;
- png_debug(1, "in png_handle_pHYs\n");
+ png_debug(1, "in png_handle_pHYs");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before pHYs");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid pHYs after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1556,17 +1535,17 @@ png_handle_pHYs(png_structp png_ptr, png
#if defined(PNG_READ_oFFs_SUPPORTED)
void /* PRIVATE */
png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte buf[9];
png_int_32 offset_x, offset_y;
int unit_type;
- png_debug(1, "in png_handle_oFFs\n");
+ png_debug(1, "in png_handle_oFFs");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before oFFs");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid oFFs after IDAT");
png_crc_finish(png_ptr, length);
return;
@@ -1603,34 +1582,34 @@ png_handle_pCAL(png_structp png_ptr, png
{
png_int_32 X0, X1;
png_byte type, nparams;
png_charp buf, units, endptr;
png_charpp params;
png_size_t slength;
int i;
- png_debug(1, "in png_handle_pCAL\n");
+ png_debug(1, "in png_handle_pCAL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before pCAL");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid pCAL after IDAT");
png_crc_finish(png_ptr, length);
return;
}
else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL))
{
png_warning(png_ptr, "Duplicate pCAL chunk");
png_crc_finish(png_ptr, length);
return;
}
- png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n",
+ png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)",
length + 1);
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "No memory for pCAL purpose.");
return;
}
@@ -1641,40 +1620,40 @@ png_handle_pCAL(png_structp png_ptr, png
{
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = NULL;
return;
}
png_ptr->chunkdata[slength] = 0x00; /* null terminate the last string */
- png_debug(3, "Finding end of pCAL purpose string\n");
+ png_debug(3, "Finding end of pCAL purpose string");
for (buf = png_ptr->chunkdata; *buf; buf++)
/* empty loop */ ;
endptr = png_ptr->chunkdata + slength;
/* We need to have at least 12 bytes after the purpose string
in order to get the parameter information. */
if (endptr <= buf + 12)
{
png_warning(png_ptr, "Invalid pCAL data");
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = NULL;
return;
}
- png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n");
+ png_debug(3, "Reading pCAL X0, X1, type, nparams, and units");
X0 = png_get_int_32((png_bytep)buf+1);
X1 = png_get_int_32((png_bytep)buf+5);
type = buf[9];
nparams = buf[10];
units = buf + 11;
- png_debug(3, "Checking pCAL equation type and number of parameters\n");
+ png_debug(3, "Checking pCAL equation type and number of parameters");
/* Check that we have the right number of parameters for known
equation types. */
if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||
(type == PNG_EQUATION_BASE_E && nparams != 3) ||
(type == PNG_EQUATION_ARBITRARY && nparams != 3) ||
(type == PNG_EQUATION_HYPERBOLIC && nparams != 4))
{
png_warning(png_ptr, "Invalid pCAL parameters for equation type");
@@ -1685,33 +1664,33 @@ png_handle_pCAL(png_structp png_ptr, png
else if (type >= PNG_EQUATION_LAST)
{
png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
}
for (buf = units; *buf; buf++)
/* Empty loop to move past the units string. */ ;
- png_debug(3, "Allocating pCAL parameters array\n");
+ png_debug(3, "Allocating pCAL parameters array");
params = (png_charpp)png_malloc_warn(png_ptr,
(png_uint_32)(nparams * png_sizeof(png_charp))) ;
if (params == NULL)
{
png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = NULL;
png_warning(png_ptr, "No memory for pCAL params.");
return;
}
/* Get pointers to the start of each parameter string. */
for (i = 0; i < (int)nparams; i++)
{
buf++; /* Skip the null string terminator from previous parameter. */
- png_debug1(3, "Reading pCAL parameter %d\n", i);
+ png_debug1(3, "Reading pCAL parameter %d", i);
for (params[i] = buf; buf <= endptr && *buf != 0x00; buf++)
/* Empty loop to move past each parameter string */ ;
/* Make sure we haven't run out of data yet */
if (buf > endptr)
{
png_warning(png_ptr, "Invalid pCAL data");
png_free(png_ptr, png_ptr->chunkdata);
@@ -1741,34 +1720,34 @@ png_handle_sCAL(png_structp png_ptr, png
png_charp vp;
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
png_charp swidth, sheight;
#endif
#endif
png_size_t slength;
- png_debug(1, "in png_handle_sCAL\n");
+ png_debug(1, "in png_handle_sCAL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before sCAL");
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid sCAL after IDAT");
png_crc_finish(png_ptr, length);
return;
}
else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL))
{
png_warning(png_ptr, "Duplicate sCAL chunk");
png_crc_finish(png_ptr, length);
return;
}
- png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n",
+ png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)",
length + 1);
png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "Out of memory while processing sCAL chunk");
return;
}
slength = (png_size_t)length;
@@ -1875,17 +1854,17 @@ png_handle_sCAL(png_structp png_ptr, png
#if defined(PNG_READ_tIME_SUPPORTED)
void /* PRIVATE */
png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte buf[7];
png_time mod_time;
- png_debug(1, "in png_handle_tIME\n");
+ png_debug(1, "in png_handle_tIME");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Out of place tIME chunk");
else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME))
{
png_warning(png_ptr, "Duplicate tIME chunk");
png_crc_finish(png_ptr, length);
return;
@@ -1923,77 +1902,82 @@ png_handle_tEXt(png_structp png_ptr, png
{
png_textp text_ptr;
png_charp key;
png_charp text;
png_uint_32 skip = 0;
png_size_t slength;
int ret;
- png_debug(1, "in png_handle_tEXt\n");
+ png_debug(1, "in png_handle_tEXt");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before tEXt");
if (png_ptr->mode & PNG_HAVE_IDAT)
png_ptr->mode |= PNG_AFTER_IDAT;
#ifdef PNG_MAX_MALLOC_64K
if (length > (png_uint_32)65535L)
{
png_warning(png_ptr, "tEXt chunk too large to fit in memory");
skip = length - (png_uint_32)65535L;
length = (png_uint_32)65535L;
}
#endif
- key = (png_charp)png_malloc_warn(png_ptr, length + 1);
- if (key == NULL)
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
+ if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "No memory to process text chunk.");
return;
}
slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)key, slength);
+ png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
if (png_crc_finish(png_ptr, skip))
{
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
+ key = png_ptr->chunkdata;
key[slength] = 0x00;
for (text = key; *text; text++)
/* empty loop to find end of key */ ;
if (text != key + slength)
text++;
text_ptr = (png_textp)png_malloc_warn(png_ptr,
(png_uint_32)png_sizeof(png_text));
if (text_ptr == NULL)
{
png_warning(png_ptr, "Not enough memory to process text chunk.");
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
return;
}
text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
text_ptr->key = key;
#ifdef PNG_iTXt_SUPPORTED
text_ptr->lang = NULL;
text_ptr->lang_key = NULL;
text_ptr->itxt_length = 0;
#endif
text_ptr->text = text;
text_ptr->text_length = png_strlen(text);
ret = png_set_text_2(png_ptr, info_ptr, text_ptr, 1);
- png_free(png_ptr, key);
+ png_free(png_ptr, png_ptr->chunkdata);
+ png_ptr->chunkdata = NULL;
png_free(png_ptr, text_ptr);
if (ret)
png_warning(png_ptr, "Insufficient memory to process text chunk.");
}
#endif
#if defined(PNG_READ_zTXt_SUPPORTED)
/* note: this does not correctly handle chunks that are > 64K under DOS */
@@ -2001,17 +1985,17 @@ void /* PRIVATE */
png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_textp text_ptr;
png_charp text;
int comp_type;
int ret;
png_size_t slength, prefix_len, data_len;
- png_debug(1, "in png_handle_zTXt\n");
+ png_debug(1, "in png_handle_zTXt");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before zTXt");
if (png_ptr->mode & PNG_HAVE_IDAT)
png_ptr->mode |= PNG_AFTER_IDAT;
#ifdef PNG_MAX_MALLOC_64K
/* We will no doubt have problems with chunks even half this size, but
@@ -2019,17 +2003,17 @@ png_handle_zTXt(png_structp png_ptr, png
if (length > (png_uint_32)65535L)
{
png_warning(png_ptr, "zTXt chunk too large to fit in memory");
png_crc_finish(png_ptr, length);
return;
}
#endif
- png_free(png_ptr,png_ptr->chunkdata);
+ png_free(png_ptr, png_ptr->chunkdata);
png_ptr->chunkdata = (png_charp)png_malloc_warn(png_ptr, length + 1);
if (png_ptr->chunkdata == NULL)
{
png_warning(png_ptr, "Out of memory processing zTXt chunk.");
return;
}
slength = (png_size_t)length;
png_crc_read(png_ptr, (png_bytep)png_ptr->chunkdata, slength);
@@ -2104,17 +2088,17 @@ png_handle_iTXt(png_structp png_ptr, png
{
png_textp text_ptr;
png_charp key, lang, text, lang_key;
int comp_flag;
int comp_type = 0;
int ret;
png_size_t slength, prefix_len, data_len;
- png_debug(1, "in png_handle_iTXt\n");
+ png_debug(1, "in png_handle_iTXt");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
png_error(png_ptr, "Missing IHDR before iTXt");
if (png_ptr->mode & PNG_HAVE_IDAT)
png_ptr->mode |= PNG_AFTER_IDAT;
#ifdef PNG_MAX_MALLOC_64K
@@ -2230,17 +2214,17 @@ png_handle_iTXt(png_structp png_ptr, png
void /* PRIVATE */
png_handle_acTL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_byte data[8];
png_uint_32 num_frames;
png_uint_32 num_plays;
png_uint_32 didSet;
- png_debug(1, "in png_handle_acTL\n");
+ png_debug(1, "in png_handle_acTL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
{
png_error(png_ptr, "Missing IHDR before acTL");
}
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
png_warning(png_ptr, "Invalid acTL after IDAT skipped");
@@ -2280,17 +2264,17 @@ png_handle_fcTL(png_structp png_ptr, png
png_uint_32 height;
png_uint_32 x_offset;
png_uint_32 y_offset;
png_uint_16 delay_num;
png_uint_16 delay_den;
png_byte dispose_op;
png_byte blend_op;
- png_debug(1, "in png_handle_fcTL\n");
+ png_debug(1, "in png_handle_fcTL");
if (!(png_ptr->mode & PNG_HAVE_IHDR))
{
png_error(png_ptr, "Missing IHDR before fcTL");
}
else if (png_ptr->mode & PNG_HAVE_IDAT)
{
/* for any frames other then the first this message may be misleading,
@@ -2392,17 +2376,17 @@ png_ensure_sequence_number(png_structp p
chunk name, CRC, or a critical chunk), the chunk is silently ignored
-- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which
case it will be saved away to be written out later. */
void /* PRIVATE */
png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
{
png_uint_32 skip = 0;
- png_debug(1, "in png_handle_unknown\n");
+ png_debug(1, "in png_handle_unknown");
if (png_ptr->mode & PNG_HAVE_IDAT)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_CONST PNG_IDAT;
#endif
if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */
png_ptr->mode |= PNG_AFTER_IDAT;
@@ -2487,17 +2471,17 @@ png_handle_unknown(png_structp png_ptr,
functions to handle unknown critical chunks after we check that
the chunk name itself is valid. */
#define isnonalpha(c) ((c) < 65 || (c) > 122 || ((c) > 90 && (c) < 97))
void /* PRIVATE */
png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)
{
- png_debug(1, "in png_check_chunk_name\n");
+ png_debug(1, "in png_check_chunk_name");
if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) ||
isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3]))
{
png_chunk_error(png_ptr, "invalid chunk type");
}
}
/* Combines the row recently read in with the existing pixels in the
@@ -2509,17 +2493,17 @@ png_check_chunk_name(png_structp png_ptr
bits are needed. A one indicates the pixel is to be combined,
a zero indicates the pixel is to be skipped. This is in addition
to any alpha or transparency value associated with the pixel. If
you want all pixels to be combined, pass 0xff (255) in mask. */
void /* PRIVATE */
png_combine_row(png_structp png_ptr, png_bytep row, int mask)
{
- png_debug(1, "in png_combine_row\n");
+ png_debug(1, "in png_combine_row");
if (mask == 0xff)
{
png_memcpy(row, png_ptr->row_buf + 1,
PNG_ROWBYTES(png_ptr->row_info.pixel_depth, png_ptr->width));
}
else
{
switch (png_ptr->row_info.pixel_depth)
@@ -2725,17 +2709,17 @@ png_do_read_interlace(png_structp png_pt
int pass = png_ptr->pass;
png_uint_32 transformations = png_ptr->transformations;
#ifdef PNG_USE_LOCAL_ARRAYS
/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
/* offset to next interlace block */
PNG_CONST int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
#endif
- png_debug(1, "in png_do_read_interlace\n");
+ png_debug(1, "in png_do_read_interlace");
if (row != NULL && row_info != NULL)
{
png_uint_32 final_width;
final_width = row_info->width * png_pass_inc[pass];
switch (row_info->pixel_depth)
{
@@ -2938,18 +2922,18 @@ png_do_read_interlace(png_structp png_pt
#endif
}
#endif /* PNG_READ_INTERLACING_SUPPORTED */
void /* PRIVATE */
png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
png_bytep prev_row, int filter)
{
- png_debug(1, "in png_read_filter_row\n");
- png_debug2(2, "row = %lu, filter = %d\n", png_ptr->row_number, filter);
+ png_debug(1, "in png_read_filter_row");
+ png_debug2(2, "row = %lu, filter = %d", png_ptr->row_number, filter);
switch (filter)
{
case PNG_FILTER_VALUE_NONE:
break;
case PNG_FILTER_VALUE_SUB:
{
png_uint_32 i;
png_uint_32 istop = row_info->rowbytes;
@@ -3078,17 +3062,17 @@ png_read_finish_row(png_structp png_ptr)
/* start of interlace block in the y direction */
PNG_CONST int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
/* offset to next interlace block in the y direction */
PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif /* PNG_READ_INTERLACING_SUPPORTED */
#endif
- png_debug(1, "in png_read_finish_row\n");
+ png_debug(1, "in png_read_finish_row");
png_ptr->row_number++;
if (png_ptr->row_number < png_ptr->num_rows)
return;
#ifdef PNG_READ_INTERLACING_SUPPORTED
if (png_ptr->interlaced)
{
png_ptr->row_number = 0;
@@ -3213,17 +3197,17 @@ png_read_start_row(png_structp png_ptr)
/* offset to next interlace block in the y direction */
PNG_CONST int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
int max_pixel_depth;
png_size_t row_bytes;
- png_debug(1, "in png_read_start_row\n");
+ png_debug(1, "in png_read_start_row");
png_ptr->zstream.avail_in = 0;
png_init_read_transformations(png_ptr);
#ifdef PNG_READ_INTERLACING_SUPPORTED
if (png_ptr->interlaced)
{
if (!(png_ptr->transformations & PNG_INTERLACE))
png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
png_pass_ystart[0]) / png_pass_yinc[0];
@@ -3379,22 +3363,22 @@ defined(PNG_USER_TRANSFORM_PTR_SUPPORTED
png_free(png_ptr, png_ptr->prev_row);
png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)(
png_ptr->rowbytes + 1));
png_ptr->old_prev_row_size = png_ptr->rowbytes+1;
}
png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
- png_debug1(3, "width = %lu,\n", png_ptr->width);
- png_debug1(3, "height = %lu,\n", png_ptr->height);
- png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth);
- png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows);
- png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes);
- png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes);
+ png_debug1(3, "width = %lu,", png_ptr->width);
+ png_debug1(3, "height = %lu,", png_ptr->height);
+ png_debug1(3, "iwidth = %lu,", png_ptr->iwidth);
+ png_debug1(3, "num_rows = %lu", png_ptr->num_rows);
+ png_debug1(3, "rowbytes = %lu,", png_ptr->rowbytes);
+ png_debug1(3, "irowbytes = %lu,", png_ptr->irowbytes);
png_ptr->flags |= PNG_FLAG_ROW_INIT;
}
#if defined(PNG_READ_APNG_SUPPORTED)
/* This function is to be called after the main IDAT set has been read and
* before a new IDAT is read. It resets some parts of png_ptr
* to make them usable by the read functions again */
--- a/modules/libimg/png/pngset.c
+++ b/modules/libimg/png/pngset.c
@@ -1,12 +1,12 @@
/* pngset.c - storage of image information into info struct
*
- * Last changed in libpng 1.2.30 [August 13, 2008]
+ * Last changed in libpng 1.2.34 [December 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*
* The functions here are used during reads to store data from the file
* into the info struct, and during writes to store application data
* into the info struct for writing into the file. This abstracts the
@@ -16,60 +16,35 @@
#define PNG_INTERNAL
#include "png.h"
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
#if defined(PNG_bKGD_SUPPORTED)
void PNGAPI
png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
{
- png_debug1(1, "in %s storage function\n", "bKGD");
+ png_debug1(1, "in %s storage function", "bKGD");
if (png_ptr == NULL || info_ptr == NULL)
return;
png_memcpy(&(info_ptr->background), background, png_sizeof(png_color_16));
info_ptr->valid |= PNG_INFO_bKGD;
}
#endif
#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
double white_x, double white_y, double red_x, double red_y,
double green_x, double green_y, double blue_x, double blue_y)
{
- png_debug1(1, "in %s storage function\n", "cHRM");
+ png_debug1(1, "in %s storage function", "cHRM");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
- blue_x || blue_y))
- {
- png_warning(png_ptr,
- "Ignoring attempt to set all-zero chromaticity values");
- return;
- }
- if (white_x < 0.0 || white_y < 0.0 ||
- red_x < 0.0 || red_y < 0.0 ||
- green_x < 0.0 || green_y < 0.0 ||
- blue_x < 0.0 || blue_y < 0.0)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set negative chromaticity value");
- return;
- }
- if (white_x > 21474.83 || white_y > 21474.83 ||
- red_x > 21474.83 || red_y > 21474.83 ||
- green_x > 21474.83 || green_y > 21474.83 ||
- blue_x > 21474.83 || blue_y > 21474.83)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set chromaticity value exceeding 21474.83");
- return;
- }
info_ptr->x_white = (float)white_x;
info_ptr->y_white = (float)white_y;
info_ptr->x_red = (float)red_x;
info_ptr->y_red = (float)red_y;
info_ptr->x_green = (float)green_x;
info_ptr->y_green = (float)green_y;
info_ptr->x_blue = (float)blue_x;
@@ -89,79 +64,56 @@ png_set_cHRM(png_structp png_ptr, png_in
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
png_fixed_point blue_x, png_fixed_point blue_y)
{
- png_debug1(1, "in %s storage function\n", "cHRM");
+ png_debug1(1, "in %s storage function", "cHRM fixed");
if (png_ptr == NULL || info_ptr == NULL)
return;
- if (!(white_x || white_y || red_x || red_y || green_x || green_y ||
- blue_x || blue_y))
- {
- png_warning(png_ptr,
- "Ignoring attempt to set all-zero chromaticity values");
- return;
- }
- if (white_x < 0 || white_y < 0 ||
- red_x < 0 || red_y < 0 ||
- green_x < 0 || green_y < 0 ||
- blue_x < 0 || blue_y < 0)
- {
- png_warning(png_ptr,
- "Ignoring attempt to set negative chromaticity value");
- return;
- }
- if (white_x > (png_fixed_point) PNG_UINT_31_MAX ||
- white_y > (png_fixed_point) PNG_UINT_31_MAX ||
- red_x > (png_fixed_point) PNG_UINT_31_MAX ||
- red_y > (png_fixed_point) PNG_UINT_31_MAX ||
- green_x > (png_fixed_point) PNG_UINT_31_MAX ||
- green_y > (png_fixed_point) PNG_UINT_31_MAX ||
- blue_x > (png_fixed_point) PNG_UINT_31_MAX ||
- blue_y > (png_fixed_point) PNG_UINT_31_MAX )
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr,
+ white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y))
+#endif
{
- png_warning(png_ptr,
- "Ignoring attempt to set chromaticity value exceeding 21474.83");
- return;
- }
- info_ptr->int_x_white = white_x;
- info_ptr->int_y_white = white_y;
- info_ptr->int_x_red = red_x;
- info_ptr->int_y_red = red_y;
- info_ptr->int_x_green = green_x;
- info_ptr->int_y_green = green_y;
- info_ptr->int_x_blue = blue_x;
- info_ptr->int_y_blue = blue_y;
+ info_ptr->int_x_white = white_x;
+ info_ptr->int_y_white = white_y;
+ info_ptr->int_x_red = red_x;
+ info_ptr->int_y_red = red_y;
+ info_ptr->int_x_green = green_x;
+ info_ptr->int_y_green = green_y;
+ info_ptr->int_x_blue = blue_x;
+ info_ptr->int_y_blue = blue_y;
#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->x_white = (float)(white_x/100000.);
- info_ptr->y_white = (float)(white_y/100000.);
- info_ptr->x_red = (float)( red_x/100000.);
- info_ptr->y_red = (float)( red_y/100000.);
- info_ptr->x_green = (float)(green_x/100000.);
- info_ptr->y_green = (float)(green_y/100000.);
- info_ptr->x_blue = (float)( blue_x/100000.);
- info_ptr->y_blue = (float)( blue_y/100000.);
+ info_ptr->x_white = (float)(white_x/100000.);
+ info_ptr->y_white = (float)(white_y/100000.);
+ info_ptr->x_red = (float)( red_x/100000.);
+ info_ptr->y_red = (float)( red_y/100000.);
+ info_ptr->x_green = (float)(green_x/100000.);
+ info_ptr->y_green = (float)(green_y/100000.);
+ info_ptr->x_blue = (float)( blue_x/100000.);
+ info_ptr->y_blue = (float)( blue_y/100000.);
#endif
- info_ptr->valid |= PNG_INFO_cHRM;
+ info_ptr->valid |= PNG_INFO_cHRM;
+ }
}
-#endif
-#endif
+#endif /* PNG_FIXED_POINT_SUPPORTED */
+#endif /* PNG_cHRM_SUPPORTED */
#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
{
double gamma;
- png_debug1(1, "in %s storage function\n", "gAMA");
+ png_debug1(1, "in %s storage function", "gAMA");
if (png_ptr == NULL || info_ptr == NULL)
return;
/* Check for overflow */
if (file_gamma > 21474.83)
{
png_warning(png_ptr, "Limiting gamma to 21474.83");
gamma=21474.83;
@@ -178,17 +130,17 @@ png_set_gAMA(png_structp png_ptr, png_in
}
#endif
void PNGAPI
png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
int_gamma)
{
png_fixed_point gamma;
- png_debug1(1, "in %s storage function\n", "gAMA");
+ png_debug1(1, "in %s storage function", "gAMA");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (int_gamma > (png_fixed_point) PNG_UINT_31_MAX)
{
png_warning(png_ptr, "Limiting gamma to 21474.83");
gamma=PNG_UINT_31_MAX;
}
@@ -215,17 +167,17 @@ png_set_gAMA_fixed(png_structp png_ptr,
#endif
#if defined(PNG_hIST_SUPPORTED)
void PNGAPI
png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
{
int i;
- png_debug1(1, "in %s storage function\n", "hIST");
+ png_debug1(1, "in %s storage function", "hIST");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (info_ptr->num_palette == 0 || info_ptr->num_palette
> PNG_MAX_PALETTE_LENGTH)
{
png_warning(png_ptr,
"Invalid palette size, hIST allocation skipped.");
return;
@@ -258,17 +210,17 @@ png_set_hIST(png_structp png_ptr, png_in
#endif
void PNGAPI
png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
png_uint_32 width, png_uint_32 height, int bit_depth,
int color_type, int interlace_type, int compression_type,
int filter_type)
{
- png_debug1(1, "in %s storage function\n", "IHDR");
+ png_debug1(1, "in %s storage function", "IHDR");
if (png_ptr == NULL || info_ptr == NULL)
return;
/* check for width and height valid values */
if (width == 0 || height == 0)
png_error(png_ptr, "Image width or height is zero in IHDR");
#ifdef PNG_SET_USER_LIMITS_SUPPORTED
if (width > png_ptr->user_width_max || height > png_ptr->user_height_max)
@@ -370,17 +322,17 @@ png_set_IHDR(png_structp png_ptr, png_in
#endif
}
#if defined(PNG_oFFs_SUPPORTED)
void PNGAPI
png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
png_int_32 offset_x, png_int_32 offset_y, int unit_type)
{
- png_debug1(1, "in %s storage function\n", "oFFs");
+ png_debug1(1, "in %s storage function", "oFFs");
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->x_offset = offset_x;
info_ptr->y_offset = offset_y;
info_ptr->offset_unit_type = (png_byte)unit_type;
info_ptr->valid |= PNG_INFO_oFFs;
}
@@ -390,39 +342,39 @@ png_set_oFFs(png_structp png_ptr, png_in
void PNGAPI
png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
png_charp units, png_charpp params)
{
png_uint_32 length;
int i;
- png_debug1(1, "in %s storage function\n", "pCAL");
+ png_debug1(1, "in %s storage function", "pCAL");
if (png_ptr == NULL || info_ptr == NULL)
return;
length = png_strlen(purpose) + 1;
- png_debug1(3, "allocating purpose for info (%lu bytes)\n",
+ png_debug1(3, "allocating purpose for info (%lu bytes)",
(unsigned long)length);
info_ptr->pcal_purpose = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_purpose == NULL)
{
png_warning(png_ptr, "Insufficient memory for pCAL purpose.");
return;
}
png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length);
- png_debug(3, "storing X0, X1, type, and nparams in info\n");
+ png_debug(3, "storing X0, X1, type, and nparams in info");
info_ptr->pcal_X0 = X0;
info_ptr->pcal_X1 = X1;
info_ptr->pcal_type = (png_byte)type;
info_ptr->pcal_nparams = (png_byte)nparams;
length = png_strlen(units) + 1;
- png_debug1(3, "allocating units for info (%lu bytes)\n",
+ png_debug1(3, "allocating units for info (%lu bytes)",
(unsigned long)length);
info_ptr->pcal_units = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_units == NULL)
{
png_warning(png_ptr, "Insufficient memory for pCAL units.");
return;
}
png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);
@@ -435,17 +387,17 @@ png_set_pCAL(png_structp png_ptr, png_in
return;
}
info_ptr->pcal_params[nparams] = NULL;
for (i = 0; i < nparams; i++)
{
length = png_strlen(params[i]) + 1;
- png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i,
+ png_debug2(3, "allocating parameter %d for info (%lu bytes)", i,
(unsigned long)length);
info_ptr->pcal_params[i] = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->pcal_params[i] == NULL)
{
png_warning(png_ptr, "Insufficient memory for pCAL parameter.");
return;
}
png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);
@@ -459,17 +411,17 @@ png_set_pCAL(png_structp png_ptr, png_in
#endif
#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
void PNGAPI
png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
int unit, double width, double height)
{
- png_debug1(1, "in %s storage function\n", "sCAL");
+ png_debug1(1, "in %s storage function", "sCAL");
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->scal_unit = (png_byte)unit;
info_ptr->scal_pixel_width = width;
info_ptr->scal_pixel_height = height;
info_ptr->valid |= PNG_INFO_sCAL;
@@ -477,36 +429,36 @@ png_set_sCAL(png_structp png_ptr, png_in
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
void PNGAPI
png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
int unit, png_charp swidth, png_charp sheight)
{
png_uint_32 length;
- png_debug1(1, "in %s storage function\n", "sCAL");
+ png_debug1(1, "in %s storage function", "sCAL");
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->scal_unit = (png_byte)unit;
length = png_strlen(swidth) + 1;
- png_debug1(3, "allocating unit for info (%u bytes)\n",
+ png_debug1(3, "allocating unit for info (%u bytes)",
(unsigned int)length);
info_ptr->scal_s_width = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->scal_s_width == NULL)
{
png_warning(png_ptr,
"Memory allocation failed while processing sCAL.");
return;
}
png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);
length = png_strlen(sheight) + 1;
- png_debug1(3, "allocating unit for info (%u bytes)\n",
+ png_debug1(3, "allocating unit for info (%u bytes)",
(unsigned int)length);
info_ptr->scal_s_height = (png_charp)png_malloc_warn(png_ptr, length);
if (info_ptr->scal_s_height == NULL)
{
png_free (png_ptr, info_ptr->scal_s_width);
info_ptr->scal_s_width = NULL;
png_warning(png_ptr,
"Memory allocation failed while processing sCAL.");
@@ -522,33 +474,33 @@ png_set_sCAL_s(png_structp png_ptr, png_
#endif
#endif
#if defined(PNG_pHYs_SUPPORTED)
void PNGAPI
png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
png_uint_32 res_x, png_uint_32 res_y, int unit_type)
{
- png_debug1(1, "in %s storage function\n", "pHYs");
+ png_debug1(1, "in %s storage function", "pHYs");
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->x_pixels_per_unit = res_x;
info_ptr->y_pixels_per_unit = res_y;
info_ptr->phys_unit_type = (png_byte)unit_type;
info_ptr->valid |= PNG_INFO_pHYs;
}
#endif
void PNGAPI
png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
png_colorp palette, int num_palette)
{
- png_debug1(1, "in %s storage function\n", "PLTE");
+ png_debug1(1, "in %s storage function", "PLTE");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
{
if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
png_error(png_ptr, "Invalid palette length");
else
@@ -587,30 +539,30 @@ png_set_PLTE(png_structp png_ptr, png_in
info_ptr->valid |= PNG_INFO_PLTE;
}
#if defined(PNG_sBIT_SUPPORTED)
void PNGAPI
png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
png_color_8p sig_bit)
{
- png_debug1(1, "in %s storage function\n", "sBIT");
+ png_debug1(1, "in %s storage function", "sBIT");
if (png_ptr == NULL || info_ptr == NULL)
return;
png_memcpy(&(info_ptr->sig_bit), sig_bit, png_sizeof(png_color_8));
info_ptr->valid |= PNG_INFO_sBIT;
}
#endif
#if defined(PNG_sRGB_SUPPORTED)
void PNGAPI
png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
{
- png_debug1(1, "in %s storage function\n", "sRGB");
+ png_debug1(1, "in %s storage function", "sRGB");
if (png_ptr == NULL || info_ptr == NULL)
return;
info_ptr->srgb_intent = (png_byte)intent;
info_ptr->valid |= PNG_INFO_sRGB;
}
void PNGAPI
@@ -624,22 +576,20 @@ png_set_sRGB_gAMA_and_cHRM(png_structp p
#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point int_file_gamma;
#endif
#endif
#if defined(PNG_cHRM_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
int_green_y, int_blue_x, int_blue_y;
#endif
-#endif
- png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
+ png_debug1(1, "in %s storage function", "sRGB_gAMA_and_cHRM");
if (png_ptr == NULL || info_ptr == NULL)
return;
png_set_sRGB(png_ptr, info_ptr, intent);
#if defined(PNG_gAMA_SUPPORTED)
#ifdef PNG_FLOATING_POINT_SUPPORTED
file_gamma = (float).45455;
@@ -647,59 +597,68 @@ png_set_sRGB_gAMA_and_cHRM(png_structp p
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
int_file_gamma = 45455L;
png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
#endif
#endif
#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FIXED_POINT_SUPPORTED
int_white_x = 31270L;
int_white_y = 32900L;
int_red_x = 64000L;
int_red_y = 33000L;
int_green_x = 30000L;
int_green_y = 60000L;
int_blue_x = 15000L;
int_blue_y = 6000L;
- png_set_cHRM_fixed(png_ptr, info_ptr,
- int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y,
- int_blue_x, int_blue_y);
-#endif
#ifdef PNG_FLOATING_POINT_SUPPORTED
white_x = (float).3127;
white_y = (float).3290;
red_x = (float).64;
red_y = (float).33;
green_x = (float).30;
green_y = (float).60;
blue_x = (float).15;
blue_y = (float).06;
+#endif
- png_set_cHRM(png_ptr, info_ptr,
- white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr,
+ int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
+ int_green_y, int_blue_x, int_blue_y))
#endif
+ {
+#ifdef PNG_FIXED_POINT_SUPPORTED
+ png_set_cHRM_fixed(png_ptr, info_ptr,
+ int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
+ int_green_y, int_blue_x, int_blue_y);
#endif
+#ifdef PNG_FLOATING_POINT_SUPPORTED
+ png_set_cHRM(png_ptr, info_ptr,
+ white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
+#endif
+ }
+#endif /* cHRM */
}
#endif
#if defined(PNG_iCCP_SUPPORTED)
void PNGAPI
png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
png_charp name, int compression_type,
png_charp profile, png_uint_32 proflen)
{
png_charp new_iccp_name;
png_charp new_iccp_profile;
png_uint_32 length;
- png_debug1(1, "in %s storage function\n", "iCCP");
+ png_debug1(1, "in %s storage function", "iCCP");
if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
return;
length = png_strlen(name)+1;
new_iccp_name = (png_charp)png_malloc_warn(png_ptr, length);
if (new_iccp_name == NULL)
{
png_warning(png_ptr, "Insufficient memory to process iCCP chunk.");
@@ -743,17 +702,17 @@ png_set_text(png_structp png_ptr, png_in
}
int /* PRIVATE */
png_set_text_2(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
int num_text)
{
int i;
- png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ?
+ png_debug1(1, "in %s storage function", (png_ptr->chunk_name[0] == '\0' ?
"text" : (png_const_charp)png_ptr->chunk_name));
if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
return(0);
/* Make sure we have enough space in the "text" array in info_struct
* to hold all of the incoming text_ptr objects.
*/
@@ -785,17 +744,17 @@ png_set_text_2(png_structp png_ptr, png_
info_ptr->text = (png_textp)png_malloc_warn(png_ptr,
(png_uint_32)(info_ptr->max_text * png_sizeof(png_text)));
if (info_ptr->text == NULL)
return(1);
#ifdef PNG_FREE_ME_SUPPORTED
info_ptr->free_me |= PNG_FREE_TEXT;
#endif
}
- png_debug1(3, "allocated %d entries for info_ptr->text\n",
+ png_debug1(3, "allocated %d entries for info_ptr->text",
info_ptr->max_text);
}
for (i = 0; i < num_text; i++)
{
png_size_t text_length, key_len;
png_size_t lang_len, lang_key_len;
png_textp textp = &(info_ptr->text[info_ptr->num_text]);
@@ -845,17 +804,17 @@ png_set_text_2(png_structp png_ptr, png_
textp->compression = text_ptr[i].compression;
}
textp->key = (png_charp)png_malloc_warn(png_ptr,
(png_uint_32)
(key_len + text_length + lang_len + lang_key_len + 4));
if (textp->key == NULL)
return(1);
- png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n",
+ png_debug2(2, "Allocated %lu bytes at %x in png_set_text",
(png_uint_32)
(key_len + lang_len + lang_key_len + text_length + 4),
(int)textp->key);
png_memcpy(textp->key, text_ptr[i].key,
(png_size_t)(key_len));
*(textp->key + key_len) = '\0';
#ifdef PNG_iTXt_SUPPORTED
@@ -893,42 +852,42 @@ png_set_text_2(png_structp png_ptr, png_
#endif
{
textp->text_length = text_length;
#ifdef PNG_iTXt_SUPPORTED
textp->itxt_length = 0;
#endif
}
info_ptr->num_text++;
- png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text);
+ png_debug1(3, "transferred text chunk %d", info_ptr->num_text);
}
return(0);
}
#endif
#if defined(PNG_tIME_SUPPORTED)
void PNGAPI
png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
{
- png_debug1(1, "in %s storage function\n", "tIME");
+ png_debug1(1, "in %s storage function", "tIME");
if (png_ptr == NULL || info_ptr == NULL ||
(png_ptr->mode & PNG_WROTE_tIME))
return;
png_memcpy(&(info_ptr->mod_time), mod_time, png_sizeof(png_time));
info_ptr->valid |= PNG_INFO_tIME;
}
#endif
#if defined(PNG_tRNS_SUPPORTED)
void PNGAPI
png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
png_bytep trans, int num_trans, png_color_16p trans_values)
{
- png_debug1(1, "in %s storage function\n", "tRNS");
+ png_debug1(1, "in %s storage function", "tRNS");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (trans != NULL)
{
/*
* It may not actually be necessary to set png_ptr->trans here;
* we do it for backward compatibility with the way the png_handle_tRNS
@@ -1048,17 +1007,17 @@ png_set_sPLT(png_structp png_ptr,
}
#endif /* PNG_sPLT_SUPPORTED */
#if defined(PNG_APNG_SUPPORTED)
png_uint_32 PNGAPI
png_set_acTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 num_frames, png_uint_32 num_plays)
{
- png_debug1(1, "in %s storage function\n", "acTL");
+ png_debug1(1, "in %s storage function", "acTL");
if (png_ptr == NULL || info_ptr == NULL)
{
png_warning(png_ptr,
"Call to png_set_acTL() with NULL png_ptr "
"or info_ptr ignored");
return (0);
}
@@ -1093,17 +1052,17 @@ png_set_acTL(png_structp png_ptr, png_in
/* delay_num and delay_den can hold any 16-bit values including zero */
png_uint_32 PNGAPI
png_set_next_frame_fcTL(png_structp png_ptr, png_infop info_ptr,
png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den,
png_byte dispose_op, png_byte blend_op)
{
- png_debug1(1, "in %s storage function\n", "fcTL");
+ png_debug1(1, "in %s storage function", "fcTL");
if (png_ptr == NULL || info_ptr == NULL)
{
png_warning(png_ptr,
"Call to png_set_fcTL() with NULL png_ptr or info_ptr "
"ignored");
return (0);
}
@@ -1164,17 +1123,17 @@ png_ensure_fcTL_is_valid(png_structp png
"color type 'truecolor without alpha'");
}
}
png_uint_32 PNGAPI
png_set_first_frame_is_hidden(png_structp png_ptr, png_infop info_ptr,
png_byte is_hidden)
{
- png_debug(1, "in png_first_frame_is_hidden()\n");
+ png_debug(1, "in png_first_frame_is_hidden()");
if (png_ptr == NULL)
return 0;
if(is_hidden)
png_ptr->apng_flags |= PNG_FIRST_FRAME_HIDDEN;
else
png_ptr->apng_flags &= ~PNG_FIRST_FRAME_HIDDEN;
@@ -1258,31 +1217,31 @@ png_set_unknown_chunk_location(png_struc
#if defined(PNG_1_0_X) || defined(PNG_1_2_X)
#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
void PNGAPI
png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
{
/* This function is deprecated in favor of png_permit_mng_features()
and will be removed from libpng-1.3.0 */
- png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n");
+ png_debug(1, "in png_permit_empty_plte, DEPRECATED.");
if (png_ptr == NULL)
return;
png_ptr->mng_features_permitted = (png_byte)
((png_ptr->mng_features_permitted & (~PNG_FLAG_MNG_EMPTY_PLTE)) |
((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE)));
}
#endif
#endif
#if defined(PNG_MNG_FEATURES_SUPPORTED)
png_uint_32 PNGAPI
png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
{
- png_debug(1, "in png_permit_mng_features\n");
+ png_debug(1, "in png_permit_mng_features");
if (png_ptr == NULL)
return (png_uint_32)0;
png_ptr->mng_features_permitted =
(png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
return (png_uint_32)png_ptr->mng_features_permitted;
}
#endif
@@ -1333,29 +1292,29 @@ png_set_keep_unknown_chunks(png_structp
}
#endif
#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
void PNGAPI
png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
png_user_chunk_ptr read_user_chunk_fn)
{
- png_debug(1, "in png_set_read_user_chunk_fn\n");
+ png_debug(1, "in png_set_read_user_chunk_fn");
if (png_ptr == NULL)
return;
png_ptr->read_user_chunk_fn = read_user_chunk_fn;
png_ptr->user_chunk_ptr = user_chunk_ptr;
}
#endif
#if defined(PNG_INFO_IMAGE_SUPPORTED)
void PNGAPI
png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
{
- png_debug1(1, "in %s storage function\n", "rows");
+ png_debug1(1, "in %s storage function", "rows");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
info_ptr->row_pointers = row_pointers;
if (row_pointers)
--- a/modules/libimg/png/pngtrans.c
+++ b/modules/libimg/png/pngtrans.c
@@ -12,78 +12,78 @@
#include "png.h"
#if defined(PNG_READ_SUPPORTED) || defined(PNG_WRITE_SUPPORTED)
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* turn on BGR-to-RGB mapping */
void PNGAPI
png_set_bgr(png_structp png_ptr)
{
- png_debug(1, "in png_set_bgr\n");
+ png_debug(1, "in png_set_bgr");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_BGR;
}
#endif
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* turn on 16 bit byte swapping */
void PNGAPI
png_set_swap(png_structp png_ptr)
{
- png_debug(1, "in png_set_swap\n");
+ png_debug(1, "in png_set_swap");
if (png_ptr == NULL) return;
if (png_ptr->bit_depth == 16)
png_ptr->transformations |= PNG_SWAP_BYTES;
}
#endif
#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
/* turn on pixel packing */
void PNGAPI
png_set_packing(png_structp png_ptr)
{
- png_debug(1, "in png_set_packing\n");
+ png_debug(1, "in png_set_packing");
if (png_ptr == NULL) return;
if (png_ptr->bit_depth < 8)
{
png_ptr->transformations |= PNG_PACK;
png_ptr->usr_bit_depth = 8;
}
}
#endif
#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
/* turn on packed pixel swapping */
void PNGAPI
png_set_packswap(png_structp png_ptr)
{
- png_debug(1, "in png_set_packswap\n");
+ png_debug(1, "in png_set_packswap");
if (png_ptr == NULL) return;
if (png_ptr->bit_depth < 8)
png_ptr->transformations |= PNG_PACKSWAP;
}
#endif
#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
void PNGAPI
png_set_shift(png_structp png_ptr, png_color_8p true_bits)
{
- png_debug(1, "in png_set_shift\n");
+ png_debug(1, "in png_set_shift");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_SHIFT;
png_ptr->shift = *true_bits;
}
#endif
#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
defined(PNG_WRITE_INTERLACING_SUPPORTED)
int PNGAPI
png_set_interlace_handling(png_structp png_ptr)
{
- png_debug(1, "in png_set_interlace handling\n");
+ png_debug(1, "in png_set_interlace handling");
if (png_ptr && png_ptr->interlaced)
{
png_ptr->transformations |= PNG_INTERLACE;
return (7);
}
return (1);
}
@@ -93,17 +93,17 @@ png_set_interlace_handling(png_structp p
/* Add a filler byte on read, or remove a filler or alpha byte on write.
* The filler type has changed in v0.95 to allow future 2-byte fillers
* for 48-bit input data, as well as to avoid problems with some compilers
* that don't like bytes as parameters.
*/
void PNGAPI
png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
{
- png_debug(1, "in png_set_filler\n");
+ png_debug(1, "in png_set_filler");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_FILLER;
png_ptr->filler = (png_byte)filler;
if (filler_loc == PNG_FILLER_AFTER)
png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
else
png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
@@ -126,61 +126,61 @@ png_set_filler(png_structp png_ptr, png_
}
}
#if !defined(PNG_1_0_X)
/* Added to libpng-1.2.7 */
void PNGAPI
png_set_add_alpha(png_structp png_ptr, png_uint_32 filler, int filler_loc)
{
- png_debug(1, "in png_set_add_alpha\n");
+ png_debug(1, "in png_set_add_alpha");
if (png_ptr == NULL) return;
png_set_filler(png_ptr, filler, filler_loc);
png_ptr->transformations |= PNG_ADD_ALPHA;
}
#endif
#endif
#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
void PNGAPI
png_set_swap_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_swap_alpha\n");
+ png_debug(1, "in png_set_swap_alpha");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_SWAP_ALPHA;
}
#endif
#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
void PNGAPI
png_set_invert_alpha(png_structp png_ptr)
{
- png_debug(1, "in png_set_invert_alpha\n");
+ png_debug(1, "in png_set_invert_alpha");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_INVERT_ALPHA;
}
#endif
#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
void PNGAPI
png_set_invert_mono(png_structp png_ptr)
{
- png_debug(1, "in png_set_invert_mono\n");
+ png_debug(1, "in png_set_invert_mono");
if (png_ptr == NULL) return;
png_ptr->transformations |= PNG_INVERT_MONO;
}
/* invert monochrome grayscale data */
void /* PRIVATE */
png_do_invert(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_invert\n");
+ png_debug(1, "in png_do_invert");
/* This test removed from libpng version 1.0.13 and 1.2.0:
* if (row_info->bit_depth == 1 &&
*/
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row == NULL || row_info == NULL)
return;
#endif
if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
@@ -225,17 +225,17 @@ png_do_invert(png_row_infop row_info, pn
}
#endif
#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
/* swaps byte order on 16 bit depth images */
void /* PRIVATE */
png_do_swap(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_swap\n");
+ png_debug(1, "in png_do_swap");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->bit_depth == 16)
{
png_bytep rp = row;
png_uint_32 i;
@@ -356,17 +356,17 @@ static PNG_CONST png_byte fourbppswaptab
0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
};
/* swaps pixel packing order within bytes */
void /* PRIVATE */
png_do_packswap(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_packswap\n");
+ png_debug(1, "in png_do_packswap");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->bit_depth < 8)
{
png_bytep rp, end, table;
@@ -388,17 +388,17 @@ png_do_packswap(png_row_infop row_info,
#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
/* remove filler or alpha byte(s) */
void /* PRIVATE */
png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
{
- png_debug(1, "in png_do_strip_filler\n");
+ png_debug(1, "in png_do_strip_filler");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
png_bytep sp=row;
png_bytep dp=row;
png_uint_32 row_width=row_info->width;
png_uint_32 i;
@@ -546,17 +546,17 @@ png_do_strip_filler(png_row_infop row_in
}
#endif
#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
/* swaps red and blue bytes within a pixel */
void /* PRIVATE */
png_do_bgr(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_bgr\n");
+ png_debug(1, "in png_do_bgr");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
png_uint_32 row_width = row_info->width;
if (row_info->bit_depth == 8)
@@ -625,17 +625,17 @@ png_do_bgr(png_row_infop row_info, png_b
#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
defined(PNG_LEGACY_SUPPORTED)
void PNGAPI
png_set_user_transform_info(png_structp png_ptr, png_voidp
user_transform_ptr, int user_transform_depth, int user_transform_channels)
{
- png_debug(1, "in png_set_user_transform_info\n");
+ png_debug(1, "in png_set_user_transform_info");
if (png_ptr == NULL) return;
#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
png_ptr->user_transform_ptr = user_transform_ptr;
png_ptr->user_transform_depth = (png_byte)user_transform_depth;
png_ptr->user_transform_channels = (png_byte)user_transform_channels;
#else
if (user_transform_ptr || user_transform_depth || user_transform_channels)
png_warning(png_ptr,
--- a/modules/libimg/png/pngwrite.c
+++ b/modules/libimg/png/pngwrite.c
@@ -1,12 +1,12 @@
/* pngwrite.c - general routines to write a PNG file
*
- * Last changed in libpng 1.2.31 [August 21, 2008]
+ * Last changed in libpng 1.2.31 [August 19, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
/* get internal access to png.h */
#define PNG_INTERNAL
@@ -20,17 +20,17 @@
* you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing
* the chunk, as that will keep the code from breaking if you want to just
* write a plain PNG file. If you have long comments, I suggest writing
* them in png_write_end(), and compressing them.
*/
void PNGAPI
png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_write_info_before_PLTE\n");
+ png_debug(1, "in png_write_info_before_PLTE");
if (png_ptr == NULL || info_ptr == NULL)
return;
if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
{
png_write_sig(png_ptr); /* write PNG signature */
#if defined(PNG_MNG_FEATURES_SUPPORTED)
if ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))
{
@@ -94,17 +94,17 @@ png_write_info_before_PLTE(png_structp p
#endif
}
#endif
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
{
png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
for (up = info_ptr->unknown_chunks;
up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
up++)
{
int keep=png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
up->location && !(up->location & PNG_HAVE_PLTE) &&
@@ -125,17 +125,17 @@ png_write_info_before_PLTE(png_structp p
void PNGAPI
png_write_info(png_structp png_ptr, png_infop info_ptr)
{
#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
int i;
#endif
- png_debug(1, "in png_write_info\n");
+ png_debug(1, "in png_write_info");
if (png_ptr == NULL || info_ptr == NULL)
return;
png_write_info_before_PLTE(png_ptr, info_ptr);
if (info_ptr->valid & PNG_INFO_PLTE)
png_write_PLTE(png_ptr, info_ptr->palette,
@@ -210,17 +210,17 @@ png_write_info(png_structp png_ptr, png_
if (info_ptr->valid & PNG_INFO_sPLT)
for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
#endif
#if defined(PNG_WRITE_TEXT_SUPPORTED)
/* Check to see if we need to write text chunks */
for (i = 0; i < info_ptr->num_text; i++)
{
- png_debug2(2, "Writing header text chunk %d, type %d\n", i,
+ png_debug2(2, "Writing header text chunk %d, type %d", i,
info_ptr->text[i].compression);
/* an internationalized chunk? */
if (info_ptr->text[i].compression > 0)
{
#if defined(PNG_WRITE_iTXt_SUPPORTED)
/* write international chunk */
png_write_iTXt(png_ptr,
info_ptr->text[i].compression,
@@ -267,17 +267,17 @@ png_write_info(png_structp png_ptr, png_
if (info_ptr->valid & PNG_INFO_acTL)
png_write_acTL(png_ptr, info_ptr->num_frames, info_ptr->num_plays);
#endif
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
{
png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
for (up = info_ptr->unknown_chunks;
up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
up++)
{
int keep=png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
up->location && (up->location & PNG_HAVE_PLTE) &&
@@ -295,17 +295,17 @@ png_write_info(png_structp png_ptr, png_
/* Writes the end of the PNG file. If you don't want to write comments or
* time information, you can pass NULL for info. If you already wrote these
* in png_write_info(), do not write them again here. If you have long
* comments, I suggest writing them here, and compressing them.
*/
void PNGAPI
png_write_end(png_structp png_ptr, png_infop info_ptr)
{
- png_debug(1, "in png_write_end\n");
+ png_debug(1, "in png_write_end");
if (png_ptr == NULL)
return;
if (!(png_ptr->mode & PNG_HAVE_IDAT))
png_error(png_ptr, "No IDATs written into file");
#if defined(PNG_WRITE_APNG_SUPPORTED)
if (png_ptr->num_frames_written != png_ptr->num_frames_to_write)
png_error(png_ptr, "Not enough frames written");
#endif
@@ -321,17 +321,17 @@ png_write_end(png_structp png_ptr, png_i
if ((info_ptr->valid & PNG_INFO_tIME) &&
!(png_ptr->mode & PNG_WROTE_tIME))
png_write_tIME(png_ptr, &(info_ptr->mod_time));
#endif
#if defined(PNG_WRITE_TEXT_SUPPORTED)
/* loop through comment chunks */
for (i = 0; i < info_ptr->num_text; i++)
{
- png_debug2(2, "Writing trailer text chunk %d, type %d\n", i,
+ png_debug2(2, "Writing trailer text chunk %d, type %d", i,
info_ptr->text[i].compression);
/* an internationalized chunk? */
if (info_ptr->text[i].compression > 0)
{
#if defined(PNG_WRITE_iTXt_SUPPORTED)
/* write international chunk */
png_write_iTXt(png_ptr,
info_ptr->text[i].compression,
@@ -373,17 +373,17 @@ png_write_end(png_structp png_ptr, png_i
}
}
#endif
#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
if (info_ptr->unknown_chunks_num)
{
png_unknown_chunk *up;
- png_debug(5, "writing extra chunks\n");
+ png_debug(5, "writing extra chunks");
for (up = info_ptr->unknown_chunks;
up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
up++)
{
int keep=png_handle_as_unknown(png_ptr, up->name);
if (keep != PNG_HANDLE_CHUNK_NEVER &&
up->location && (up->location & PNG_AFTER_IDAT) &&
@@ -416,31 +416,31 @@ png_write_end(png_structp png_ptr, png_i
}
#if defined(PNG_WRITE_tIME_SUPPORTED)
#if !defined(_WIN32_WCE)
/* "time.h" functions are not supported on WindowsCE */
void PNGAPI
png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime)
{
- png_debug(1, "in png_convert_from_struct_tm\n");
+ png_debug(1, "in png_convert_from_struct_tm");
ptime->year = (png_uint_16)(1900 + ttime->tm_year);
ptime->month = (png_byte)(ttime->tm_mon + 1);
ptime->day = (png_byte)ttime->tm_mday;
ptime->hour = (png_byte)ttime->tm_hour;
ptime->minute = (png_byte)ttime->tm_min;
ptime->second = (png_byte)ttime->tm_sec;
}
void PNGAPI
png_convert_from_time_t(png_timep ptime, time_t ttime)
{
struct tm *tbuf;
- png_debug(1, "in png_convert_from_time_t\n");
+ png_debug(1, "in png_convert_from_time_t");
tbuf = gmtime(&ttime);
png_convert_from_struct_tm(ptime, tbuf);
}
#endif
#endif
/* Initialize png_ptr structure, and allocate any memory needed */
png_structp PNGAPI
@@ -464,17 +464,17 @@ png_create_write_struct_2(png_const_char
#endif
png_structp png_ptr;
#ifdef PNG_SETJMP_SUPPORTED
#ifdef USE_FAR_KEYWORD
jmp_buf jmpbuf;
#endif
#endif
int i;
- png_debug(1, "in png_create_write_struct\n");
+ png_debug(1, "in png_create_write_struct");
#ifdef PNG_USER_MEM_SUPPORTED
png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
(png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr);
#else
png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
#endif /* PNG_USER_MEM_SUPPORTED */
if (png_ptr == NULL)
return (NULL);
@@ -662,17 +662,17 @@ png_write_init_3(png_structpp ptr_ptr, p
png_ptr->warning_fn=NULL;
png_warning(png_ptr,
"Application uses deprecated png_write_init() and should be recompiled.");
break;
#endif
}
} while (png_libpng_ver[i++]);
- png_debug(1, "in png_write_init_3\n");
+ png_debug(1, "in png_write_init_3");
#ifdef PNG_SETJMP_SUPPORTED
/* save jump buffer and error functions */
png_memcpy(tmp_jmp, png_ptr->jmpbuf, png_sizeof(jmp_buf));
#endif
if (png_sizeof(png_struct) > png_struct_size)
{
@@ -716,17 +716,17 @@ png_write_init_3(png_structpp ptr_ptr, p
*/
void PNGAPI
png_write_rows(png_structp png_ptr, png_bytepp row,
png_uint_32 num_rows)
{
png_uint_32 i; /* row counter */
png_bytepp rp; /* row pointer */
- png_debug(1, "in png_write_rows\n");
+ png_debug(1, "in png_write_rows");
if (png_ptr == NULL)
return;
/* loop through the rows */
for (i = 0, rp = row; i < num_rows; i++, rp++)
{
png_write_row(png_ptr, *rp);
@@ -741,17 +741,17 @@ png_write_image(png_structp png_ptr, png
{
png_uint_32 i; /* row index */
int pass, num_pass; /* pass variables */
png_bytepp rp; /* points to current row */
if (png_ptr == NULL)
return;
- png_debug(1, "in png_write_image\n");
+ png_debug(1, "in png_write_image");
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* intialize interlace handling. If image is not interlaced,
this will set pass to 1 */
num_pass = png_set_interlace_handling(png_ptr);
#else
num_pass = 1;
#endif
/* loop through passes */
@@ -766,17 +766,17 @@ png_write_image(png_structp png_ptr, png
}
/* called by user to write a row of image data */
void PNGAPI
png_write_row(png_structp png_ptr, png_bytep row)
{
if (png_ptr == NULL)
return;
- png_debug2(1, "in png_write_row (row %ld, pass %d)\n",
+ png_debug2(1, "in png_write_row (row %ld, pass %d)",
png_ptr->row_number, png_ptr->pass);
/* initialize transformations and other stuff if first time */
if (png_ptr->row_number == 0 && png_ptr->pass == 0)
{
/* make sure we wrote the header info */
if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
png_error(png_ptr,
@@ -880,22 +880,22 @@ png_write_row(png_structp png_ptr, png_b
png_ptr->row_info.channels = png_ptr->usr_channels;
png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth;
png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
png_ptr->row_info.channels);
png_ptr->row_info.rowbytes = PNG_ROWBYTES(png_ptr->row_info.pixel_depth,
png_ptr->row_info.width);
- png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type);
- png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width);
- png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels);
- png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth);
- png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth);
- png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes);
+ png_debug1(3, "row_info->color_type = %d", png_ptr->row_info.color_type);
+ png_debug1(3, "row_info->width = %lu", png_ptr->row_info.width);
+ png_debug1(3, "row_info->channels = %d", png_ptr->row_info.channels);
+ png_debug1(3, "row_info->bit_depth = %d", png_ptr->row_info.bit_depth);
+ png_debug1(3, "row_info->pixel_depth = %d", png_ptr->row_info.pixel_depth);
+ png_debug1(3, "row_info->rowbytes = %lu", png_ptr->row_info.rowbytes);
/* Copy user's row into buffer, leaving room for filter byte. */
png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row,
png_ptr->row_info.rowbytes);
#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
/* handle interlacing */
if (png_ptr->interlaced && png_ptr->pass < 6 &&
@@ -941,29 +941,29 @@ png_write_row(png_structp png_ptr, png_b
(*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
}
#if defined(PNG_WRITE_FLUSH_SUPPORTED)
/* Set the automatic flush interval or 0 to turn flushing off */
void PNGAPI
png_set_flush(png_structp png_ptr, int nrows)
{
- png_debug(1, "in png_set_flush\n");
+ png_debug(1, "in png_set_flush");
if (png_ptr == NULL)
return;
png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
}
/* flush the current output buffers now */
void PNGAPI
png_write_flush(png_structp png_ptr)
{
int wrote_IDAT;
- png_debug(1, "in png_write_flush\n");
+ png_debug(1, "in png_write_flush");
if (png_ptr == NULL)
return;
/* We have already written out all of the data */
if (png_ptr->row_number >= png_ptr->num_rows)
return;
do
{
@@ -1013,17 +1013,17 @@ png_destroy_write_struct(png_structpp pn
{
png_structp png_ptr = NULL;
png_infop info_ptr = NULL;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn = NULL;
png_voidp mem_ptr = NULL;
#endif
- png_debug(1, "in png_destroy_write_struct\n");
+ png_debug(1, "in png_destroy_write_struct");
if (png_ptr_ptr != NULL)
{
png_ptr = *png_ptr_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
free_fn = png_ptr->free_fn;
mem_ptr = png_ptr->mem_ptr;
#endif
}
@@ -1087,17 +1087,17 @@ png_write_destroy(png_structp png_ptr)
#endif
png_error_ptr error_fn;
png_error_ptr warning_fn;
png_voidp error_ptr;
#ifdef PNG_USER_MEM_SUPPORTED
png_free_ptr free_fn;
#endif
- png_debug(1, "in png_write_destroy\n");
+ png_debug(1, "in png_write_destroy");
/* free any memory zlib uses */
deflateEnd(&png_ptr->zstream);
/* free our memory. png_free checks NULL for us. */
png_free(png_ptr, png_ptr->zbuf);
png_free(png_ptr, png_ptr->row_buf);
#ifndef PNG_NO_WRITE_FILTER
png_free(png_ptr, png_ptr->prev_row);
@@ -1144,17 +1144,17 @@ png_write_destroy(png_structp png_ptr)
png_memcpy(png_ptr->jmpbuf, tmp_jmp, png_sizeof(jmp_buf));
#endif
}
/* Allow the application to select one or more row filters to use. */
void PNGAPI
png_set_filter(png_structp png_ptr, int method, int filters)
{
- png_debug(1, "in png_set_filter\n");
+ png_debug(1, "in png_set_filter");
if (png_ptr == NULL)
return;
#if defined(PNG_MNG_FEATURES_SUPPORTED)
if ((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
(method == PNG_INTRAPIXEL_DIFFERENCING))
method = PNG_FILTER_TYPE_BASE;
#endif
if (method == PNG_FILTER_TYPE_BASE)
@@ -1267,17 +1267,17 @@ png_set_filter(png_structp png_ptr, int
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */
void PNGAPI
png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
int num_weights, png_doublep filter_weights,
png_doublep filter_costs)
{
int i;
- png_debug(1, "in png_set_filter_heuristics\n");
+ png_debug(1, "in png_set_filter_heuristics");
if (png_ptr == NULL)
return;
if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST)
{
png_warning(png_ptr, "Unknown filter heuristic method");
return;
}
@@ -1381,37 +1381,37 @@ png_set_filter_heuristics(png_structp pn
}
}
}
#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
void PNGAPI
png_set_compression_level(png_structp png_ptr, int level)
{
- png_debug(1, "in png_set_compression_level\n");
+ png_debug(1, "in png_set_compression_level");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL;
png_ptr->zlib_level = level;
}
void PNGAPI
png_set_compression_mem_level(png_structp png_ptr, int mem_level)
{
- png_debug(1, "in png_set_compression_mem_level\n");
+ png_debug(1, "in png_set_compression_mem_level");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL;
png_ptr->zlib_mem_level = mem_level;
}
void PNGAPI
png_set_compression_strategy(png_structp png_ptr, int strategy)
{
- png_debug(1, "in png_set_compression_strategy\n");
+ png_debug(1, "in png_set_compression_strategy");
if (png_ptr == NULL)
return;
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;
png_ptr->zlib_strategy = strategy;
}
void PNGAPI
png_set_compression_window_bits(png_structp png_ptr, int window_bits)
@@ -1432,17 +1432,17 @@ png_set_compression_window_bits(png_stru
#endif
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS;
png_ptr->zlib_window_bits = window_bits;
}
void PNGAPI
png_set_compression_method(png_structp png_ptr, int method)
{
- png_debug(1, "in png_set_compression_method\n");
+ png_debug(1, "in png_set_compression_method");
if (png_ptr == NULL)
return;
if (method != 8)
png_warning(png_ptr, "Only compression method 8 is supported by PNG");
png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD;
png_ptr->zlib_method = method;
}
@@ -1454,17 +1454,17 @@ png_set_write_status_fn(png_structp png_
png_ptr->write_row_fn = write_row_fn;
}
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
void PNGAPI
png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
write_user_transform_fn)
{
- png_debug(1, "in png_set_write_user_transform_fn\n");
+ png_debug(1, "in png_set_write_user_transform_fn");
if (png_ptr == NULL)
return;
png_ptr->transformations |= PNG_USER_TRANSFORM;
png_ptr->write_user_transform_fn = write_user_transform_fn;
}
#endif
@@ -1509,21 +1509,21 @@ png_write_png(png_structp png_ptr, png_i
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
/* swap location of alpha bytes from ARGB to RGBA */
if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
png_set_swap_alpha(png_ptr);
#endif
#if defined(PNG_WRITE_FILLER_SUPPORTED)
- /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into
- * RGB (4 channels -> 3 channels). The second parameter is not used.
- */
- if (transforms & PNG_TRANSFORM_STRIP_FILLER)
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
+ /* Pack XRGB/RGBX/ARGB/RGBA into * RGB (4 channels -> 3 channels) */
+ if (transforms & PNG_TRANSFORM_STRIP_FILLER_AFTER)
+ png_set_filler(png_ptr, 0, PNG_FILLER_AFTER);
+ else if (transforms & PNG_TRANSFORM_STRIP_FILLER_BEFORE)
+ png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
#endif
#if defined(PNG_WRITE_BGR_SUPPORTED)
/* flip BGR pixels to RGB */
if (transforms & PNG_TRANSFORM_BGR)
png_set_bgr(png_ptr);
#endif
@@ -1556,17 +1556,17 @@ png_write_png(png_structp png_ptr, png_i
#if defined(PNG_WRITE_APNG_SUPPORTED)
void PNGAPI
png_write_frame_head(png_structp png_ptr, png_infop info_ptr,
png_bytepp row_pointers, png_uint_32 width, png_uint_32 height,
png_uint_32 x_offset, png_uint_32 y_offset,
png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
png_byte blend_op)
{
- png_debug(1, "in png_write_frame_head\n");
+ png_debug(1, "in png_write_frame_head");
/* there is a chance this has been set after png_write_info was called,
* so it would be set but not written. is there a way to be sure? */
if (!(info_ptr->valid & PNG_INFO_acTL))
png_error(png_ptr, "png_write_frame_head(): acTL not set");
png_write_reset(png_ptr);
@@ -1576,15 +1576,15 @@ png_write_frame_head(png_structp png_ptr
(png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN) ) )
png_write_fcTL(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, dispose_op, blend_op);
}
void PNGAPI
png_write_frame_tail(png_structp png_ptr, png_infop png_info)
{
- png_debug(1, "in png_write_frame_tail\n");
+ png_debug(1, "in png_write_frame_tail");
png_ptr->num_frames_written++;
}
#endif /* PNG_WRITE_APNG_SUPPORTED */
#endif /* PNG_WRITE_SUPPORTED */
--- a/modules/libimg/png/pngwtran.c
+++ b/modules/libimg/png/pngwtran.c
@@ -13,17 +13,17 @@
#ifdef PNG_WRITE_SUPPORTED
/* Transform the data according to the user's wishes. The order of
* transformations is significant.
*/
void /* PRIVATE */
png_do_write_transformations(png_structp png_ptr)
{
- png_debug(1, "in png_do_write_transformations\n");
+ png_debug(1, "in png_do_write_transformations");
if (png_ptr == NULL)
return;
#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
if (png_ptr->transformations & PNG_USER_TRANSFORM)
if (png_ptr->write_user_transform_fn != NULL)
(*(png_ptr->write_user_transform_fn)) /* user write transform function */
@@ -81,17 +81,17 @@ png_do_write_transformations(png_structp
#if defined(PNG_WRITE_PACK_SUPPORTED)
/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
* row_info bit depth should be 8 (one pixel per byte). The channels
* should be 1 (this only happens on grayscale and paletted images).
*/
void /* PRIVATE */
png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
{
- png_debug(1, "in png_do_pack\n");
+ png_debug(1, "in png_do_pack");
if (row_info->bit_depth == 8 &&
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
row_info->channels == 1)
{
switch ((int)bit_depth)
{
@@ -207,17 +207,17 @@ png_do_pack(png_row_infop row_info, png_
* according to row_info->bit_depth. Thus, if you had a row of
* bit depth 4, but the pixels only had values from 0 to 7, you
* would pass 3 as bit_depth, and this routine would translate the
* data to 0 to 15.
*/
void /* PRIVATE */
png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
{
- png_debug(1, "in png_do_shift\n");
+ png_debug(1, "in png_do_shift");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL &&
#else
if (
#endif
row_info->color_type != PNG_COLOR_TYPE_PALETTE)
{
int shift_start[4], shift_dec[4];
@@ -331,17 +331,17 @@ png_do_shift(png_row_infop row_info, png
}
}
#endif
#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
void /* PRIVATE */
png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_swap_alpha\n");
+ png_debug(1, "in png_do_write_swap_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{
/* This converts from ARGB to RGBA */
if (row_info->bit_depth == 8)
@@ -419,17 +419,17 @@ png_do_write_swap_alpha(png_row_infop ro
}
}
#endif
#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
void /* PRIVATE */
png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_invert_alpha\n");
+ png_debug(1, "in png_do_write_invert_alpha");
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL)
#endif
{
if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
{
/* This inverts the alpha channel in RGBA */
if (row_info->bit_depth == 8)
@@ -509,17 +509,17 @@ png_do_write_invert_alpha(png_row_infop
}
#endif
#if defined(PNG_MNG_FEATURES_SUPPORTED)
/* undoes intrapixel differencing */
void /* PRIVATE */
png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
{
- png_debug(1, "in png_do_write_intrapixel\n");
+ png_debug(1, "in png_do_write_intrapixel");
if (
#if defined(PNG_USELESS_TESTS_SUPPORTED)
row != NULL && row_info != NULL &&
#endif
(row_info->color_type & PNG_COLOR_MASK_COLOR))
{
int bytes_per_pixel;
png_uint_32 row_width = row_info->width;
--- a/modules/libimg/png/pngwutil.c
+++ b/modules/libimg/png/pngwutil.c
@@ -1,12 +1,12 @@
/* pngwutil.c - utilities to write a PNG file
*
- * Last changed in libpng 1.2.30 [August 13, 2008]
+ * Last changed in libpng 1.2.34 [December 18, 2008]
* For conditions of distribution and use, see copyright notice in png.h
* Copyright (c) 1998-2008 Glenn Randers-Pehrson
* (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
* (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
*/
#define PNG_INTERNAL
#include "png.h"
@@ -91,17 +91,17 @@ png_write_chunk(png_structp png_ptr, png
* passing in png_write_chunk_data().
*/
void PNGAPI
png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,
png_uint_32 length)
{
png_byte buf[8];
- png_debug2(0, "Writing %s chunk, length = %lu\n", chunk_name,
+ png_debug2(0, "Writing %s chunk, length = %lu", chunk_name,
(unsigned long)length);
if (png_ptr == NULL) return;
/* write the length and the chunk name */
png_save_uint_32(buf, length);
png_memcpy(buf + 4, chunk_name, 4);
png_write_data(png_ptr, buf, (png_size_t)8);
/* put the chunk name into png_ptr->chunk_name */
@@ -387,17 +387,17 @@ png_write_IHDR(png_structp png_ptr, png_
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IHDR;
#endif
int ret;
png_byte buf[13]; /* buffer to store the IHDR info */
- png_debug(1, "in png_write_IHDR\n");
+ png_debug(1, "in png_write_IHDR");
/* Check that we have valid input data from the application info */
switch (color_type)
{
case PNG_COLOR_TYPE_GRAY:
switch (bit_depth)
{
case 1:
case 2:
@@ -569,17 +569,17 @@ png_write_PLTE(png_structp png_ptr, png_
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_PLTE;
#endif
png_uint_32 i;
png_colorp pal_ptr;
png_byte buf[3];
- png_debug(1, "in png_write_PLTE\n");
+ png_debug(1, "in png_write_PLTE");
if ((
#if defined(PNG_MNG_FEATURES_SUPPORTED)
!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
#endif
num_pal == 0) || num_pal > 256)
{
if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
{
@@ -595,17 +595,17 @@ png_write_PLTE(png_structp png_ptr, png_
if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR))
{
png_warning(png_ptr,
"Ignoring request to write a PLTE chunk in grayscale PNG");
return;
}
png_ptr->num_palette = (png_uint_16)num_pal;
- png_debug1(3, "num_palette = %d\n", png_ptr->num_palette);
+ png_debug1(3, "num_palette = %d", png_ptr->num_palette);
png_write_chunk_start(png_ptr, (png_bytep)png_PLTE,
(png_uint_32)(num_pal * 3));
#ifndef PNG_NO_POINTER_INDEXING
for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)
{
buf[0] = pal_ptr->red;
buf[1] = pal_ptr->green;
@@ -632,17 +632,17 @@ void /* PRIVATE */
png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IDAT;
#if defined(PNG_WRITE_APNG_SUPPORTED)
PNG_fdAT;
#endif
#endif
- png_debug(1, "in png_write_IDAT\n");
+ png_debug(1, "in png_write_IDAT");
/* Optimize the CMF field in the zlib stream. */
/* This hack of the zlib stream is compliant to the stream specification. */
if (!(png_ptr->mode & PNG_HAVE_IDAT) &&
png_ptr->compression_type == PNG_COMPRESSION_TYPE_BASE)
{
unsigned int z_cmf = data[0]; /* zlib compression method and flags */
if ((z_cmf & 0x0f) == 8 && (z_cmf & 0xf0) <= 0x70)
@@ -705,17 +705,17 @@ png_write_IDAT(png_structp png_ptr, png_
/* write an IEND chunk */
void /* PRIVATE */
png_write_IEND(png_structp png_ptr)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_IEND;
#endif
- png_debug(1, "in png_write_IEND\n");
+ png_debug(1, "in png_write_IEND");
png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL,
(png_size_t)0);
png_ptr->mode |= PNG_HAVE_IEND;
}
#if defined(PNG_WRITE_gAMA_SUPPORTED)
/* write a gAMA chunk */
#ifdef PNG_FLOATING_POINT_SUPPORTED
@@ -723,33 +723,33 @@ void /* PRIVATE */
png_write_gAMA(png_structp png_ptr, double file_gamma)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_gAMA;
#endif
png_uint_32 igamma;
png_byte buf[4];
- png_debug(1, "in png_write_gAMA\n");
+ png_debug(1, "in png_write_gAMA");
/* file_gamma is saved in 1/100,000ths */
igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5);
png_save_uint_32(buf, igamma);
png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
}
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
void /* PRIVATE */
png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_gAMA;
#endif
png_byte buf[4];
- png_debug(1, "in png_write_gAMA\n");
+ png_debug(1, "in png_write_gAMA");
/* file_gamma is saved in 1/100,000ths */
png_save_uint_32(buf, (png_uint_32)file_gamma);
png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
}
#endif
#endif
#if defined(PNG_WRITE_sRGB_SUPPORTED)
@@ -757,17 +757,17 @@ png_write_gAMA_fixed(png_structp png_ptr
void /* PRIVATE */
png_write_sRGB(png_structp png_ptr, int srgb_intent)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_sRGB;
#endif
png_byte buf[1];
- png_debug(1, "in png_write_sRGB\n");
+ png_debug(1, "in png_write_sRGB");
if (srgb_intent >= PNG_sRGB_INTENT_LAST)
png_warning(png_ptr,
"Invalid sRGB rendering intent specified");
buf[0]=(png_byte)srgb_intent;
png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1);
}
#endif
@@ -780,30 +780,27 @@ png_write_iCCP(png_structp png_ptr, png_
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_iCCP;
#endif
png_size_t name_len;
png_charp new_name;
compression_state comp;
int embedded_profile_len = 0;
- png_debug(1, "in png_write_iCCP\n");
+ png_debug(1, "in png_write_iCCP");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
comp.output_ptr = NULL;
comp.input = NULL;
comp.input_len = 0;
- if (name == NULL || (name_len = png_check_keyword(png_ptr, name,
+ if ((name_len = png_check_keyword(png_ptr, name,
&new_name)) == 0)
- {
- png_warning(png_ptr, "Empty keyword in iCCP chunk");
return;
- }
if (compression_type != PNG_COMPRESSION_TYPE_BASE)
png_warning(png_ptr, "Unknown compression type in iCCP chunk");
if (profile == NULL)
profile_len = 0;
if (profile_len > 3)
@@ -859,23 +856,20 @@ png_write_sPLT(png_structp png_ptr, png_
png_byte entrybuf[10];
int entry_size = (spalette->depth == 8 ? 6 : 10);
int palette_size = entry_size * spalette->nentries;
png_sPLT_entryp ep;
#ifdef PNG_NO_POINTER_INDEXING
int i;
#endif
- png_debug(1, "in png_write_sPLT\n");
- if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr,
+ png_debug(1, "in png_write_sPLT");
+ if ((name_len = png_check_keyword(png_ptr,
spalette->name, &new_name))==0)
- {
- png_warning(png_ptr, "Empty keyword in sPLT chunk");
- return;
- }
+ return;
/* make sure we include the NULL after the name */
png_write_chunk_start(png_ptr, (png_bytep)png_sPLT,
(png_uint_32)(name_len + 2 + palette_size));
png_write_chunk_data(png_ptr, (png_bytep)new_name,
(png_size_t)(name_len + 1));
png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, (png_size_t)1);
@@ -936,17 +930,17 @@ void /* PRIVATE */
png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_sBIT;
#endif
png_byte buf[4];
png_size_t size;
- png_debug(1, "in png_write_sBIT\n");
+ png_debug(1, "in png_write_sBIT");
/* make sure we don't depend upon the order of PNG_COLOR_8 */
if (color_type & PNG_COLOR_MASK_COLOR)
{
png_byte maxbits;
maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 :
png_ptr->usr_bit_depth);
if (sbit->red == 0 || sbit->red > maxbits ||
@@ -993,134 +987,103 @@ void /* PRIVATE */
png_write_cHRM(png_structp png_ptr, double white_x, double white_y,
double red_x, double red_y, double green_x, double green_y,
double blue_x, double blue_y)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_cHRM;
#endif
png_byte buf[32];
- png_uint_32 itemp;
+
+ png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y,
+ int_green_x, int_green_y, int_blue_x, int_blue_y;
+
+ png_debug(1, "in png_write_cHRM");
- png_debug(1, "in png_write_cHRM\n");
- /* each value is saved in 1/100,000ths */
- if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 ||
- white_x + white_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr, "white_x=%f, white_y=%f\n", white_x, white_y);
+ int_white_x = (png_uint_32)(white_x * 100000.0 + 0.5);
+ int_white_y = (png_uint_32)(white_y * 100000.0 + 0.5);
+ int_red_x = (png_uint_32)(red_x * 100000.0 + 0.5);
+ int_red_y = (png_uint_32)(red_y * 100000.0 + 0.5);
+ int_green_x = (png_uint_32)(green_x * 100000.0 + 0.5);
+ int_green_y = (png_uint_32)(green_y * 100000.0 + 0.5);
+ int_blue_x = (png_uint_32)(blue_x * 100000.0 + 0.5);
+ int_blue_y = (png_uint_32)(blue_y * 100000.0 + 0.5);
+
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr, int_white_x, int_white_y,
+ int_red_x, int_red_y, int_green_x, int_green_y, int_blue_x, int_blue_y))
#endif
- return;
- }
- itemp = (png_uint_32)(white_x * 100000.0 + 0.5);
- png_save_uint_32(buf, itemp);
- itemp = (png_uint_32)(white_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 4, itemp);
+ {
+ /* each value is saved in 1/100,000ths */
+
+ png_save_uint_32(buf, int_white_x);
+ png_save_uint_32(buf + 4, int_white_y);
- if (red_x < 0 || red_y < 0 || red_x + red_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM red point specified");
- return;
+ png_save_uint_32(buf + 8, int_red_x);
+ png_save_uint_32(buf + 12, int_red_y);
+
+ png_save_uint_32(buf + 16, int_green_x);
+ png_save_uint_32(buf + 20, int_green_y);
+
+ png_save_uint_32(buf + 24, int_blue_x);
+ png_save_uint_32(buf + 28, int_blue_y);
+
+ png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
}
- itemp = (png_uint_32)(red_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 8, itemp);
- itemp = (png_uint_32)(red_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 12, itemp);
-
- if (green_x < 0 || green_y < 0 || green_x + green_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM green point specified");
- return;
- }
- itemp = (png_uint_32)(green_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 16, itemp);
- itemp = (png_uint_32)(green_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 20, itemp);
-
- if (blue_x < 0 || blue_y < 0 || blue_x + blue_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM blue point specified");
- return;
- }
- itemp = (png_uint_32)(blue_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 24, itemp);
- itemp = (png_uint_32)(blue_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 28, itemp);
-
- png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
}
#endif
#ifdef PNG_FIXED_POINT_SUPPORTED
void /* PRIVATE */
png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y,
png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x,
png_fixed_point blue_y)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_cHRM;
#endif
png_byte buf[32];
- png_debug(1, "in png_write_cHRM\n");
+ png_debug(1, "in png_write_cHRM");
/* each value is saved in 1/100,000ths */
- if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L)
+#if !defined(PNG_NO_CHECK_cHRM)
+ if (png_check_cHRM_fixed(png_ptr, white_x, white_y, red_x, red_y,
+ green_x, green_y, blue_x, blue_y))
+#endif
{
- png_warning(png_ptr, "Invalid fixed cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr, "white_x=%ld, white_y=%ld\n", (unsigned long)white_x,
- (unsigned long)white_y);
-#endif
- return;
- }
png_save_uint_32(buf, (png_uint_32)white_x);
png_save_uint_32(buf + 4, (png_uint_32)white_y);
- if (red_x + red_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM fixed red point specified");
- return;
- }
png_save_uint_32(buf + 8, (png_uint_32)red_x);
png_save_uint_32(buf + 12, (png_uint_32)red_y);
- if (green_x + green_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM green point specified");
- return;
- }
png_save_uint_32(buf + 16, (png_uint_32)green_x);
png_save_uint_32(buf + 20, (png_uint_32)green_y);
- if (blue_x + blue_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM blue point specified");
- return;
- }
png_save_uint_32(buf + 24, (png_uint_32)blue_x);
png_save_uint_32(buf + 28, (png_uint_32)blue_y);
png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
+ }
}
#endif
#endif
#if defined(PNG_WRITE_tRNS_SUPPORTED)
/* write the tRNS chunk */
void /* PRIVATE */
png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,
int num_trans, int color_type)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_tRNS;
#endif
png_byte buf[6];
- png_debug(1, "in png_write_tRNS\n");
+ png_debug(1, "in png_write_tRNS");
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)
{
png_warning(png_ptr, "Invalid number of transparent colors specified");
return;
}
/* write the chunk out as it is */
@@ -1165,25 +1128,25 @@ png_write_tRNS(png_structp png_ptr, png_
void /* PRIVATE */
png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_bKGD;
#endif
png_byte buf[6];
- png_debug(1, "in png_write_bKGD\n");
+ png_debug(1, "in png_write_bKGD");
if (color_type == PNG_COLOR_TYPE_PALETTE)
{
if (
#if defined(PNG_MNG_FEATURES_SUPPORTED)
(png_ptr->num_palette ||
(!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) &&
#endif
- back->index > png_ptr->num_palette)
+ back->index >= png_ptr->num_palette)
{
png_warning(png_ptr, "Invalid background palette index");
return;
}
buf[0] = back->index;
png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1);
}
else if (color_type & PNG_COLOR_MASK_COLOR)
@@ -1219,20 +1182,20 @@ void /* PRIVATE */
png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_hIST;
#endif
int i;
png_byte buf[3];
- png_debug(1, "in png_write_hIST\n");
+ png_debug(1, "in png_write_hIST");
if (num_hist > (int)png_ptr->num_palette)
{
- png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist,
+ png_debug2(3, "num_hist = %d, num_palette = %d", num_hist,
png_ptr->num_palette);
png_warning(png_ptr, "Invalid number of histogram entries specified");
return;
}
png_write_chunk_start(png_ptr, (png_bytep)png_hIST,
(png_uint_32)(num_hist * 2));
for (i = 0; i < num_hist; i++)
@@ -1259,26 +1222,26 @@ png_write_hIST(png_structp png_ptr, png_
png_size_t /* PRIVATE */
png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
{
png_size_t key_len;
png_charp kp, dp;
int kflag;
int kwarn=0;
- png_debug(1, "in png_check_keyword\n");
+ png_debug(1, "in png_check_keyword");
*new_key = NULL;
if (key == NULL || (key_len = png_strlen(key)) == 0)
{
png_warning(png_ptr, "zero length keyword");
return ((png_size_t)0);
}
- png_debug1(2, "Keyword to be checked is '%s'\n", key);
+ png_debug1(2, "Keyword to be checked is '%s'", key);
*new_key = (png_charp)png_malloc_warn(png_ptr, (png_uint_32)(key_len + 2));
if (*new_key == NULL)
{
png_warning(png_ptr, "Out of memory while procesing keyword");
return ((png_size_t)0);
}
@@ -1327,17 +1290,17 @@ png_check_keyword(png_structp png_ptr, p
while (*kp == ' ')
{
kp++;
key_len--;
}
}
- png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp);
+ png_debug1(2, "Checking for multiple internal spaces in '%s'", kp);
/* Remove multiple internal spaces. */
for (kflag = 0, dp = *new_key; *kp != '\0'; kp++)
{
if (*kp == ' ' && kflag == 0)
{
*(dp++) = *kp;
kflag = 1;
@@ -1362,17 +1325,17 @@ png_check_keyword(png_structp png_ptr, p
png_free(png_ptr, *new_key);
*new_key=NULL;
png_warning(png_ptr, "Zero length keyword");
}
if (key_len > 79)
{
png_warning(png_ptr, "keyword length must be 1 - 79 characters");
- new_key[79] = '\0';
+ (*new_key)[79] = '\0';
key_len = 79;
}
return (key_len);
}
#endif
#if defined(PNG_WRITE_tEXt_SUPPORTED)
@@ -1382,22 +1345,19 @@ png_write_tEXt(png_structp png_ptr, png_
png_size_t text_len)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_tEXt;
#endif
png_size_t key_len;
png_charp new_key;
- png_debug(1, "in png_write_tEXt\n");
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in tEXt chunk");
+ png_debug(1, "in png_write_tEXt");
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
return;
- }
if (text == NULL || *text == '\0')
text_len = 0;
else
text_len = png_strlen(text);
/* make sure we include the 0 after the key */
png_write_chunk_start(png_ptr, (png_bytep)png_tEXt,
@@ -1427,27 +1387,26 @@ png_write_zTXt(png_structp png_ptr, png_
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_zTXt;
#endif
png_size_t key_len;
char buf[1];
png_charp new_key;
compression_state comp;
- png_debug(1, "in png_write_zTXt\n");
+ png_debug(1, "in png_write_zTXt");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
comp.output_ptr = NULL;
comp.input = NULL;
comp.input_len = 0;
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
{
- png_warning(png_ptr, "Empty keyword in zTXt chunk");
png_free(png_ptr, new_key);
return;
}
if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE)
{
png_write_tEXt(png_ptr, new_key, text, (png_size_t)0);
png_free(png_ptr, new_key);
@@ -1484,33 +1443,32 @@ png_write_zTXt(png_structp png_ptr, png_
void /* PRIVATE */
png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
png_charp lang, png_charp lang_key, png_charp text)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_iTXt;
#endif
png_size_t lang_len, key_len, lang_key_len, text_len;
- png_charp new_lang, new_key;
+ png_charp new_lang;
+ png_charp new_key = NULL;
png_byte cbuf[2];
compression_state comp;
- png_debug(1, "in png_write_iTXt\n");
+ png_debug(1, "in png_write_iTXt");
comp.num_output_ptr = 0;
comp.max_output_ptr = 0;
comp.output_ptr = NULL;
comp.input = NULL;
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in iTXt chunk");
+ if ((key_len = png_check_keyword(png_ptr, key, &new_key))==0)
return;
- }
- if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)
+
+ if ((lang_len = png_check_keyword(png_ptr, lang, &new_lang))==0)
{
png_warning(png_ptr, "Empty language field in iTXt chunk");
new_lang = NULL;
lang_len = 0;
}
if (lang_key == NULL)
lang_key_len = 0;
@@ -1576,17 +1534,17 @@ void /* PRIVATE */
png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
int unit_type)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_oFFs;
#endif
png_byte buf[9];
- png_debug(1, "in png_write_oFFs\n");
+ png_debug(1, "in png_write_oFFs");
if (unit_type >= PNG_OFFSET_LAST)
png_warning(png_ptr, "Unrecognized unit type for oFFs chunk");
png_save_int_32(buf, x_offset);
png_save_int_32(buf + 4, y_offset);
buf[8] = (png_byte)unit_type;
png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9);
@@ -1602,40 +1560,40 @@ png_write_pCAL(png_structp png_ptr, png_
PNG_pCAL;
#endif
png_size_t purpose_len, units_len, total_len;
png_uint_32p params_len;
png_byte buf[10];
png_charp new_purpose;
int i;
- png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams);
+ png_debug1(1, "in png_write_pCAL (%d parameters)", nparams);
if (type >= PNG_EQUATION_LAST)
png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1;
- png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len);
+ png_debug1(3, "pCAL purpose length = %d", (int)purpose_len);
units_len = png_strlen(units) + (nparams == 0 ? 0 : 1);
- png_debug1(3, "pCAL units length = %d\n", (int)units_len);
+ png_debug1(3, "pCAL units length = %d", (int)units_len);
total_len = purpose_len + units_len + 10;
params_len = (png_uint_32p)png_malloc(png_ptr,
(png_uint_32)(nparams * png_sizeof(png_uint_32)));
/* Find the length of each parameter, making sure we don't count the
null terminator for the last parameter. */
for (i = 0; i < nparams; i++)
{
params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
- png_debug2(3, "pCAL parameter %d length = %lu\n", i,
+ png_debug2(3, "pCAL parameter %d length = %lu", i,
(unsigned long) params_len[i]);
total_len += (png_size_t)params_len[i];
}
- png_debug1(3, "pCAL total length = %d\n", (int)total_len);
+ png_debug1(3, "pCAL total length = %d", (int)total_len);
png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len);
png_write_chunk_data(png_ptr, (png_bytep)new_purpose,
(png_size_t)purpose_len);
png_save_int_32(buf, X0);
png_save_int_32(buf + 4, X1);
buf[8] = (png_byte)type;
buf[9] = (png_byte)nparams;
png_write_chunk_data(png_ptr, buf, (png_size_t)10);
@@ -1661,17 +1619,17 @@ void /* PRIVATE */
png_write_sCAL(png_structp png_ptr, int unit, double width, double height)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_sCAL;
#endif
char buf[64];
png_size_t total_len;
- png_debug(1, "in png_write_sCAL\n");
+ png_debug(1, "in png_write_sCAL");
buf[0] = (char)unit;
#if defined(_WIN32_WCE)
/* sprintf() function is not supported on WindowsCE */
{
wchar_t wc_buf[32];
size_t wc_len;
swprintf(wc_buf, TEXT("%12.12e"), width);
@@ -1686,47 +1644,47 @@ png_write_sCAL(png_structp png_ptr, int
}
#else
png_snprintf(buf + 1, 63, "%12.12e", width);
total_len = 1 + png_strlen(buf + 1) + 1;
png_snprintf(buf + total_len, 64-total_len, "%12.12e", height);
total_len += png_strlen(buf + total_len);
#endif
- png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len);
+ png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
png_write_chunk(png_ptr, (png_bytep)png_sCAL, (png_bytep)buf, total_len);
}
#else
#ifdef PNG_FIXED_POINT_SUPPORTED
void /* PRIVATE */
png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,
png_charp height)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_sCAL;
#endif
png_byte buf[64];
png_size_t wlen, hlen, total_len;
- png_debug(1, "in png_write_sCAL_s\n");
+ png_debug(1, "in png_write_sCAL_s");
wlen = png_strlen(width);
hlen = png_strlen(height);
total_len = wlen + hlen + 2;
if (total_len > 64)
{
png_warning(png_ptr, "Can't write sCAL (buffer too small)");
return;
}
buf[0] = (png_byte)unit;
png_memcpy(buf + 1, width, wlen + 1); /* append the '\0' here */
png_memcpy(buf + wlen + 2, height, hlen); /* do NOT append the '\0' here */
- png_debug1(3, "sCAL total length = %u\n", (unsigned int)total_len);
+ png_debug1(3, "sCAL total length = %u", (unsigned int)total_len);
png_write_chunk(png_ptr, (png_bytep)png_sCAL, buf, total_len);
}
#endif
#endif
#endif
#if defined(PNG_WRITE_pHYs_SUPPORTED)
/* write the pHYs chunk */
@@ -1735,17 +1693,17 @@ png_write_pHYs(png_structp png_ptr, png_
png_uint_32 y_pixels_per_unit,
int unit_type)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_pHYs;
#endif
png_byte buf[9];
- png_debug(1, "in png_write_pHYs\n");
+ png_debug(1, "in png_write_pHYs");
if (unit_type >= PNG_RESOLUTION_LAST)
png_warning(png_ptr, "Unrecognized unit type for pHYs chunk");
png_save_uint_32(buf, x_pixels_per_unit);
png_save_uint_32(buf + 4, y_pixels_per_unit);
buf[8] = (png_byte)unit_type;
png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9);
@@ -1759,17 +1717,17 @@ png_write_pHYs(png_structp png_ptr, png_
void /* PRIVATE */
png_write_tIME(png_structp png_ptr, png_timep mod_time)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_tIME;
#endif
png_byte buf[7];
- png_debug(1, "in png_write_tIME\n");
+ png_debug(1, "in png_write_tIME");
if (mod_time->month > 12 || mod_time->month < 1 ||
mod_time->day > 31 || mod_time->day < 1 ||
mod_time->hour > 23 || mod_time->second > 60)
{
png_warning(png_ptr, "Invalid time specified for tIME chunk");
return;
}
@@ -1789,17 +1747,17 @@ void /* PRIVATE */
png_write_acTL(png_structp png_ptr,
png_uint_32 num_frames, png_uint_32 num_plays)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_acTL;
#endif
png_byte data[16];
- png_debug(1, "in png_write_acTL\n");
+ png_debug(1, "in png_write_acTL");
png_ptr->num_frames_to_write = num_frames;
if (png_ptr->apng_flags & PNG_FIRST_FRAME_HIDDEN)
num_frames--;
png_save_uint_32(data, num_frames);
png_save_uint_32(data + 4, num_plays);
@@ -1813,25 +1771,25 @@ png_write_fcTL(png_structp png_ptr, png_
png_uint_16 delay_num, png_uint_16 delay_den, png_byte dispose_op,
png_byte blend_op)
{
#ifdef PNG_USE_LOCAL_ARRAYS
PNG_fcTL;
#endif
png_byte data[26];
- png_debug(1, "in png_write_fcTL\n");
+ png_debug(1, "in png_write_fcTL");
if (png_ptr->num_frames_written == 0 && (x_offset != 0 || y_offset != 0))
- png_error(png_ptr, "x and/or y offset for the first frame aren't 0\n");
+ png_error(png_ptr, "x and/or y offset for the first frame aren't 0");
if (png_ptr->num_frames_written == 0 &&
(width != png_ptr->first_frame_width ||
height != png_ptr->first_frame_height))
png_error(png_ptr, "width and/or height in the first frame's fcTL "
- "don't match the ones in IHDR\n");
+ "don't match the ones in IHDR");
/* more error checking */
png_ensure_fcTL_is_valid(png_ptr, width, height, x_offset, y_offset,
delay_num, delay_den, dispose_op, blend_op);
png_save_uint_32(data, png_ptr->next_seq_num);
png_save_uint_32(data + 4, width);
png_save_uint_32(data + 8, height);
@@ -1867,17 +1825,17 @@ png_write_start_row(png_structp png_ptr)
/* offset to next interlace block in the y direction */
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
png_size_t buf_size;
- png_debug(1, "in png_write_start_row\n");
+ png_debug(1, "in png_write_start_row");
buf_size = (png_size_t)(PNG_ROWBYTES(
png_ptr->usr_channels*png_ptr->usr_bit_depth, png_ptr->width) + 1);
/* set up row buffer */
png_ptr->row_buf = (png_bytep)png_malloc(png_ptr,
(png_uint_32)buf_size);
png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;
@@ -1967,17 +1925,17 @@ png_write_finish_row(png_structp png_ptr
/* offset to next interlace block in the y direction */
int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
#endif
#endif
int ret;
- png_debug(1, "in png_write_finish_row\n");
+ png_debug(1, "in png_write_finish_row");
/* next row */
png_ptr->row_number++;
/* see if we are done */
if (png_ptr->row_number < png_ptr->num_rows)
return;
#ifdef PNG_WRITE_INTERLACING_SUPPORTED
@@ -2076,17 +2034,17 @@ png_do_write_interlace(png_row_infop row
/* start of interlace block */
int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
/* offset to next interlace block */
int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
#endif
- png_debug(1, "in png_do_write_interlace\n");
+ png_debug(1, "in png_do_write_interlace");
/* we don't have to do anything on the last pass (6) */
#if defined(PNG_USELESS_TESTS_SUPPORTED)
if (row != NULL && row_info != NULL && pass < 6)
#else
if (pass < 6)
#endif
{
/* each pixel depth is handled separately */
@@ -2247,17 +2205,17 @@ png_write_find_filter(png_structp png_pt
png_bytep prev_row, row_buf;
png_uint_32 mins, bpp;
png_byte filter_to_do = png_ptr->do_filter;
png_uint_32 row_bytes = row_info->rowbytes;
#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
int num_p_filters = (int)png_ptr->num_prev_filters;
#endif
- png_debug(1, "in png_write_find_filter\n");
+ png_debug(1, "in png_write_find_filter");
/* find out how many bytes offset each pixel is */
bpp = (row_info->pixel_depth + 7) >> 3;
prev_row = png_ptr->prev_row;
#endif
best_row = png_ptr->row_buf;
#ifndef PNG_NO_WRITE_FILTER
row_buf = best_row;
@@ -2856,18 +2814,18 @@ png_write_find_filter(png_structp png_pt
#endif /* PNG_NO_WRITE_FILTER */
}
/* Do the actual writing of a previously filtered row. */
void /* PRIVATE */
png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
{
- png_debug(1, "in png_write_filtered_row\n");
- png_debug1(2, "filter = %d\n", filtered_row[0]);
+ png_debug(1, "in png_write_filtered_row");
+ png_debug1(2, "filter = %d", filtered_row[0]);
/* set up the zlib input buffer */
png_ptr->zstream.next_in = filtered_row;
png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1;
/* repeat until we have compressed all the data */
do
{
int ret; /* return of zlib */
@@ -2930,17 +2888,17 @@ png_write_reset(png_structp png_ptr)
void /* PRIVATE */
png_write_reinit(png_structp png_ptr, png_infop info_ptr,
png_uint_32 width, png_uint_32 height)
{
if (png_ptr->num_frames_written == 0 &&
(width != png_ptr->first_frame_width ||
height != png_ptr->first_frame_height))
png_error(png_ptr, "width and/or height in the first frame's fcTL "
- "don't match the ones in IHDR\n");
+ "don't match the ones in IHDR");
if (width > png_ptr->first_frame_width ||
height > png_ptr->first_frame_height)
png_error(png_ptr, "width and/or height for a frame greater than"
"the ones in IHDR");
png_set_IHDR(png_ptr, info_ptr, width, height,
info_ptr->bit_depth, info_ptr->color_type,
info_ptr->interlace_type, info_ptr->compression_type,
--- a/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp
+++ b/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp
@@ -54,16 +54,23 @@
#include "nsNetUtil.h"
#include "nsInt64.h"
#include "nsIFile.h"
#include "nsIFileURL.h"
#include "nsIMIMEService.h"
#include "nsCExternalHandlerService.h"
#include "nsDirectoryServiceDefs.h"
+#ifndef MOZ_DISABLE_VISTA_SDK_REQUIREMENTS
+#ifdef _WIN32_WINNT
+#undef _WIN32_WINNT
+#endif
+#define _WIN32_WINNT 0x0600
+#endif
+
// we need windows.h to read out registry information...
#include <windows.h>
#include <shellapi.h>
#include <shlobj.h>
#include <wchar.h>
struct ICONFILEHEADER {
PRUint16 ifhReserved;
@@ -77,16 +84,30 @@ struct ICONENTRY {
PRUint8 ieColors;
PRUint8 ieReserved;
PRUint16 iePlanes;
PRUint16 ieBitCount;
PRUint32 ieSizeImage;
PRUint32 ieFileOffset;
};
+#ifndef MOZ_DISABLE_VISTA_SDK_REQUIREMENTS
+typedef HRESULT (WINAPI*SHGetStockIconInfoPtr) (SHSTOCKICONID siid, UINT uFlags, SHSTOCKICONINFO *psii);
+
+// Match stock icons with names
+static SHSTOCKICONID GetStockIconIDForName(const nsACString &aStockName)
+{
+ // UAC shield icon
+ if (aStockName == NS_LITERAL_CSTRING("uac-shield"))
+ return SIID_SHIELD;
+
+ return SIID_INVALID;
+}
+#endif
+
// nsIconChannel methods
nsIconChannel::nsIconChannel()
{
}
nsIconChannel::~nsIconChannel()
{}
@@ -267,17 +288,30 @@ static DWORD GetSpecialFolderIcon(nsIFil
pMalloc->Free(idList);
pMalloc->Release();
}
}
}
return shellResult;
}
-nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBlocking)
+static UINT GetSizeInfoFlag(PRUint32 aDesiredImageSize)
+{
+ UINT infoFlag;
+#ifndef WINCE
+ if (aDesiredImageSize > 16)
+ infoFlag = SHGFI_SHELLICONSIZE;
+ else
+#endif
+ infoFlag = SHGFI_SMALLICON;
+
+ return infoFlag;
+}
+
+nsresult nsIconChannel::GetHIconFromFile(HICON *hIcon)
{
nsXPIDLCString contentType;
nsCString fileExt;
nsCOMPtr<nsIFile> localFile; // file we want an icon for
PRUint32 desiredImageSize;
nsresult rv = ExtractIconInfoFromUrl(getter_AddRefs(localFile), &desiredImageSize, contentType, fileExt);
NS_ENSURE_SUCCESS(rv, rv);
@@ -304,40 +338,33 @@ nsresult nsIconChannel::MakeInputStream(
if (!fileExists)
localFile->GetNativeLeafName(filePath);
}
}
if (!fileExists)
infoFlags |= SHGFI_USEFILEATTRIBUTES;
-#ifndef WINCE
- if (desiredImageSize > 16)
- infoFlags |= SHGFI_SHELLICONSIZE;
- else
-#endif
- infoFlags |= SHGFI_SMALLICON;
+ infoFlags |= GetSizeInfoFlag(desiredImageSize);
// if we have a content type... then use it! but for existing files, we want
// to show their real icon.
if (!fileExists && !contentType.IsEmpty())
{
nsCOMPtr<nsIMIMEService> mimeService (do_GetService(NS_MIMESERVICE_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCAutoString defFileExt;
mimeService->GetPrimaryExtension(contentType, fileExt, defFileExt);
// If the mime service does not know about this mime type, we show
// the generic icon.
// In any case, we need to insert a '.' before the extension.
filePath = NS_LITERAL_CSTRING(".") + defFileExt;
}
- rv = NS_ERROR_NOT_AVAILABLE;
-
// Is this the "Desktop" folder?
DWORD shellResult = GetSpecialFolderIcon(localFile, CSIDL_DESKTOP, &sfi, infoFlags);
if (!shellResult) {
// Is this the "My Documents" folder?
shellResult = GetSpecialFolderIcon(localFile, CSIDL_PERSONAL, &sfi, infoFlags);
}
// There are other "Special Folders" and Namespace entities that we are not
@@ -346,20 +373,93 @@ nsresult nsIconChannel::MakeInputStream(
// If we ever need to get them, code to do so would be inserted here.
// Not a special folder, or something else failed above.
if (!shellResult)
shellResult = ::SHGetFileInfoW(NS_ConvertUTF8toUTF16(filePath).get(),
FILE_ATTRIBUTE_ARCHIVE, &sfi, sizeof(sfi), infoFlags);
if (shellResult && sfi.hIcon)
+ *hIcon = sfi.hIcon;
+ else
+ rv = NS_ERROR_NOT_AVAILABLE;
+
+ return rv;
+}
+
+#ifndef MOZ_DISABLE_VISTA_SDK_REQUIREMENTS
+nsresult nsIconChannel::GetStockHIcon(nsIMozIconURI *aIconURI, HICON *hIcon)
+{
+ nsresult rv = NS_OK;
+
+ // We can only do this on Vista or above
+ HMODULE hShellDLL = ::LoadLibraryW(L"shell32.dll");
+ SHGetStockIconInfoPtr pSHGetStockIconInfo =
+ (SHGetStockIconInfoPtr) ::GetProcAddress(hShellDLL, "SHGetStockIconInfo");
+
+ if (pSHGetStockIconInfo)
+ {
+ PRUint32 desiredImageSize;
+ aIconURI->GetImageSize(&desiredImageSize);
+ nsCAutoString stockIcon;
+ aIconURI->GetStockIcon(stockIcon);
+
+ SHSTOCKICONID stockIconID = GetStockIconIDForName(stockIcon);
+ if (stockIconID == SIID_INVALID)
+ return NS_ERROR_NOT_AVAILABLE;
+
+ UINT infoFlags = SHGSI_ICON;
+ infoFlags |= GetSizeInfoFlag(desiredImageSize);
+
+ SHSTOCKICONINFO sii = {0};
+ sii.cbSize = sizeof(sii);
+ HRESULT hr = pSHGetStockIconInfo(stockIconID, infoFlags, &sii);
+
+ if (SUCCEEDED(hr))
+ *hIcon = sii.hIcon;
+ else
+ rv = NS_ERROR_FAILURE;
+ }
+ else
+ {
+ rv = NS_ERROR_NOT_AVAILABLE;
+ }
+
+ if (hShellDLL)
+ ::FreeLibrary(hShellDLL);
+
+ return rv;
+}
+#endif
+
+nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBlocking)
+{
+ // Check whether the icon requested's a file icon or a stock icon
+ nsresult rv;
+ HICON hIcon = NULL;
+
+#ifndef MOZ_DISABLE_VISTA_SDK_REQUIREMENTS
+ nsCOMPtr<nsIMozIconURI> iconURI(do_QueryInterface(mUrl, &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCAutoString stockIcon;
+ iconURI->GetStockIcon(stockIcon);
+ if (!stockIcon.IsEmpty())
+ rv = GetStockHIcon(iconURI, &hIcon);
+ else
+#endif
+ rv = GetHIconFromFile(&hIcon);
+
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (hIcon)
{
// we got a handle to an icon. Now we want to get a bitmap for the icon using GetIconInfo....
ICONINFO iconInfo;
- if (GetIconInfo(sfi.hIcon, &iconInfo))
+ if (GetIconInfo(hIcon, &iconInfo))
{
// we got the bitmaps, first find out their size
HDC hDC = CreateCompatibleDC(NULL); // get a device context for the screen.
BITMAPINFO maskInfo = {{sizeof(BITMAPINFOHEADER)}};
if (GetDIBits(hDC, iconInfo.hbmMask, 0, 0, NULL, &maskInfo, DIB_RGB_COLORS) &&
maskInfo.bmiHeader.biSizeImage > 0) {
PRUint32 colorSize = maskInfo.bmiHeader.biWidth * maskInfo.bmiHeader.biHeight * 4;
PRUint32 iconSize = sizeof(ICONFILEHEADER) + sizeof(ICONENTRY) + sizeof(BITMAPINFOHEADER) + colorSize + maskInfo.bmiHeader.biSizeImage;
@@ -414,18 +514,18 @@ nsresult nsIconChannel::MakeInputStream(
delete [] buffer;
} // if we allocated the buffer
} // if we got mask size
DeleteDC(hDC);
DeleteObject(iconInfo.hbmColor);
DeleteObject(iconInfo.hbmMask);
} // if we got icon info
- DestroyIcon(sfi.hIcon);
- } // if we got sfi
+ DestroyIcon(hIcon);
+ } // if we got an hIcon
return rv;
}
NS_IMETHODIMP nsIconChannel::GetContentType(nsACString &aContentType)
{
aContentType.AssignLiteral("image/x-icon");
return NS_OK;
--- a/modules/libpr0n/decoders/icon/win/nsIconChannel.h
+++ b/modules/libpr0n/decoders/icon/win/nsIconChannel.h
@@ -44,16 +44,19 @@
#include "nsXPIDLString.h"
#include "nsIChannel.h"
#include "nsILoadGroup.h"
#include "nsIInterfaceRequestor.h"
#include "nsIInterfaceRequestorUtils.h"
#include "nsIURI.h"
#include "nsIInputStreamPump.h"
#include "nsIStreamListener.h"
+#include "nsIIconURI.h"
+
+#include <windows.h>
class nsIFile;
class nsIconChannel : public nsIChannel, public nsIStreamListener
{
public:
NS_DECL_ISUPPORTS
NS_DECL_NSIREQUEST
@@ -73,12 +76,19 @@ protected:
nsCOMPtr<nsILoadGroup> mLoadGroup;
nsCOMPtr<nsIInterfaceRequestor> mCallbacks;
nsCOMPtr<nsISupports> mOwner;
nsCOMPtr<nsIInputStreamPump> mPump;
nsCOMPtr<nsIStreamListener> mListener;
nsresult ExtractIconInfoFromUrl(nsIFile ** aLocalFile, PRUint32 * aDesiredImageSize, nsCString &aContentType, nsCString &aFileExtension);
+ nsresult GetHIconFromFile(HICON *hIcon);
nsresult MakeInputStream(nsIInputStream** _retval, PRBool nonBlocking);
+
+ // Functions specific to Vista and above
+#ifndef MOZ_DISABLE_VISTA_SDK_REQUIREMENTS
+protected:
+ nsresult GetStockHIcon(nsIMozIconURI *aIconURI, HICON *hIcon);
+#endif
};
#endif /* nsIconChannel_h___ */
--- a/modules/libpr0n/public/imgIRequest.idl
+++ b/modules/libpr0n/public/imgIRequest.idl
@@ -99,10 +99,21 @@ interface imgIRequest : nsIRequest
* for this image load.
*/
imgIRequest clone(in imgIDecoderObserver aObserver);
/**
* The principal gotten from the channel the image was loaded from.
*/
readonly attribute nsIPrincipal imagePrincipal;
+
+ /**
+ * Cancels this request as in nsIRequest::Cancel(); further, also nulls out
+ * decoderObserver so it gets no further notifications from us.
+ *
+ * NOTE: You should not use this in any new code; instead, use cancel(). Note
+ * that cancel() is asynchronous, which means that some time after you call
+ * it, the listener/observer will get an OnStopRequest(). This means that, if
+ * you're the observer, you can't call cancel() from your destructor.
+ */
+ void cancelAndForgetObserver(in nsresult aStatus);
};
--- a/modules/libpr0n/src/imgContainer.cpp
+++ b/modules/libpr0n/src/imgContainer.cpp
@@ -1219,19 +1219,19 @@ imgContainer::sDiscardTimerCallback(nsIT
NS_ASSERTION(aTimer == self->mDiscardTimer,
"imgContainer::DiscardTimerCallback() got a callback for an unknown timer");
self->mDiscardTimer = nsnull;
int old_frame_count = self->mFrames.Count();
+ // Don't discard animated images, because we don't handle that very well. (See bug 414259.)
if (self->mAnim) {
- delete self->mAnim;
- self->mAnim = nsnull;
+ return;
}
self->mFrames.Clear();
self->mDiscarded = PR_TRUE;
PR_LOG(gCompressedImageAccountingLog, PR_LOG_DEBUG,
("CompressedImageAccounting: discarded uncompressed image data from imgContainer %p (%s) - %d frames (cached count: %d); "
--- a/modules/libpr0n/src/imgLoader.cpp
+++ b/modules/libpr0n/src/imgLoader.cpp
@@ -250,31 +250,31 @@ imgCacheEntry::imgCacheEntry(imgRequest
void imgCacheEntry::TouchWithSize(PRInt32 diff)
{
LOG_SCOPE(gImgLog, "imgCacheEntry::TouchWithSize");
mTouchedTime = SecondsFromPRTime(PR_Now());
if (!Evicted()) {
nsCOMPtr<nsIURI> uri;
- mRequest->GetURI(getter_AddRefs(uri));
+ mRequest->GetKeyURI(getter_AddRefs(uri));
imgLoader::CacheEntriesChanged(uri, diff);
}
}
void imgCacheEntry::Touch(PRBool updateTime /* = PR_TRUE */)
{
LOG_SCOPE(gImgLog, "imgCacheEntry::Touch");
if (updateTime)
mTouchedTime = SecondsFromPRTime(PR_Now());
if (!Evicted()) {
nsCOMPtr<nsIURI> uri;
- mRequest->GetURI(getter_AddRefs(uri));
+ mRequest->GetKeyURI(getter_AddRefs(uri));
imgLoader::CacheEntriesChanged(uri);
}
}
imgCacheQueue::imgCacheQueue()
: mDirty(PR_FALSE),
mSize(0)
{}
@@ -904,17 +904,17 @@ PRBool imgLoader::RemoveFromCache(nsIURI
PRBool imgLoader::RemoveFromCache(imgCacheEntry *entry)
{
LOG_STATIC_FUNC(gImgLog, "imgLoader::RemoveFromCache entry");
PRBool ret = PR_FALSE;
nsRefPtr<imgRequest> request(getter_AddRefs(entry->GetRequest()));
if (request) {
nsCOMPtr<nsIURI> key;
- if (NS_SUCCEEDED(request->GetURI(getter_AddRefs(key))) && key)
+ if (NS_SUCCEEDED(request->GetKeyURI(getter_AddRefs(key))) && key)
ret = RemoveFromCache(key);
}
return ret;
}
nsresult imgLoader::EvictEntries(imgCacheTable &aCacheToClear, imgCacheQueue &aQueueToClear)
{
@@ -1007,18 +1007,18 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIUR
if (aLoadFlags & nsIRequest::LOAD_BYPASS_CACHE) {
RemoveFromCache(aURI);
} else {
// Look in the cache for our URI, and then validate it.
// XXX For now ignore aCacheKey. We will need it in the future
// for correctly dealing with image load requests that are a result
// of post data.
imgCacheTable &cache = GetCache(aURI);
+
nsCAutoString spec;
-
aURI->GetSpec(spec);
if (cache.Get(spec, getter_AddRefs(entry)) && entry) {
if (gCacheTracker)
gCacheTracker->MarkUsed(entry);
if (ValidateEntry(entry, aURI, aInitialDocumentURI, aReferrerURI, aLoadGroup, aObserver, aCX,
requestFlags, PR_TRUE, aRequest, _retval)) {
@@ -1056,39 +1056,39 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIUR
// Create a loadgroup for this new channel. This way if the channel
// is redirected, we'll have a way to cancel the resulting channel.
nsCOMPtr<nsILoadGroup> loadGroup =
do_CreateInstance(NS_LOADGROUP_CONTRACTID);
newChannel->SetLoadGroup(loadGroup);
void *cacheId = NS_GetCurrentThread();
- request->Init(aURI, loadGroup, entry, cacheId, aCX);
+ request->Init(aURI, aURI, loadGroup, newChannel, entry, cacheId, aCX);
// create the proxy listener
ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(request.get()));
if (!pl) {
- request->Cancel(NS_ERROR_OUT_OF_MEMORY);
+ request->CancelAndAbort(NS_ERROR_OUT_OF_MEMORY);
return NS_ERROR_OUT_OF_MEMORY;
}
NS_ADDREF(pl);
PR_LOG(gImgLog, PR_LOG_DEBUG,
("[this=%p] imgLoader::LoadImage -- Calling channel->AsyncOpen()\n", this));
nsresult openRes = newChannel->AsyncOpen(static_cast<nsIStreamListener *>(pl), nsnull);
NS_RELEASE(pl);
if (NS_FAILED(openRes)) {
PR_LOG(gImgLog, PR_LOG_DEBUG,
("[this=%p] imgLoader::LoadImage -- AsyncOpen() failed: 0x%x\n",
this, openRes));
- request->Cancel(openRes);
+ request->CancelAndAbort(openRes);
return openRes;
}
// Try to add the new request into the cache.
PutIntoCache(aURI, entry);
// If we did get a cache hit, use it.
} else {
@@ -1188,29 +1188,22 @@ NS_IMETHODIMP imgLoader::LoadImageWithCh
if (request) {
// we have this in our cache already.. cancel the current (document) load
channel->Cancel(NS_IMAGELIB_ERROR_LOAD_ABORTED); // this should fire an OnStopRequest
*listener = nsnull; // give them back a null nsIStreamListener
} else {
-
- // Get the current Thread... This is used as a cacheId to prevent
- // sharing requests which are being loaded across multiple threads...
- nsIThread *thread = NS_GetCurrentThread();
-
NewRequestAndEntry(uri, getter_AddRefs(request), getter_AddRefs(entry));
- // XXX(darin): I'm not sure that using the original URI is correct here.
- // Perhaps we should use the same URI that indexes the cache? Or, perhaps
- // the cache should use the original URI? See bug 89419.
+ // We use originalURI here to fulfil the imgIRequest contract on GetURI.
nsCOMPtr<nsIURI> originalURI;
channel->GetOriginalURI(getter_AddRefs(originalURI));
- request->Init(originalURI, channel, entry, thread, aCX);
+ request->Init(originalURI, uri, channel, channel, entry, NS_GetCurrentThread(), aCX);
ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(request.get()));
if (!pl)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(pl);
*listener = static_cast<nsIStreamListener*>(pl);
@@ -1470,22 +1463,20 @@ NS_IMETHODIMP imgCacheValidator::OnStart
mRequest->mValidator = nsnull;
mRequest = nsnull;
imgRequest *request;
if (!NewRequestAndEntry(uri, &request, getter_AddRefs(entry)))
return NS_ERROR_OUT_OF_MEMORY;
- // XXX(darin): I'm not sure that using the original URI is correct here.
- // Perhaps we should use the same URI that indexes the cache? Or, perhaps
- // the cache should use the original URI? See bug 89419.
+ // We use originalURI here to fulfil the imgIRequest contract on GetURI.
nsCOMPtr<nsIURI> originalURI;
channel->GetOriginalURI(getter_AddRefs(originalURI));
- request->Init(originalURI, channel, entry, NS_GetCurrentThread(), mContext);
+ request->Init(originalURI, uri, channel, channel, entry, NS_GetCurrentThread(), mContext);
ProxyListener *pl = new ProxyListener(static_cast<nsIStreamListener *>(request));
if (!pl) {
NS_RELEASE(request);
return NS_ERROR_OUT_OF_MEMORY;
}
mDestListener = static_cast<nsIStreamListener*>(pl);
--- a/modules/libpr0n/src/imgRequest.cpp
+++ b/modules/libpr0n/src/imgRequest.cpp
@@ -53,68 +53,82 @@
#include "nsIChannel.h"
#include "nsICachingChannel.h"
#include "nsILoadGroup.h"
#include "nsIInputStream.h"
#include "nsIMultiPartChannel.h"
#include "nsIHttpChannel.h"
#include "nsIComponentManager.h"
+#include "nsIInterfaceRequestorUtils.h"
#include "nsIProxyObjectManager.h"
#include "nsIServiceManager.h"
#include "nsISupportsPrimitives.h"
#include "nsIScriptSecurityManager.h"
#include "nsICacheVisitor.h"
#include "nsString.h"
#include "nsXPIDLString.h"
#include "plstr.h" // PL_strcasestr(...)
#if defined(PR_LOGGING)
PRLogModuleInfo *gImgLog = PR_NewLogModule("imgRequest");
#endif
-NS_IMPL_ISUPPORTS6(imgRequest, imgILoad,
+NS_IMPL_ISUPPORTS8(imgRequest, imgILoad,
imgIDecoderObserver, imgIContainerObserver,
nsIStreamListener, nsIRequestObserver,
- nsISupportsWeakReference)
+ nsISupportsWeakReference,
+ nsIChannelEventSink,
+ nsIInterfaceRequestor)
imgRequest::imgRequest() :
mLoading(PR_FALSE), mProcessing(PR_FALSE), mHadLastPart(PR_FALSE),
mNetworkStatus(0), mImageStatus(imgIRequest::STATUS_NONE), mState(0),
mCacheId(0), mValidator(nsnull), mIsMultiPartChannel(PR_FALSE),
mImageSniffers("image-sniffing-services")
{
/* member initializers and constructor code */
}
imgRequest::~imgRequest()
{
/* destructor code */
}
nsresult imgRequest::Init(nsIURI *aURI,
+ nsIURI *aKeyURI,
nsIRequest *aRequest,
+ nsIChannel *aChannel,
imgCacheEntry *aCacheEntry,
void *aCacheId,
void *aLoadId)
{
LOG_FUNC(gImgLog, "imgRequest::Init");
NS_ASSERTION(!mImage, "Multiple calls to init");
NS_ASSERTION(aURI, "No uri");
NS_ASSERTION(aRequest, "No request");
+ NS_ASSERTION(aChannel, "No channel");
mProperties = do_CreateInstance("@mozilla.org/properties;1");
if (!mProperties)
return NS_ERROR_OUT_OF_MEMORY;
mURI = aURI;
+ mKeyURI = aKeyURI;
mRequest = aRequest;
+ mChannel = aChannel;
+ mChannel->GetNotificationCallbacks(getter_AddRefs(mPrevChannelSink));
+
+ NS_ASSERTION(mPrevChannelSink != this,
+ "Initializing with a channel that already calls back to us!");
+
+ mChannel->SetNotificationCallbacks(this);
/* set our loading flag to true here.
Setting it here lets checks to see if the load is in progress
before OnStartRequest gets called, letting 'this' properly get removed
from the cache in certain cases.
*/
mLoading = PR_TRUE;
@@ -289,33 +303,59 @@ void imgRequest::Cancel(nsresult aStatus
if (!(mImageStatus & imgIRequest::STATUS_LOAD_PARTIAL))
mImageStatus |= imgIRequest::STATUS_ERROR;
if (aStatus != NS_IMAGELIB_ERROR_NO_DECODER) {
RemoveFromCache();
}
- if (mRequest && mLoading)
- mRequest->Cancel(aStatus);
+ if (mChannel && mLoading)
+ mChannel->Cancel(aStatus);
+}
+
+void imgRequest::CancelAndAbort(nsresult aStatus)
+{
+ Cancel(aStatus);
+
+ // It's possible for the channel to fail to open after we've set our
+ // notification callbacks. In that case, make sure to break the cycle between
+ // the channel and us, because it won't.
+ if (mChannel) {
+ mChannel->SetNotificationCallbacks(mPrevChannelSink);
+ mPrevChannelSink = nsnull;
+ }
}
nsresult imgRequest::GetURI(nsIURI **aURI)
{
LOG_FUNC(gImgLog, "imgRequest::GetURI");
if (mURI) {
*aURI = mURI;
NS_ADDREF(*aURI);
return NS_OK;
}
return NS_ERROR_FAILURE;
}
+nsresult imgRequest::GetKeyURI(nsIURI **aKeyURI)
+{
+ LOG_FUNC(gImgLog, "imgRequest::GetKeyURI");
+
+ if (mKeyURI) {
+ *aKeyURI = mKeyURI;
+ NS_ADDREF(*aKeyURI);
+ return NS_OK;
+ }
+
+ return NS_ERROR_FAILURE;
+}
+
nsresult imgRequest::GetPrincipal(nsIPrincipal **aPrincipal)
{
LOG_FUNC(gImgLog, "imgRequest::GetPrincipal");
if (mPrincipal) {
NS_ADDREF(*aPrincipal = mPrincipal);
return NS_OK;
}
@@ -732,25 +772,31 @@ NS_IMETHODIMP imgRequest::OnStopRequest(
if (mpchan) {
PRBool lastPart;
nsresult rv = mpchan->GetIsLastPart(&lastPart);
if (NS_SUCCEEDED(rv))
mHadLastPart = lastPart;
}
// XXXldb What if this is a non-last part of a multipart request?
- // xxx before we release our reference to mChannel, lets
+ // xxx before we release our reference to mRequest, lets
// save the last status that we saw so that the
// imgRequestProxy will have access to it.
- if (mRequest)
- {
+ if (mRequest) {
mRequest->GetStatus(&mNetworkStatus);
mRequest = nsnull; // we no longer need the request
}
+ // stop holding a ref to the channel, since we don't need it anymore
+ if (mChannel) {
+ mChannel->SetNotificationCallbacks(mPrevChannelSink);
+ mPrevChannelSink = nsnull;
+ mChannel = nsnull;
+ }
+
// If mImage is still null, we didn't properly load the image.
if (NS_FAILED(status) || !mImage) {
this->Cancel(status); // sets status, stops animations, removes from cache
} else {
mImageStatus |= imgIRequest::STATUS_LOAD_COMPLETE;
}
if (mDecoder) {
@@ -952,8 +998,52 @@ imgRequest::GetNetworkStatus()
nsresult status;
if (mRequest)
mRequest->GetStatus(&status);
else
status = mNetworkStatus;
return status;
}
+
+/** nsIInterfaceRequestor methods **/
+
+NS_IMETHODIMP
+imgRequest::GetInterface(const nsIID & aIID, void **aResult)
+{
+ if (!mPrevChannelSink || aIID.Equals(NS_GET_IID(nsIChannelEventSink)))
+ return QueryInterface(aIID, aResult);
+
+ NS_ASSERTION(mPrevChannelSink != this,
+ "Infinite recursion - don't keep track of channel sinks that are us!");
+ return mPrevChannelSink->GetInterface(aIID, aResult);
+}
+
+/** nsIChannelEventSink methods **/
+
+/* void onChannelRedirect (in nsIChannel oldChannel, in nsIChannel newChannel, in unsigned long flags); */
+NS_IMETHODIMP
+imgRequest::OnChannelRedirect(nsIChannel *oldChannel, nsIChannel *newChannel, PRUint32 flags)
+{
+ NS_ASSERTION(mRequest && mChannel, "Got an OnChannelRedirect after we nulled out mRequest!");
+ NS_ASSERTION(mChannel == oldChannel, "Got a channel redirect for an unknown channel!");
+ NS_ASSERTION(newChannel, "Got a redirect to a NULL channel!");
+
+ nsresult rv = NS_OK;
+ nsCOMPtr<nsIChannelEventSink> sink(do_GetInterface(mPrevChannelSink));
+ if (sink) {
+ rv = sink->OnChannelRedirect(oldChannel, newChannel, flags);
+ if (NS_FAILED(rv))
+ return rv;
+ }
+
+ RemoveFromCache();
+
+ mChannel = newChannel;
+
+ newChannel->GetOriginalURI(getter_AddRefs(mKeyURI));
+
+ // If we don't still have a cache entry, we don't want to refresh the cache.
+ if (mKeyURI && mCacheEntry)
+ imgLoader::PutIntoCache(mKeyURI, mCacheEntry);
+
+ return rv;
+}
--- a/modules/libpr0n/src/imgRequest.h
+++ b/modules/libpr0n/src/imgRequest.h
@@ -41,17 +41,19 @@
#define imgRequest_h__
#include "imgILoad.h"
#include "imgIContainer.h"
#include "imgIDecoder.h"
#include "imgIDecoderObserver.h"
+#include "nsIChannelEventSink.h"
#include "nsIContentSniffer.h"
+#include "nsIInterfaceRequestor.h"
#include "nsIRequest.h"
#include "nsIProperties.h"
#include "nsIStreamListener.h"
#include "nsIURI.h"
#include "nsIPrincipal.h"
#include "nsCategoryCache.h"
#include "nsCOMPtr.h"
@@ -71,26 +73,30 @@ enum {
onStopContainer = PR_BIT(3),
onStopDecode = PR_BIT(4),
onStopRequest = PR_BIT(5)
};
class imgRequest : public imgILoad,
public imgIDecoderObserver,
public nsIStreamListener,
- public nsSupportsWeakReference
+ public nsSupportsWeakReference,
+ public nsIChannelEventSink,
+ public nsIInterfaceRequestor
{
public:
imgRequest();
virtual ~imgRequest();
NS_DECL_ISUPPORTS
nsresult Init(nsIURI *aURI,
+ nsIURI *aKeyURI,
nsIRequest *aRequest,
+ nsIChannel *aChannel,
imgCacheEntry *aCacheEntry,
void *aCacheId,
void *aLoadId);
// Callers must call NotifyProxyListener later.
nsresult AddProxy(imgRequestProxy *proxy);
// aNotify==PR_FALSE still sends OnStopRequest.
@@ -103,30 +109,36 @@ public:
// currently being loaded on the same event queue as the new request
// being made...
PRBool IsReusable(void *aCacheId) { return !mLoading || (aCacheId == mCacheId); }
// get the current or last network status from our
// internal nsIChannel.
nsresult GetNetworkStatus();
+ // Cancel, but also ensure that all work done in Init() is undone. Call this
+ // only when the channel has failed to open, and so calling Cancel() on it
+ // won't be sufficient.
+ void CancelAndAbort(nsresult aStatus);
+
private:
friend class imgCacheEntry;
friend class imgRequestProxy;
friend class imgLoader;
friend class imgCacheValidator;
inline void SetLoadId(void *aLoadId) {
mLoadId = aLoadId;
mLoadTime = PR_Now();
}
inline PRUint32 GetImageStatus() const { return mImageStatus; }
inline nsresult GetResultFromImageStatus(PRUint32 aStatus) const;
void Cancel(nsresult aStatus);
nsresult GetURI(nsIURI **aURI);
+ nsresult GetKeyURI(nsIURI **aURI);
nsresult GetPrincipal(nsIPrincipal **aPrincipal);
nsresult GetSecurityInfo(nsISupports **aSecurityInfo);
void RemoveFromCache();
inline const char *GetMimeType() const {
return mContentType.get();
}
inline nsIProperties *Properties() {
return mProperties;
@@ -145,25 +157,32 @@ private:
void AdjustPriority(imgRequestProxy *aProxy, PRInt32 aDelta);
public:
NS_DECL_IMGILOAD
NS_DECL_IMGIDECODEROBSERVER
NS_DECL_IMGICONTAINEROBSERVER
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
+ NS_DECL_NSICHANNELEVENTSINK
+ NS_DECL_NSIINTERFACEREQUESTOR
private:
nsCOMPtr<nsIRequest> mRequest;
+ // The original URI we were loaded with.
nsCOMPtr<nsIURI> mURI;
+ // The URI we are keyed on in the cache.
+ nsCOMPtr<nsIURI> mKeyURI;
nsCOMPtr<nsIPrincipal> mPrincipal;
nsCOMPtr<imgIContainer> mImage;
nsCOMPtr<imgIDecoder> mDecoder;
nsCOMPtr<nsIProperties> mProperties;
nsCOMPtr<nsISupports> mSecurityInfo;
+ nsCOMPtr<nsIChannel> mChannel;
+ nsCOMPtr<nsIInterfaceRequestor> mPrevChannelSink;
nsTObserverArray<imgRequestProxy*> mObservers;
PRPackedBool mLoading;
PRPackedBool mProcessing;
PRPackedBool mHadLastPart;
PRUint32 mNetworkStatus;
PRUint32 mImageStatus;
--- a/modules/libpr0n/src/imgRequestProxy.cpp
+++ b/modules/libpr0n/src/imgRequestProxy.cpp
@@ -69,16 +69,17 @@ imgRequestProxy::imgRequestProxy() :
/* member initializers and constructor code */
}
imgRequestProxy::~imgRequestProxy()
{
/* destructor code */
NS_PRECONDITION(!mListener, "Someone forgot to properly cancel this request!");
+
// Explicitly set mListener to null to ensure that the RemoveProxy
// call below can't send |this| to an arbitrary listener while |this|
// is being destroyed. This is all belt-and-suspenders in view of the
// above assert.
NullOutListener();
if (mOwner) {
if (!mCanceled) {
@@ -92,18 +93,16 @@ imgRequestProxy::~imgRequestProxy()
Passing false to aNotify means that we will still get
OnStopRequest, if needed.
*/
mOwner->RemoveProxy(this, NS_OK, PR_FALSE);
}
}
}
-
-
nsresult imgRequestProxy::Init(imgRequest *request, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver)
{
NS_PRECONDITION(!mOwner && !mListener, "imgRequestProxy is already initialized");
NS_PRECONDITION(request, "no request");
if (!request)
return NS_ERROR_NULL_POINTER;
LOG_SCOPE_WITH_PARAM(gImgLog, "imgRequestProxy::Init", "request", request);
@@ -192,16 +191,18 @@ NS_IMETHODIMP imgRequestProxy::GetName(n
NS_IMETHODIMP imgRequestProxy::IsPending(PRBool *_retval)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
/* readonly attribute nsresult status; */
NS_IMETHODIMP imgRequestProxy::GetStatus(nsresult *aStatus)
{
+ // XXXbz this is wrong... Canceling with a status should make that
+ // status the status of the request, generally.
if (!mOwner)
return NS_ERROR_FAILURE;
*aStatus = mOwner->GetNetworkStatus();
return NS_OK;
}
@@ -210,21 +211,45 @@ NS_IMETHODIMP imgRequestProxy::Cancel(ns
{
if (mCanceled || !mOwner)
return NS_ERROR_FAILURE;
LOG_SCOPE(gImgLog, "imgRequestProxy::Cancel");
mCanceled = PR_TRUE;
+ nsCOMPtr<nsIRunnable> ev = new imgCancelRunnable(this, status);
+ return NS_DispatchToCurrentThread(ev);
+}
+
+void
+imgRequestProxy::DoCancel(nsresult status)
+{
// Passing false to aNotify means that mListener will still get
// OnStopRequest, if needed.
mOwner->RemoveProxy(this, status, PR_FALSE);
NullOutListener();
+}
+
+/* void cancelAndForgetObserver (in nsresult aStatus); */
+NS_IMETHODIMP imgRequestProxy::CancelAndForgetObserver(nsresult aStatus)
+{
+ if (mCanceled || !mOwner)
+ return NS_ERROR_FAILURE;
+
+ LOG_SCOPE(gImgLog, "imgRequestProxy::CancelAndForgetObserver");
+
+ mCanceled = PR_TRUE;
+
+ // Passing false to aNotify means that mListener will still get
+ // OnStopRequest, if needed.
+ mOwner->RemoveProxy(this, aStatus, PR_FALSE);
+
+ NullOutListener();
return NS_OK;
}
/* void suspend (); */
NS_IMETHODIMP imgRequestProxy::Suspend()
{
return NS_ERROR_NOT_IMPLEMENTED;
@@ -395,112 +420,114 @@ NS_IMETHODIMP imgRequestProxy::GetSecuri
}
/** imgIContainerObserver methods **/
void imgRequestProxy::FrameChanged(imgIContainer *container, gfxIImageFrame *newframe, nsIntRect * dirtyRect)
{
LOG_FUNC(gImgLog, "imgRequestProxy::FrameChanged");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->FrameChanged(container, newframe, dirtyRect);
}
}
/** imgIDecoderObserver methods **/
void imgRequestProxy::OnStartDecode()
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStartDecode");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStartDecode(this);
}
}
void imgRequestProxy::OnStartContainer(imgIContainer *image)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStartContainer");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStartContainer(this, image);
}
}
void imgRequestProxy::OnStartFrame(gfxIImageFrame *frame)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStartFrame");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStartFrame(this, frame);
}
}
void imgRequestProxy::OnDataAvailable(gfxIImageFrame *frame, const nsIntRect * rect)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnDataAvailable");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnDataAvailable(this, frame, rect);
}
}
void imgRequestProxy::OnStopFrame(gfxIImageFrame *frame)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStopFrame");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStopFrame(this, frame);
}
}
void imgRequestProxy::OnStopContainer(imgIContainer *image)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStopContainer");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStopContainer(this, image);
}
}
void imgRequestProxy::OnStopDecode(nsresult status, const PRUnichar *statusArg)
{
LOG_FUNC(gImgLog, "imgRequestProxy::OnStopDecode");
- if (mListener) {
+ if (mListener && !mCanceled) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStopDecode(this, status, statusArg);
}
}
void imgRequestProxy::OnStartRequest(nsIRequest *request, nsISupports *ctxt)
{
#ifdef PR_LOGGING
nsCAutoString name;
GetName(name);
LOG_FUNC_WITH_PARAM(gImgLog, "imgRequestProxy::OnStartRequest", "name", name.get());
#endif
+ // Notify even if mCanceled, since OnStartRequest is guaranteed by the
+ // nsIStreamListener contract so it makes sense to do the same here.
if (mListener) {
// Hold a ref to the listener while we call it, just in case.
nsCOMPtr<imgIDecoderObserver> kungFuDeathGrip(mListener);
mListener->OnStartRequest(this);
}
}
void imgRequestProxy::OnStopRequest(nsIRequest *request, nsISupports *ctxt,
--- a/modules/libpr0n/src/imgRequestProxy.h
+++ b/modules/libpr0n/src/imgRequestProxy.h
@@ -44,16 +44,17 @@
#include "imgIContainer.h"
#include "imgIDecoder.h"
#include "nsIRequestObserver.h"
#include "nsIChannel.h"
#include "nsILoadGroup.h"
#include "nsISupportsPriority.h"
#include "nsCOMPtr.h"
#include "nsAutoPtr.h"
+#include "nsThreadUtils.h"
#include "imgRequest.h"
#define NS_IMGREQUESTPROXY_CID \
{ /* 20557898-1dd2-11b2-8f65-9c462ee2bc95 */ \
0x20557898, \
0x1dd2, \
0x11b2, \
@@ -80,16 +81,38 @@ public:
// owner has already sent notifications out!
void AddToLoadGroup();
void RemoveFromLoadGroup(PRBool releaseLoadGroup);
protected:
friend class imgRequest;
+ class imgCancelRunnable;
+ friend class imgCancelRunnable;
+
+ class imgCancelRunnable : public nsRunnable
+ {
+ public:
+ imgCancelRunnable(imgRequestProxy* owner, nsresult status)
+ : mOwner(owner), mStatus(status)
+ {}
+
+ NS_IMETHOD Run() {
+ mOwner->DoCancel(mStatus);
+ return NS_OK;
+ }
+
+ private:
+ nsRefPtr<imgRequestProxy> mOwner;
+ nsresult mStatus;
+ };
+
+
+
/* non-virtual imgIDecoderObserver methods */
void OnStartDecode ();
void OnStartContainer(imgIContainer *aContainer);
void OnStartFrame (gfxIImageFrame *aFrame);
void OnDataAvailable (gfxIImageFrame *aFrame, const nsIntRect * aRect);
void OnStopFrame (gfxIImageFrame *aFrame);
void OnStopContainer (imgIContainer *aContainer);
void OnStopDecode (nsresult status, const PRUnichar *statusArg);
@@ -100,16 +123,19 @@ protected:
/* non-virtual nsIRequestObserver (plus some) methods */
void OnStartRequest(nsIRequest *request, nsISupports *ctxt);
void OnStopRequest(nsIRequest *request, nsISupports *ctxt, nsresult statusCode, PRBool aLastPart);
inline PRBool HasObserver() const {
return mListener != nsnull;
}
+ /* Finish up canceling ourselves */
+ void DoCancel(nsresult status);
+
/* Do the proper refcount management to null out mListener */
void NullOutListener();
private:
friend class imgCacheValidator;
// We maintain the following invariant:
// The proxy is registered at most with a single imgRequest as an observer,
--- a/modules/libpr0n/test/mochitest/Makefile.in
+++ b/modules/libpr0n/test/mochitest/Makefile.in
@@ -41,12 +41,15 @@ srcdir = @srcdir@
VPATH = @srcdir@
relativesrcdir = modules/libpr0n/test/mochitest
include $(DEPTH)/config/autoconf.mk
include $(topsrcdir)/config/rules.mk
_TEST_FILES = test_bug399925.html \
bug399925.gif \
+ bug468160.sjs \
+ test_bug468160.html \
+ red.png \
$(NULL)
libs:: $(_TEST_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
new file mode 100644
--- /dev/null
+++ b/modules/libpr0n/test/mochitest/bug468160.sjs
@@ -0,0 +1,6 @@
+function handleRequest(request, response)
+{
+ response.setStatusLine("1.1", 302, "Found");
+ response.setHeader("Location", "red.png", false);
+ response.setHeader("Cache-Control", "no-cache", false);
+}
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..aa9ce252631ec850b02009a4a2fe9dd5e79cf09f
GIT binary patch
literal 82
zc%17D@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2s6ii6yp7}lMWc?sn3c)B=-a9mIR
casB`U12ZEdgT&q54M1@QPgg&ebxsLQ0F+!45&!@I
new file mode 100644
--- /dev/null
+++ b/modules/libpr0n/test/mochitest/test_bug468160.html
@@ -0,0 +1,30 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=468160
+-->
+<head>
+ <title>Test for Bug 468160</title>
+ <script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=468160">Mozilla Bug 468160</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+<!-- bug468160.sjs does a simple redirect to a PNG image. As long as this
+ doesn't leak, this test passes. -->
+
+<object data="bug468160.sjs"></object>
+
+</div>
+<pre id="test">
+<script type="application/javascript">
+
+ok(true, "test passed");
+
+</script>
+</pre>
+</body>
+</html>
index 447d9e3012967bd903fe812cbc06c22bb6908837..4718c00e62be7745adce35b0247be33e6739ac54
GIT binary patch
literal 201
zc%17D@N?(olHy`uVBq!ia0vp^DIm<j1SJ1AFfjwE37#&FAr-gYUNGckVBk2g;ioyT
t*pG@?A&%LPyc%^PH>I3(q9=7<Y}1$5+TOAqD}iof@O1TaS?83{1OR3}Oy&Rp
--- a/modules/libpref/src/init/all.js
+++ b/modules/libpref/src/init/all.js
@@ -855,17 +855,17 @@ pref("intl.accept_charsets",
pref("intl.menuitems.alwaysappendaccesskeys","chrome://global/locale/intl.properties");
pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.static", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more1", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more3", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more4", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more5", "chrome://global/locale/intl.properties");
-pref("intl.charsetmenu.browser.unicode", "chrome://global/locale/intl.properties");
+pref("intl.charsetmenu.browser.unicode", "UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE");
pref("intl.charsetmenu.mailedit", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.cache", "");
pref("intl.charsetmenu.mailview.cache", "");
pref("intl.charsetmenu.composer.cache", "");
pref("intl.charsetmenu.browser.cache.size", 5);
pref("intl.charset.detector", "chrome://global/locale/intl.properties");
pref("intl.charset.default", "chrome://global-platform/locale/intl.properties");
pref("intl.ellipsis", "chrome://global-platform/locale/intl.properties");
index 05a47ad639cf5559a92e2be3ae366d49389f1998..bddeb5438aed8dca4d7f70f6cf62c388cb3997a3
GIT binary patch
literal 122368
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
--- a/parser/htmlparser/src/nsParser.cpp
+++ b/parser/htmlparser/src/nsParser.cpp
@@ -1699,16 +1699,23 @@ nsParser::ContinueParsing()
mFlags |= NS_PARSER_FLAG_PARSER_ENABLED;
return ContinueInterruptedParsing();
}
NS_IMETHODIMP
nsParser::ContinueInterruptedParsing()
{
+ // If there are scripts executing, then the content sink is jumping the gun
+ // (probably due to a synchronous XMLHttpRequest) and will re-enable us
+ // later, see bug 460706.
+ if (mScriptsExecuting) {
+ return NS_OK;
+ }
+
// If the stream has already finished, there's a good chance
// that we might start closing things down when the parser
// is reenabled. To make sure that we're not deleted across
// the reenabling process, hold a reference to ourselves.
nsresult result=NS_OK;
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
#ifdef DEBUG
--- a/security/manager/ssl/src/nsNSSCertHelper.cpp
+++ b/security/manager/ssl/src/nsNSSCertHelper.cpp
@@ -998,16 +998,19 @@ ProcessGeneralName(PRArenaPool *arena,
CERTGeneralName *current,
nsAString &text,
nsINSSComponent *nssComponent)
{
nsAutoString key;
nsXPIDLString value;
nsresult rv = NS_OK;
+ if (!current)
+ return NS_ERROR_NULL_POINTER;
+
switch (current->type) {
case certOtherName: {
SECOidTag oidTag = SECOID_FindOIDTag(¤t->name.OthName.oid);
if (oidTag == SEC_OID(MS_NT_PRINCIPAL_NAME)) {
/* The type of this name is apparently nowhere explicitly
documented. However, in the generated templates, it is always
UTF-8. So try to decode this as UTF-8; if that fails, dump the
raw data. */
--- a/testing/crashtest/crashtests.list
+++ b/testing/crashtest/crashtests.list
@@ -11,16 +11,17 @@ include ../../content/html/content/crash
include ../../content/svg/content/src/crashtests/crashtests.list
include ../../content/xml/content/crashtest/crashtests.list
include ../../content/xml/document/crashtests/crashtests.list
include ../../content/xbl/crashtests/crashtests.list
include ../../content/xslt/crashtests/crashtests.list
include ../../content/xul/content/crashtests/crashtests.list
include ../../content/xul/document/crashtests/crashtests.list
include ../../content/xul/templates/src/crashtests/crashtests.list
+include ../../content/mathml/content/crashtests/crashtests.list
include ../../docshell/base/crashtests/crashtests.list
include ../../dom/src/base/crashtests/crashtests.list
include ../../dom/src/offline/crashtests/crashtests.list
include ../../dom/src/jsurl/crashtests/crashtests.list
include ../../editor/libeditor/html/crashtests/crashtests.list
--- a/testing/mochitest/ssltunnel/ssltunnel.cpp
+++ b/testing/mochitest/ssltunnel/ssltunnel.cpp
@@ -224,17 +224,16 @@ bool ConnectSocket(PRFileDesc *fd, const
* port and then proxy data back and forth.
* The data parameter is a connection_info_t*, and must be deleted
* by this function.
*/
void HandleConnection(void* data)
{
connection_info_t* ci = static_cast<connection_info_t*>(data);
PRIntervalTime connect_timeout = PR_SecondsToInterval(2);
- PRIntervalTime short_timeout = PR_MillisecondsToInterval(250);
AutoFD other_sock(PR_NewTCPSocket());
bool client_done = false;
bool client_error = false;
bool connect_accepted = !do_http_proxy;
bool ssl_updated = !do_http_proxy;
string certificateToUse;
@@ -484,17 +483,17 @@ void StartServer(void* data)
}
// bogus password func, just don't use passwords. :-P
char* password_func(PK11SlotInfo* slot, PRBool retry, void* arg)
{
if (retry)
return NULL;
- return "";
+ return PL_strdup("");
}
server_info_t* findServerInfo(int portnumber)
{
for (vector<server_info_t>::iterator it = servers.begin();
it != servers.end(); it++)
{
if (it->listen_port == portnumber)
--- a/toolkit/components/places/src/nsPlacesDBFlush.js
+++ b/toolkit/components/places/src/nsPlacesDBFlush.js
@@ -85,16 +85,27 @@ function nsPlacesDBFlush()
getService(Ci.nsIObserverService);
this._os.addObserver(this, kQuitApplication, false);
this._prefs.QueryInterface(Ci.nsIPrefBranch2)
.addObserver("", this, false);
// Create our timer to update everything
this._timer = this._newTimer();
+
+ //////////////////////////////////////////////////////////////////////////////
+ //// Smart Getters
+
+ this.__defineGetter__("_db", function() {
+ delete this._db;
+ return this._db = Cc["@mozilla.org/browser/nav-history-service;1"].
+ getService(Ci.nsPIPlacesDatabase).
+ DBConnection;
+ });
+
}
nsPlacesDBFlush.prototype = {
//////////////////////////////////////////////////////////////////////////////
//// nsIObserver
observe: function DBFlush_observe(aSubject, aTopic, aData)
{
@@ -307,26 +318,16 @@ nsPlacesDBFlush.prototype = {
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIObserver,
Ci.nsINavBookmarkObserver,
Ci.nsITimerCallback,
Ci.mozIStorageStatementCallback,
])
};
-//////////////////////////////////////////////////////////////////////////////
-//// Smart Getters
-
-nsPlacesDBFlush.prototype.__defineGetter__("_db", function() {
- delete nsPlacesDBFlush._db;
- return nsPlacesDBFlush._db = Cc["@mozilla.org/browser/nav-history-service;1"].
- getService(Ci.nsPIPlacesDatabase).
- DBConnection;
-});
-
////////////////////////////////////////////////////////////////////////////////
//// Module Registration
let components = [nsPlacesDBFlush];
function NSGetModule(compMgr, fileSpec)
{
return XPCOMUtils.generateModule(components);
}
--- a/toolkit/components/places/tests/chrome/Makefile.in
+++ b/toolkit/components/places/tests/chrome/Makefile.in
@@ -52,17 +52,16 @@ include $(topsrcdir)/config/rules.mk
$(NULL)
_CHROME_FILES = \
test_329534.xul \
test_371798.xul \
test_342484.xul \
test_341972a.xul \
test_381357.xul \
- test_423060.xul \
$(NULL)
libs:: $(_HTTP_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/tests/$(relativesrcdir)
libs:: $(_CHROME_FILES)
$(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/chrome/$(relativesrcdir)
--- a/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js
+++ b/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js
@@ -69,20 +69,17 @@ var transitions = [ hs.TRANSITION_LINK,
hs.TRANSITION_REDIRECT_TEMPORARY,
hs.TRANSITION_DOWNLOAD ];
var observer = {
observe: function(aSubject, aTopic, aData) {
if (aTopic == kSyncFinished && this.visitId != -1) {
// remove the observer, we don't need to observe sync on quit
os.removeObserver(this, kSyncFinished);
- dump("\n\n");
- dump_table("moz_places_temp");
- dump_table("moz_places");
- dump("\n\n");
+
// Check that moz_places table has been correctly synced
var stmt = dbConn.createStatement(
"SELECT id FROM moz_places WHERE url = :url");
stmt.params["url"] = TEST_URI;
do_check_true(stmt.executeStep());
stmt.finalize();
stmt = dbConn.createStatement(
"SELECT id FROM moz_places_temp WHERE url = :url");
@@ -130,17 +127,17 @@ var observer = {
do_check_true(stmt.executeStep());
stmt.finalize();
stmt = dbConn.createStatement(
"SELECT id FROM moz_historyvisits_temp h WHERE visit_type <> :t_embed");
stmt.params["t_embed"] = hs.TRANSITION_EMBED;
do_check_false(stmt.executeStep());
stmt.finalize();
- do_test_finished();
+ finish_test();
}
}
}
function run_test()
{
// First set the preference for the timer to a small value
prefs.setIntPref(kSyncPrefName, SYNC_INTERVAL);
--- a/toolkit/content/tests/widgets/test_videocontrols.html
+++ b/toolkit/content/tests/widgets/test_videocontrols.html
@@ -6,91 +6,87 @@
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<p id="display"></p>
<div id="content">
- <video width="320" height="240" id="video" src="video.ogg" controls></video>
+ <video width="320" height="240" id="video" src="video.ogg" controls mozNoDynamicControls></video>
</div>
<pre id="test">
<script class="testbody" type="text/javascript">
-var testnum = 1;
-var video = document.getElementById("video");
-
function runTest(event) {
ok(true, "----- test #" + testnum + " -----");
switch (testnum) {
case 1:
// Check initial state upon load
- is(event.type, "load", "checking event type");
+ is(event.type, "loadeddata", "checking event type");
is(video.paused, true, "checking video play state");
is(video.muted, false, "checking video mute state");
- // Let the fadein happen
- synthesizeMouse(video, 12, 228, { type : "mouseover" });
- setTimeout(runTest, 0, { type: "setTimeout" });
- break;
-
- case 2:
- is(event.type, "setTimeout", "checking event type");
// Click the play button
synthesizeMouse(video, 12, 228, { });
break;
- case 3:
+ case 2:
is(event.type, "play", "checking event type");
is(video.paused, false, "checking video play state");
is(video.muted, false, "checking video mute state");
// Click the pause button
synthesizeMouse(video, 12, 228, { });
break;
- case 4:
+ case 3:
is(event.type, "pause", "checking event type");
is(video.paused, true, "checking video play state");
is(video.muted, false, "checking video mute state");
// Click the mute button
// XXX volume event is sent synchronously, so do this in a timeout
setTimeout("synthesizeMouse(video, 308, 228, { });", 0);
break;
- case 5:
+ case 4:
is(event.type, "volumechange", "checking event type");
is(video.paused, true, "checking video play state");
is(video.muted, true, "checking video mute state");
// Click the unmute button
// XXX volume event is sent synchronously, so do this in a timeout
setTimeout("synthesizeMouse(video, 308, 228, { });", 0);
break;
- case 6:
+ case 5:
is(event.type, "volumechange", "checking event type");
is(video.paused, true, "checking video play state");
is(video.muted, false, "checking video mute state");
SimpleTest.finish();
break;
default:
- throw "unexpected test #" + testnum + " w/ event " + event.name;
+ throw "unexpected test #" + testnum + " w/ event " + event.type;
}
testnum++;
}
-window.onload = runTest;
+var testnum = 1;
+var video = document.getElementById("video");
+
+// Kick off test once we've got enough to do something.
+video.addEventListener("loadeddata", runTest, false);
+
+// Other events expected by the test.
video.addEventListener("play", runTest, false);
video.addEventListener("pause", runTest, false);
video.addEventListener("volumechange", runTest, false);
SimpleTest.waitForExplicitFinish();
</script>
</pre>
--- a/toolkit/content/widgets/videocontrols.xml
+++ b/toolkit/content/widgets/videocontrols.xml
@@ -9,22 +9,20 @@
<binding id="videoControls">
<resources>
<stylesheet src="chrome://global/skin/media/videocontrols.css"/>
</resources>
<xbl:content xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<spacer flex="1"/>
- <hbox id="controlsBackground">
- <image id="playButton"
- onclick="if (event.button == 0) this.parentNode.parentNode.Utils.togglePause();"/>
- <box id="controlsMiddle" flex="1"/>
- <image id="muteButton"
- onclick="if (event.button == 0) this.parentNode.parentNode.Utils.toggleMute();"/>
+ <hbox class="controlBar">
+ <button class="playButton" oncommand="this.parentNode.parentNode.Utils.togglePause();"/>
+ <box class="controlsMiddle" flex="1"/>
+ <button class="muteButton" oncommand="this.parentNode.parentNode.Utils.toggleMute();"/>
</hbox>
</xbl:content>
<implementation implements="nsISecurityCheckedComponent">
<!-- nsISecurityCheckedComponent -->
<method name="canCreateWrapper">
<parameter name="aIID"/>
<body>
@@ -72,26 +70,39 @@
this.init();
]]>
</constructor>
<field name="Utils">
<![CDATA[ ({
debug : false,
video : null,
- controls : null,
+ controlBar : null,
playButton : null,
muteButton : null,
- animationSteps : 8,
- animationStep : 0,
- animationDirection : 1,
- animationTimer : null,
- dynamicHideControls : true,
+ FADE_TIME_MAX : 200, // ms
+ FADE_TIME_STEP : 30, // ms
+
+ fadeTime : 0, // duration of active fade animation
+ fadingIn: true, // are we fading in, or fading out?
+ fadeTimer : null,
+ controlsVisible : false,
+ get dynamicControls() {
+ // Don't fade controls for <audio> elements.
+ var enabled = this.video instanceof HTMLVideoElement;
+
+ // Allow tests to explicitly suppress the fading of controls.
+ if (this.video.hasAttribute("mozNoDynamicControls"))
+ enabled = false;
+
+ return enabled;
+ },
+
handleEvent : function (aEvent) {
this.log("Got " + aEvent.type + " media event");
switch (aEvent.type) {
case "play":
this.playButton.setAttribute("paused", false);
break;
case "pause":
case "ended":
@@ -100,32 +111,81 @@
case "volumechange":
this.muteButton.setAttribute("muted", this.video.muted);
break;
default:
this.log("!!! event " + aEvent.type + " not handled!");
}
},
- fadeControls : function (self) {
- self.log("fadeControls @" + self.animationStep);
- self.animationStep += self.animationDirection;
+ onMouseInOut : function (event) {
+ if (!this.dynamicControls)
+ return;
+
+ var isMouseOver = (event.type == "mouseover");
+
+ // Ignore events caused by transitions between child nodes.
+ if (this.isChildNode(event.target) &&
+ this.isChildNode(event.relatedTarget))
+ return;
+
+ // Don't show controls when they're disabled, but do allow a
+ // mouseout to hide controls that were disabled after being shown.
+ if (!this.video.controls && (isMouseOver || !this.controlsVisible))
+ return;
+
+ this.log("Fading controls " + (isMouseOver ? "in" : "out"));
+
+ var directionChange = (isMouseOver != this.fadingIn);
+ this.fadingIn = isMouseOver;
+
+ // When switching direction mid-fade, adjust fade time for current fade state.
+ if (directionChange && this.fadeTime)
+ this.fadeTime = this.FADE_TIME_MAX - this.fadeTime;
+
+ if (!this.fadeTimer)
+ this.fadeTimer = setInterval(this.fadeControls, this.FADE_TIME_STEP, this);
- if (self.animationStep <= 0) {
- self.animationStep = 0;
- clearInterval(self.animationTimer);
- self.animationTimer = null;
- } else if (self.animationStep >= self.animationSteps) {
- self.animationStep = self.animationSteps;
- clearInterval(self.animationTimer);
- self.animationTimer = null;
+ // If we're fading in, immediately make the controls clickable.
+ // Otherwise they might not activate until the first fadeTimer
+ // fires, which is hard to test reliably.
+ if (this.fadingIn)
+ this.controlBar.style.visibility = "visible";
+ },
+
+ fadeControls : function (self, lateness) {
+ // Update elapsed time, and compute position as a percent
+ // of total. Last frame could run over, so clamp to 1.
+ self.fadeTime += self.FADE_TIME_STEP + lateness;
+ var pos = self.fadeTime / self.FADE_TIME_MAX;
+ if (pos > 1)
+ pos = 1;
+
+ // Calculate the opacity for our position in the animation.
+ var opacity;
+ if (self.fadingIn)
+ opacity = Math.pow(pos, 0.5);
+ else
+ opacity = Math.pow(1 - pos, 0.5);
+ self.controlsVisible = (opacity ? true : false);
+
+ self.controlBar.style.opacity = opacity;
+
+ // Use .visibility to ignore mouse clicks when hidden.
+ if (self.controlsVisible)
+ self.controlBar.style.visibility = "visible";
+ else
+ self.controlBar.style.visibility = "hidden";
+
+ // Is the animation done?
+ if (pos == 1) {
+ clearInterval(self.fadeTimer);
+ self.fadeTimer = null;
+ self.fadeTime = 0;
}
-
- // XXX might be good to do logarithmic steps, maybe use timer error too (for smoothness)?
- self.controls.style.opacity = self.animationStep / self.animationSteps;
},
togglePause : function () {
if (this.video.paused)
this.video.play();
else
this.video.pause();
@@ -139,47 +199,46 @@
// We'll handle style changes in the event listener for
// the "volumechange" event, same as if content script was
// controlling volume.
},
isChildNode : function (node) {
while (node) {
- if (node == this.controls)
+ if (node == this.video)
break;
node = node.parentNode;
}
- return (node == this);
+ return (node == this.video);
},
log : function (msg) {
if (this.debug)
dump("videoctl: " + msg + "\n");
}
}) ]]>
</field>
<method name="init">
<body>
<![CDATA[
var video = this.parentNode;
this.Utils.video = video;
- this.Utils.controls = this;
- // We shouldn't dynamically hide the controls for audio elements
- this.Utils.dynamicHideControls = video instanceof HTMLVideoElement;
- this.Utils.playButton = document.getAnonymousElementByAttribute(this, "id", "playButton");
- this.Utils.muteButton = document.getAnonymousElementByAttribute(this, "id", "muteButton");
+ this.Utils.controlBar = document.getAnonymousElementByAttribute(this, "class", "controlBar");
+ this.Utils.playButton = document.getAnonymousElementByAttribute(this, "class", "playButton");
+ this.Utils.muteButton = document.getAnonymousElementByAttribute(this, "class", "muteButton");
// Set initial state of play/pause button.
this.Utils.playButton.setAttribute("paused", video.paused);
-
- if (this.Utils.dynamicHideControls) {
- this.style.opacity = 0;
+ // Controls are initially faded out and hidden (to ignore mouse clicks)
+ if (this.Utils.dynamicControls) {
+ this.Utils.controlBar.style.opacity = 0;
+ this.Utils.controlBar.style.visibility = "hidden";
}
// Use Utils.handleEvent() callback for all media events.
video.addEventListener("play", this.Utils, false);
video.addEventListener("pause", this.Utils, false);
video.addEventListener("ended", this.Utils, false);
video.addEventListener("volumechange", this.Utils, false);
@@ -187,41 +246,16 @@
]]>
</body>
</method>
</implementation>
<handlers>
<handler event="mouseover">
- <![CDATA[
- if (!this.Utils.dynamicHideControls)
- return;
-
- // Ignore events caused by transitions between child nodes.
- if (this.Utils.isChildNode(event.relatedTarget))
- return;
-
- // XXX add support for dynamically hiding controls w/o waiting for mouseout?
-
- this.Utils.animationDirection = 1;
- if (!this.Utils.animationTimer)
- this.Utils.animationTimer = setInterval(this.Utils.fadeControls, 50, this.Utils);
- ]]>
+ this.Utils.onMouseInOut(event);
</handler>
-
<handler event="mouseout">
- <![CDATA[
- if (!this.Utils.dynamicHideControls)
- return;
-
- // Ignore events caused by transitions between child nodes.
- if (this.Utils.isChildNode(event.relatedTarget))
- return;
-
- this.Utils.animationDirection = -1;
- if (!this.Utils.animationTimer)
- this.Utils.animationTimer = setInterval(this.Utils.fadeControls, 50, this.Utils);
- ]]>
+ this.Utils.onMouseInOut(event);
</handler>
</handlers>
</binding>
</bindings>
--- a/toolkit/crashreporter/client/crashreporter.cpp
+++ b/toolkit/crashreporter/client/crashreporter.cpp
@@ -304,16 +304,22 @@ static bool AddSubmittedReport(const str
if (reportFile->is_open()) {
// don't really care about the contents
*reportFile << 1 << "\n";
reportFile->close();
}
delete reportFile;
}
+ if (responseItems.find("Discarded") != responseItems.end()) {
+ // server discarded this report... save it so the user can resubmit it
+ // manually
+ return false;
+ }
+
if (responseItems.find("CrashID") == responseItems.end())
return false;
string submittedDir =
gSettingsPath + UI_DIR_SEPARATOR + "submitted";
if (!UIEnsurePathExists(submittedDir)) {
return false;
}
@@ -352,23 +358,22 @@ void DeleteDump()
if (!noDelete || *noDelete == '\0') {
if (!gDumpFile.empty())
UIDeleteFile(gDumpFile);
if (!gExtraFile.empty())
UIDeleteFile(gExtraFile);
}
}
-bool SendCompleted(bool success, const string& serverResponse)
+void SendCompleted(bool success, const string& serverResponse)
{
if (success) {
- DeleteDump();
- return AddSubmittedReport(serverResponse);
+ if (AddSubmittedReport(serverResponse))
+ DeleteDump();
}
- return true;
}
bool ShouldEnableSending()
{
srand(time(0));
return ((rand() % 100) < MOZ_CRASHREPORTER_ENABLE_PERCENT);
}
--- a/toolkit/crashreporter/client/crashreporter.h
+++ b/toolkit/crashreporter/client/crashreporter.h
@@ -79,17 +79,17 @@ namespace CrashReporter {
extern StringTable gStrings;
extern std::string gSettingsPath;
extern int gArgc;
extern char** gArgv;
void UIError(const std::string& message);
// The UI finished sending the report
- bool SendCompleted(bool success, const std::string& serverResponse);
+ void SendCompleted(bool success, const std::string& serverResponse);
bool ReadStrings(std::istream& in,
StringTable& strings,
bool unescape);
bool ReadStringsFromFile(const std::string& path,
StringTable& strings,
bool unescape);
bool WriteStrings(std::ostream& out,
--- a/toolkit/crashreporter/tools/symbolstore.py
+++ b/toolkit/crashreporter/tools/symbolstore.py
@@ -686,17 +686,20 @@ class Dumper_Mac(Dumper):
by dsymutil(1), so run dsymutil here and pass the bundle name
down to the superclass method instead."""
dsymbundle = file + ".dSYM"
if os.path.exists(dsymbundle):
shutil.rmtree(dsymbundle)
# dsymutil takes --arch=foo instead of -a foo like everything else
os.system("dsymutil %s %s >/dev/null" % (' '.join([a.replace('-a ', '--arch=') for a in self.archs]),
file))
- return Dumper.ProcessFile(self, dsymbundle)
+ res = Dumper.ProcessFile(self, dsymbundle)
+ if not self.copy_debug:
+ shutil.rmtree(dsymbundle)
+ return res
# Entry point if called as a standalone program
def main():
parser = OptionParser(usage="usage: %prog [options] <dump_syms binary> <symbol store path> <debug info files>")
parser.add_option("-c", "--copy",
action="store_true", dest="copy_debug", default=False,
help="Copy debug info files into the same directory structure as symbol files")
parser.add_option("-a", "--archs",
--- a/toolkit/locales/en-US/chrome/global/intl.properties
+++ b/toolkit/locales/en-US/chrome/global/intl.properties
@@ -23,17 +23,15 @@ font.language.group=x-western
# "ja-jp, ja, en-us, en"
intl.accept_languages=en-us, en
intl.charsetmenu.browser.static=ISO-8859-1, UTF-8
intl.charsetmenu.browser.more1=ISO-8859-1, ISO-8859-15, IBM850, x-mac-roman, windows-1252, ISO-8859-14, ISO-8859-7, x-mac-greek, windows-1253, x-mac-icelandic, ISO-8859-10, ISO-8859-3
intl.charsetmenu.browser.more2=ISO-8859-4, ISO-8859-13, windows-1257, IBM852, ISO-8859-2, x-mac-ce, windows-1250, x-mac-croatian, IBM855, ISO-8859-5, ISO-IR-111, KOI8-R, x-mac-cyrillic, windows-1251, IBM866, KOI8-U, x-mac-ukrainian, ISO-8859-16, x-mac-romanian
intl.charsetmenu.browser.more3=GB2312, x-gbk, gb18030, HZ-GB-2312, ISO-2022-CN, Big5, Big5-HKSCS, x-euc-tw, EUC-JP, ISO-2022-JP, Shift_JIS, EUC-KR, x-windows-949, x-johab, ISO-2022-KR
intl.charsetmenu.browser.more4=armscii-8, GEOSTD8, TIS-620, ISO-8859-11, windows-874, IBM857, ISO-8859-9, x-mac-turkish, windows-1254, x-viet-tcvn5712, VISCII, x-viet-vps, windows-1258, x-mac-devanagari, x-mac-gujarati, x-mac-gurmukhi
intl.charsetmenu.browser.more5=ISO-8859-6, windows-1256, IBM864, x-mac-arabic, x-mac-farsi, ISO-8859-8-I, windows-1255, ISO-8859-8, IBM862, x-mac-hebrew
-# Localization Note: Never change the following entry.
-intl.charsetmenu.browser.unicode=UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE
intl.charset.default=ISO-8859-1
intl.charset.detector=
intl.charsetmenu.mailedit=ISO-8859-1, ISO-8859-15, ISO-8859-6, armscii-8, geostd8, ISO-8859-13, ISO-8859-14, ISO-8859-2, GB2312, GB18030, Big5, KOI8-R, windows-1251, KOI8-U, ISO-8859-7, ISO-8859-8-I, windows-1255, ISO-2022-JP, EUC-KR, ISO-8859-10, ISO-8859-3, TIS-620, ISO-8859-9, UTF-8, VISCII
# valid intl.menuitems.appendedacceskeys are: true or false, <empty string> (missing or empty preference equals false)
intl.menuitems.alwaysappendaccesskeys=
# valid intl.menuitems.insertseparatorbeforeaccesskeys are: true or false, <empty string> (missing or empty preference equals false)
intl.menuitems.insertseparatorbeforeaccesskeys=true
--- a/toolkit/locales/en-US/crashreporter/crashes.dtd
+++ b/toolkit/locales/en-US/crashreporter/crashes.dtd
@@ -1,7 +1,7 @@
<!ENTITY crashes.title "Submitted Crash Reports">
<!ENTITY id.heading "Report ID">
<!ENTITY date.heading "Date Submitted">
<!ENTITY noReports.label "No crash reports have been submitted.">
<!ENTITY noConfig.label "This application has not been configured to display crash reports. The preference <code>breakpad.reportURL</code> must be set.">
-<!ENTITY clearReports.label "Remove Reports">
+<!ENTITY clearReports.label "Remove All Reports">
--- a/toolkit/mozapps/installer/package-name.mk
+++ b/toolkit/mozapps/installer/package-name.mk
@@ -82,31 +82,34 @@ endif # 5.1
endif # 6.
endif # OS_ARCH BeOS
endif #MOZ_PKG_PLATFORM
ifdef MOZ_PKG_SPECIAL
MOZ_PKG_PLATFORM := $(MOZ_PKG_PLATFORM)-$(MOZ_PKG_SPECIAL)
endif
+MOZ_PKG_DIR = $(MOZ_APP_NAME)
ifndef MOZ_PKG_PRETTYNAMES # standard package names
ifndef MOZ_PKG_APPNAME
MOZ_PKG_APPNAME = $(MOZ_APP_NAME)
endif
PKG_BASENAME = $(MOZ_PKG_APPNAME)-$(MOZ_PKG_VERSION).$(AB_CD).$(MOZ_PKG_PLATFORM)
PKG_PATH =
PKG_INST_BASENAME = $(PKG_BASENAME).installer
PKG_INST_PATH = install/sea/
PKG_UPDATE_BASENAME = $(PKG_BASENAME)
PKG_UPDATE_PATH = update/
+COMPLETE_MAR = $(PKG_UPDATE_PATH)$(PKG_UPDATE_BASENAME).complete.mar
PKG_LANGPACK_BASENAME = $(MOZ_PKG_APPNAME)-$(MOZ_PKG_VERSION).$(AB_CD).langpack
PKG_LANGPACK_PATH = install/
+LANGPACK = $(PKG_LANGPACK_PATH)$(PKG_LANGPACK_BASENAME).xpi
PKG_SRCPACK_BASENAME = $(MOZ_PKG_APPNAME)-$(MOZ_PKG_VERSION).source
PKG_SRCPACK_PATH =
else # "pretty" release package names
ifndef MOZ_PKG_APPNAME
MOZ_PKG_APPNAME = $(MOZ_APP_DISPLAYNAME)
endif
@@ -131,14 +134,16 @@ else # unix (actually, not Windows, Mac
PKG_BASENAME = $(MOZ_PKG_APPNAME_LC)-$(MOZ_PKG_VERSION)
PKG_INST_BASENAME = $(MOZ_PKG_APPNAME_LC)-setup-$(MOZ_PKG_VERSION)
endif
endif
PKG_PATH = $(MOZ_PKG_PLATFORM)/$(AB_CD)/
PKG_INST_PATH = $(PKG_PATH)
PKG_UPDATE_BASENAME = $(MOZ_PKG_APPNAME_LC)-$(MOZ_PKG_VERSION)
PKG_UPDATE_PATH = update/$(PKG_PATH)
+COMPLETE_MAR = $(PKG_UPDATE_PATH)$(PKG_UPDATE_BASENAME).complete.mar
PKG_LANGPACK_BASENAME = $(AB_CD)
-PKG_LANGPACK_PATH = langpack/
+PKG_LANGPACK_PATH = $(MOZ_PKG_PLATFORM)/xpi/
+LANGPACK = $(PKG_LANGPACK_PATH)$(PKG_LANGPACK_BASENAME).xpi
PKG_SRCPACK_BASENAME = $(MOZ_PKG_APPNAME_LC)-$(MOZ_PKG_VERSION).source
PKG_SRCPACK_PATH = source/
endif # MOZ_PKG_PRETTYNAMES
--- a/toolkit/mozapps/installer/packager.mk
+++ b/toolkit/mozapps/installer/packager.mk
@@ -69,18 +69,16 @@ endif
endif
INSTALLER_DIR = unix
endif
endif
endif # MOZ_PKG_FORMAT
PACKAGE = $(PKG_PATH)$(PKG_BASENAME)$(PKG_SUFFIX)
-MOZ_PKG_DIR = $(MOZ_APP_NAME)
-
# By default, the SDK uses the same packaging type as the main bundle,
# but on mac it is a .tar.bz2
SDK_SUFFIX = $(PKG_SUFFIX)
SDK = $(PKG_PATH)$(PKG_BASENAME).sdk$(SDK_SUFFIX)
MAKE_PACKAGE = $(error What is a $(MOZ_PKG_FORMAT) package format?);
CREATE_FINAL_TAR = $(TAR) -c --owner=0 --group=0 --numeric-owner \
--- a/toolkit/mozapps/installer/windows/nsis/makensis.mk
+++ b/toolkit/mozapps/installer/windows/nsis/makensis.mk
@@ -77,13 +77,9 @@ installer::
# For building the uninstaller during the application build so it can be
# included for mar file generation.
uninstaller::
$(INSTALL) $(addprefix $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/,$(TOOLKIT_NSIS_FILES)) $(CONFIG_DIR)
$(INSTALL) $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/setup.ico $(CONFIG_DIR)
cd $(CONFIG_DIR) && makensis.exe uninstaller.nsi
$(NSINSTALL) -D $(DIST)/bin/uninstall
-ifdef MOZ_SUNBIRD
- cp $(CONFIG_DIR)/uninst.exe $(DIST)/bin/uninstall
-else
cp $(CONFIG_DIR)/helper.exe $(DIST)/bin/uninstall
-endif
--- a/toolkit/profile/skin/profileSelection.css
+++ b/toolkit/profile/skin/profileSelection.css
@@ -38,15 +38,20 @@
@import url("chrome://global/skin/global.css");
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#profiles > listitem {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
+#profiles > listitem > listcell > image {
+ width: 16px;
+ height: 16px;
+}
+
box#managebuttons > button {
min-width: 8em;
}
#managebuttons {
padding-top: 1em;
}
--- a/toolkit/themes/gnomestripe/global/autocomplete.css
+++ b/toolkit/themes/gnomestripe/global/autocomplete.css
@@ -132,17 +132,17 @@ treechildren.autocomplete-treebody::-moz
.autocomplete-treebody::-moz-tree-image(treecolAutoCompleteValue) {
max-width: 16px;
height: 16px;
}
/* ::::: richlistbox autocomplete ::::: */
.autocomplete-richlistbox {
- margin: 0;
+ margin: 1px;
background-color: transparent;
}
.autocomplete-richlistitem[selected="true"] {
background-color: Highlight;
color: HighlightText;
}
index 4767a4f362e525f920a524b9a5406c96803b690b..05277b65082ad54e62bff29201098e2ec057d221
GIT binary patch
literal 659
zc$@)~0&M+>P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00007bV*G`2iO7?
z5)n7scrh*j000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA0w765
zK~zXfy_8E!8&MdBRgelIMHj_|3a+}V;3Yw0CbyZyOA@V3e}ky)#*JGSt(Qm;gk~#>
z;6~Jy;J;88qF5CbHOXWY5fm@v^Sp=5ko!c(_JfBrb8^n}o-dP0Ny-1Hso?Lbnb6dD
zXf~*@Ycc{HaIxzuEdUeSJ6lhQM1qVK9B{#@1t1k4%r7ibv$>tVw3^-o_QC-doLT@{
zLt#N*;2ZV7g5EwKb=U+AI8bnA1>h7?kC&w0;%T#3vpOjl&>tA!UGPr6s|0f58~93{
z4tpB90fH!zO>&b>Ovf$(Pa3&SuN%<i^HR6pM^{&IK5Af|(c=f0^OE3llGW)*LpQ+G
zDR9hIfrntsMN7LS>*Pgs;PiON>2_-%#Kq<^v56w<z?Fq=Kq`=@-Z!<GIhpG+DHvdv
zL=NQYb!w?|`Opn`5Ap`!Ep)K&-3SHW<heg#!~aEaWCoO~0q<GKfKmih;O6o1fj`){
zuofGmRe6+;xWB)@Qv)gxP&+*{aib_Q9Ubk{!NKmU37_~Wc-qRx!^1r~J3Apb;YL8?
zkDo(Jo0}WY(dY$TUn|Lz$s9$AapG|hC0UMeVzEmN>;sX=IUOJWrM2~yCph6oz^A(U
zI$?NZaCvh2*DYEz0vvF`2{!^hFlrbLjL(cFhKbR^uoMZ_Vh{Gh0T-Nb^Cw-#C{IpQ
tGCne@lZ%Q0Yq1A=;eZQH{ww;Y^#W*CP-ahq7C!(0002ovPDHLkV1nH{8rJ{-
index 01fb204fd6be02c981df6565e5fc0ef91ffe747c..6f3687d0ac4c6a5dd0ab5a63992769f30eb3d1f0
GIT binary patch
literal 757
zc$@+C0t)?!P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00007bV*G`2iO4^
z4<{)JUk?@l000JJOGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K0)k0I
zK~y+Tol#j&6Hyp#O#C0b`QWR+!T4?rfmXu<5f!5e5FrwU$YN>PiY28R)3S?N5m_vY
z$^!}vrC=A9mQrX1G7N<oTRN23<GqawRMf<WlgZ?sbH4MPPX<7C8kDN43j`JdcWr%5
zoP3=GMuPLld8Y}_5>yyWx~*_Hv=EEMcuA5Fmkzec|GZAG-68Kq1ZVzaQ1Qk-<cjQz
z(NgmVPVso;NM1b(d6oUBoSEX{QbOqKw=EG~;co^sw!x^|;v+&-p&X0nHGhQa<szDg
zeXzU@;8C{|SyguFFp=2PHfwmoKbLM`S>FgQRCco59sLXn7-!1h>Es5cR(Lr45vZTL
zpzLyRs{#KE;VaV(+=8&r-_=bXs{0mE-s47Dj|;D6!tia12<^l$<k&=xYWy%771s!V
z?1TYrTl^xTz%UK-SO86fE2w<tftIY$&xSEDy9w*N0CLphNlA)J#2}cSz)2Ep-)Go_
zZ7PJ0i6FE?K2*Q(qT%&&stbzinh8k|_WXoDoNi$Bdfls98=EwZ_%KK&w!aTTGq8-Z
zZZ|4=J-BCPVHosm6CO)1cEaG+?HhTTC-q5ghevtGEcEsj^pXM%BYr4tUgWn-qtGxd
zk~O);raF3sjGy8wnU^nR$ukd1AC$miZ3V}1Fb&KlA9gsTVyh!r%&@Vx(WTFVC~%!!
z?Li{WrMeU1woV47))o|(6rrK9HtC$7TaH9_*GS{i?k?|ldtB`I$tiKlfQT>t5Stl2
z>Kar~T+5E%%+JfEcc!PJZPUW&&NTM%wPo3gOpdV{$>d*Rn&>#`Z;;8aW__wrSAYE<
nams)QGN=hnLf1(r{0rXzrYP3${U=-N00000NkvXXu0mjf*6&!3
index 68df4b03cde2f453463a26dc26b43acae65ba4c2..f4c4d9e396d5fbcb22faaa747d549394dad60554
GIT binary patch
literal 3846
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
IM6N<$f>B*lasU7T
index b53603f7a770c914ac24ea00df448d26c658ee3b..cceed403e544492ee757a93e2e2936ff082406c6
GIT binary patch
literal 1498
zc$@*+1tt24P)<h;3K|Lk000e1NJLTq000mG001Be1^@s68;SVL00007bV*G`2iO4>
z3J?>k^=zg9000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA1!qY_
zK~zY`jg@_DQ)Lv!pL^S`YqyoLjdij)_6dv)lsQJHh&aKI2&fnpf`CSeE{g$_s9`SA
z3<Uf`W7Gr#N=y(m{((vqb$nz3@|6+U=wM@8#|B&5^}D@o@3-gHZ43eRByZmKrqAy=
z?>XnaWpIn|UVu4m%E2@_-o~o3Gh)v9D2&?#bCb9o<w=$$OHI}fGUJ}jjKMsY)0<{F
zA@%mCqN7cp(KK{hK+uj<8HQ#{iM@>Xe?Ea_jWC#PF@_NaAv!u$skc>?297H-*KEu^
zs@?=3_g%?Z8`l`p9@UGXy_y)hqyj*4K&1t-*R9BbBZ?gPi6HyU1?RajfY*+4hRr^c
zUTQbTTyH~XEJy&Lct*vv4}ye{W$tI%_oWtH+{27>UuUv5eW*{aU?uJl3@J9S`V10k
z?!AdD6gjMkX^&{2Z)trw2Jl_LQY2M>KcVmdqY8GgIwMrE=ek&OC)`KG+VX-;-@%M)
z-BLwK{!Wq$k}`_FKvK$7sPPsku@-_{880099EIMp{I}~FbQsT?QY)$y<MVKLe*!uR
ztkX6@&juk!_Ce;mp(xiO&=*6Lr(R=5+$$K?blPHl+00tr1n=Gmzxy(V9G$QhJ_~Ef
zb99_@kiz>RiF6c&N0Q}5be`HBW&U<g*<(z5aJeaKgAPg<N@O=gQ9+y+G2GXUpl29U
z?p}=v*4dCE2cfDALjIWA*LL6(L++UjlRRL#bC*e%vKVrBCsp1~?emk9N)QEHI0BcW
zgPs|YQ~CgO`egK;+Z*L$(K(FIZhFUHdAuPdXL~YWfExV~syqm2iy&HP*+e)QzM)nj
z>Ua0YICWT&(J*ffjxxTEG-p~ti&ZO{HZZDiiNr$$xkfuJ#YYGgvgC)yc_JiAa#6ut
zc*pL7ufx)nJgKqRl(~T=FA{`E?4sWHLlL{^Q5$_9M#SI3QT6LHE7Y%UxJ*=o5=NK4
zN0kHBx4NApp)!o&>x^=7)qh@REt=k|XIHGO*Snn8z;R*u;YXIq|NDJF;*`?TnVAb0
zJ!v?8>=)$b70Om?t`H1*<AH!La{v6tgxdnPG`*$+*jcaEZ8EpEp3oZ%2IS=xC=`4!
z;Ee@>zHm6?4?g|OTK_Ep<UY+-v(Q>xT*lb#t(q9=6SF{Kkh`{v@p#lP2yvev2%eYL
zz9lo`Q#YGaE9>eT*~5o^z{H7}TKb4ZIZ*lu02c{@=Xs0(+^^I%xW)r=7c5v@l5L#~
zM{j3BY&M%o>_@=wK``V8ACHX!XbHmtA0HYI$jr&fuUN6N4xV8rwDbG@nzIL?pik?@
zc(JyNMx*IQ0L$vjQ&ZEKr<Sck)}$N^^!Fr|=1y)2fGF~b&l+S#d8L00uyymg%A7m$
z(x#VH;@I!a$j+XOhZZe?Bnh}k1@(E|;01ov9qH*=uvjv9X0(6?y`i#d&V07oR*S>U
z`!P6p6<7KkxM$9NsH(abF6RI`JKGb56h#qt&91@G!@nvCz_#~aFDopXHpynIWi)zw
z`&n|9C{+Ph2m0aj`7m#OE%Nh=(9>;CWXy3K&Yn3LV#wW~*XeCbo>;|}mX_oEpC{q*
zIO#nQhe~%=5G8Wu(AU=s`W?z<%!DDyh(C@UQDU)JE3<9O`Y9!)75Ox}EW_#&4&iVx
zk*WsKLd%Aa^VHtUY9J7Z(-A~fQ5~P|_$I(?-}*+)>KE20X+_f}&g*q0TBboF;Q(UP
zdo8qq>gwu{33htR)}7+mC=;NXE{MriQ%ipua-zZs0JYBR9j2KWL^K*fPfw>z?YrFg
z?q{wWE)&(jL<2FM=VKQ9OVEtC8X7;o^v~yi0bW2xdNQy8ZvX%Q07*qoM6N<$f(viN
An*aa+
index deed18f3345b5d1ea2bf7fa903ae093fc61404cd..b928454d4e42d6043ef628e47e53879109e165f0
GIT binary patch
literal 1173
zc$@*11Zw+<P)<h;3K|Lk000e1NJLTq000mG001Be1^@s68;SVL00007bV*G`2iO7@
z3nVHV4X986000JJOGiWi000000Qp0^e*gdg32;bRa{vGh*8l(w*8xH(n|J^K1R_a9
zK~zY`jg)O{Q&kwpf9GW#(9t<&*R_KVS(&0?A{dAni3z9}{eZ?OiG)pji+(Us5wb`k
z20;qjK*Bcx{X`79s38UtO(r9nEOR(OL0Z-hB{0~?*6!u5t@qygVO!~Fkv++ib5G8>
z|MUFM%TEC8Zv6BarPSx9X;zRYq?BnPL`rMjkxVAHHEh}X^OOlqdw2Kt_1{SUUqqta
z=|BEFo8Et5?@05$J<S<$0Mj(f-S?Ieid-PneSW-+Tp*m4XU?3)>+?~+VWU$@`F3#6
z&NUf<$xu?FltxK~R%-lvB83tp#>POv%G#APb%EXvpr;6^$*w?%>=A+2>!YKy9n-X#
z@1Kut*^lH3NCiUBH(;>utKT_ysSgA!t@iNV`eg*FoEXL!ix)pk+o_WUxfYb7KbGK)
z9mnyM$JzW^l8@h6PN1rvSGJ!Zt(^G%er6QTz_KiYdv*$WyM^W>r&+tYn-vd5xE6mF
zQ(R?5%}LfheU;`TohYToO$m_(L{0@~LpSi2xo8hP$Bn@RMKf9%Nw}C--pA>S*U@T<
z>!|`#j;kmBU5S6rAx1{~>A6}$f#}9aEYB=5Q2}|6aY?m@U%G~wJ@X2_l6E>TKEcSS
zlT%$zmM!vTPAabjDHU5^f1JO<*Et`3lv$3aSTxr~YsYHNU5K&m%~hESCN1dO?mU&=
zduVBVnVpAD^3$)K04#lQ0mnXDMTOgS>(7Y_rtXLk2qCES7IW~U=aCbAA!KGOdu~Rc
zprD{PJ{0#ByNa1kj2fc=gFs3HSeCW%i!TozOr=uurX%2RIIh{Y{Z_-4t!WLAw&ZU%
z;w5ZVcn2OJgs`>N!^vdw^84>@j@^1CKvPrGV|8_P4!7HV$5o@zD28Fs+S+QFrrEn`
z)22u^4;*f{n{YTxC=?<b4(DW7R~J5?kNWz0C8hKQgTXmD7fDKqQYzDCr<9Vhu`vK@
zYip&}dVU@rOueSrN9Of<>FDUdvMeeqE3s|6D6fDJf`NenTE0C-cl0s<)qw@P_`+HO
zfdGbKP*YPwTU(pR%Y(sKoZZa_a5yAuo~)&Q!#YYzirCe-AFVZhzn{XwLM+Q7ufW$W
z-*f-M3Ot@-W;#o;Z4;#uEU5`_^qcSQ@*0(*I})X|v;@<hMJzr<Z*LD$YP7ZqU5cRf
zE!V+dFc&BQvuBqwaPuExg99Xz7O~h(N=qy5&I2hW3#;zqVmL}NIgFMjqXwkYf>5}J
z2dV>i7pSjWPfyR^NLfUgXD;(9Du@rK>A8G`S2xz(&VyV5Z@GtEJGKE1j-U9EV?P|n
zIjfk);3t%O$})Q}!2|O0pxjf&hYcTO`q_CW9;Akbh8!-JYg#-o3<JPyXlSq}c@R2$
n_;7V9l`5Pj4^p;mhXMWrm2s-G2~V$c00000NkvXXu0mjf9Q+zB
index 0bf6442598e664630ac012103c4764e873c5d086..241d86b175c46f1150deec2b1ad4fe47cfad45f2
GIT binary patch
literal 1323
zc$@(%1=RY9P)<h;3K|Lk000e1NJLTq001BW000mO1^@s6cL04^00007bV*G`2iO7@
z4m1V))kU)a000JJOGiWi000000Qp0^e*gdg32;bRa{vGf6951U69E94oEQKA1h`2=
zK~zY`eU)8|Rn-;8e{1c1?!Da0z}0f;Fu+`9ifAh+qBSxmrL9(@@`N$*!Nh2yuQkDE
zpNu|@niyk6qS3@O7VAUPU>a=|Y%XARgpPcK4=*r|BEyHn%>6!RFCWewW+--ca&kVh
zlK*f2*MF}g%(I5J`c>k1jldlU0r<!QPgREF@tK-c_dmbFd;h06j_(%{=_%xJPBAku
zFf)P~03ihG%{FG3_kM32$4~hA02URBJDz#u&D;8Zwu)w_#s?#BZ~5yduP+CNW@?=G
zuiUk1{e8Et8<e-+`<SO5y_d0X&oO#rjLE4w0E>I_th-?)EBco3{)Z#ncFXlLdieCl
ze^(A{n-^fZIoW%zewxbI4r=WmC>PhOApLV|k~rRc>$*XG@1F-LmX`9`yPxp8jcXaY
z{Z|xwasW(DH<`FF#r7S$sJCI^_!PffvyxrAzt}i0KuB!(qmdoYU(;L21xpw?vb&ii
z;o1KwQ&k~J5(WoXa^z5xeFsl7JvGhLrD*_)#U7figbg>Z=2&$C?*vr<#Q#L!e=o`#
z7AOOZojp;%ZuJA01-=^nAONopZS}8;a>@dae|H2#1Q8(@IkLGdH>_EOQ^7gGtKd}l
zZ2#BvEiH25)C7@J%mjd|07TjTz@~@Fy`>c-p+h@q<^TKbzeqyDraSJ*t2hA8oEtCi
z+WU{~04nK~jT9$BE~7Y|6?ZDAKrT{LgviNdy{iB$Fi<KjW#_S%=X^|WpPqgP3x*jC
zl^?_c1CS<NMN$EUtao@fEACWK6*AtTlD-=u1sK}u`_;=|3fV;~rfQSV0d%BJl+`N$
zEQMoHb_u2Y08x~(3xXl2%nD>9y)5jz;xpex!8?V}ZGk$5w?6d3?Q6>$W#stBFa3G<
z3-z{5<$YF}G0H53$onG8{5t#ci!Y}?y|^bQ!ZdIVX6eo&MfFO6xh=?aTi_H-Q(L_m
zcaOLC%i*It33Q^N-~KwPPJd36QDzBJh^2*<9H{KCO`JdbN8nu`0h-cvV5Y}e?|uS6
z$T~#@qPY$L+6b38SsS5L=*K&U%Yau!WYz%-pb^v>H31G*hT}TGFE#^`o`kdo=}zZ{
zP`g*;6_NBA={g`PdrqA^`G;k_H)-|Ism8@0s&?l+H|JaR3+b->VhVaKAsDUBC04KP
z%N`o3?z;171m(<`Luo!#Ao8gL8K+l-5nDhwzBGsiH*_QZkF{qNW)10k_tj2BHi
zxJW5v7SsN2VX|l6@dm(}Tl(?~mz&@4^L|gqv3KXuvROLg4TzIKz=%U2n2?yDA$2DN
zqtS{9!H6y3Nki@{!|@pKn>mB%#dc@_kkLH<sT^<CYppGSe6_Fo{`&iR3zu3KSRlo2
zJd6;a69>*uwP<$&-(PHYhtq6~8tsH{&Npbqfo3bAko!M_$VE~eKXGngNx4MaGU~Nf
zzA_wt2r%?CxlX4;BstEGO`@JENV(Q*>4xi<(X$}Kje{k!8P`Qivl9&Zdy51!mX{XM
zvmm0;ZX+V$Du58%V~0Qc=FOyH0|4q6yF4X@iIKmb=><?vH6%Rdy?^-SZGU^x%(PoG
h@9O@UQ*rON{Rp7O^?w_g;>Q30002ovPDHLkV1kMCY%Tx*
index f5344b854a22d879afecaa7900143dbc816d0ce4..dd70ee1b8e3dcf7f270b57a67ec5b01038f31442
GIT binary patch
literal 1822
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
M07*qoM6N<$g1VGtVgLXD
index bdee2418559a9fd3278c29adc80093752f060661..a53a2729777cd1813050c0807bd4e55cff2dc2f7
GIT binary patch
literal 10541
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
index e6e6d74f8a851c39c60c5bc1aedf8273a18dd50c..920e7cc108b804bcd409982024d754f29a3d96c4
GIT binary patch
literal 774
zc$@(S1Nr=kP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00007bV*G`2iO7@
z4m1Rd(sd;O000JJOGiWi000000Qp0^e*gdg32;bRa{vGh*8l(w*8xH(n|J^K0+UHZ
zK~y-)jgo6flVKFc{qWAq5*sN<c_~X0t>{A;=(aTT7LsLG4IHRB&Ag><-f&Y0GYyi=
zJ|w7=AIu?^nQr9L=6vVc0?RK^Fbsu)C^0p|)PLvQyg^I+@MDLw^Zed(p656KaQGjg
zh0GqIoY4r2m}#MmnIcq_^V(SBu$drM;bCGwKF9d?F?{$sg1fz0OCmXs-Lim+C%Q))
zaYrjbRbM<>Sp~#$$H^@VsNMYB=J0uCZyYLK#Da?{m$|8c3L<FMary;ELXFQ{gDw;I
zUQ4a<YJR0A;vWJ1VX5v(LbFkZCPO|N_1BQm5rC`h{-_^Jvx+#%I^#Hr#a;(!GUnkz
zoAWx4ZJdAPjB~9{NN90F-K#6sPPhZUqGH}ijKY1A;w&!t;7vM`RQz>1_(&u!xAT$S
z<%=>+80v>4Hi1aasJhGz%b&iP@x)NKaQ61jxq4$FlDl0YSt0ou@zfO=J>IBP$1R_!
z-t|)~b6lYP_`%IQb)QW`_3$a&9F9b-F&=qZf26A2kg8dM;*>r&ROmwJBE4ql%P9n(
zaN-2hb^42tYCKV{4@QkS1_eX@kPZltF=&H})3pL94IzkD3TElxv9)KU`PJEN!Ar{i
zC`cae|8=_7W3FcOB(AeNkYjL%%(NGkZ;wJ@I)W1R0J2m;f5J;$=BfSPwC3a7CHjbq
zc{&nJgcdRR+{N5_e;m0c50t*!heGw?#h5C=3`b6P(2|@DM1d{<1==9nCE9z&s?lJp
zKsj~@k&10x%TYx1iE@|O8+t#az1)uM{@wNk;u4-k+UbWfb0Esi2f3o<HF*)Um_6W)
z%zjT?Y7szGY-f>ZwlEsWvbwVL%%3-G>6f)U9VTJeUpi(=dp2qr^Z)<=07*qoM6N<$
Eg7;--BLDyZ
index f7191d091894686eda9eaed051a8480195b85199..124abf1d00377648f06fdf0ef2e4778c78300853
GIT binary patch
literal 1920
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
GLSTX`ajQ1~
--- a/toolkit/themes/pinstripe/global/jar.mn
+++ b/toolkit/themes/pinstripe/global/jar.mn
@@ -169,17 +169,20 @@ classic.jar:
+ skin/classic/global/icons/sslWarning.png (icons/sslWarning.png)
+ skin/classic/global/icons/white-checkbox-active.png (icons/white-checkbox-active.png)
+ skin/classic/global/icons/white-checkbox-checked.png (icons/white-checkbox-checked.png)
+ skin/classic/global/icons/white-checkbox.png (icons/white-checkbox.png)
+ skin/classic/global/notification/critical-bar-background.png (notification/critical-bar-background.png)
+ skin/classic/global/notification/info-bar-background.png (notification/info-bar-background.png)
+ skin/classic/global/notification/warning-bar-background.png (notification/warning-bar-background.png)
+ skin/classic/global/media/videocontrols.css (media/videocontrols.css)
-+ skin/classic/global/media/videocontrols.png (media/videocontrols.png)
++ skin/classic/global/media/pauseButton.png (media/pauseButton.png)
++ skin/classic/global/media/playButton.png (media/playButton.png)
++ skin/classic/global/media/muteButton.png (media/muteButton.png)
++ skin/classic/global/media/unmuteButton.png (media/unmuteButton.png)
+ skin/classic/global/menu/menu-arrow-dis.gif (menu/menu-arrow-dis.gif)
+ skin/classic/global/menu/menu-arrow-hov.gif (menu/menu-arrow-hov.gif)
+ skin/classic/global/menu/menu-arrow.gif (menu/menu-arrow.gif)
+ skin/classic/global/menu/menu-arrow-dis-rtl.gif (menu/menu-arrow-dis-rtl.gif)
+ skin/classic/global/menu/menu-arrow-hov-rtl.gif (menu/menu-arrow-hov-rtl.gif)
+ skin/classic/global/menu/menu-arrow-rtl.gif (menu/menu-arrow-rtl.gif)
+ skin/classic/global/menu/menu-check-dis.gif (menu/menu-check-dis.gif)
+ skin/classic/global/menu/menu-check-dis.png (menu/menu-check-dis.png)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0e3556cb2bb5f772a96c73fc0a931ced1e0df3b5
GIT binary patch
literal 236
zc$@+302BX-P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00029Nkl<ZNXKJH
zO-}w#OUy88!Kei|aYkC&|H+dk(Z+(DtgQdnu3h_o?8p)7TToU~^8fks=l?-~VhbAT
z>i+NByBBN_41f6W;Xe$(Ea>a){l9(NHqtBr1;f{`U;pC+FbhhGivIuj@dNBTqAlp@
z>iSOzAP3Q<3m5-Soib$*SwQn3!WPMwE?&fH0a=lZ3(uM{6YN^5BvV|twx;I)lP6DT
mX8|mZXjW8=7T2Q|pkM%7@KCs&iZ<{70000<MNUMnLSTZ}y=pB0
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..965b67ad024e65115973324f98cd8defbcc5448f
GIT binary patch
literal 135
zc%17D@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjex5FlAs)w*J$(KC`Fo!+$U1mo
z!-BnAzt;PQi%UFz{_N1v#3Y3|Qzts^W6i&}=O;h2!r_ERCl)MPlXImhklRgHVr#=P
ju?u@PNUtqu+s4YUa7(U$0fU%0&}0TrS3j3^P6<r_-4!uP
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6d5da15efefe2e4d547c1566933fbe077f2223da
GIT binary patch
literal 176
zc%17D@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj<(@8%As)w*J$(KC`Fo!+$U1mo
zgMzkl^ENS?`hS1wbA5T=>M%6Q+t>Y>Z<s6fR;Quy?d@%U&wF?;p3ACG@b=c$|E)iN
zZrRMha&K?-_x($E&MXsaIIuo`|3Cex4GA4l4wn@cWvX1(nR&@%@x?tW7E~shM?K`p
a<z~1s&nl>kv8)~F1O`u6KbLh*2~7Z0??@N`
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e0c9bc12d1fb20be60e18a5669144fc251be74af
GIT binary patch
literal 205
zc$@*v05boHP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0001#Nkl<ZNXKJH
zO-}w#OUy88!Kei|ae7MX|K`Rf+E|d4k@0{1+I9bzELu!`3kve`{_onc^Z&^cCn>j}
ztfch+{JHbM2Ep)weFwmXQ)~e!7!Dsg1UC#DrpSW2np(Vu4}J@19z@t8dCjWT)U^N`
z?r3ZKf8_8H+F1a?rNzbncWmE5I}2cOM6;q|w74F%00jd82>l`CKj|+A00000NkvXX
Hu0mjf<jPjc
--- a/toolkit/themes/pinstripe/global/media/videocontrols.css
+++ b/toolkit/themes/pinstripe/global/media/videocontrols.css
@@ -1,23 +1,33 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
-#controlsBackground {
+.controlBar {
height: 24px;
background-color: #656363;
}
-#playButton {
- list-style-image: url(chrome://global/skin/media/videocontrols.png);
- -moz-image-region: rect(0px, 48px, 24px, 24px);
+.playButton {
+ background: url(chrome://global/skin/media/pauseButton.png) no-repeat center;
+ /* Remove the native button appearance and styling */
+ -moz-appearance: none;
+ margin: 0px;
+ padding: 0px;
+ min-height: 24px;
+ min-width: 24px;
}
-#playButton[paused="true"] {
- -moz-image-region: rect(0px, 24px, 24px, 0px);
+.playButton[paused="true"] {
+ background: url(chrome://global/skin/media/playButton.png) no-repeat center;
}
-#muteButton{
- list-style-image: url(chrome://global/skin/media/videocontrols.png);
- -moz-image-region: rect(24px, 24px, 48px, 0px);
+.muteButton {
+ background: url(chrome://global/skin/media/muteButton.png) no-repeat center;
+ /* Remove the native button appearance and styling */
+ -moz-appearance: none;
+ margin: 0px;
+ padding: 0px;
+ min-height: 24px;
+ min-width: 24px;
}
-#muteButton[muted="true"] {
- -moz-image-region: rect(24px, 48px, 48px, 24px);
+.muteButton[muted="true"] {
+ background: url(chrome://global/skin/media/unmuteButton.png) no-repeat center;
}
deleted file mode 100644
index 4a54c4697c6d8ebe5361e174940208a2f93dae33..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css
+++ b/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css
@@ -38,15 +38,20 @@
@import url("chrome://global/skin/global.css");
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#profiles > listitem {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
+#profiles > listitem > listcell > image {
+ width: 16px;
+ height: 16px;
+}
+
box#managebuttons > button {
min-width: 8em;
}
#managebuttons {
padding-top: 1em;
}
--- a/toolkit/themes/winstripe/global/jar.mn
+++ b/toolkit/themes/winstripe/global/jar.mn
@@ -141,17 +141,20 @@ classic.jar:
skin/classic/global/icons/warning-24.png (icons/warning-24.png)
skin/classic/global/icons/warning-64.png (icons/warning-64.png)
skin/classic/global/icons/warningBar-30.png (icons/warningBar-30.png)
skin/classic/global/icons/warningBar-60.png (icons/warningBar-60.png)
skin/classic/global/icons/warningBarIcon-16.png (icons/warningBarIcon-16.png)
skin/classic/global/icons/warningGhosted-64.png (icons/warningGhosted-64.png)
skin/classic/global/icons/wrap.png (icons/wrap.png)
skin/classic/global/media/videocontrols.css (media/videocontrols.css)
- skin/classic/global/media/videocontrols.png (media/videocontrols.png)
+ skin/classic/global/media/pauseButton.png (media/pauseButton.png)
+ skin/classic/global/media/playButton.png (media/playButton.png)
+ skin/classic/global/media/muteButton.png (media/muteButton.png)
+ skin/classic/global/media/unmuteButton.png (media/unmuteButton.png)
skin/classic/global/radio/radio-check.gif (radio/radio-check.gif)
skin/classic/global/radio/radio-check-dis.gif (radio/radio-check-dis.gif)
skin/classic/global/scrollbar/slider.gif (scrollbar/slider.gif)
skin/classic/global/splitter/grip-hrz-after.gif (splitter/grip-hrz-after.gif)
skin/classic/global/splitter/grip-hrz-before.gif (splitter/grip-hrz-before.gif)
skin/classic/global/splitter/grip-vrt-after.gif (splitter/grip-vrt-after.gif)
skin/classic/global/splitter/grip-vrt-before.gif (splitter/grip-vrt-before.gif)
skin/classic/global/toolbar/chevron.gif (toolbar/chevron.gif)
@@ -308,17 +311,20 @@ classic.jar:
skin/classic/aero/global/icons/warning-24.png (icons/warning-24-aero.png)
skin/classic/aero/global/icons/warning-64.png (icons/warning-64-aero.png)
skin/classic/aero/global/icons/warningBar-30.png (icons/warningBar-30-aero.png)
skin/classic/aero/global/icons/warningBar-60.png (icons/warningBar-60-aero.png)
skin/classic/aero/global/icons/warningBarIcon-16.png (icons/warningBarIcon-16-aero.png)
skin/classic/aero/global/icons/warningGhosted-64.png (icons/warningGhosted-64-aero.png)
skin/classic/aero/global/icons/wrap.png (icons/wrap-aero.png)
skin/classic/aero/global/media/videocontrols.css (media/videocontrols.css)
- skin/classic/aero/global/media/videocontrols.png (media/videocontrols.png)
+ skin/classic/aero/global/media/pauseButton.png (media/pauseButton.png)
+ skin/classic/aero/global/media/playButton.png (media/playButton.png)
+ skin/classic/aero/global/media/muteButton.png (media/muteButton.png)
+ skin/classic/aero/global/media/unmuteButton.png (media/unmuteButton.png)
skin/classic/aero/global/radio/radio-check.gif (radio/radio-check.gif)
skin/classic/aero/global/radio/radio-check-dis.gif (radio/radio-check-dis.gif)
skin/classic/aero/global/scrollbar/slider.gif (scrollbar/slider.gif)
skin/classic/aero/global/splitter/grip-hrz-after.gif (splitter/grip-hrz-after.gif)
skin/classic/aero/global/splitter/grip-hrz-before.gif (splitter/grip-hrz-before.gif)
skin/classic/aero/global/splitter/grip-vrt-after.gif (splitter/grip-vrt-after.gif)
skin/classic/aero/global/splitter/grip-vrt-before.gif (splitter/grip-vrt-before.gif)
skin/classic/aero/global/toolbar/chevron.gif (toolbar/chevron.gif)
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0e3556cb2bb5f772a96c73fc0a931ced1e0df3b5
GIT binary patch
literal 236
zc$@+302BX-P)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv00029Nkl<ZNXKJH
zO-}w#OUy88!Kei|aYkC&|H+dk(Z+(DtgQdnu3h_o?8p)7TToU~^8fks=l?-~VhbAT
z>i+NByBBN_41f6W;Xe$(Ea>a){l9(NHqtBr1;f{`U;pC+FbhhGivIuj@dNBTqAlp@
z>iSOzAP3Q<3m5-Soib$*SwQn3!WPMwE?&fH0a=lZ3(uM{6YN^5BvV|twx;I)lP6DT
mX8|mZXjW8=7T2Q|pkM%7@KCs&iZ<{70000<MNUMnLSTZ}y=pB0
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..965b67ad024e65115973324f98cd8defbcc5448f
GIT binary patch
literal 135
zc%17D@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gjex5FlAs)w*J$(KC`Fo!+$U1mo
z!-BnAzt;PQi%UFz{_N1v#3Y3|Qzts^W6i&}=O;h2!r_ERCl)MPlXImhklRgHVr#=P
ju?u@PNUtqu+s4YUa7(U$0fU%0&}0TrS3j3^P6<r_-4!uP
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..6d5da15efefe2e4d547c1566933fbe077f2223da
GIT binary patch
literal 176
zc%17D@N?(olHy`uVBq!ia0vp^5+KaM1|%Pp+x`Gj<(@8%As)w*J$(KC`Fo!+$U1mo
zgMzkl^ENS?`hS1wbA5T=>M%6Q+t>Y>Z<s6fR;Quy?d@%U&wF?;p3ACG@b=c$|E)iN
zZrRMha&K?-_x($E&MXsaIIuo`|3Cex4GA4l4wn@cWvX1(nR&@%@x?tW7E~shM?K`p
a<z~1s&nl>kv8)~F1O`u6KbLh*2~7Z0??@N`
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e0c9bc12d1fb20be60e18a5669144fc251be74af
GIT binary patch
literal 205
zc$@*v05boHP)<h;3K|Lk000e1NJLTq000;O000;W1^@s6;CDUv0001#Nkl<ZNXKJH
zO-}w#OUy88!Kei|ae7MX|K`Rf+E|d4k@0{1+I9bzELu!`3kve`{_onc^Z&^cCn>j}
ztfch+{JHbM2Ep)weFwmXQ)~e!7!Dsg1UC#DrpSW2np(Vu4}J@19z@t8dCjWT)U^N`
z?r3ZKf8_8H+F1a?rNzbncWmE5I}2cOM6;q|w74F%00jd82>l`CKj|+A00000NkvXX
Hu0mjf<jPjc
--- a/toolkit/themes/winstripe/global/media/videocontrols.css
+++ b/toolkit/themes/winstripe/global/media/videocontrols.css
@@ -1,23 +1,35 @@
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
-#controlsBackground {
+.controlBar {
height: 24px;
background-color: #656363;
}
-#playButton {
- list-style-image: url(chrome://global/skin/media/videocontrols.png);
- -moz-image-region: rect(0px, 48px, 24px, 24px);
+.playButton {
+ background: url(chrome://global/skin/media/pauseButton.png) no-repeat center;
+ /* Remove the native button appearance and styling */
+ -moz-appearance: none;
+ margin: 0px;
+ padding: 0px;
+ min-height: 24px;
+ min-width: 24px;
+ border: none;
}
-#playButton[paused="true"] {
- -moz-image-region: rect(0px, 24px, 24px, 0px);
+.playButton[paused="true"] {
+ background: url(chrome://global/skin/media/playButton.png) no-repeat center;
}
-#muteButton{
- list-style-image: url(chrome://global/skin/media/videocontrols.png);
- -moz-image-region: rect(24px, 24px, 48px, 0px);
+.muteButton {
+ background: url(chrome://global/skin/media/muteButton.png) no-repeat center;
+ /* Remove the native button appearance and styling */
+ -moz-appearance: none;
+ margin: 0px;
+ padding: 0px;
+ min-height: 24px;
+ min-width: 24px;
+ border: none;
}
-#muteButton[muted="true"] {
- -moz-image-region: rect(24px, 48px, 48px, 24px);
+.muteButton[muted="true"] {
+ background: url(chrome://global/skin/media/unmuteButton.png) no-repeat center;
}
deleted file mode 100644
index 4a54c4697c6d8ebe5361e174940208a2f93dae33..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/toolkit/themes/winstripe/mozapps/profile/profileSelection.css
+++ b/toolkit/themes/winstripe/mozapps/profile/profileSelection.css
@@ -38,15 +38,20 @@
@import url("chrome://global/skin/global.css");
@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#profiles > listitem {
list-style-image: url("chrome://mozapps/skin/profile/profileicon.png");
}
+#profiles > listitem > listcell > image {
+ width: 16px;
+ height: 16px;
+}
+
box#managebuttons > button {
min-width: 8em;
}
#managebuttons {
padding-top: 1em;
}
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2532,16 +2532,19 @@ XRE_main(int argc, char* argv[], const n
if (gtkModules && *gtkModules) {
nsCString gtkModulesStr(gtkModules);
gtkModulesStr.ReplaceSubstring("atk-bridge", "");
char* expr = PR_smprintf("GTK_MODULES=%s", gtkModulesStr.get());
if (expr)
PR_SetEnv(expr);
// We intentionally leak |expr| here since it is required by PR_SetEnv.
}
+
+ // Suppress atk-bridge init at startup, it works after GNOME 2.24.2
+ PR_SetEnv("NO_AT_BRIDGE=1");
#endif
#ifndef WINCE
// Unbuffer stdout, needed for tinderbox tests.
setbuf(stdout, 0);
#endif
#if defined(FREEBSD)
--- a/tools/update-packaging/Makefile.in
+++ b/tools/update-packaging/Makefile.in
@@ -59,17 +59,17 @@ ifneq (,$(filter %/l10n-stage,$(PACKAGE_
PACKAGE_DIR = $(PACKAGE_BASE_DIR)/$(MOZ_PKG_APPNAME)/$(MOZ_APP_DISPLAYNAME).app
else
PACKAGE_DIR = $(PACKAGE_BASE_DIR)/universal/$(MOZ_PKG_APPNAME)/$(MOZ_APP_DISPLAYNAME).app
endif
else
PACKAGE_DIR = $(PACKAGE_BASE_DIR)/$(MOZ_PKG_APPNAME)/$(MOZ_APP_DISPLAYNAME).app
endif
else
-PACKAGE_DIR = $(PACKAGE_BASE_DIR)/$(MOZ_PKG_APPNAME)
+PACKAGE_DIR = $(PACKAGE_BASE_DIR)/$(MOZ_PKG_DIR)
endif
MAR_BIN = $(DIST)/host/bin/mar$(HOST_BIN_SUFFIX)
MBSDIFF_BIN = $(DIST)/host/bin/mbsdiff$(HOST_BIN_SUFFIX)
full-update:: complete-patch
complete-patch::
--- a/widget/src/cocoa/nsMenuItemIconX.mm
+++ b/widget/src/cocoa/nsMenuItemIconX.mm
@@ -93,17 +93,17 @@ nsMenuItemIconX::nsMenuItemIconX(nsMenuO
{
// printf("Creating icon for menu item %d, menu %d, native item is %d\n", aMenuItem, aMenu, aNativeMenuItem);
}
nsMenuItemIconX::~nsMenuItemIconX()
{
if (mIconRequest)
- mIconRequest->Cancel(NS_BINDING_ABORTED);
+ mIconRequest->CancelAndForgetObserver(NS_BINDING_ABORTED);
}
nsresult
nsMenuItemIconX::SetupIcon()
{
NS_OBJC_BEGIN_TRY_ABORT_BLOCK_NSRESULT;
--- a/widget/src/gtk2/nsFilePicker.cpp
+++ b/widget/src/gtk2/nsFilePicker.cpp
@@ -35,16 +35,19 @@
*
* ***** END LICENSE BLOCK ***** */
#include <gtk/gtkwindow.h>
#include <gtk/gtkdialog.h>
#include <gtk/gtkstock.h>
#include <gtk/gtkmessagedialog.h>
#include <gtk/gtkimage.h>
+#include <gtk/gtkfilechooser.h>
+#include <gtk/gtkfilechooserdialog.h>
+#include <gtk/gtkmisc.h>
#include "nsIFileURL.h"
#include "nsIURI.h"
#include "nsIWidget.h"
#include "nsILocalFile.h"
#include "nsIStringBundle.h"
#include "nsArrayEnumerator.h"
@@ -55,94 +58,20 @@
#include "mozcontainer.h"
#include "prmem.h"
#include "prlink.h"
#include "nsFilePicker.h"
#include "nsAccessibilityHelper.h"
-#define DECL_FUNC_PTR(func) static _##func##_fn _##func
-#define GTK_FILE_CHOOSER(widget) ((GtkFileChooser*) widget)
-
#define MAX_PREVIEW_SIZE 180
-PRLibrary *nsFilePicker::mGTK24 = nsnull;
nsILocalFile *nsFilePicker::mPrevDisplayDirectory = nsnull;
-// XXX total ass. We should really impose a build-time requirement on gtk2.4
-// and then check at run-time whether the user is actually running gtk2.4.
-// We should then decide to load the component (or not) from the component mgr.
-// We don't really have a mechanism to do that, though....
-
-typedef struct _GtkFileChooser GtkFileChooser;
-typedef struct _GtkFileFilter GtkFileFilter;
-
-/* Copied from gtkfilechooser.h */
-typedef enum
-{
- GTK_FILE_CHOOSER_ACTION_OPEN,
- GTK_FILE_CHOOSER_ACTION_SAVE,
- GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
- GTK_FILE_CHOOSER_ACTION_CREATE_FOLDER
-} GtkFileChooserAction;
-
-
-typedef gchar* (*_gtk_file_chooser_get_filename_fn)(GtkFileChooser *chooser);
-typedef GSList* (*_gtk_file_chooser_get_filenames_fn)(GtkFileChooser *chooser);
-typedef gchar* (*_gtk_file_chooser_get_uri_fn)(GtkFileChooser *chooser);
-typedef GSList* (*_gtk_file_chooser_get_uris_fn)(GtkFileChooser *chooser);
-typedef GtkWidget* (*_gtk_file_chooser_dialog_new_fn)(const gchar *title,
- GtkWindow *parent,
- GtkFileChooserAction action,
- const gchar *first_button_text,
- ...);
-typedef void (*_gtk_file_chooser_set_select_multiple_fn)(GtkFileChooser* chooser, gboolean truth);
-typedef void (*_gtk_file_chooser_set_do_overwrite_confirmation_fn)(GtkFileChooser* chooser, gboolean do_confirm);
-typedef void (*_gtk_file_chooser_set_current_name_fn)(GtkFileChooser* chooser, const gchar* name);
-typedef void (*_gtk_file_chooser_set_current_folder_fn)(GtkFileChooser* chooser, const gchar* folder);
-typedef void (*_gtk_file_chooser_add_filter_fn)(GtkFileChooser* chooser, GtkFileFilter* filter);
-typedef void (*_gtk_file_chooser_set_filter_fn)(GtkFileChooser* chooser, GtkFileFilter* filter);
-typedef GtkFileFilter* (*_gtk_file_chooser_get_filter_fn)(GtkFileChooser* chooser);
-typedef GSList* (*_gtk_file_chooser_list_filters_fn)(GtkFileChooser* chooser);
-typedef GtkFileFilter* (*_gtk_file_filter_new_fn)();
-typedef void (*_gtk_file_filter_add_pattern_fn)(GtkFileFilter* filter, const gchar* pattern);
-typedef void (*_gtk_file_filter_set_name_fn)(GtkFileFilter* filter, const gchar* name);
-typedef char* (*_gtk_file_chooser_get_preview_filename_fn)(GtkFileChooser *chooser);
-typedef void (*_gtk_file_chooser_set_preview_widget_active_fn)(GtkFileChooser *chooser, gboolean active);
-typedef void (*_gtk_image_set_from_pixbuf_fn)(GtkImage *image, GdkPixbuf *pixbuf);
-typedef void (*_gtk_file_chooser_set_preview_widget_fn)(GtkFileChooser *chooser, GtkWidget *preview_widget);
-typedef GtkWidget* (*_gtk_image_new_fn)();
-typedef void (*_gtk_misc_set_padding_fn)(GtkMisc *misc, gint xpad, gint ypad);
-typedef void (*_gtk_file_chooser_set_local_only_fn)(GtkFileChooser *chooser, gboolean local_only);
-
-DECL_FUNC_PTR(gtk_file_chooser_get_filename);
-DECL_FUNC_PTR(gtk_file_chooser_get_filenames);
-DECL_FUNC_PTR(gtk_file_chooser_get_uri);
-DECL_FUNC_PTR(gtk_file_chooser_get_uris);
-DECL_FUNC_PTR(gtk_file_chooser_dialog_new);
-DECL_FUNC_PTR(gtk_file_chooser_set_select_multiple);
-DECL_FUNC_PTR(gtk_file_chooser_set_do_overwrite_confirmation);
-DECL_FUNC_PTR(gtk_file_chooser_set_current_name);
-DECL_FUNC_PTR(gtk_file_chooser_set_current_folder);
-DECL_FUNC_PTR(gtk_file_chooser_add_filter);
-DECL_FUNC_PTR(gtk_file_chooser_set_filter);
-DECL_FUNC_PTR(gtk_file_chooser_get_filter);
-DECL_FUNC_PTR(gtk_file_chooser_list_filters);
-DECL_FUNC_PTR(gtk_file_filter_new);
-DECL_FUNC_PTR(gtk_file_filter_add_pattern);
-DECL_FUNC_PTR(gtk_file_filter_set_name);
-DECL_FUNC_PTR(gtk_file_chooser_get_preview_filename);
-DECL_FUNC_PTR(gtk_file_chooser_set_preview_widget_active);
-DECL_FUNC_PTR(gtk_image_set_from_pixbuf);
-DECL_FUNC_PTR(gtk_file_chooser_set_preview_widget);
-DECL_FUNC_PTR(gtk_image_new);
-DECL_FUNC_PTR(gtk_misc_set_padding);
-DECL_FUNC_PTR(gtk_file_chooser_set_local_only);
-
// XXXdholbert -- this function is duplicated in nsPrintDialogGTK.cpp
// and needs to be unified in some generic utility class.
static GtkWindow *
get_gtk_window_for_nsiwidget(nsIWidget *widget)
{
// Get native GdkWindow
GdkWindow *gdk_win = GDK_WINDOW(widget->GetNativeData(NS_NATIVE_WIDGET));
if (!gdk_win)
@@ -158,105 +87,22 @@ get_gtk_window_for_nsiwidget(nsIWidget *
MozContainer *parent_container = MOZ_CONTAINER(user_data);
if (!parent_container)
return NULL;
// Get its toplevel
return GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(parent_container)));
}
-static PRLibrary *
-LoadVersionedLibrary(const char* libName, const char* libVersion)
-{
- char *platformLibName = PR_GetLibraryName(nsnull, libName);
- nsCAutoString versionLibName(platformLibName);
- versionLibName.Append(libVersion);
- PR_FreeLibraryName(platformLibName);
- return PR_LoadLibrary(versionLibName.get());
-}
-
-/* static */
-nsresult
-nsFilePicker::LoadSymbolsGTK24()
-{
- static PRBool initialized;
- if (initialized) {
- return NS_OK;
- }
-
- #define GET_LIBGTK_FUNC_BASE(func, onerr) \
- PR_BEGIN_MACRO \
- _##func = (_##func##_fn) PR_FindFunctionSymbol(mGTK24, #func); \
- if (!_##func) { \
- NS_WARNING("Can't load gtk symbol " #func); \
- onerr \
- } \
- PR_END_MACRO
-
- #define GET_LIBGTK_FUNC(func) \
- GET_LIBGTK_FUNC_BASE(func, return NS_ERROR_NOT_AVAILABLE;)
-
- #define GET_LIBGTK_FUNC_OPT(func) \
- GET_LIBGTK_FUNC_BASE(func, ;)
-
- PRFuncPtr func = PR_FindFunctionSymbolAndLibrary("gtk_file_chooser_get_filename",
- &mGTK24);
- if (mGTK24) {
- _gtk_file_chooser_get_filename = (_gtk_file_chooser_get_filename_fn)func;
- } else {
- // XXX hmm, this seems to fail when gtk 2.4 is already loaded...
- mGTK24 = LoadVersionedLibrary("gtk-2", ".4");
- if (!mGTK24) {
- return NS_ERROR_NOT_AVAILABLE;
- }
- GET_LIBGTK_FUNC(gtk_file_chooser_get_filename);
- }
-
- GET_LIBGTK_FUNC(gtk_file_chooser_get_filenames);
- GET_LIBGTK_FUNC(gtk_file_chooser_get_uri);
- GET_LIBGTK_FUNC(gtk_file_chooser_get_uris);
- GET_LIBGTK_FUNC(gtk_file_chooser_dialog_new);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_select_multiple);
- GET_LIBGTK_FUNC_OPT(gtk_file_chooser_set_do_overwrite_confirmation);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_current_name);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_current_folder);
- GET_LIBGTK_FUNC(gtk_file_chooser_add_filter);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_filter);
- GET_LIBGTK_FUNC(gtk_file_chooser_get_filter);
- GET_LIBGTK_FUNC(gtk_file_chooser_list_filters);
- GET_LIBGTK_FUNC(gtk_file_filter_new);
- GET_LIBGTK_FUNC(gtk_file_filter_add_pattern);
- GET_LIBGTK_FUNC(gtk_file_filter_set_name);
- GET_LIBGTK_FUNC(gtk_file_chooser_get_preview_filename);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_preview_widget_active);
- GET_LIBGTK_FUNC(gtk_image_set_from_pixbuf);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_preview_widget);
- GET_LIBGTK_FUNC(gtk_image_new);
- GET_LIBGTK_FUNC(gtk_misc_set_padding);
- GET_LIBGTK_FUNC(gtk_file_chooser_set_local_only);
-
- initialized = PR_TRUE;
-
- // Woot.
- return NS_OK;
-}
-
void
nsFilePicker::Shutdown()
{
- if (mGTK24) {
- PR_UnloadLibrary(mGTK24);
- mGTK24 = nsnull;
- }
-
NS_IF_RELEASE(mPrevDisplayDirectory);
}
-// Ok, lib loading crap is done... the real code starts here:
-
static GtkFileChooserAction
GetGtkFileChooserAction(PRInt16 aMode)
{
GtkFileChooserAction action;
switch (aMode) {
case nsIFilePicker::modeSave:
action = GTK_FILE_CHOOSER_ACTION_SAVE;
@@ -280,49 +126,49 @@ GetGtkFileChooserAction(PRInt16 aMode)
}
static void
UpdateFilePreviewWidget(GtkFileChooser *file_chooser,
gpointer preview_widget_voidptr)
{
GtkImage *preview_widget = GTK_IMAGE(preview_widget_voidptr);
- char *image_filename = _gtk_file_chooser_get_preview_filename(file_chooser);
+ char *image_filename = gtk_file_chooser_get_preview_filename(file_chooser);
if (!image_filename) {
- _gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
+ gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
return;
}
// We do this so GTK scales down images that are too big, but not scale up images that are too small
GdkPixbuf *preview_pixbuf = gdk_pixbuf_new_from_file(image_filename, NULL);
if (!preview_pixbuf) {
g_free(image_filename);
- _gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
+ gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
return;
}
if (gdk_pixbuf_get_width(preview_pixbuf) > MAX_PREVIEW_SIZE || gdk_pixbuf_get_height(preview_pixbuf) > MAX_PREVIEW_SIZE) {
g_object_unref(preview_pixbuf);
preview_pixbuf = gdk_pixbuf_new_from_file_at_size(image_filename, MAX_PREVIEW_SIZE, MAX_PREVIEW_SIZE, NULL);
}
g_free(image_filename);
if (!preview_pixbuf) {
- _gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
+ gtk_file_chooser_set_preview_widget_active(file_chooser, FALSE);
return;
}
// This is the easiest way to do center alignment without worrying about containers
// Minimum 3px padding each side (hence the 6) just to make things nice
gint x_padding = (MAX_PREVIEW_SIZE + 6 - gdk_pixbuf_get_width(preview_pixbuf)) / 2;
- _gtk_misc_set_padding(GTK_MISC(preview_widget), x_padding, 0);
+ gtk_misc_set_padding(GTK_MISC(preview_widget), x_padding, 0);
- _gtk_image_set_from_pixbuf(preview_widget, preview_pixbuf);
+ gtk_image_set_from_pixbuf(preview_widget, preview_pixbuf);
g_object_unref(preview_pixbuf);
- _gtk_file_chooser_set_preview_widget_active(file_chooser, TRUE);
+ gtk_file_chooser_set_preview_widget_active(file_chooser, TRUE);
}
static nsCAutoString
MakeCaseInsensitiveShellGlob(const char* aPattern) {
// aPattern is UTF8
nsCAutoString result;
unsigned int len = strlen(aPattern);
@@ -376,55 +222,44 @@ ReadMultipleFiles(gpointer filename, gpo
void
nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser)
{
mFiles.Clear();
if (mMode == nsIFilePicker::modeOpenMultiple) {
mFileURL.Truncate();
- GSList *list = _gtk_file_chooser_get_filenames (GTK_FILE_CHOOSER(file_chooser));
+ GSList *list = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(file_chooser));
g_slist_foreach(list, ReadMultipleFiles, static_cast<gpointer>(&mFiles));
g_slist_free(list);
} else {
- gchar *filename = _gtk_file_chooser_get_uri (GTK_FILE_CHOOSER(file_chooser));
+ gchar *filename = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(file_chooser));
mFileURL.Assign(filename);
g_free(filename);
}
- GtkFileFilter *filter = _gtk_file_chooser_get_filter (GTK_FILE_CHOOSER(file_chooser));
- GSList *filter_list = _gtk_file_chooser_list_filters (GTK_FILE_CHOOSER(file_chooser));
+ GtkFileFilter *filter = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER(file_chooser));
+ GSList *filter_list = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER(file_chooser));
- mSelectedType = static_cast<PRInt16>(g_slist_index (filter_list, filter));
+ mSelectedType = static_cast<PRInt16>(g_slist_index(filter_list, filter));
g_slist_free(filter_list);
// Remember last used directory.
nsCOMPtr<nsILocalFile> file;
GetFile(getter_AddRefs(file));
if (file) {
nsCOMPtr<nsIFile> dir;
file->GetParent(getter_AddRefs(dir));
nsCOMPtr<nsILocalFile> localDir(do_QueryInterface(dir));
if (localDir) {
localDir.swap(mPrevDisplayDirectory);
}
}
}
-NS_IMETHODIMP
-nsFilePicker::Init(nsIDOMWindow *aParent, const nsAString &aTitle, PRInt16 aMode)
-{
- nsresult rv = LoadSymbolsGTK24();
- if (NS_FAILED(rv)) {
- return rv;
- }
-
- return nsBaseFilePicker::Init(aParent, aTitle, aMode);
-}
-
void
nsFilePicker::InitNative(nsIWidget *aParent,
const nsAString& aTitle,
PRInt16 aMode)
{
mParentWidget = aParent;
mTitle.Assign(aTitle);
mMode = aMode;
@@ -538,17 +373,17 @@ nsFilePicker::GetFiles(nsISimpleEnumerat
if (mMode == nsIFilePicker::modeOpenMultiple) {
return NS_NewArrayEnumerator(aFiles, mFiles);
}
return NS_ERROR_FAILURE;
}
PRBool
-confirm_overwrite_file (GtkWidget *parent, nsILocalFile* file)
+confirm_overwrite_file(GtkWidget *parent, nsILocalFile* file)
{
nsCOMPtr<nsIStringBundleService> sbs = do_GetService(NS_STRINGBUNDLE_CONTRACTID);
nsCOMPtr<nsIStringBundle> bundle;
nsresult rv = sbs->CreateBundle("chrome://global/locale/filepicker.properties",
getter_AddRefs(bundle));
if (NS_FAILED(rv)) {
return PR_FALSE;
}
@@ -575,19 +410,19 @@ confirm_overwrite_file (GtkWidget *paren
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_YES_NO,
NS_ConvertUTF16toUTF8(message).get());
gtk_window_set_title(GTK_WINDOW(dialog), NS_ConvertUTF16toUTF8(title).get());
if (parent_window && parent_window->group) {
gtk_window_group_add_window(parent_window->group, GTK_WINDOW(dialog));
}
- PRBool result = (RunDialog(GTK_DIALOG (dialog)) == GTK_RESPONSE_YES);
+ PRBool result = (RunDialog(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES);
- gtk_widget_destroy (dialog);
+ gtk_widget_destroy(dialog);
return result;
}
NS_IMETHODIMP
nsFilePicker::Show(PRInt16 *aReturn)
{
NS_ENSURE_ARG_POINTER(aReturn);
@@ -596,122 +431,109 @@ nsFilePicker::Show(PRInt16 *aReturn)
title.Adopt(ToNewUTF8String(mTitle));
GtkWindow *parent_widget = get_gtk_window_for_nsiwidget(mParentWidget);
GtkFileChooserAction action = GetGtkFileChooserAction(mMode);
const gchar *accept_button = (mMode == GTK_FILE_CHOOSER_ACTION_SAVE)
? GTK_STOCK_SAVE : GTK_STOCK_OPEN;
GtkWidget *file_chooser =
- _gtk_file_chooser_dialog_new(title, parent_widget, action,
- GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
- accept_button, GTK_RESPONSE_ACCEPT,
- NULL);
+ gtk_file_chooser_dialog_new(title, parent_widget, action,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ accept_button, GTK_RESPONSE_ACCEPT,
+ NULL);
if (mAllowURLs) {
- _gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_chooser), FALSE);
+ gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(file_chooser), FALSE);
}
if (mMode == GTK_FILE_CHOOSER_ACTION_OPEN || mMode == GTK_FILE_CHOOSER_ACTION_SAVE) {
- GtkWidget *img_preview = _gtk_image_new();
- _gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(file_chooser), img_preview);
+ GtkWidget *img_preview = gtk_image_new();
+ gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(file_chooser), img_preview);
g_signal_connect(file_chooser, "update-preview", G_CALLBACK(UpdateFilePreviewWidget), img_preview);
}
if (parent_widget && parent_widget->group) {
gtk_window_group_add_window(parent_widget->group, GTK_WINDOW(file_chooser));
}
if (mMode == nsIFilePicker::modeOpenMultiple) {
- _gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER(file_chooser), TRUE);
+ gtk_file_chooser_set_select_multiple(GTK_FILE_CHOOSER(file_chooser), TRUE);
} else if (mMode == nsIFilePicker::modeSave) {
char *default_filename = ToNewUTF8String(mDefault);
- _gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser),
- static_cast<const gchar*>(default_filename));
+ gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser),
+ static_cast<const gchar*>(default_filename));
nsMemory::Free(default_filename);
}
gtk_dialog_set_default_response(GTK_DIALOG(file_chooser), GTK_RESPONSE_ACCEPT);
nsCAutoString directory;
if (mDisplayDirectory) {
mDisplayDirectory->GetNativePath(directory);
} else if (mPrevDisplayDirectory) {
mPrevDisplayDirectory->GetNativePath(directory);
}
if (!directory.IsEmpty()) {
- _gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser),
- directory.get());
+ gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(file_chooser),
+ directory.get());
}
PRInt32 count = mFilters.Count();
for (PRInt32 i = 0; i < count; ++i) {
// This is fun... the GTK file picker does not accept a list of filters
// so we need to split out each string, and add it manually.
char **patterns = g_strsplit(mFilters[i]->get(), ";", -1);
if (!patterns) {
return NS_ERROR_OUT_OF_MEMORY;
}
- GtkFileFilter *filter = _gtk_file_filter_new ();
+ GtkFileFilter *filter = gtk_file_filter_new();
for (int j = 0; patterns[j] != NULL; ++j) {
nsCAutoString caseInsensitiveFilter = MakeCaseInsensitiveShellGlob(g_strstrip(patterns[j]));
- _gtk_file_filter_add_pattern (filter, caseInsensitiveFilter.get());
+ gtk_file_filter_add_pattern(filter, caseInsensitiveFilter.get());
}
g_strfreev(patterns);
if (!mFilterNames[i]->IsEmpty()) {
// If we have a name for our filter, let's use that.
const char *filter_name = mFilterNames[i]->get();
- _gtk_file_filter_set_name (filter, filter_name);
+ gtk_file_filter_set_name(filter, filter_name);
} else {
// If we don't have a name, let's just use the filter pattern.
const char *filter_pattern = mFilters[i]->get();
- _gtk_file_filter_set_name (filter, filter_pattern);
+ gtk_file_filter_set_name(filter, filter_pattern);
}
- _gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (file_chooser), filter);
+ gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(file_chooser), filter);
// Set the initially selected filter
if (mSelectedType == i) {
- _gtk_file_chooser_set_filter (GTK_FILE_CHOOSER(file_chooser), filter);
+ gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(file_chooser), filter);
}
}
- PRBool checkForOverwrite = PR_TRUE;
- if (_gtk_file_chooser_set_do_overwrite_confirmation) {
- checkForOverwrite = PR_FALSE;
- // Only available in GTK 2.8
- _gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(file_chooser), PR_TRUE);
- }
-
- gint response = RunDialog(GTK_DIALOG (file_chooser));
+ gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(file_chooser), PR_TRUE);
+ gint response = RunDialog(GTK_DIALOG(file_chooser));
switch (response) {
case GTK_RESPONSE_ACCEPT:
ReadValuesFromFileChooser(file_chooser);
*aReturn = nsIFilePicker::returnOK;
if (mMode == nsIFilePicker::modeSave) {
nsCOMPtr<nsILocalFile> file;
GetFile(getter_AddRefs(file));
if (file) {
PRBool exists = PR_FALSE;
file->Exists(&exists);
- if (exists) {
- PRBool overwrite = !checkForOverwrite ||
- confirm_overwrite_file (file_chooser, file);
+ if (exists)
+ *aReturn = nsIFilePicker::returnReplace;
- if (overwrite) {
- *aReturn = nsIFilePicker::returnReplace;
- } else {
- *aReturn = nsIFilePicker::returnCancel;
- }
- }
}
}
break;
case GTK_RESPONSE_CANCEL:
case GTK_RESPONSE_CLOSE:
case GTK_RESPONSE_DELETE_EVENT:
*aReturn = nsIFilePicker::returnCancel;
--- a/widget/src/gtk2/nsFilePicker.h
+++ b/widget/src/gtk2/nsFilePicker.h
@@ -42,28 +42,26 @@
#include "nsBaseFilePicker.h"
#include "nsString.h"
#include "nsVoidArray.h"
#include "nsCOMArray.h"
class nsIWidget;
class nsILocalFile;
-class PRLibrary;
class nsFilePicker : public nsBaseFilePicker
{
public:
nsFilePicker();
virtual ~nsFilePicker();
NS_DECL_ISUPPORTS
// nsIFilePicker (less what's in nsBaseFilePicker)
- NS_IMETHODIMP Init(nsIDOMWindow *aParent, const nsAString &aTitle, PRInt16 aMode);
NS_IMETHODIMP AppendFilters(PRInt32 aFilterMask);
NS_IMETHODIMP AppendFilter(const nsAString& aTitle, const nsAString& aFilter);
NS_IMETHODIMP SetDefaultString(const nsAString& aString);
NS_IMETHODIMP GetDefaultString(nsAString& aString);
NS_IMETHODIMP SetDefaultExtension(const nsAString& aExtension);
NS_IMETHODIMP GetDefaultExtension(nsAString& aExtension);
NS_IMETHODIMP GetFilterIndex(PRInt32 *aFilterIndex);
NS_IMETHODIMP SetFilterIndex(PRInt32 aFilterIndex);
@@ -72,17 +70,16 @@ public:
NS_IMETHODIMP GetFiles(nsISimpleEnumerator **aFiles);
NS_IMETHODIMP Show(PRInt16 *aReturn);
virtual void InitNative(nsIWidget *aParent, const nsAString& aTitle, PRInt16 aMode);
static void Shutdown();
protected:
- static nsresult LoadSymbolsGTK24();
void ReadValuesFromFileChooser(GtkWidget *file_chooser);
nsCOMPtr<nsIWidget> mParentWidget;
nsCOMArray<nsILocalFile> mFiles;
PRInt16 mMode;
PRInt16 mSelectedType;
@@ -92,12 +89,11 @@ protected:
nsString mDefault;
nsString mDefaultExtension;
nsCStringArray mFilters;
nsCStringArray mFilterNames;
private:
static nsILocalFile *mPrevDisplayDirectory;
- static PRLibrary *mGTK24;
};
#endif
--- a/widget/src/windows/nsScreenWin.cpp
+++ b/widget/src/windows/nsScreenWin.cpp
@@ -142,17 +142,24 @@ nsScreenWin :: GetAvailRect(PRInt32 *out
NS_IMETHODIMP
nsScreenWin :: GetPixelDepth(PRInt32 *aPixelDepth)
{
//XXX not sure how to get this info for multiple monitors, this might be ok...
HDC hDCScreen = ::GetDC(nsnull);
NS_ASSERTION(hDCScreen,"GetDC Failure");
- *aPixelDepth = ::GetDeviceCaps(hDCScreen, BITSPIXEL);
+ PRInt32 depth = ::GetDeviceCaps(hDCScreen, BITSPIXEL);
+ if (depth == 32) {
+ // If a device uses 32 bits per pixel, it's still only using 8 bits
+ // per color component, which is what our callers want to know.
+ // (Some devices report 32 and some devices report 24.)
+ depth = 24;
+ }
+ *aPixelDepth = depth;
::ReleaseDC(nsnull, hDCScreen);
return NS_OK;
} // GetPixelDepth
NS_IMETHODIMP
--- a/xpfe/components/intl/nsCharsetMenu.cpp
+++ b/xpfe/components/intl/nsCharsetMenu.cpp
@@ -1289,17 +1289,17 @@ nsresult nsCharsetMenu::InitMoreSubmenus
res = NewRDFContainer(mInner, kNC_BrowserMore5CharsetMenuRoot,
getter_AddRefs(container5));
if (NS_FAILED(res)) return res;
AddFromPrefsToMenu(NULL, container5, key5, aDecs, NULL);
res = NewRDFContainer(mInner, kNC_BrowserUnicodeCharsetMenuRoot,
getter_AddRefs(containerU));
if (NS_FAILED(res)) return res;
- AddFromPrefsToMenu(NULL, containerU, keyU, aDecs, NULL);
+ AddFromNolocPrefsToMenu(NULL, containerU, keyU, aDecs, NULL);
NS_TIMELINE_STOP_TIMER("nsCharsetMenu::InitMoreSubmenus");
NS_TIMELINE_MARK_TIMER("nsCharsetMenu::InitMoreSubmenus");
return res;
}
nsresult nsCharsetMenu::AddCharsetToItemArray(nsVoidArray *aArray,
--- a/xulrunner/app/xulrunner.js
+++ b/xulrunner/app/xulrunner.js
@@ -43,17 +43,17 @@ pref("general.useragent.locale", "@AB_CD
pref("font.language.group", "chrome://global/locale/intl.properties");
pref("intl.accept_languages", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.static", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more1", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more3", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more4", "chrome://global/locale/intl.properties");
pref("intl.charsetmenu.browser.more5", "chrome://global/locale/intl.properties");
-pref("intl.charsetmenu.browser.unicode", "chrome://global/locale/intl.properties");
+pref("intl.charsetmenu.browser.unicode", "UTF-8, UTF-16LE, UTF-16BE, UTF-32, UTF-32LE, UTF-32BE");
pref("intl.charset.detector", "chrome://global/locale/intl.properties");
pref("intl.charset.default", "chrome://global-platform/locale/intl.properties");
pref("intl.menuitems.alwaysappendaccesskeys","chrome://global/locale/intl.properties");
pref("intl.menuitems.insertseparatorbeforeaccesskeys","chrome://global/locale/intl.properties");
pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul");
pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul");
pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul");
pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager");
--- a/xulrunner/installer/debian/control
+++ b/xulrunner/installer/debian/control
@@ -3,18 +3,18 @@ Section: user/internet
Priority: extra
Maintainer: Mozilla xulrunner <blassey@mozilla.com>
Build-Depends: debhelper (>= 5)
Standards-Version: 3.7.2
Package: xulrunner
Architecture: any
Depends: libasound2 (>> 1.0.14), libatk1.0-0 (>= 1.12.2), libc6 (>= 2.5.0-1), libcairo2 (>= 1.4.10), libdbus-1-3 (>= 0.94), libdbus-glib-1-2 (>= 0.74), libfontconfig1 (>= 2.4.1), libfreetype6 (>= 2.2.1), libgcc1 (>= 1:3.4.4), libgconf2-6 (>= 2.13.5), libglib2.0-0 (>= 2.12.12-1osso3), libgpsbt (>= 0.2), libgpsmgr (>= 0.2), libgtk2.0-0 (>= 2:2.10.12-0osso15), libhildon1 (>= 1.0.11), libhildonmime0 (>= 1.10.0), liblocation0, libosso-gnomevfs2-0, libosso1 (>= 2.13), libpango1.0-0 (>= 1.16.4), libstdc++6 (>= 3.4.4), libx11-6, libxrender1, libxt6, osso-gpsd (>= 1.0), zlib1g (>= 1:1.2.1)
-Description: Project aiming to create a XUL runtime that requires no browser.
- XULRunner is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird.
+Description: XUL runtime package
+ A runtime package used to create XUL-based applications or embed Mozilla's Gecko engine into other applications
XB-Maemo-Icon-26:
MB5!.1PT*&@H````-24A$4@```!H````:"`8```"I2DS.````"7!(67,```L3
M```+$P$`FIP8```%;$E$051(B:667XQ4U1W'/_>>>V?NG=F9V3^S_W%9<'#!
M/Q1;NQ:EQH@:T2"EH>&A34R;]$U?Q%9-VH:41BUJFV"-B<8'^Z!-VP=E?37&
M5=18L"SACVMVH<M.9W>8V9G9N7-G[O_3AP6$LD"$;W*3<T_R^W[.]Y=S3@Z<
ME90H_)\DE\Y=J]3SHW_\1)6O#FV2NVD'D*\,W<T;JWK.0W>3OA[012N68]LW
MD1W^!8?W_XGANQ^C5?V$(V/_8L.VGU.:.JG\\M@[UPK2SD/V#=U,K=QDW;TF
M#S_[&HZC4,^O9_T6'84VWO[PI]>32/MFV.URZ^;G273UT7^7`3&)#%*!TM"U