From b6eec2ca8eecafe173f58775c2a057e5aac2d928 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Fri, 19 Dec 2008 17:35:50 -0500 Subject: [PATCH 01/98] Bug 393936 - nsIRequest::cancel() must not notify anything sync. Make removal from the loadgroup async, and add another call cancelAndForgetObserver() that removes the listener immediately (since some callsites expect that). Note, however, that this new method shouldn't be used in any new code; it exists only to support code that relied on the broken behaviour prior to this checkin. r=bzbarsky sr=vlad --- content/base/src/nsImageLoadingContent.cpp | 4 +- layout/base/nsImageLoader.cpp | 6 +-- layout/generic/nsImageFrame.h | 4 +- layout/xul/base/src/nsImageBoxFrame.cpp | 2 +- modules/libpr0n/public/imgIRequest.idl | 11 +++++ modules/libpr0n/src/imgRequestProxy.cpp | 47 +++++++++++++++++----- modules/libpr0n/src/imgRequestProxy.h | 26 ++++++++++++ widget/src/cocoa/nsMenuItemIconX.mm | 2 +- 8 files changed, 83 insertions(+), 19 deletions(-) diff --git a/content/base/src/nsImageLoadingContent.cpp b/content/base/src/nsImageLoadingContent.cpp index 575912b4bcfa..b5f017f6c00e 100644 --- a/content/base/src/nsImageLoadingContent.cpp +++ b/content/base/src/nsImageLoadingContent.cpp @@ -121,11 +121,11 @@ 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; } } diff --git a/layout/base/nsImageLoader.cpp b/layout/base/nsImageLoader.cpp index f917dbb115c2..90f4fb78fa46 100644 --- a/layout/base/nsImageLoader.cpp +++ b/layout/base/nsImageLoader.cpp @@ -74,7 +74,7 @@ nsImageLoader::~nsImageLoader() mPresContext = nsnull; if (mRequest) { - mRequest->Cancel(NS_ERROR_FAILURE); + mRequest->CancelAndForgetObserver(NS_ERROR_FAILURE); } } @@ -95,7 +95,7 @@ nsImageLoader::Destroy() mPresContext = nsnull; if (mRequest) { - mRequest->Cancel(NS_ERROR_FAILURE); + mRequest->CancelAndForgetObserver(NS_ERROR_FAILURE); } mRequest = nsnull; @@ -122,7 +122,7 @@ nsImageLoader::Load(imgIRequest *aImage) } // 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; } diff --git a/layout/generic/nsImageFrame.h b/layout/generic/nsImageFrame.h index c1e66ae45766..fd17a3eb22da 100644 --- a/layout/generic/nsImageFrame.h +++ b/layout/generic/nsImageFrame.h @@ -307,11 +307,11 @@ private: { // 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; } } diff --git a/layout/xul/base/src/nsImageBoxFrame.cpp b/layout/xul/base/src/nsImageBoxFrame.cpp index cdab38ee8c93..25b4127a9149 100644 --- a/layout/xul/base/src/nsImageBoxFrame.cpp +++ b/layout/xul/base/src/nsImageBoxFrame.cpp @@ -207,7 +207,7 @@ 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(mListener.get())->SetFrame(nsnull); // set the frame to null so we don't send messages to a dead object. diff --git a/modules/libpr0n/public/imgIRequest.idl b/modules/libpr0n/public/imgIRequest.idl index 11b32a02e46a..4443c5c282bf 100644 --- a/modules/libpr0n/public/imgIRequest.idl +++ b/modules/libpr0n/public/imgIRequest.idl @@ -104,5 +104,16 @@ interface imgIRequest : nsIRequest * 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); }; diff --git a/modules/libpr0n/src/imgRequestProxy.cpp b/modules/libpr0n/src/imgRequestProxy.cpp index 0bebed2a0eba..3bf61de8a0a0 100644 --- a/modules/libpr0n/src/imgRequestProxy.cpp +++ b/modules/libpr0n/src/imgRequestProxy.cpp @@ -74,6 +74,7 @@ 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 @@ -97,8 +98,6 @@ imgRequestProxy::~imgRequestProxy() } } - - nsresult imgRequestProxy::Init(imgRequest *request, nsILoadGroup *aLoadGroup, imgIDecoderObserver *aObserver) { NS_PRECONDITION(!mOwner && !mListener, "imgRequestProxy is already initialized"); @@ -197,6 +196,8 @@ NS_IMETHODIMP imgRequestProxy::IsPending(PRBool *_retval) /* 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; @@ -215,11 +216,35 @@ NS_IMETHODIMP imgRequestProxy::Cancel(nsresult status) mCanceled = PR_TRUE; + nsCOMPtr 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; } @@ -400,7 +425,7 @@ void imgRequestProxy::FrameChanged(imgIContainer *container, gfxIImageFrame *new { LOG_FUNC(gImgLog, "imgRequestProxy::FrameChanged"); - if (mListener) { + if (mListener && !mCanceled) { // Hold a ref to the listener while we call it, just in case. nsCOMPtr kungFuDeathGrip(mListener); mListener->FrameChanged(container, newframe, dirtyRect); @@ -413,7 +438,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStartDecode(this); @@ -424,7 +449,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStartContainer(this, image); @@ -435,7 +460,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStartFrame(this, frame); @@ -446,7 +471,7 @@ void imgRequestProxy::OnDataAvailable(gfxIImageFrame *frame, const nsIntRect * r { LOG_FUNC(gImgLog, "imgRequestProxy::OnDataAvailable"); - if (mListener) { + if (mListener && !mCanceled) { // Hold a ref to the listener while we call it, just in case. nsCOMPtr kungFuDeathGrip(mListener); mListener->OnDataAvailable(this, frame, rect); @@ -457,7 +482,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStopFrame(this, frame); @@ -468,7 +493,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStopContainer(this, image); @@ -479,7 +504,7 @@ 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 kungFuDeathGrip(mListener); mListener->OnStopDecode(this, status, statusArg); @@ -496,6 +521,8 @@ void imgRequestProxy::OnStartRequest(nsIRequest *request, nsISupports *ctxt) 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 kungFuDeathGrip(mListener); diff --git a/modules/libpr0n/src/imgRequestProxy.h b/modules/libpr0n/src/imgRequestProxy.h index 5f79e200bb45..727829e7668f 100644 --- a/modules/libpr0n/src/imgRequestProxy.h +++ b/modules/libpr0n/src/imgRequestProxy.h @@ -49,6 +49,7 @@ #include "nsISupportsPriority.h" #include "nsCOMPtr.h" #include "nsAutoPtr.h" +#include "nsThreadUtils.h" #include "imgRequest.h" @@ -85,6 +86,28 @@ public: 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 mOwner; + nsresult mStatus; + }; + + + /* non-virtual imgIDecoderObserver methods */ void OnStartDecode (); void OnStartContainer(imgIContainer *aContainer); @@ -105,6 +128,9 @@ protected: return mListener != nsnull; } + /* Finish up canceling ourselves */ + void DoCancel(nsresult status); + /* Do the proper refcount management to null out mListener */ void NullOutListener(); diff --git a/widget/src/cocoa/nsMenuItemIconX.mm b/widget/src/cocoa/nsMenuItemIconX.mm index c2c26cc059b3..9058ee53cbda 100644 --- a/widget/src/cocoa/nsMenuItemIconX.mm +++ b/widget/src/cocoa/nsMenuItemIconX.mm @@ -98,7 +98,7 @@ nsMenuItemIconX::nsMenuItemIconX(nsMenuObjectX* aMenuItem, nsMenuItemIconX::~nsMenuItemIconX() { if (mIconRequest) - mIconRequest->Cancel(NS_BINDING_ABORTED); + mIconRequest->CancelAndForgetObserver(NS_BINDING_ABORTED); } From 88f530158b3e690dfc1eec8060d84b98c6326f82 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Fri, 19 Dec 2008 17:35:50 -0500 Subject: [PATCH 02/98] Don't discard animated images so we don't have to worry about how to restore them. b=414259 r/sr=vlad --- modules/libpr0n/src/imgContainer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/libpr0n/src/imgContainer.cpp b/modules/libpr0n/src/imgContainer.cpp index 647d4c4b5aa5..f64a835025ba 100644 --- a/modules/libpr0n/src/imgContainer.cpp +++ b/modules/libpr0n/src/imgContainer.cpp @@ -1224,9 +1224,9 @@ imgContainer::sDiscardTimerCallback(nsITimer *aTimer, void *aClosure) 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(); From 8334b0e0a4381cc1dcbc9d33ccae19a785e9b289 Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 00:39:47 +0200 Subject: [PATCH 03/98] Bug 470419 - Crash [@ nsXBLPrototypeHandler::MouseEventMatched] dispatching mousedown UIEvent and xbl event handler, r+sr=bz --- content/xbl/src/nsXBLEventHandler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/xbl/src/nsXBLEventHandler.cpp b/content/xbl/src/nsXBLEventHandler.cpp index b85be41cb8a4..46df94f972d6 100644 --- a/content/xbl/src/nsXBLEventHandler.cpp +++ b/content/xbl/src/nsXBLEventHandler.cpp @@ -103,7 +103,7 @@ PRBool nsXBLMouseEventHandler::EventMatched(nsIDOMEvent* aEvent) { nsCOMPtr mouse(do_QueryInterface(aEvent)); - return mProtoHandler->MouseEventMatched(mouse); + return mouse && mProtoHandler->MouseEventMatched(mouse); } nsXBLKeyEventHandler::nsXBLKeyEventHandler(nsIAtom* aEventType, PRUint8 aPhase, From 2a620fc7f79539bf7f3ba7ddf656291394d7dc9e Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 01:27:33 +0200 Subject: [PATCH 04/98] Bug 470431 - Memory leak of document and content nodes with creating DOMMouseScroll event, r+sr=jst --- content/events/src/nsDOMMouseScrollEvent.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/content/events/src/nsDOMMouseScrollEvent.cpp b/content/events/src/nsDOMMouseScrollEvent.cpp index 0338aaa2ff52..2293f65c906f 100644 --- a/content/events/src/nsDOMMouseScrollEvent.cpp +++ b/content/events/src/nsDOMMouseScrollEvent.cpp @@ -46,6 +46,14 @@ nsDOMMouseScrollEvent::nsDOMMouseScrollEvent(nsPresContext* aPresContext, : 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(mEvent); mDetail = mouseEvent->delta; From c4e089543db1edf891935a5e6f416b97c9db427d Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 01:35:30 +0200 Subject: [PATCH 05/98] Bug 470167 - 'ASSERTION: Should be in an update while creating frames' with stylesheet appended many times, r+sr=bz --- layout/base/nsCSSFrameConstructor.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index a3936095dde3..408b1022f3e1 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -10143,6 +10143,7 @@ nsCSSFrameConstructor::EndUpdate() RecalcQuotesAndCounters(); NS_ASSERTION(mUpdateCount == 1, "Odd update count"); } + --mUpdateCount; if (mFocusSuppressCount) { NS_UnsuppressFocusEvent(); --mFocusSuppressCount; From 3abb81ab1db97c761abbdbe789c7a95590b4d74a Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 01:40:00 +0200 Subject: [PATCH 06/98] Bug 461027, r+sr=bz --- content/xbl/src/nsXBLBinding.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/content/xbl/src/nsXBLBinding.cpp b/content/xbl/src/nsXBLBinding.cpp index 356dfdc4b171..6576781ca269 100644 --- a/content/xbl/src/nsXBLBinding.cpp +++ b/content/xbl/src/nsXBLBinding.cpp @@ -725,6 +725,21 @@ nsXBLBinding::GenerateAnonymousContent() if (ni->NamespaceID() != kNameSpaceID_XUL || (localName != nsGkAtoms::observes && localName != nsGkAtoms::_template)) { + // Undo InstallAnonymousContent + PRUint32 childCount = mContent->GetChildCount(); +#ifdef MOZ_XUL + nsCOMPtr 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); From dbf8cc51bcb476522bc131b5d6436c7c19971c6e Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 01:45:56 +0200 Subject: [PATCH 07/98] Bug 461994 - Crash [@ DocumentViewerImpl::Close] with reloading, r+sr=bz --- layout/base/nsDocumentViewer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/layout/base/nsDocumentViewer.cpp b/layout/base/nsDocumentViewer.cpp index 6d1870895a42..786809aa4fe1 100644 --- a/layout/base/nsDocumentViewer.cpp +++ b/layout/base/nsDocumentViewer.cpp @@ -1320,7 +1320,7 @@ DocumentViewerImpl::Close(nsISHEntry *aSHEntry) // out of band cleanup of webshell mDocument->SetScriptGlobalObject(nsnull); - if (!mSHEntry) + if (!mSHEntry && mDocument) mDocument->RemovedFromDocShell(); } From 50dec622711080989ec1736a9a424ff73a7d17e9 Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Fri, 19 Dec 2008 15:45:55 -0800 Subject: [PATCH 08/98] Bug 460706 - Handle misplaced ContinueInterruptedParsing calls during synchronous XMLHttpRequest. r+sr=sicking --HG-- extra : rebase_source : 2852f7f9f0283bc6971dab6dd2ec92234fab302a --- parser/htmlparser/src/nsParser.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/parser/htmlparser/src/nsParser.cpp b/parser/htmlparser/src/nsParser.cpp index 7ca22a82c9df..32db962f1e21 100644 --- a/parser/htmlparser/src/nsParser.cpp +++ b/parser/htmlparser/src/nsParser.cpp @@ -1704,6 +1704,13 @@ nsParser::ContinueParsing() 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 From 3396986416dac73f6623d748566adb2e0156d46b Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Fri, 19 Dec 2008 15:47:19 -0800 Subject: [PATCH 09/98] Bug 455629 - Test that we actually do wrap the return value of nsISVGDocument::getSVGDocument in a XOW. r=bzbarsky --HG-- extra : rebase_source : 471ed08d3cc3ab957f44a6b65b8f2bd8c5e7d41d --- content/base/test/Makefile.in | 2 + content/base/test/bug455629-helper.svg | 6 +++ content/base/test/test_bug455629.html | 64 ++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) create mode 100644 content/base/test/bug455629-helper.svg create mode 100644 content/base/test/test_bug455629.html diff --git a/content/base/test/Makefile.in b/content/base/test/Makefile.in index 7823db1c48a2..cb372b71b8bc 100644 --- a/content/base/test/Makefile.in +++ b/content/base/test/Makefile.in @@ -270,6 +270,8 @@ _TEST_FILES = test_bug5141.html \ test_bug444322.html \ bug444322.txt \ bug444322.js \ + test_bug455629.html \ + bug455629-helper.svg \ $(NULL) # Disabled for now. Mochitest isn't reliable enough for these. diff --git a/content/base/test/bug455629-helper.svg b/content/base/test/bug455629-helper.svg new file mode 100644 index 000000000000..38098585edf0 --- /dev/null +++ b/content/base/test/bug455629-helper.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/content/base/test/test_bug455629.html b/content/base/test/test_bug455629.html new file mode 100644 index 000000000000..cd4690b1df29 --- /dev/null +++ b/content/base/test/test_bug455629.html @@ -0,0 +1,64 @@ + + + + + Test for Bug 455629 + + + + + +Mozilla Bug 455629 +

+ +
+
+
+
+
+
+
+
+
+
+ + From 0c7cae7ac454aac7881f8472c43695aed39b3428 Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Fri, 19 Dec 2008 15:47:20 -0800 Subject: [PATCH 10/98] Bug 468581 - Use a better function to compute principals. r=brendan --HG-- extra : rebase_source : 137705045b8b528c49405a52f91455306ecf9857 --- js/src/jsobj.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/jsobj.cpp b/js/src/jsobj.cpp index 06f4ffcf4e32..954e9b5b59c1 100644 --- a/js/src/jsobj.cpp +++ b/js/src/jsobj.cpp @@ -1259,7 +1259,7 @@ obj_eval(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } if (obj != callerScopeChain) { ok = js_CheckPrincipalsAccess(cx, obj, - caller->script->principals, + JS_StackFramePrincipals(cx, caller), cx->runtime->atomState.evalAtom); if (!ok) goto out; From 19a2a5d7d017d17b1a0fd905d0b9ccabbb1992a6 Mon Sep 17 00:00:00 2001 From: Blake Kaplan Date: Fri, 19 Dec 2008 15:47:20 -0800 Subject: [PATCH 11/98] Bug 468552 - Enforce 'funobj' conditions in the XPCNativeWrapper case. r+sr=jst --HG-- extra : rebase_source : 6023cc8a797167551461fe6f8fb003d98b4f5b9b --- js/src/xpconnect/src/xpcwrappednative.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/src/xpconnect/src/xpcwrappednative.cpp b/js/src/xpconnect/src/xpcwrappednative.cpp index 057f443c5453..e375fc499d3e 100644 --- a/js/src/xpconnect/src/xpcwrappednative.cpp +++ b/js/src/xpconnect/src/xpcwrappednative.cpp @@ -1444,10 +1444,10 @@ return_tearoff: 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) && From 8503ace86772cc6a366409ab301b8f98137d213f Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Fri, 19 Dec 2008 16:09:05 -0800 Subject: [PATCH 12/98] [Sunbird] Bug 470197 - Update installer. r=ctalbert --- other-licenses/7zstub/sunbird/7zSD.sfx | Bin 121344 -> 122368 bytes .../installer/windows/nsis/makensis.mk | 4 ---- 2 files changed, 4 deletions(-) diff --git a/other-licenses/7zstub/sunbird/7zSD.sfx b/other-licenses/7zstub/sunbird/7zSD.sfx index 05a47ad639cf5559a92e2be3ae366d49389f1998..bddeb5438aed8dca4d7f70f6cf62c388cb3997a3 100755 GIT binary patch delta 1686 zcma)5&ui0A9Dgs<{Q_l2k0Brop=rBy-4ENcF$BjHD-#{l!_xGn4JI!!FX>t@>Ciu5 z(1E+i209sdDJV=uasPq42s?W4u;UK?y!m}y(`H)>2AWSkpYMC$->tswtA6aOPvD;0 zpM=^~92d5Y+Nv;Ldyh8)!x z;6C6G;3428K!j111AmV14}gTwCC~-H7$Em|9gy3X0lD8YAomL?RQmvTF!HPY@UaKN z0N?>2K;t=fjL{G9d~`+^8Ug!-W5*(3^I9_@j5a}-=%DjNvn|~ZD!>hg#g?J14?rf3 zvYHWs#JIl3%k7|Vb<`)C*j^8L7{Xk#6tL#QC&)n^zLVPgV*_#8NFQoyq>Fxr6y3izMbz+qzp zzV!jlgYSU%e+D~ja=`0fd=M_Tg~gv3y@PH92ZnxOv>xIwfhR)z0Ql1ofAAY4H&np> zUyQzn_%NL1|0EH9n6K*YB*V8fKcz56%$!jX%cenDTJjt^#nd7(6&5jd)v=hRxe?Ve zrxa$&rMM)T3e`2j+`GhKx<%7cT#iYZmZP~mp|0*$#8SvE$KZ@;JC;fqvz!@6E$S{& zUEgy^T3Vb)N+MNE_#A({ATzBjlQNM+w_<~|qSMh42oMcY4I*SxdBRjjw_QjhGagye zZE=AZT7;BcM^Rm!7Q{xR5)n%YIWdxohA+Tv+b0y#RV&<;-S~EAnhohtQ8=GwzBhvw z$@g@cw^o=uYni4+BeNED9m`-+yAMg;g_C{ogGRLbV0$@3SLaFPj`fg0cavk2W4UA^ zo=B*w7SC&vXehMcDFtZFmCkK}GS3v#(s;41<1u%RYL@?>V;_Y;jHsRigUzHI^2mb) zAo;ALmvn;^2n&hV%5ad65Y5Qb+~le@E!6c)i=NEyK*U}GuRSf;Q_5t4u)Xp!ztw74>I0c|7!K@MzE z2#F$MnNCYf%lrU8Qu@yAMfXVdZJx}t*_kD~37(wb-WgPQiHM?Y-c(^TI#qko1NT|y zDE+FS^g99_Fa%w&4|?Fp#|O{|(%p;Q!^q;t7XNPXlZ;R1>%r5^f}BfxS1vXa?ThfGh~>`z zvfpJg2UISZ8u9?r^siAT_os#H-!R4UBGL@*P|M3pQ+>n+T*oXg&sdiinWpiIdSh1M pA$~E9{!1F8?i%&MH`A6;uXiBM4YBsabdvlM!`3m^>-hh)e*uhKO0)m~ diff --git a/toolkit/mozapps/installer/windows/nsis/makensis.mk b/toolkit/mozapps/installer/windows/nsis/makensis.mk index 3d62330ceb32..9784eb5e4e5d 100755 --- a/toolkit/mozapps/installer/windows/nsis/makensis.mk +++ b/toolkit/mozapps/installer/windows/nsis/makensis.mk @@ -82,8 +82,4 @@ uninstaller:: $(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 From 4079f2d44e366061e3a8182376f012b7b1bee06b Mon Sep 17 00:00:00 2001 From: Shawn Wilsher Date: Sat, 20 Dec 2008 01:46:04 +0100 Subject: [PATCH 13/98] Bug 469972 - leaking the places database connection in strange situations; r=dietrich --- .../components/places/src/nsPlacesDBFlush.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/toolkit/components/places/src/nsPlacesDBFlush.js b/toolkit/components/places/src/nsPlacesDBFlush.js index 1aa8cf2a1105..a28f3a095e29 100644 --- a/toolkit/components/places/src/nsPlacesDBFlush.js +++ b/toolkit/components/places/src/nsPlacesDBFlush.js @@ -90,6 +90,17 @@ function nsPlacesDBFlush() // 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 = { @@ -312,16 +323,6 @@ nsPlacesDBFlush.prototype = { ]) }; -////////////////////////////////////////////////////////////////////////////// -//// 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 From f5a9408fe7c6a4cea46b4cf6eb95501f6986f11d Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Sat, 20 Dec 2008 01:49:08 +0100 Subject: [PATCH 14/98] Bug 468562 - "ASSERTION: Inserting multiple children without flushing"; r+sr=mrbkap --- .../html/document/src/nsHTMLContentSink.cpp | 22 ++++++------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/content/html/document/src/nsHTMLContentSink.cpp b/content/html/document/src/nsHTMLContentSink.cpp index 0ba96e520113..faee86c5850d 100644 --- a/content/html/document/src/nsHTMLContentSink.cpp +++ b/content/html/document/src/nsHTMLContentSink.cpp @@ -334,7 +334,7 @@ public: 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(); @@ -898,6 +898,7 @@ SinkContext::HaveNotifiedForCurrentContent() const 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."); @@ -1153,7 +1154,7 @@ SinkContext::AddLeaf(const nsIParserNode& aNode) } nsresult -SinkContext::AddLeaf(nsGenericHTMLElement* aContent) +SinkContext::AddLeaf(nsIContent* aContent) { NS_ASSERTION(mStackPos > 0, "leaf w/o container"); if (mStackPos <= 0) { @@ -1470,13 +1471,8 @@ SinkContext::FlushText(PRBool* aDidFlush, PRBool aReleaseLast) 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; } @@ -2889,13 +2885,8 @@ 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 element; nsCOMPtr nodeInfo; @@ -2923,7 +2914,8 @@ HTMLContentSink::ProcessLINKTag(const nsIParserNode& aNode) if (NS_FAILED(result)) { return result; } - parent->AppendChildTo(element, PR_FALSE); + + mCurrentContext->AddLeaf(element); // s are leaves if (ssle) { ssle->SetEnableUpdates(PR_TRUE); From e28a1a593442321a31c758a40e0c9de78b6d034a Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Sat, 20 Dec 2008 01:55:59 +0100 Subject: [PATCH 15/98] Bug 456219 - fix background clipping with rounded corners; r+sr=roc --- layout/base/nsCSSRendering.cpp | 338 ++++++++++---------- layout/base/nsCSSRenderingBorders.cpp | 12 +- layout/base/nsCSSRenderingBorders.h | 5 + layout/reftests/bugs/456219-1-mask-wArB.png | Bin 0 -> 163 bytes layout/reftests/bugs/456219-1-mask-wArC.png | Bin 0 -> 218 bytes layout/reftests/bugs/456219-1-mask-wArD.png | Bin 0 -> 269 bytes layout/reftests/bugs/456219-1-mask-wArE.png | Bin 0 -> 287 bytes layout/reftests/bugs/456219-1-mask-wBrC.png | Bin 0 -> 166 bytes layout/reftests/bugs/456219-1-mask-wBrD.png | Bin 0 -> 222 bytes layout/reftests/bugs/456219-1-mask-wBrE.png | Bin 0 -> 275 bytes layout/reftests/bugs/456219-1-mask-wCrC.png | Bin 0 -> 207 bytes layout/reftests/bugs/456219-1-mask-wCrD.png | Bin 0 -> 251 bytes layout/reftests/bugs/456219-1-mask-wCrE.png | Bin 0 -> 251 bytes layout/reftests/bugs/456219-1-mask-wDrA.png | Bin 0 -> 117 bytes layout/reftests/bugs/456219-1-mask-wDrB.png | Bin 0 -> 138 bytes layout/reftests/bugs/456219-1-mask-wDrC.png | Bin 0 -> 222 bytes layout/reftests/bugs/456219-1-mask-wDrD.png | Bin 0 -> 279 bytes layout/reftests/bugs/456219-1-mask-wDrE.png | Bin 0 -> 312 bytes layout/reftests/bugs/456219-1-mask-wErB.png | Bin 0 -> 144 bytes layout/reftests/bugs/456219-1-mask-wErC.png | Bin 0 -> 215 bytes layout/reftests/bugs/456219-1-mask-wErD.png | Bin 0 -> 279 bytes layout/reftests/bugs/456219-1-mask-wErE.png | Bin 0 -> 288 bytes layout/reftests/bugs/456219-1-ref.html | 72 +++++ layout/reftests/bugs/456219-1a.html | 81 +++++ layout/reftests/bugs/456219-1b.html | 81 +++++ layout/reftests/bugs/456219-1c.html | 81 +++++ layout/reftests/bugs/456219-2-mask.png | Bin 0 -> 203 bytes layout/reftests/bugs/456219-2-ref.html | 23 ++ layout/reftests/bugs/456219-2.html | 30 ++ layout/reftests/bugs/reftest.list | 6 +- 30 files changed, 556 insertions(+), 173 deletions(-) create mode 100644 layout/reftests/bugs/456219-1-mask-wArB.png create mode 100644 layout/reftests/bugs/456219-1-mask-wArC.png create mode 100644 layout/reftests/bugs/456219-1-mask-wArD.png create mode 100644 layout/reftests/bugs/456219-1-mask-wArE.png create mode 100644 layout/reftests/bugs/456219-1-mask-wBrC.png create mode 100644 layout/reftests/bugs/456219-1-mask-wBrD.png create mode 100644 layout/reftests/bugs/456219-1-mask-wBrE.png create mode 100644 layout/reftests/bugs/456219-1-mask-wCrC.png create mode 100644 layout/reftests/bugs/456219-1-mask-wCrD.png create mode 100644 layout/reftests/bugs/456219-1-mask-wCrE.png create mode 100644 layout/reftests/bugs/456219-1-mask-wDrA.png create mode 100644 layout/reftests/bugs/456219-1-mask-wDrB.png create mode 100644 layout/reftests/bugs/456219-1-mask-wDrC.png create mode 100644 layout/reftests/bugs/456219-1-mask-wDrD.png create mode 100644 layout/reftests/bugs/456219-1-mask-wDrE.png create mode 100644 layout/reftests/bugs/456219-1-mask-wErB.png create mode 100644 layout/reftests/bugs/456219-1-mask-wErC.png create mode 100644 layout/reftests/bugs/456219-1-mask-wErD.png create mode 100644 layout/reftests/bugs/456219-1-mask-wErE.png create mode 100644 layout/reftests/bugs/456219-1-ref.html create mode 100644 layout/reftests/bugs/456219-1a.html create mode 100644 layout/reftests/bugs/456219-1b.html create mode 100644 layout/reftests/bugs/456219-1c.html create mode 100644 layout/reftests/bugs/456219-2-mask.png create mode 100644 layout/reftests/bugs/456219-2-ref.html create mode 100644 layout/reftests/bugs/456219-2.html diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp index 85a84f731d35..ec7cdf990b5e 100644 --- a/layout/base/nsCSSRendering.cpp +++ b/layout/base/nsCSSRendering.cpp @@ -278,14 +278,6 @@ static void DrawBorderImageSide(gfxContext *aThebesContext, PRUint8 aHFillType, PRUint8 aVFillType); -static void PaintBackgroundColor(nsPresContext* aPresContext, - nsIRenderingContext& aRenderingContext, - nsIFrame* aForFrame, - const nsRect& aBgClipArea, - const nsStyleBackground& aColor, - const nsStyleBorder& aBorder, - PRBool aCanPaintNonWhite); - static nscolor MakeBevelColor(PRIntn whichSide, PRUint8 style, nscolor aBackgroundColor, nscolor aBorderColor); @@ -1246,8 +1238,7 @@ IsSolidBorderEdge(const nsStyleBorder& aBorder, PRUint32 aSide) static PRBool IsSolidBorder(const nsStyleBorder& aBorder) { - if (aBorder.mBorderColors || - nsLayoutUtils::HasNonZeroCorner(aBorder.mBorderRadius)) + if (aBorder.mBorderColors) return PR_FALSE; for (PRUint32 i = 0; i < 4; ++i) { if (!IsSolidBorderEdge(aBorder, i)) @@ -1270,20 +1261,14 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, NS_PRECONDITION(aForFrame, "Frame is expected to be provided to PaintBackground"); - PRBool canDrawBackgroundImage = PR_TRUE; - PRBool canDrawBackgroundColor = PR_TRUE; - - if (aUsePrintSettings) { - canDrawBackgroundImage = aPresContext->GetBackgroundImageDraw(); - canDrawBackgroundColor = aPresContext->GetBackgroundColorDraw(); - } - // Check to see if we have an appearance defined. If so, we let the theme // renderer draw the background and bail out. + // XXXzw this ignores aBGClipRect. const nsStyleDisplay* displayData = aForFrame->GetStyleDisplay(); if (displayData->mAppearance) { nsITheme *theme = aPresContext->GetTheme(); - if (theme && theme->ThemeSupportsWidget(aPresContext, aForFrame, displayData->mAppearance)) { + if (theme && theme->ThemeSupportsWidget(aPresContext, aForFrame, + displayData->mAppearance)) { nsRect dirty; dirty.IntersectRect(aDirtyRect, aBorderArea); theme->DrawWidgetBackground(&aRenderingContext, aForFrame, @@ -1292,42 +1277,153 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, } } - // Same coordinate space as aBorderArea - nsRect bgClipArea; - if (aBGClipRect) { - bgClipArea = *aBGClipRect; + // Determine whether we are drawing background images and/or + // background colors. + PRBool drawBackgroundImage = PR_TRUE; + PRBool drawBackgroundColor = PR_TRUE; + + if (aUsePrintSettings) { + drawBackgroundImage = aPresContext->GetBackgroundImageDraw(); + drawBackgroundColor = aPresContext->GetBackgroundColorDraw(); } - else { - // The background is rendered over the 'background-clip' area. - bgClipArea = aBorderArea; - // If the border is solid, then clip the background to the padding-box - // so that we don't draw unnecessary tiles. - if (aColor.mBackgroundClip != NS_STYLE_BG_CLIP_BORDER || - IsSolidBorder(aBorder)) { - nsMargin border = aForFrame->GetUsedBorder(); - aForFrame->ApplySkipSides(border); - bgClipArea.Deflate(border); + + if ((aColor.mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) || + !aColor.mBackgroundImage) { + NS_ASSERTION((aColor.mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) && + !aColor.mBackgroundImage, "background flags/image mismatch"); + drawBackgroundImage = PR_FALSE; + } + + // If GetBackgroundColorDraw() is false, we are still expected to + // draw color in the background of any frame that's not completely + // transparent, but we are expected to use white instead of whatever + // color was specified. + nscolor bgColor; + if (drawBackgroundColor) { + bgColor = aColor.mBackgroundColor; + if (NS_GET_A(bgColor) == 0) + drawBackgroundColor = PR_FALSE; + } else { + bgColor = NS_RGB(255, 255, 255); + if (drawBackgroundImage || NS_GET_A(aColor.mBackgroundColor) > 0) + drawBackgroundColor = PR_TRUE; + } + + // At this point, drawBackgroundImage and drawBackgroundColor are + // true if and only if we are actually supposed to paint an image or + // color into aDirtyRect, respectively. + if (!drawBackgroundImage && !drawBackgroundColor) + return; + + // Compute the outermost boundary of the area that might be painted. + gfxContext *ctx = aRenderingContext.ThebesContext(); + nscoord appUnitsPerPixel = aPresContext->AppUnitsPerDevPixel(); + + // Same coordinate space as aBorderArea & aBGClipRect + nsRect bgArea; + gfxCornerSizes bgRadii; + PRBool haveRoundedCorners; + PRBool radiiAreOuter = PR_TRUE; + { + nscoord radii[8]; + haveRoundedCorners = + GetBorderRadiusTwips(aBorder.mBorderRadius, aForFrame->GetSize().width, + radii); + if (haveRoundedCorners) + ComputePixelRadii(radii, aBorderArea, aForFrame->GetSkipSides(), + appUnitsPerPixel, &bgRadii); + } + + // The background is rendered over the 'background-clip' area, + // which is normally equal to the border area but may be reduced + // to the padding area by CSS. Also, if the border is solid, we + // don't need to draw outside the padding area. In either case, + // if the borders are rounded, make sure we use the same inner + // radii as the border code will. + bgArea = aBorderArea; + if (aColor.mBackgroundClip != NS_STYLE_BG_CLIP_BORDER || + IsSolidBorder(aBorder)) { + nsMargin border = aForFrame->GetUsedBorder(); + aForFrame->ApplySkipSides(border); + bgArea.Deflate(border); + if (haveRoundedCorners) { + gfxCornerSizes outerRadii = bgRadii; + gfxFloat borderSizes[4] = { + border.top / appUnitsPerPixel, border.right / appUnitsPerPixel, + border.bottom / appUnitsPerPixel, border.left / appUnitsPerPixel + }; + nsCSSBorderRenderer::ComputeInnerRadii(outerRadii, borderSizes, + &bgRadii); + radiiAreOuter = PR_FALSE; } } - gfxContext *ctx = aRenderingContext.ThebesContext(); + // The 'bgClipArea' (used only by the image tiling logic, far below) + // is the caller-provided aBGClipRect if any, or else the bgArea + // computed above. (Arguably it should be the intersection, but + // that breaks the table painter -- in particular, honoring the + // bgArea when we have aBGClipRect breaks reftests/bugs/403429-1[ab].) + // The dirtyRect is the intersection of that rectangle with the + // caller-provided aDirtyRect. If the dirtyRect is empty there is + // nothing to draw. + + nsRect bgClipArea; + if (aBGClipRect) + bgClipArea = *aBGClipRect; + else + bgClipArea = bgArea; - // The actual dirty rect is the intersection of the 'background-clip' - // area and the dirty rect we were given nsRect dirtyRect; - if (!dirtyRect.IntersectRect(bgClipArea, aDirtyRect)) { - // Nothing to paint + dirtyRect.IntersectRect(bgClipArea, aDirtyRect); + + if (dirtyRect.IsEmpty()) + return; + + // Compute the Thebes equivalent of the dirtyRect. + gfxRect dirtyRectGfx(RectToGfxRect(dirtyRect, appUnitsPerPixel)); + dirtyRectGfx.Round(); + dirtyRectGfx.Condition(); + if (dirtyRectGfx.IsEmpty()) { + NS_WARNING("converted dirty rect should not be empty"); return; } - // if there is no background image or background images are turned off, try a color. - if (!aColor.mBackgroundImage || !canDrawBackgroundImage) { - PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea, - aColor, aBorder, canDrawBackgroundColor); - return; + // If we have rounded corners, clip all subsequent drawing to the + // rounded rectangle defined by bgArea and bgRadii (we don't know + // whether the rounded corners intrude on the dirtyRect or not). + // Do not do this if we have a caller-provided clip rect -- + // as above with bgArea, arguably a bug, but table painting seems + // to depend on it. + + gfxContextAutoSaveRestore autoSR; + if (haveRoundedCorners && !aBGClipRect) { + gfxRect bgAreaGfx(RectToGfxRect(bgArea, appUnitsPerPixel)); + bgAreaGfx.Round(); + bgAreaGfx.Condition(); + if (bgAreaGfx.IsEmpty()) { + NS_WARNING("converted background area should not be empty"); + return; + } + + autoSR.SetContext(ctx); + ctx->NewPath(); + ctx->RoundedRectangle(bgAreaGfx, bgRadii, radiiAreOuter); + ctx->Clip(); } - // We have a background image + // If we might be using a background color, go ahead and set it now. + if (drawBackgroundColor) + ctx->SetColor(gfxRGBA(bgColor)); + + // If there is no background image, draw a color. (If there is + // neither a background image nor a color, we wouldn't have gotten + // this far.) + if (!drawBackgroundImage) { + ctx->NewPath(); + ctx->Rectangle(dirtyRectGfx); + ctx->Fill(); + return; + } // Lookup the image imgIRequest *req = aPresContext->LoadImage(aColor.mBackgroundImage, @@ -1337,9 +1433,15 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, if (req) req->GetImageStatus(&status); - if (!req || !(status & imgIRequest::STATUS_FRAME_COMPLETE) || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { - PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea, - aColor, aBorder, canDrawBackgroundColor); + // While waiting for the image, draw a color, if any. + if (!req || + !(status & imgIRequest::STATUS_FRAME_COMPLETE) || + !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) { + if (drawBackgroundColor) { + ctx->NewPath(); + ctx->Rectangle(dirtyRectGfx); + ctx->Fill(); + } return; } @@ -1402,46 +1504,50 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, } } - PRBool needBackgroundColor = NS_GET_A(aColor.mBackgroundColor) > 0; PRIntn repeat = aColor.mBackgroundRepeat; - switch (repeat) { case NS_STYLE_BG_REPEAT_X: break; case NS_STYLE_BG_REPEAT_Y: break; case NS_STYLE_BG_REPEAT_XY: - if (needBackgroundColor) { - // If the image is completely opaque, we do not need to paint the - // background color + if (drawBackgroundColor) { + // If the image is completely opaque, we may not need to paint + // the background color. nsCOMPtr gfxImgFrame; image->GetCurrentFrame(getter_AddRefs(gfxImgFrame)); if (gfxImgFrame) { - gfxImgFrame->GetNeedsBackground(&needBackgroundColor); - - /* check for tiling of a image where frame smaller than container */ - nsSize iSize; - image->GetWidth(&iSize.width); - image->GetHeight(&iSize.height); - nsRect iframeRect; - gfxImgFrame->GetRect(iframeRect); - if (iSize.width != iframeRect.width || - iSize.height != iframeRect.height) { - needBackgroundColor = PR_TRUE; + gfxImgFrame->GetNeedsBackground(&drawBackgroundColor); + if (!drawBackgroundColor) { + // If the current frame is smaller than its container, we + // need to paint the background color even if the frame + // itself is opaque. + nsSize iSize; + image->GetWidth(&iSize.width); + image->GetHeight(&iSize.height); + nsRect iframeRect; + gfxImgFrame->GetRect(iframeRect); + if (iSize.width != iframeRect.width || + iSize.height != iframeRect.height) { + drawBackgroundColor = PR_TRUE; + } } } } break; case NS_STYLE_BG_REPEAT_OFF: default: - NS_ASSERTION(repeat == NS_STYLE_BG_REPEAT_OFF, "unknown background-repeat value"); + NS_ASSERTION(repeat == NS_STYLE_BG_REPEAT_OFF, + "unknown background-repeat value"); break; } - // The background color is rendered over the 'background-clip' area - if (needBackgroundColor) { - PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea, - aColor, aBorder, canDrawBackgroundColor); + // The background color is rendered over the entire dirty area, + // even if the image isn't. + if (drawBackgroundColor) { + ctx->NewPath(); + ctx->Rectangle(dirtyRectGfx); + ctx->Fill(); } // Compute the anchor point. @@ -1498,28 +1604,6 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, anchor += bgOriginRect.TopLeft(); } - ctx->Save(); - - nscoord borderRadii[8]; - PRBool haveRadius = GetBorderRadiusTwips(aBorder.mBorderRadius, - aForFrame->GetSize().width, - borderRadii); - if (haveRadius) { - nscoord appUnitsPerPixel = aPresContext->DevPixelsToAppUnits(1); - gfxCornerSizes radii; - ComputePixelRadii(borderRadii, bgClipArea, - aForFrame ? aForFrame->GetSkipSides() : 0, - appUnitsPerPixel, &radii); - - gfxRect oRect(RectToGfxRect(bgClipArea, appUnitsPerPixel)); - oRect.Round(); - oRect.Condition(); - - ctx->NewPath(); - ctx->RoundedRectangle(oRect, radii); - ctx->Clip(); - } - nsRect destArea(imageTopLeft + aBorderArea.TopLeft(), imageSize); nsRect fillArea = destArea; if (repeat & NS_STYLE_BG_REPEAT_X) { @@ -1534,8 +1618,6 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext, nsLayoutUtils::DrawImage(&aRenderingContext, image, destArea, fillArea, anchor + aBorderArea.TopLeft(), dirtyRect); - - ctx->Restore(); } static void @@ -1929,78 +2011,6 @@ DrawBorderImageSide(gfxContext *aThebesContext, aThebesContext->Restore(); } -static void -PaintBackgroundColor(nsPresContext* aPresContext, - nsIRenderingContext& aRenderingContext, - nsIFrame* aForFrame, - const nsRect& aBgClipArea, - const nsStyleBackground& aColor, - const nsStyleBorder& aBorder, - PRBool aCanPaintNonWhite) -{ - // If we're only allowed to paint white, then don't bail out on transparent - // color if we're not completely transparent. See the corresponding check - // for whether we're allowed to paint background images in - // PaintBackgroundWithSC before the first call to PaintBackgroundColor. - if (NS_GET_A(aColor.mBackgroundColor) == 0 && - (aCanPaintNonWhite || aColor.IsTransparent())) { - // nothing to paint - return; - } - - nscolor color = aColor.mBackgroundColor; - if (!aCanPaintNonWhite) { - color = NS_RGB(255, 255, 255); - } - aRenderingContext.SetColor(color); - - if (!nsLayoutUtils::HasNonZeroCorner(aBorder.mBorderRadius)) { - aRenderingContext.FillRect(aBgClipArea); - return; - } - - gfxContext *ctx = aRenderingContext.ThebesContext(); - - // needed for our border thickness - nscoord appUnitsPerPixel = aPresContext->AppUnitsPerDevPixel(); - - nscoord borderRadii[8]; - GetBorderRadiusTwips(aBorder.mBorderRadius, aForFrame->GetSize().width, - borderRadii); - - // the bgClipArea is the outside - gfxRect oRect(RectToGfxRect(aBgClipArea, appUnitsPerPixel)); - oRect.Round(); - oRect.Condition(); - if (oRect.IsEmpty()) - return; - - // convert the radii - gfxCornerSizes radii; - ComputePixelRadii(borderRadii, aBgClipArea, - aForFrame ? aForFrame->GetSkipSides() : 0, - appUnitsPerPixel, &radii); - - // Add 1.0 to any border radii; if we don't, the border and background - // curves will combine to have fringing at the rounded corners. Since - // alpha is used for coverage, we have problems because the border and - // background should have identical coverage, and the border should - // overlay the background exactly. The way to avoid this is by using - // a supersampling scheme, but we don't have the mechanism in place to do - // this. So, this will do for now. - for (int i = 0; i < 4; i++) { - if (radii[i].width > 0.0) - radii[i].width += 1.0; - if (radii[i].height > 0.0) - radii[i].height += 1.0; - } - - ctx->NewPath(); - ctx->RoundedRectangle(oRect, radii); - ctx->Fill(); -} - - // Begin table border-collapsing section // These functions were written to not disrupt the normal ones and yet satisfy some additional requirements // At some point, all functions should be unified to include the additional functionality that these provide diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp index 5517a29f5ed9..31fa3041ad82 100644 --- a/layout/base/nsCSSRenderingBorders.cpp +++ b/layout/base/nsCSSRenderingBorders.cpp @@ -100,10 +100,6 @@ static void ComputeBorderCornerDimensions(const gfxRect& aOuterRect, const gfxCornerSizes& aRadii, gfxCornerSizes *aDimsResult); -static void ComputeInnerRadii(const gfxCornerSizes& radii, - const gfxFloat *borderSizes, - gfxCornerSizes *innerRadii); - // given a side index, get the previous and next side index #define NEXT_SIDE(_s) (((_s) + 1) & 3) #define PREV_SIDE(_s) (((_s) + 3) & 3) @@ -201,10 +197,10 @@ nsCSSBorderRenderer::nsCSSBorderRenderer(PRInt32 aAppUnitsPerPixel, mNoBorderRadius = AllCornersZeroSize(mBorderRadii); } -void -ComputeInnerRadii(const gfxCornerSizes& aRadii, - const gfxFloat *aBorderSizes, - gfxCornerSizes *aInnerRadiiRet) +/* static */ void +nsCSSBorderRenderer::ComputeInnerRadii(const gfxCornerSizes& aRadii, + const gfxFloat *aBorderSizes, + gfxCornerSizes *aInnerRadiiRet) { gfxCornerSizes& iRadii = *aInnerRadiiRet; diff --git a/layout/base/nsCSSRenderingBorders.h b/layout/base/nsCSSRenderingBorders.h index cff72e232196..4f2f95f05da6 100644 --- a/layout/base/nsCSSRenderingBorders.h +++ b/layout/base/nsCSSRenderingBorders.h @@ -200,6 +200,11 @@ struct nsCSSBorderRenderer { // draw the entire border void DrawBorders (); + + // utility function used for background painting as well as borders + static void ComputeInnerRadii(const gfxCornerSizes& aRadii, + const gfxFloat *aBorderSizes, + gfxCornerSizes *aInnerRadiiRet); }; #ifdef DEBUG_NEW_BORDERS diff --git a/layout/reftests/bugs/456219-1-mask-wArB.png b/layout/reftests/bugs/456219-1-mask-wArB.png new file mode 100644 index 0000000000000000000000000000000000000000..4f7eb16ae0f482de9fa30d66ea003d812aae41a3 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S973?!M-E;|A#wg8_HS0K&Mz%cKLVhfPLSQ6wH z%;50sMjDXg?djqeVsSb-L89Wo4@MtDdxpsYj?4lFnV&Xf@@cfQx^OsH`V?$6*vn-Q z?D?RlDbT=z!E&Xz>d(VQY|?Ji8dKFIdve+)F|tcBFiiJm{hL~6w*zFGr>mdKI;Vst E09NZPG5`Po literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wArC.png b/layout/reftests/bugs/456219-1-mask-wArC.png new file mode 100644 index 0000000000000000000000000000000000000000..16f086e9e6b005e7d0325a27ddab3b3d03db26be GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S973?!M-E;|A#wg8_HS0K&Mz%cKLVhfPLSQ6wH z%;50sMjDXQBmaa4^$ZU;G<$M$xU>0uaM+LWBONsR0g3=B^*c==zXZm$D5($m$? JWt~$(69CH#NzbX$%cG~40v4QHMn?0linP-pj^Og!F4?0&BZE_Jf`Ni5Bjh0 zhS;c71}15L{Qp7x;}fIfRptk6AF#+UB&%CK1 Oe|ft4xvXZkfnB~(oOBmCRApkw)Ldu*v=Ea;G_V<^tsE9Hn1o7T+rz|uyaFM z+QVaqCNpHeskZ8F_3bQr$M9fHAL9a}7u_tHvAGw-N|%&p2jm~f@^7qa&SF+R`j(yf zySl>k+wU8J@$<8AxC8+*qD1#3rT;>OtU@9lg~^s) z|D@v=yqIXFATw{3Y{Hiti~@^}D&EX1JlA7-)1~b6y#!;a+sVsIH#s~ry}9;U@}9mA z6Zahu`zAMid-BEmUt`Uev;+leZnzSCNz}Wo2P9X&)#&fKjbspSd zR%l{Bmh7g~*ua})b4Eu_Mc1HN&`o+l01uad7sIL2h5#8JjkE(gZMP0EedX`^TA(M) z#VYLfc+#9HpSq6qAGl@{mUz_AXzVLMQb6Mw<&;$Ur;ZZ^W literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wCrE.png b/layout/reftests/bugs/456219-1-mask-wCrE.png new file mode 100644 index 0000000000000000000000000000000000000000..02fd2f63cdfaa9fecd1f4bf9fb0cdd30ccffa35d GIT binary patch literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%$P6S8J-w6)q}T#{LR^6~Lj%LSCyFgV24hK( zUoeBivm0qZ&SFm&#}JFt$q5VeCa@#9HpSq6qAGl@{mUz_AXzVLMQb6Mw<&;$Ur;ZZ^W literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wDrA.png b/layout/reftests/bugs/456219-1-mask-wDrA.png new file mode 100644 index 0000000000000000000000000000000000000000..02a90a00ea683ca761f4ae0128a6e116ca2f7669 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^@gU5|3?#QSb#4PvYymzYu0WchfnnYg#TFogu_VYZ zn8D%MjWi%f*3-o?#G*GjL4tL0f=CZj7NgiB3!f7*$CyJ(7#Lh!7%tqudaD_zkipZ{ K&t;ucLK6Vk>VQkjm!M!5O;5p-z#|+ci znphOl+9X#on6sWrJa|%)^)S8BClF$@Q4I?Jylqo$9o-Z#-vN%WR4hUoG(EX^!k7hCrJWOFq11 z*}H3ULBt=3A(K3P&f_h(;v?)|)ffem{%+*Xs? Y!x*X~Ic1uDW+%vpp00i_>zopr0FHENkN^Mx literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wDrE.png b/layout/reftests/bugs/456219-1-mask-wDrE.png new file mode 100644 index 0000000000000000000000000000000000000000..8de2e61ac785ccc987f520ef78c558c5cda66ad6 GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^@gU5|3?#QSb#4PvYymzYu0WchfnnYg#TFogu_VYZ zn8D%MjWi(Vfv1aOh{fr*lWm2X35gkPd<8#kn!UaMZ{vTa2Rn3r#@HIzNjF$FN?%ad=ief@g<&dp0)v84%XYDyyBQMZ zSePHYcUta!)7+@Iq$!&(W$f5>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pW8vxI7-DfcIbng(kA_2&9UgvM@Zm;4#TgA7w~#nyF7c`546V-{nD1#w nusVxA@V?Go@O;1hVM85;&MR#5ZFD;KgN*ic^>bP0l+XkKjt?vD literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wErC.png b/layout/reftests/bugs/456219-1-mask-wErC.png new file mode 100644 index 0000000000000000000000000000000000000000..5802482bb76317bc797ffdc511471764ebc7c518 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pQ}5~G7-DfcIbng=1V+I#@(XO3TO>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pv)|LjF~s8Z-N}Z0hYWaJ<8N`5uDH@CJK=?(#LX9h7EJCZE*4FZYo4fB zI7OfJh=Xd&^cRt3Z;ssmU}}AEN9rzScV_X1YwB5y9G!fYG6@U`epkfpW_0CP9G@+$ z`_V%+%ra={?3OvLYCG46OD)M^cThenZQ6R?$m(}f`4jIh+pqHj1fsqxz52qu?e%SE zO}js@J9nPC6DquFdf1dytJ&IJCU5nW5(};3Z}&NxsZZM*(JWU`8ET$z#=ffc5LzB8bLnvboFyt=akR{0PXx}asU7T literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-1-mask-wErE.png b/layout/reftests/bugs/456219-1-mask-wErE.png new file mode 100644 index 0000000000000000000000000000000000000000..66c6861634447a2e0f51d0fde946571a5581c8ec GIT binary patch literal 288 zcmeAS@N?(olHy`uVBq!ia0vp^DL@>>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pbHdZbF~s8Z-N}Z0%?3QK@f?eII1G(KLi;Z$KhdytJ1*0^xS*xaC$~Ld zvcGYelJ}Q@H~DY!f7~wYuFfrCvX`9O*nW}sMQ_@H=t&$Oczx!-*A5lq35ZT=;A==* zYFN$hd}>Z7vtjJ@lC@2ZF$O0lM{vn+UbIkjq2G#WlcW}UojARIht99|BtMZAx|dZ% z`1}fIyY2M875jFNpX>AIsoQq%>~=1D7nr{C?v;dQj;%op@*1YU_4u^;O~je+?~{IC iZ?2a5d33Mkv!4vI%(B + +background-clip interaction with border-radius + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Inside each green shape, there should be no white.

+ + diff --git a/layout/reftests/bugs/456219-1a.html b/layout/reftests/bugs/456219-1a.html new file mode 100644 index 000000000000..be28a95d0766 --- /dev/null +++ b/layout/reftests/bugs/456219-1a.html @@ -0,0 +1,81 @@ + + +background-clip interaction with border-radius + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Inside each green shape, there should be no white.

+ + diff --git a/layout/reftests/bugs/456219-1b.html b/layout/reftests/bugs/456219-1b.html new file mode 100644 index 000000000000..cbfd3f477cd4 --- /dev/null +++ b/layout/reftests/bugs/456219-1b.html @@ -0,0 +1,81 @@ + + +background-clip interaction with border-radius + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Inside each green shape, there should be no white.

+ + diff --git a/layout/reftests/bugs/456219-1c.html b/layout/reftests/bugs/456219-1c.html new file mode 100644 index 000000000000..b075e1f49667 --- /dev/null +++ b/layout/reftests/bugs/456219-1c.html @@ -0,0 +1,81 @@ + + +background-clip interaction with border-radius + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +

Inside each green shape, there should be no white.

+ diff --git a/layout/reftests/bugs/456219-2-mask.png b/layout/reftests/bugs/456219-2-mask.png new file mode 100644 index 0000000000000000000000000000000000000000..b1b5a9a3ff115acdea5d4a58257d040413dadc31 GIT binary patch literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^nIO!<3?xsl5#R(;S^+*Gt_+F{-2eac{{Qdr|G(q^ z|IYvaSO5QC^Z$R{|Nk5Q|KIfg|K|VyxBUOV_5c5zH1@YZU5q6`e!&b5&u*jvIsTq5 zjv*18Zx1RmHaLi|9t@TF#KO4mpzuShpa)6{91bi>6CY-lv7Pfvo4r9G+u&rZ%oDb` yF^Zm(RDkFuztzs93DQ1A{Jl50?zpDa|73W~&u**DW|j&xn!(f6&t;ucLK6U(4NrRj literal 0 HcmV?d00001 diff --git a/layout/reftests/bugs/456219-2-ref.html b/layout/reftests/bugs/456219-2-ref.html new file mode 100644 index 000000000000..66bf98c75067 --- /dev/null +++ b/layout/reftests/bugs/456219-2-ref.html @@ -0,0 +1,23 @@ + + + + + + + +
+ + diff --git a/layout/reftests/bugs/456219-2.html b/layout/reftests/bugs/456219-2.html new file mode 100644 index 000000000000..2c1b3e601476 --- /dev/null +++ b/layout/reftests/bugs/456219-2.html @@ -0,0 +1,30 @@ + + + + + + + +
+ + + diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 39f32d0c0248..054b2cd9e8ca 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -958,7 +958,11 @@ fails == 441259-2.html 441259-2-ref.html # bug 441400 == 455171-5.html 455171-5-ref.html == 455280-1.xhtml 455280-1-ref.xhtml == 455826-1.html 455826-1-ref.html -fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == 456147.xul 456147-ref.html # bug 456147, but not caused by it +fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == 456147.xul 456147-ref.html # bug 458047 +== 456219-1a.html 456219-1-ref.html +== 456219-1b.html 456219-1-ref.html +== 456219-1c.html 456219-1-ref.html +== 456219-2.html 456219-2-ref.html == 456330-1.gif 456330-1-ref.png == 456484-1.html 456484-1-ref.html == 457398-1.html 457398-1-ref.html From 58fe6d8f7465f3cdf7b3e0f6b94d1d6e12549239 Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Sat, 20 Dec 2008 01:59:17 +0100 Subject: [PATCH 16/98] Bug 467423 - Painting stops in this case, using -moz-transform: scale, rotate and video; r=vladimir --- gfx/cairo/cairo/src/cairo-win32-font.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gfx/cairo/cairo/src/cairo-win32-font.c b/gfx/cairo/cairo/src/cairo-win32-font.c index 879cfac79d40..c86cab5a5fcc 100644 --- a/gfx/cairo/cairo/src/cairo-win32-font.c +++ b/gfx/cairo/cairo/src/cairo-win32-font.c @@ -158,7 +158,8 @@ _compute_transform (cairo_win32_scaled_font_t *scaled_font, { 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); @@ -166,7 +167,8 @@ _compute_transform (cairo_win32_scaled_font_t *scaled_font, 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); From 63ac0795527fcc131a03aa1f091edd5b6ce53a35 Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Sat, 20 Dec 2008 02:10:46 +0100 Subject: [PATCH 17/98] Bug 418970 - DOMNodeInsertedIntoDocument mistyped as *InfoDocument; r+sr=jonas --- content/base/src/nsGkAtomList.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/base/src/nsGkAtomList.h b/content/base/src/nsGkAtomList.h index 905438540ef1..87fc511c497b 100755 --- a/content/base/src/nsGkAtomList.h +++ b/content/base/src/nsGkAtomList.h @@ -300,7 +300,7 @@ 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") From 84c079057a4a519076fb340440e7e51e9611b1ae Mon Sep 17 00:00:00 2001 From: Sergey Yanovich Date: Sat, 20 Dec 2008 02:21:04 +0100 Subject: [PATCH 18/98] Bug 462497 - nsComponentManagerImpl::HashContractID() reenters mMon; r=benjamin --- xpcom/components/nsComponentManager.cpp | 2 +- xpcom/components/nsComponentManager.h | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp index e81187f0f0d6..1230676292f1 100644 --- a/xpcom/components/nsComponentManager.cpp +++ b/xpcom/components/nsComponentManager.cpp @@ -1298,7 +1298,7 @@ nsComponentManagerImpl::HashContractID(const char *aContractID, if(!aContractID || !aContractIDLen) return NS_ERROR_NULL_POINTER; - nsAutoMonitor mon(mMon); + NS_ASSERTION(PR_GetMonitorEntryCount(mMon), "called from outside mMon"); nsContractIDTableEntry* contractIDTableEntry = static_cast diff --git a/xpcom/components/nsComponentManager.h b/xpcom/components/nsComponentManager.h index f2864631e197..390adcbf5685 100644 --- a/xpcom/components/nsComponentManager.h +++ b/xpcom/components/nsComponentManager.h @@ -213,6 +213,9 @@ public: nsFactoryEntry *GetFactoryEntry(const nsCID &aClass); nsresult SyncComponentsInDir(PRInt32 when, nsIFile *dirSpec); + + // NOTE: HashContractID operates on the hash table with ContractIDs, + // for thread-safety it should only be invoked from inside mMon. nsresult HashContractID(const char *acontractID, PRUint32 aContractIDLen, nsFactoryEntry *fe_ptr); From 87bb5c389bcd55f3f296994aef79e81e9e01d292 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Fri, 19 Dec 2008 17:33:20 -0800 Subject: [PATCH 19/98] Bug 461680 - Improve video control fade in/out animation. r=enn --- .../tests/widgets/test_videocontrols.html | 32 ++-- toolkit/content/widgets/videocontrols.xml | 148 +++++++++++------- .../pinstripe/global/media/videocontrols.css | 2 +- .../winstripe/global/media/videocontrols.css | 2 +- 4 files changed, 108 insertions(+), 76 deletions(-) diff --git a/toolkit/content/tests/widgets/test_videocontrols.html b/toolkit/content/tests/widgets/test_videocontrols.html index 93c526a81841..d78a392d00e2 100644 --- a/toolkit/content/tests/widgets/test_videocontrols.html +++ b/toolkit/content/tests/widgets/test_videocontrols.html @@ -11,37 +11,27 @@

- +
 
+
+
+
+
+
+
+
+
diff --git a/parser/htmlparser/tests/crashtests/crashtests.list b/parser/htmlparser/tests/crashtests/crashtests.list
index 5e467e90c268..2bf1aed15cfa 100644
--- a/parser/htmlparser/tests/crashtests/crashtests.list
+++ b/parser/htmlparser/tests/crashtests/crashtests.list
@@ -1 +1,2 @@
 load 423373-1.html
+load 460706-1.xhtml

From d92c943750c35d0d228ac4990e4c8ebbe5c14b48 Mon Sep 17 00:00:00 2001
From: Serge Gautherie 
Date: Sat, 20 Dec 2008 02:56:04 +0100
Subject: [PATCH 21/98] Backed out changeset: 8b5a38ba459a

---
 xpcom/components/nsComponentManager.cpp | 2 +-
 xpcom/components/nsComponentManager.h   | 3 ---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/xpcom/components/nsComponentManager.cpp b/xpcom/components/nsComponentManager.cpp
index 1230676292f1..e81187f0f0d6 100644
--- a/xpcom/components/nsComponentManager.cpp
+++ b/xpcom/components/nsComponentManager.cpp
@@ -1298,7 +1298,7 @@ nsComponentManagerImpl::HashContractID(const char *aContractID,
     if(!aContractID || !aContractIDLen)
         return NS_ERROR_NULL_POINTER;
 
-    NS_ASSERTION(PR_GetMonitorEntryCount(mMon), "called from outside mMon");
+    nsAutoMonitor mon(mMon);
 
     nsContractIDTableEntry* contractIDTableEntry =
         static_cast
diff --git a/xpcom/components/nsComponentManager.h b/xpcom/components/nsComponentManager.h
index 390adcbf5685..f2864631e197 100644
--- a/xpcom/components/nsComponentManager.h
+++ b/xpcom/components/nsComponentManager.h
@@ -213,9 +213,6 @@ public:
     nsFactoryEntry *GetFactoryEntry(const nsCID &aClass);
 
     nsresult SyncComponentsInDir(PRInt32 when, nsIFile *dirSpec);
-
-    // NOTE: HashContractID operates on the hash table with ContractIDs,
-    // for thread-safety it should only be invoked from inside mMon.
     nsresult HashContractID(const char *acontractID, PRUint32 aContractIDLen,
                             nsFactoryEntry *fe_ptr);
 

From a9b56e70b39160d33901bb336e228d8ec7fb620c Mon Sep 17 00:00:00 2001
From: Serge Gautherie 
Date: Sat, 20 Dec 2008 04:59:56 +0100
Subject: [PATCH 22/98] Backed out changeset: 4fbb9483d7e6

---
 layout/base/nsCSSRendering.cpp              | 342 ++++++++++----------
 layout/base/nsCSSRenderingBorders.cpp       |  12 +-
 layout/base/nsCSSRenderingBorders.h         |   5 -
 layout/reftests/bugs/456219-1-mask-wArB.png | Bin 163 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wArC.png | Bin 218 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wArD.png | Bin 269 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wArE.png | Bin 287 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wBrC.png | Bin 166 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wBrD.png | Bin 222 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wBrE.png | Bin 275 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wCrC.png | Bin 207 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wCrD.png | Bin 251 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wCrE.png | Bin 251 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wDrA.png | Bin 117 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wDrB.png | Bin 138 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wDrC.png | Bin 222 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wDrD.png | Bin 279 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wDrE.png | Bin 312 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wErB.png | Bin 144 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wErC.png | Bin 215 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wErD.png | Bin 279 -> 0 bytes
 layout/reftests/bugs/456219-1-mask-wErE.png | Bin 288 -> 0 bytes
 layout/reftests/bugs/456219-1-ref.html      |  72 -----
 layout/reftests/bugs/456219-1a.html         |  81 -----
 layout/reftests/bugs/456219-1b.html         |  81 -----
 layout/reftests/bugs/456219-1c.html         |  81 -----
 layout/reftests/bugs/456219-2-mask.png      | Bin 203 -> 0 bytes
 layout/reftests/bugs/456219-2-ref.html      |  23 --
 layout/reftests/bugs/456219-2.html          |  30 --
 layout/reftests/bugs/reftest.list           |   6 +-
 30 files changed, 175 insertions(+), 558 deletions(-)
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wArB.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wArC.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wArD.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wArE.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wBrC.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wBrD.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wBrE.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wCrC.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wCrD.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wCrE.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wDrA.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wDrB.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wDrC.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wDrD.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wDrE.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wErB.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wErC.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wErD.png
 delete mode 100644 layout/reftests/bugs/456219-1-mask-wErE.png
 delete mode 100644 layout/reftests/bugs/456219-1-ref.html
 delete mode 100644 layout/reftests/bugs/456219-1a.html
 delete mode 100644 layout/reftests/bugs/456219-1b.html
 delete mode 100644 layout/reftests/bugs/456219-1c.html
 delete mode 100644 layout/reftests/bugs/456219-2-mask.png
 delete mode 100644 layout/reftests/bugs/456219-2-ref.html
 delete mode 100644 layout/reftests/bugs/456219-2.html

diff --git a/layout/base/nsCSSRendering.cpp b/layout/base/nsCSSRendering.cpp
index ec7cdf990b5e..85a84f731d35 100644
--- a/layout/base/nsCSSRendering.cpp
+++ b/layout/base/nsCSSRendering.cpp
@@ -278,6 +278,14 @@ static void DrawBorderImageSide(gfxContext *aThebesContext,
                                 PRUint8 aHFillType,
                                 PRUint8 aVFillType);
 
+static void PaintBackgroundColor(nsPresContext* aPresContext,
+                                 nsIRenderingContext& aRenderingContext,
+                                 nsIFrame* aForFrame,
+                                 const nsRect& aBgClipArea,
+                                 const nsStyleBackground& aColor,
+                                 const nsStyleBorder& aBorder,
+                                 PRBool aCanPaintNonWhite);
+
 static nscolor MakeBevelColor(PRIntn whichSide, PRUint8 style,
                               nscolor aBackgroundColor,
                               nscolor aBorderColor);
@@ -1238,7 +1246,8 @@ IsSolidBorderEdge(const nsStyleBorder& aBorder, PRUint32 aSide)
 static PRBool
 IsSolidBorder(const nsStyleBorder& aBorder)
 {
-  if (aBorder.mBorderColors)
+  if (aBorder.mBorderColors ||
+      nsLayoutUtils::HasNonZeroCorner(aBorder.mBorderRadius))
     return PR_FALSE;
   for (PRUint32 i = 0; i < 4; ++i) {
     if (!IsSolidBorderEdge(aBorder, i))
@@ -1261,14 +1270,20 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
   NS_PRECONDITION(aForFrame,
                   "Frame is expected to be provided to PaintBackground");
 
+  PRBool canDrawBackgroundImage = PR_TRUE;
+  PRBool canDrawBackgroundColor = PR_TRUE;
+
+  if (aUsePrintSettings) {
+    canDrawBackgroundImage = aPresContext->GetBackgroundImageDraw();
+    canDrawBackgroundColor = aPresContext->GetBackgroundColorDraw();
+  }
+
   // Check to see if we have an appearance defined.  If so, we let the theme
   // renderer draw the background and bail out.
-  // XXXzw this ignores aBGClipRect.
   const nsStyleDisplay* displayData = aForFrame->GetStyleDisplay();
   if (displayData->mAppearance) {
     nsITheme *theme = aPresContext->GetTheme();
-    if (theme && theme->ThemeSupportsWidget(aPresContext, aForFrame,
-                                            displayData->mAppearance)) {
+    if (theme && theme->ThemeSupportsWidget(aPresContext, aForFrame, displayData->mAppearance)) {
       nsRect dirty;
       dirty.IntersectRect(aDirtyRect, aBorderArea);
       theme->DrawWidgetBackground(&aRenderingContext, aForFrame, 
@@ -1277,154 +1292,43 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
     }
   }
 
-  // Determine whether we are drawing background images and/or
-  // background colors.
-  PRBool drawBackgroundImage = PR_TRUE;
-  PRBool drawBackgroundColor = PR_TRUE;
-
-  if (aUsePrintSettings) {
-    drawBackgroundImage = aPresContext->GetBackgroundImageDraw();
-    drawBackgroundColor = aPresContext->GetBackgroundColorDraw();
-  }
-
-  if ((aColor.mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) ||
-      !aColor.mBackgroundImage) {
-    NS_ASSERTION((aColor.mBackgroundFlags & NS_STYLE_BG_IMAGE_NONE) &&
-                 !aColor.mBackgroundImage, "background flags/image mismatch");
-    drawBackgroundImage = PR_FALSE;
-  }
-
-  // If GetBackgroundColorDraw() is false, we are still expected to
-  // draw color in the background of any frame that's not completely
-  // transparent, but we are expected to use white instead of whatever
-  // color was specified.
-  nscolor bgColor;
-  if (drawBackgroundColor) {
-    bgColor = aColor.mBackgroundColor;
-    if (NS_GET_A(bgColor) == 0)
-      drawBackgroundColor = PR_FALSE;
-  } else {
-    bgColor = NS_RGB(255, 255, 255);
-    if (drawBackgroundImage || NS_GET_A(aColor.mBackgroundColor) > 0)
-      drawBackgroundColor = PR_TRUE;
-  }
-
-  // At this point, drawBackgroundImage and drawBackgroundColor are
-  // true if and only if we are actually supposed to paint an image or
-  // color into aDirtyRect, respectively.
-  if (!drawBackgroundImage && !drawBackgroundColor)
-    return;
-
-  // Compute the outermost boundary of the area that might be painted.
-  gfxContext *ctx = aRenderingContext.ThebesContext();
-  nscoord appUnitsPerPixel = aPresContext->AppUnitsPerDevPixel();
-
-  // Same coordinate space as aBorderArea & aBGClipRect
-  nsRect bgArea;
-  gfxCornerSizes bgRadii;
-  PRBool haveRoundedCorners;
-  PRBool radiiAreOuter = PR_TRUE;
-  {
-    nscoord radii[8];
-    haveRoundedCorners =
-      GetBorderRadiusTwips(aBorder.mBorderRadius, aForFrame->GetSize().width,
-                           radii);
-    if (haveRoundedCorners)
-      ComputePixelRadii(radii, aBorderArea, aForFrame->GetSkipSides(),
-                        appUnitsPerPixel, &bgRadii);
-  }
-  
-  // The background is rendered over the 'background-clip' area,
-  // which is normally equal to the border area but may be reduced
-  // to the padding area by CSS.  Also, if the border is solid, we
-  // don't need to draw outside the padding area.  In either case,
-  // if the borders are rounded, make sure we use the same inner
-  // radii as the border code will.
-  bgArea = aBorderArea;
-  if (aColor.mBackgroundClip != NS_STYLE_BG_CLIP_BORDER ||
-      IsSolidBorder(aBorder)) {
-    nsMargin border = aForFrame->GetUsedBorder();
-    aForFrame->ApplySkipSides(border);
-    bgArea.Deflate(border);
-    if (haveRoundedCorners) {
-      gfxCornerSizes outerRadii = bgRadii;
-      gfxFloat borderSizes[4] = {
-        border.top / appUnitsPerPixel, border.right / appUnitsPerPixel,
-        border.bottom / appUnitsPerPixel, border.left / appUnitsPerPixel
-      };
-      nsCSSBorderRenderer::ComputeInnerRadii(outerRadii, borderSizes,
-                                             &bgRadii);
-      radiiAreOuter = PR_FALSE;
-    }
-  }
-
-  // The 'bgClipArea' (used only by the image tiling logic, far below)
-  // is the caller-provided aBGClipRect if any, or else the bgArea
-  // computed above.  (Arguably it should be the intersection, but
-  // that breaks the table painter -- in particular, honoring the
-  // bgArea when we have aBGClipRect breaks reftests/bugs/403429-1[ab].)
-  // The dirtyRect is the intersection of that rectangle with the
-  // caller-provided aDirtyRect.  If the dirtyRect is empty there is
-  // nothing to draw.
-
+  // Same coordinate space as aBorderArea
   nsRect bgClipArea;
-  if (aBGClipRect)
+  if (aBGClipRect) {
     bgClipArea = *aBGClipRect;
-  else
-    bgClipArea = bgArea;
-
-  nsRect dirtyRect;
-  dirtyRect.IntersectRect(bgClipArea, aDirtyRect);
-
-  if (dirtyRect.IsEmpty())
-    return;
-
-  // Compute the Thebes equivalent of the dirtyRect.
-  gfxRect dirtyRectGfx(RectToGfxRect(dirtyRect, appUnitsPerPixel));
-  dirtyRectGfx.Round();
-  dirtyRectGfx.Condition();
-  if (dirtyRectGfx.IsEmpty()) {
-    NS_WARNING("converted dirty rect should not be empty");
-    return;
   }
-
-  // If we have rounded corners, clip all subsequent drawing to the
-  // rounded rectangle defined by bgArea and bgRadii (we don't know
-  // whether the rounded corners intrude on the dirtyRect or not).
-  // Do not do this if we have a caller-provided clip rect --
-  // as above with bgArea, arguably a bug, but table painting seems
-  // to depend on it.
-
-  gfxContextAutoSaveRestore autoSR;
-  if (haveRoundedCorners && !aBGClipRect) {
-    gfxRect bgAreaGfx(RectToGfxRect(bgArea, appUnitsPerPixel));
-    bgAreaGfx.Round();
-    bgAreaGfx.Condition();
-    if (bgAreaGfx.IsEmpty()) {
-      NS_WARNING("converted background area should not be empty");
-      return;
+  else {
+    // The background is rendered over the 'background-clip' area.
+    bgClipArea = aBorderArea;
+    // If the border is solid, then clip the background to the padding-box
+    // so that we don't draw unnecessary tiles.
+    if (aColor.mBackgroundClip != NS_STYLE_BG_CLIP_BORDER ||
+        IsSolidBorder(aBorder)) {
+      nsMargin border = aForFrame->GetUsedBorder();
+      aForFrame->ApplySkipSides(border);
+      bgClipArea.Deflate(border);
     }
-
-    autoSR.SetContext(ctx);
-    ctx->NewPath();
-    ctx->RoundedRectangle(bgAreaGfx, bgRadii, radiiAreOuter);
-    ctx->Clip();
   }
 
-  // If we might be using a background color, go ahead and set it now.
-  if (drawBackgroundColor)
-    ctx->SetColor(gfxRGBA(bgColor));
+  gfxContext *ctx = aRenderingContext.ThebesContext();
 
-  // If there is no background image, draw a color.  (If there is
-  // neither a background image nor a color, we wouldn't have gotten
-  // this far.)
-  if (!drawBackgroundImage) {
-    ctx->NewPath();
-    ctx->Rectangle(dirtyRectGfx);
-    ctx->Fill();
+  // The actual dirty rect is the intersection of the 'background-clip'
+  // area and the dirty rect we were given
+  nsRect dirtyRect;
+  if (!dirtyRect.IntersectRect(bgClipArea, aDirtyRect)) {
+    // Nothing to paint
     return;
   }
 
+  // if there is no background image or background images are turned off, try a color.
+  if (!aColor.mBackgroundImage || !canDrawBackgroundImage) {
+    PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea,
+                         aColor, aBorder, canDrawBackgroundColor);
+    return;
+  }
+
+  // We have a background image
+
   // Lookup the image
   imgIRequest *req = aPresContext->LoadImage(aColor.mBackgroundImage,
                                              aForFrame);
@@ -1433,15 +1337,9 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
   if (req)
     req->GetImageStatus(&status);
 
-  // While waiting for the image, draw a color, if any.
-  if (!req ||
-      !(status & imgIRequest::STATUS_FRAME_COMPLETE) ||
-      !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) {
-    if (drawBackgroundColor) {
-      ctx->NewPath();
-      ctx->Rectangle(dirtyRectGfx);
-      ctx->Fill();
-    }
+  if (!req || !(status & imgIRequest::STATUS_FRAME_COMPLETE) || !(status & imgIRequest::STATUS_SIZE_AVAILABLE)) {
+    PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea,
+                         aColor, aBorder, canDrawBackgroundColor);
     return;
   }
 
@@ -1504,50 +1402,46 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
     }
   }
 
+  PRBool  needBackgroundColor = NS_GET_A(aColor.mBackgroundColor) > 0;
   PRIntn  repeat = aColor.mBackgroundRepeat;
+
   switch (repeat) {
     case NS_STYLE_BG_REPEAT_X:
       break;
     case NS_STYLE_BG_REPEAT_Y:
       break;
     case NS_STYLE_BG_REPEAT_XY:
-      if (drawBackgroundColor) {
-        // If the image is completely opaque, we may not need to paint
-        // the background color.
+      if (needBackgroundColor) {
+        // If the image is completely opaque, we do not need to paint the
+        // background color
         nsCOMPtr gfxImgFrame;
         image->GetCurrentFrame(getter_AddRefs(gfxImgFrame));
         if (gfxImgFrame) {
-          gfxImgFrame->GetNeedsBackground(&drawBackgroundColor);
-          if (!drawBackgroundColor) {
-            // If the current frame is smaller than its container, we
-            // need to paint the background color even if the frame
-            // itself is opaque.
-            nsSize iSize;
-            image->GetWidth(&iSize.width);
-            image->GetHeight(&iSize.height);
-            nsRect iframeRect;
-            gfxImgFrame->GetRect(iframeRect);
-            if (iSize.width != iframeRect.width ||
-                iSize.height != iframeRect.height) {
-              drawBackgroundColor = PR_TRUE;
-            }
+          gfxImgFrame->GetNeedsBackground(&needBackgroundColor);
+
+          /* check for tiling of a image where frame smaller than container */
+          nsSize iSize;
+          image->GetWidth(&iSize.width);
+          image->GetHeight(&iSize.height);
+          nsRect iframeRect;
+          gfxImgFrame->GetRect(iframeRect);
+          if (iSize.width != iframeRect.width ||
+              iSize.height != iframeRect.height) {
+            needBackgroundColor = PR_TRUE;
           }
         }
       }
       break;
     case NS_STYLE_BG_REPEAT_OFF:
     default:
-      NS_ASSERTION(repeat == NS_STYLE_BG_REPEAT_OFF,
-                   "unknown background-repeat value");
+      NS_ASSERTION(repeat == NS_STYLE_BG_REPEAT_OFF, "unknown background-repeat value");
       break;
   }
 
-  // The background color is rendered over the entire dirty area,
-  // even if the image isn't.
-  if (drawBackgroundColor) {
-    ctx->NewPath();
-    ctx->Rectangle(dirtyRectGfx);
-    ctx->Fill();
+  // The background color is rendered over the 'background-clip' area
+  if (needBackgroundColor) {
+    PaintBackgroundColor(aPresContext, aRenderingContext, aForFrame, bgClipArea,
+                         aColor, aBorder, canDrawBackgroundColor);
   }
 
   // Compute the anchor point.
@@ -1604,6 +1498,28 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
     anchor += bgOriginRect.TopLeft();
   }
 
+  ctx->Save();
+
+  nscoord borderRadii[8];
+  PRBool haveRadius = GetBorderRadiusTwips(aBorder.mBorderRadius,
+                                           aForFrame->GetSize().width,
+                                           borderRadii);
+  if (haveRadius) {
+    nscoord appUnitsPerPixel = aPresContext->DevPixelsToAppUnits(1);
+    gfxCornerSizes radii;
+    ComputePixelRadii(borderRadii, bgClipArea,
+                      aForFrame ? aForFrame->GetSkipSides() : 0,
+                      appUnitsPerPixel, &radii);
+
+    gfxRect oRect(RectToGfxRect(bgClipArea, appUnitsPerPixel));
+    oRect.Round();
+    oRect.Condition();
+
+    ctx->NewPath();
+    ctx->RoundedRectangle(oRect, radii);
+    ctx->Clip();
+  }
+
   nsRect destArea(imageTopLeft + aBorderArea.TopLeft(), imageSize);
   nsRect fillArea = destArea;
   if (repeat & NS_STYLE_BG_REPEAT_X) {
@@ -1618,6 +1534,8 @@ nsCSSRendering::PaintBackgroundWithSC(nsPresContext* aPresContext,
 
   nsLayoutUtils::DrawImage(&aRenderingContext, image,
       destArea, fillArea, anchor + aBorderArea.TopLeft(), dirtyRect);
+
+  ctx->Restore();
 }
 
 static void
@@ -2011,6 +1929,78 @@ DrawBorderImageSide(gfxContext *aThebesContext,
   aThebesContext->Restore();
 }
 
+static void
+PaintBackgroundColor(nsPresContext* aPresContext,
+                     nsIRenderingContext& aRenderingContext,
+                     nsIFrame* aForFrame,
+                     const nsRect& aBgClipArea,
+                     const nsStyleBackground& aColor,
+                     const nsStyleBorder& aBorder,
+                     PRBool aCanPaintNonWhite)
+{
+  // If we're only allowed to paint white, then don't bail out on transparent
+  // color if we're not completely transparent.  See the corresponding check
+  // for whether we're allowed to paint background images in
+  // PaintBackgroundWithSC before the first call to PaintBackgroundColor.
+  if (NS_GET_A(aColor.mBackgroundColor) == 0 &&
+      (aCanPaintNonWhite || aColor.IsTransparent())) {
+    // nothing to paint
+    return;
+  }
+
+  nscolor color = aColor.mBackgroundColor;
+  if (!aCanPaintNonWhite) {
+    color = NS_RGB(255, 255, 255);
+  }
+  aRenderingContext.SetColor(color);
+
+  if (!nsLayoutUtils::HasNonZeroCorner(aBorder.mBorderRadius)) {
+    aRenderingContext.FillRect(aBgClipArea);
+    return;
+  }
+
+  gfxContext *ctx = aRenderingContext.ThebesContext();
+
+  // needed for our border thickness
+  nscoord appUnitsPerPixel = aPresContext->AppUnitsPerDevPixel();
+
+  nscoord borderRadii[8];
+  GetBorderRadiusTwips(aBorder.mBorderRadius, aForFrame->GetSize().width,
+                       borderRadii);
+
+  // the bgClipArea is the outside
+  gfxRect oRect(RectToGfxRect(aBgClipArea, appUnitsPerPixel));
+  oRect.Round();
+  oRect.Condition();
+  if (oRect.IsEmpty())
+    return;
+
+  // convert the radii
+  gfxCornerSizes radii;
+  ComputePixelRadii(borderRadii, aBgClipArea,
+                    aForFrame ? aForFrame->GetSkipSides() : 0,
+                    appUnitsPerPixel, &radii);
+
+  // Add 1.0 to any border radii; if we don't, the border and background
+  // curves will combine to have fringing at the rounded corners.  Since
+  // alpha is used for coverage, we have problems because the border and
+  // background should have identical coverage, and the border should
+  // overlay the background exactly.  The way to avoid this is by using
+  // a supersampling scheme, but we don't have the mechanism in place to do
+  // this.  So, this will do for now.
+  for (int i = 0; i < 4; i++) {
+    if (radii[i].width > 0.0)
+      radii[i].width += 1.0;
+    if (radii[i].height > 0.0)
+      radii[i].height += 1.0;
+  }
+
+  ctx->NewPath();
+  ctx->RoundedRectangle(oRect, radii);
+  ctx->Fill();
+}
+
+
 // Begin table border-collapsing section
 // These functions were written to not disrupt the normal ones and yet satisfy some additional requirements
 // At some point, all functions should be unified to include the additional functionality that these provide
diff --git a/layout/base/nsCSSRenderingBorders.cpp b/layout/base/nsCSSRenderingBorders.cpp
index 31fa3041ad82..5517a29f5ed9 100644
--- a/layout/base/nsCSSRenderingBorders.cpp
+++ b/layout/base/nsCSSRenderingBorders.cpp
@@ -100,6 +100,10 @@ static void ComputeBorderCornerDimensions(const gfxRect& aOuterRect,
                                           const gfxCornerSizes& aRadii,
                                           gfxCornerSizes *aDimsResult);
 
+static void ComputeInnerRadii(const gfxCornerSizes& radii,
+                              const gfxFloat *borderSizes,
+                              gfxCornerSizes *innerRadii);
+
 // given a side index, get the previous and next side index
 #define NEXT_SIDE(_s) (((_s) + 1) & 3)
 #define PREV_SIDE(_s) (((_s) + 3) & 3)
@@ -197,10 +201,10 @@ nsCSSBorderRenderer::nsCSSBorderRenderer(PRInt32 aAppUnitsPerPixel,
   mNoBorderRadius = AllCornersZeroSize(mBorderRadii);
 }
 
-/* static */ void
-nsCSSBorderRenderer::ComputeInnerRadii(const gfxCornerSizes& aRadii,
-                                       const gfxFloat *aBorderSizes,
-                                       gfxCornerSizes *aInnerRadiiRet)
+void
+ComputeInnerRadii(const gfxCornerSizes& aRadii,
+                  const gfxFloat *aBorderSizes,
+                  gfxCornerSizes *aInnerRadiiRet)
 {
   gfxCornerSizes& iRadii = *aInnerRadiiRet;
 
diff --git a/layout/base/nsCSSRenderingBorders.h b/layout/base/nsCSSRenderingBorders.h
index 4f2f95f05da6..cff72e232196 100644
--- a/layout/base/nsCSSRenderingBorders.h
+++ b/layout/base/nsCSSRenderingBorders.h
@@ -200,11 +200,6 @@ struct nsCSSBorderRenderer {
 
   // draw the entire border
   void DrawBorders ();
-
-  // utility function used for background painting as well as borders
-  static void ComputeInnerRadii(const gfxCornerSizes& aRadii,
-                                const gfxFloat *aBorderSizes,
-                                gfxCornerSizes *aInnerRadiiRet);
 };
 
 #ifdef DEBUG_NEW_BORDERS
diff --git a/layout/reftests/bugs/456219-1-mask-wArB.png b/layout/reftests/bugs/456219-1-mask-wArB.png
deleted file mode 100644
index 4f7eb16ae0f482de9fa30d66ea003d812aae41a3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 163
zcmeAS@N?(olHy`uVBq!ia0vp^Q6S973?!M-E;|A#wg8_HS0K&Mz%cKLVhfPLSQ6wH
z%;50sMjDXg?djqeVsSb-L89Wo4@MtDdxpsYj?4lFnV&Xf@@cfQx^OsH`V?$6*vn-Q
z?D?RlDbT=z!E&Xz>d(VQY|?Ji8dKFIdve+)F|tcBFiiJm{hL~6w*zFGr>mdKI;Vst
E09NZPG5`Po

diff --git a/layout/reftests/bugs/456219-1-mask-wArC.png b/layout/reftests/bugs/456219-1-mask-wArC.png
deleted file mode 100644
index 16f086e9e6b005e7d0325a27ddab3b3d03db26be..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 218
zcmeAS@N?(olHy`uVBq!ia0vp^Q6S973?!M-E;|A#wg8_HS0K&Mz%cKLVhfPLSQ6wH
z%;50sMjDXQBmaa4^$ZU;G<$M$xU>0uaM+LWBONsR0g3=B^*c==zXZm$D5($m$?
JWt~$(69CH#NzbX$%cG~40v4QHMn?0linP-pj^Og!F4?0&BZE_Jf`Ni5Bjh0
zhS;c71}15L{Qp7x;}fIfRptk6AF#+UB&%CK1
Oe|ft4xvXZkfnB~(oOBmCRApkw)Ldu*v=Ea;G_V<^tsE9Hn1o7T+rz|uyaFM
z+QVaqCNpHeskZ8F_3bQr$M9fHAL9a}7u_tHvAGw-N|%&p2jm~f@^7qa&SF+R`j(yf
zySl>k+wU8J@$<8AxC8+*qD1#3rT;>OtU@9lg~^s)
z|D@v=yqIXFATw{3Y{Hiti~@^}D&EX1JlA7-)1~b6y#!;a+sVsIH#s~ry}9;U@}9mA
z6Zahu`zAMid-BEmUt`Uev;+leZnzSCNz}Wo2P9X&)#&fKjbspSd
zR%l{Bmh7g~*ua})b4Eu_Mc1HN&`o+l01uad7sIL2h5#8JjkE(gZMP0EedX`^TA(M)
z#VYLfc+#9HpSq6qAGl@{mUz_AXzVLMQb6Mw<&;$Ur;ZZ^W

diff --git a/layout/reftests/bugs/456219-1-mask-wCrE.png b/layout/reftests/bugs/456219-1-mask-wCrE.png
deleted file mode 100644
index 02fd2f63cdfaa9fecd1f4bf9fb0cdd30ccffa35d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 251
zcmeAS@N?(olHy`uVBq!ia0vp^c|aV%$P6S8J-w6)q}T#{LR^6~Lj%LSCyFgV24hK(
zUoeBivm0qZ&SFm&#}JFt$q5VeCa@#9HpSq6qAGl@{mUz_AXzVLMQb6Mw<&;$Ur;ZZ^W

diff --git a/layout/reftests/bugs/456219-1-mask-wDrA.png b/layout/reftests/bugs/456219-1-mask-wDrA.png
deleted file mode 100644
index 02a90a00ea683ca761f4ae0128a6e116ca2f7669..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 117
zcmeAS@N?(olHy`uVBq!ia0vp^@gU5|3?#QSb#4PvYymzYu0WchfnnYg#TFogu_VYZ
zn8D%MjWi%f*3-o?#G*GjL4tL0f=CZj7NgiB3!f7*$CyJ(7#Lh!7%tqudaD_zkipZ{
K&t;ucLK6Vk>VQkjm!M!5O;5p-z#|+ci
znphOl+9X#on6sWrJa|%)^)S8BClF$@Q4I?Jylqo$9o-Z#-vN%WR4hUoG(EX^!k7hCrJWOFq11
z*}H3ULBt=3A(K3P&f_h(;v?)|)ffem{%+*Xs?
Y!x*X~Ic1uDW+%vpp00i_>zopr0FHENkN^Mx

diff --git a/layout/reftests/bugs/456219-1-mask-wDrE.png b/layout/reftests/bugs/456219-1-mask-wDrE.png
deleted file mode 100644
index 8de2e61ac785ccc987f520ef78c558c5cda66ad6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 312
zcmeAS@N?(olHy`uVBq!ia0vp^@gU5|3?#QSb#4PvYymzYu0WchfnnYg#TFogu_VYZ
zn8D%MjWi(Vfv1aOh{fr*lWm2X35gkPd<8#kn!UaMZ{vTa2Rn3r#@HIzNjF$FN?%ad=ief@g<&dp0)v84%XYDyyBQMZ
zSePHYcUta!)7+@Iq$!&(W$f5>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pW8vxI7-DfcIbng(kA_2&9UgvM@Zm;4#TgA7w~#nyF7c`546V-{nD1#w
nusVxA@V?Go@O;1hVM85;&MR#5ZFD;KgN*ic^>bP0l+XkKjt?vD

diff --git a/layout/reftests/bugs/456219-1-mask-wErC.png b/layout/reftests/bugs/456219-1-mask-wErC.png
deleted file mode 100644
index 5802482bb76317bc797ffdc511471764ebc7c518..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 215
zcmeAS@N?(olHy`uVBq!ia0vp^DL@>>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pQ}5~G7-DfcIbng=1V+I#@(XO3TO>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pv)|LjF~s8Z-N}Z0hYWaJ<8N`5uDH@CJK=?(#LX9h7EJCZE*4FZYo4fB
zI7OfJh=Xd&^cRt3Z;ssmU}}AEN9rzScV_X1YwB5y9G!fYG6@U`epkfpW_0CP9G@+$
z`_V%+%ra={?3OvLYCG46OD)M^cThenZQ6R?$m(}f`4jIh+pqHj1fsqxz52qu?e%SE
zO}js@J9nPC6DquFdf1dytJ&IJCU5nW5(};3Z}&NxsZZM*(JWU`8ET$z#=ffc5LzB8bLnvboFyt=akR{0PXx}asU7T

diff --git a/layout/reftests/bugs/456219-1-mask-wErE.png b/layout/reftests/bugs/456219-1-mask-wErE.png
deleted file mode 100644
index 66c6861634447a2e0f51d0fde946571a5581c8ec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 288
zcmeAS@N?(olHy`uVBq!ia0vp^DL@>>$P6S)ViHdQDYgKg5LY10(7-V7iDC_!@pbHdZbF~s8Z-N}Z0%?3QK@f?eII1G(KLi;Z$KhdytJ1*0^xS*xaC$~Ld
zvcGYelJ}Q@H~DY!f7~wYuFfrCvX`9O*nW}sMQ_@H=t&$Oczx!-*A5lq35ZT=;A==*
zYFN$hd}>Z7vtjJ@lC@2ZF$O0lM{vn+UbIkjq2G#WlcW}UojARIht99|BtMZAx|dZ%
z`1}fIyY2M875jFNpX>AIsoQq%>~=1D7nr{C?v;dQj;%op@*1YU_4u^;O~je+?~{IC
iZ?2a5d33Mkv!4vI%(B
-
-background-clip interaction with border-radius
-
-
-
-
-  
-  
-  
-  
-  
-
-
-  
-  
-  
-  
-  
-
-
-  
-  
-  
-  
-  
-
-
-  
-  
-  
-  
-  
-
-
-  
-  
-  
-  
-  
-
-
- -

Inside each green shape, there should be no white.

- - diff --git a/layout/reftests/bugs/456219-1a.html b/layout/reftests/bugs/456219-1a.html deleted file mode 100644 index be28a95d0766..000000000000 --- a/layout/reftests/bugs/456219-1a.html +++ /dev/null @@ -1,81 +0,0 @@ - - -background-clip interaction with border-radius - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Inside each green shape, there should be no white.

- - diff --git a/layout/reftests/bugs/456219-1b.html b/layout/reftests/bugs/456219-1b.html deleted file mode 100644 index cbfd3f477cd4..000000000000 --- a/layout/reftests/bugs/456219-1b.html +++ /dev/null @@ -1,81 +0,0 @@ - - -background-clip interaction with border-radius - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Inside each green shape, there should be no white.

- - diff --git a/layout/reftests/bugs/456219-1c.html b/layout/reftests/bugs/456219-1c.html deleted file mode 100644 index b075e1f49667..000000000000 --- a/layout/reftests/bugs/456219-1c.html +++ /dev/null @@ -1,81 +0,0 @@ - - -background-clip interaction with border-radius - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -

Inside each green shape, there should be no white.

- diff --git a/layout/reftests/bugs/456219-2-mask.png b/layout/reftests/bugs/456219-2-mask.png deleted file mode 100644 index b1b5a9a3ff115acdea5d4a58257d040413dadc31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmeAS@N?(olHy`uVBq!ia0vp^nIO!<3?xsl5#R(;S^+*Gt_+F{-2eac{{Qdr|G(q^ z|IYvaSO5QC^Z$R{|Nk5Q|KIfg|K|VyxBUOV_5c5zH1@YZU5q6`e!&b5&u*jvIsTq5 zjv*18Zx1RmHaLi|9t@TF#KO4mpzuShpa)6{91bi>6CY-lv7Pfvo4r9G+u&rZ%oDb` yF^Zm(RDkFuztzs93DQ1A{Jl50?zpDa|73W~&u**DW|j&xn!(f6&t;ucLK6U(4NrRj diff --git a/layout/reftests/bugs/456219-2-ref.html b/layout/reftests/bugs/456219-2-ref.html deleted file mode 100644 index 66bf98c75067..000000000000 --- a/layout/reftests/bugs/456219-2-ref.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - -
- - diff --git a/layout/reftests/bugs/456219-2.html b/layout/reftests/bugs/456219-2.html deleted file mode 100644 index 2c1b3e601476..000000000000 --- a/layout/reftests/bugs/456219-2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - -
- - - diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list index 054b2cd9e8ca..39f32d0c0248 100644 --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -958,11 +958,7 @@ fails == 441259-2.html 441259-2-ref.html # bug 441400 == 455171-5.html 455171-5-ref.html == 455280-1.xhtml 455280-1-ref.xhtml == 455826-1.html 455826-1-ref.html -fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == 456147.xul 456147-ref.html # bug 458047 -== 456219-1a.html 456219-1-ref.html -== 456219-1b.html 456219-1-ref.html -== 456219-1c.html 456219-1-ref.html -== 456219-2.html 456219-2-ref.html +fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == 456147.xul 456147-ref.html # bug 456147, but not caused by it == 456330-1.gif 456330-1-ref.png == 456484-1.html 456484-1-ref.html == 457398-1.html 457398-1-ref.html From 05e2fb4ab8f274fcbcfc9866614400ba278baafa Mon Sep 17 00:00:00 2001 From: Serge Gautherie Date: Sat, 20 Dec 2008 05:05:42 +0100 Subject: [PATCH 23/98] Backed out changeset: 9990da98d7b7 --- .../tests/crashtests/460706-1.xhtml | 463 ------------------ .../tests/crashtests/crashtests.list | 1 - 2 files changed, 464 deletions(-) delete mode 100644 parser/htmlparser/tests/crashtests/460706-1.xhtml diff --git a/parser/htmlparser/tests/crashtests/460706-1.xhtml b/parser/htmlparser/tests/crashtests/460706-1.xhtml deleted file mode 100644 index 70383af65641..000000000000 --- a/parser/htmlparser/tests/crashtests/460706-1.xhtml +++ /dev/null @@ -1,463 +0,0 @@ - - - - - - - - - - - diff --git a/parser/htmlparser/tests/crashtests/crashtests.list b/parser/htmlparser/tests/crashtests/crashtests.list index 2bf1aed15cfa..5e467e90c268 100644 --- a/parser/htmlparser/tests/crashtests/crashtests.list +++ b/parser/htmlparser/tests/crashtests/crashtests.list @@ -1,2 +1 @@ load 423373-1.html -load 460706-1.xhtml From 59c560c397b9a2b2b194aa17496068de9306c7ac Mon Sep 17 00:00:00 2001 From: Olli Pettay Date: Sat, 20 Dec 2008 16:28:19 +0200 Subject: [PATCH 24/98] Bug 466057, r+sr=bz --- layout/base/nsPresShell.cpp | 130 ++++++++---------------------------- 1 file changed, 28 insertions(+), 102 deletions(-) diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index af6817e3f40e..b037bf8c2472 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -762,7 +762,6 @@ struct nsCallbackEventRequest // ---------------------------------------------------------------------------- class nsPresShellEventCB; -class nsAutoCauseReflowNotifier; class PresShell : public nsIPresShell, public nsIViewObserver, public nsStubDocumentObserver, @@ -1013,13 +1012,6 @@ protected: void UnsuppressAndInvalidate(); - void WillCauseReflow() { - nsContentUtils::AddScriptBlocker(); - ++mChangeNestCount; - } - nsresult DidCauseReflow(); - friend class nsAutoCauseReflowNotifier; - void WillDoReflow(); void DidDoReflow(); nsresult ProcessReflowCommands(PRBool aInterruptible); @@ -1133,11 +1125,6 @@ protected: 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 mCurrentEventContent; @@ -1216,29 +1203,6 @@ private: 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: @@ -2408,7 +2372,7 @@ PresShell::InitialReflow(nscoord aWidth, nscoord aHeight) MOZ_TIMER_START(mFrameCreationWatch); { - nsAutoCauseReflowNotifier reflowNotifier(this); + nsAutoScriptBlocker scriptBlocker; mFrameConstructor->BeginUpdate(); if (!rootFrame) { @@ -2554,7 +2518,7 @@ PresShell::ResizeReflow(nscoord aWidth, nscoord aHeight) // the way don't have region accumulation issues? { - nsAutoCauseReflowNotifier crNotifier(this); + nsAutoScriptBlocker scriptBlocker; WillDoReflow(); // Kick off a top-down reflow @@ -3089,7 +3053,6 @@ PresShell::RestoreRootScrollPosition() // scrollable frame will cause it to reenter ScrollToRestoredPosition(), and // it'll get all confused. nsAutoScriptBlocker scriptBlocker; - ++mChangeNestCount; if (historyState) { nsIFrame* scrollFrame = GetRootScrollFrame(); @@ -3103,8 +3066,6 @@ PresShell::RestoreRootScrollPosition() } } } - - --mChangeNestCount; } void @@ -3384,10 +3345,7 @@ PresShell::RecreateFramesFor(nsIContent* aContent) 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 @@ -4487,29 +4445,21 @@ PresShell::HandlePostedReflowCallbacks() 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; - } + 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 == nsContentUtils::IsSafeToRunScript(), - "Someone forgot to block scripts"); - + NS_ASSERTION(!aIsSafeToFlush || isSafeToFlush, "Missing a script blocker!"); +#endif return NS_OK; } @@ -4622,7 +4572,7 @@ PresShell::CharacterDataChanged(nsIDocument *aDocument, 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 @@ -4664,7 +4614,7 @@ PresShell::ContentStatesChanged(nsIDocument* aDocument, NS_PRECONDITION(aDocument == mDocument, "Unexpected aDocument"); if (mDidInitialReflow) { - nsAutoCauseReflowNotifier crNotifier(this); + nsAutoScriptBlocker scriptBlocker; mFrameConstructor->ContentStatesChanged(aContent1, aContent2, aStateMask); VERIFY_STYLE_TREE; } @@ -4686,7 +4636,7 @@ PresShell::AttributeChanged(nsIDocument* aDocument, // 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; @@ -4706,7 +4656,7 @@ PresShell::ContentAppended(nsIDocument *aDocument, return; } - nsAutoCauseReflowNotifier crNotifier(this); + nsAutoScriptBlocker scriptBlocker; MOZ_TIMER_DEBUGLOG(("Start: Frame Creation: PresShell::ContentAppended(), this=%p\n", this)); MOZ_TIMER_START(mFrameCreationWatch); @@ -4735,7 +4685,7 @@ PresShell::ContentInserted(nsIDocument* aDocument, 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 @@ -4766,7 +4716,7 @@ PresShell::ContentRemoved(nsIDocument *aDocument, // 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 @@ -4784,7 +4734,7 @@ PresShell::ContentRemoved(nsIDocument *aDocument, nsresult PresShell::ReconstructFrames(void) { - nsAutoCauseReflowNotifier crNotifier(this); + nsAutoScriptBlocker scriptBlocker; mFrameConstructor->BeginUpdate(); nsresult rv = mFrameConstructor->ReconstructDocElementHierarchy(); VERIFY_STYLE_TREE; @@ -5591,7 +5541,7 @@ PresShell::HandleEvent(nsIView *aView, { NS_ASSERTION(aView, "null view"); - if (mIsDestroying || mIsReflowing || mChangeNestCount) { + if (mIsDestroying || !nsContentUtils::IsSafeToRunScript()) { return NS_OK; } @@ -5603,9 +5553,6 @@ PresShell::HandleEvent(nsIView *aView, } #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(); @@ -6049,10 +5996,9 @@ PresShell::IsVisible() 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; } @@ -6264,25 +6210,6 @@ PresShell::PostReflowEvent() } } -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() { @@ -6632,9 +6559,7 @@ PresShell::Observe(nsISupports* aSubject, // construction. { nsAutoScriptBlocker scriptBlocker; - ++mChangeNestCount; mFrameConstructor->ProcessRestyledFrames(changeList); - --mChangeNestCount; } batch.EndUpdateViewBatch(NS_VMREFRESH_NO_SYNC); @@ -7214,9 +7139,10 @@ PresShell::VerifyIncrementalReflow() // 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 From 872d7ebd9837f553772fe577c7c0c4ab0ebb6ac8 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Sat, 20 Dec 2008 14:57:34 -0800 Subject: [PATCH 25/98] Bug 469030 - video control binding shouldn't use ID attribute. r=enn --- toolkit/content/widgets/videocontrols.xml | 14 +++++++------- .../pinstripe/global/media/videocontrols.css | 10 +++++----- .../winstripe/global/media/videocontrols.css | 10 +++++----- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/toolkit/content/widgets/videocontrols.xml b/toolkit/content/widgets/videocontrols.xml index 304306562246..67ca77c88cf0 100644 --- a/toolkit/content/widgets/videocontrols.xml +++ b/toolkit/content/widgets/videocontrols.xml @@ -14,11 +14,11 @@ - - + - - + @@ -226,9 +226,9 @@ var video = this.parentNode; this.Utils.video = video; - this.Utils.controlBar = document.getAnonymousElementByAttribute(this, "id", "controlBar"); - 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); diff --git a/toolkit/themes/pinstripe/global/media/videocontrols.css b/toolkit/themes/pinstripe/global/media/videocontrols.css index 70f2bab50c31..bd1755c5c30b 100644 --- a/toolkit/themes/pinstripe/global/media/videocontrols.css +++ b/toolkit/themes/pinstripe/global/media/videocontrols.css @@ -1,23 +1,23 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -#controlBar { +.controlBar { height: 24px; background-color: #656363; } -#playButton { +.playButton { list-style-image: url(chrome://global/skin/media/videocontrols.png); -moz-image-region: rect(0px, 48px, 24px, 24px); } -#playButton[paused="true"] { +.playButton[paused="true"] { -moz-image-region: rect(0px, 24px, 24px, 0px); } -#muteButton{ +.muteButton { list-style-image: url(chrome://global/skin/media/videocontrols.png); -moz-image-region: rect(24px, 24px, 48px, 0px); } -#muteButton[muted="true"] { +.muteButton[muted="true"] { -moz-image-region: rect(24px, 48px, 48px, 24px); } diff --git a/toolkit/themes/winstripe/global/media/videocontrols.css b/toolkit/themes/winstripe/global/media/videocontrols.css index 70f2bab50c31..bd1755c5c30b 100644 --- a/toolkit/themes/winstripe/global/media/videocontrols.css +++ b/toolkit/themes/winstripe/global/media/videocontrols.css @@ -1,23 +1,23 @@ @namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"); -#controlBar { +.controlBar { height: 24px; background-color: #656363; } -#playButton { +.playButton { list-style-image: url(chrome://global/skin/media/videocontrols.png); -moz-image-region: rect(0px, 48px, 24px, 24px); } -#playButton[paused="true"] { +.playButton[paused="true"] { -moz-image-region: rect(0px, 24px, 24px, 0px); } -#muteButton{ +.muteButton { list-style-image: url(chrome://global/skin/media/videocontrols.png); -moz-image-region: rect(24px, 24px, 48px, 0px); } -#muteButton[muted="true"] { +.muteButton[muted="true"] { -moz-image-region: rect(24px, 48px, 48px, 24px); } From 44016eb6dac36f1f81015a092f8435912b87bd69 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Sun, 21 Dec 2008 02:16:42 +0100 Subject: [PATCH 26/98] Bug 470124 - Crash [@ nsSVGUtils::GetRelativeRect]; r+sr=roc --- layout/svg/base/src/nsSVGFilterFrame.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/layout/svg/base/src/nsSVGFilterFrame.cpp b/layout/svg/base/src/nsSVGFilterFrame.cpp index 55a57515d3cf..13868b2eeaee 100644 --- a/layout/svg/base/src/nsSVGFilterFrame.cpp +++ b/layout/svg/base/src/nsSVGFilterFrame.cpp @@ -122,6 +122,8 @@ nsAutoFilterInstance::nsAutoFilterInstance(nsIFrame *aTarget, PRUint16 units = filter->mEnumAttributes[nsSVGFilterElement::FILTERUNITS].GetAnimValue(); + PRUint16 primitiveUnits = + filter->mEnumAttributes[nsSVGFilterElement::PRIMITIVEUNITS].GetAnimValue(); nsCOMPtr bbox; if (aOverrideSourceBBox) { NS_NewSVGRect(getter_AddRefs(bbox), @@ -130,7 +132,8 @@ nsAutoFilterInstance::nsAutoFilterInstance(nsIFrame *aTarget, } 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, @@ -182,8 +185,6 @@ nsAutoFilterInstance::nsAutoFilterInstance(nsIFrame *aTarget, 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, From 7306315f298d004cf55caa1661970cf3c78be104 Mon Sep 17 00:00:00 2001 From: Jonathan Kew Date: Sun, 21 Dec 2008 02:26:18 +0100 Subject: [PATCH 27/98] Bug 463806 - [PATCH][@font-face] Downloaded font activation on Mac may fail due to ATS cache corruption; r=(jdaggett + roc) sr=roc --- gfx/thebes/src/gfxQuartzFontCache.h | 4 +- gfx/thebes/src/gfxQuartzFontCache.mm | 185 +++++++++++++++------------ 2 files changed, 109 insertions(+), 80 deletions(-) diff --git a/gfx/thebes/src/gfxQuartzFontCache.h b/gfx/thebes/src/gfxQuartzFontCache.h index 802a895f776d..0be3a16b5f37 100644 --- a/gfx/thebes/src/gfxQuartzFontCache.h +++ b/gfx/thebes/src/gfxQuartzFontCache.h @@ -85,7 +85,9 @@ public: 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; diff --git a/gfx/thebes/src/gfxQuartzFontCache.mm b/gfx/thebes/src/gfxQuartzFontCache.mm index 2461a91b79db..a47eeacb7f66 100644 --- a/gfx/thebes/src/gfxQuartzFontCache.mm +++ b/gfx/thebes/src/gfxQuartzFontCache.mm @@ -2,12 +2,13 @@ * ***** 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 * Masayuki Nakano * John Daggett + * Jonathan Kew * * Copyright (C) 2006 Apple Computer, Inc. All rights reserved. * @@ -117,7 +118,7 @@ gfxQuartzFontCache::GenerateFontListKey(const nsAString& aKeyName, nsAString& aR #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) { @@ -127,10 +128,12 @@ MacOSFontEntry::MacOSFontEntry(const nsAString& aPostscriptName, 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; @@ -143,23 +146,7 @@ MacOSFontEntry::MacOSFontEntry(ATSUFontID aFontID, PRUint16 aWeight, PRUint16 aS (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& @@ -706,7 +693,7 @@ const PRUint32 kNonNormalTraits = NSItalicFontMask | NSBoldFontMask | NSNarrowFo void gfxQuartzFontCache::InitFontList() { - ATSGeneration currentGeneration = ATSGeneration(); + ATSGeneration currentGeneration = ATSGetGeneration(); // need to ignore notifications after adding each font if (mATSGeneration == currentGeneration) @@ -1338,73 +1325,106 @@ gfxQuartzFontCache::MakePlatformFont(const gfxFontEntry *aProxyEntry, return nsnull; } - ATSUFontID fontID; + ATSFontRef fontRef; ATSFontContainerRef containerRef; - err = ATSFontActivateFromMemory(const_cast(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(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 (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 (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; - } + return nsnull; + } - mATSGeneration = ATSGeneration(); - - // 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 (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 (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; - } + ATSFontDeactivate(containerRef, NULL, kATSOptionFlagsDefault); + return nsnull; + } - // font entry will own this - MacOSUserFontData *userFontData = new MacOSUserFontData(containerRef); - - 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 (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; + } - if (!newFontEntry) { - delete userFontData; - return nsnull; - } - - // if something is funky about this font, delete immediately - if (newFontEntry && !newFontEntry->mIsValid) { + PRUint16 w = aProxyEntry->mWeight; + NS_ASSERTION(w >= 100 && w <= 900, "bogus font weight value!"); + + // 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 = @@ -1414,10 +1434,17 @@ gfxQuartzFontCache::MakePlatformFont(const gfxFontEntry *aProxyEntry, 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; } From 90a973e5c24d3bca7ba36061e6f8df97873555a6 Mon Sep 17 00:00:00 2001 From: Siddharth Agarwal Date: Sun, 21 Dec 2008 02:31:35 +0100 Subject: [PATCH 28/98] Bug 469739 - Add support for displaying Vista UAC shield icon; r=joe sr=vladimir --- .../decoders/icon/win/nsIconChannel.cpp | 124 ++++++++++++++++-- .../libpr0n/decoders/icon/win/nsIconChannel.h | 10 ++ 2 files changed, 122 insertions(+), 12 deletions(-) diff --git a/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp b/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp index 0c25cb44869e..e403ffac611f 100644 --- a/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp +++ b/modules/libpr0n/decoders/icon/win/nsIconChannel.cpp @@ -59,6 +59,13 @@ #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 #include @@ -82,6 +89,20 @@ struct ICONENTRY { 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() { @@ -272,7 +293,20 @@ static DWORD GetSpecialFolderIcon(nsIFile* aFile, int aFolder, SHFILEINFOW* aSFI 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; @@ -309,12 +343,7 @@ nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBloc 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. @@ -331,8 +360,6 @@ nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBloc 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) { @@ -351,10 +378,83 @@ nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBloc 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 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. @@ -419,8 +519,8 @@ nsresult nsIconChannel::MakeInputStream(nsIInputStream** _retval, PRBool nonBloc 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; } diff --git a/modules/libpr0n/decoders/icon/win/nsIconChannel.h b/modules/libpr0n/decoders/icon/win/nsIconChannel.h index a69ea61c0d87..97d41e322452 100644 --- a/modules/libpr0n/decoders/icon/win/nsIconChannel.h +++ b/modules/libpr0n/decoders/icon/win/nsIconChannel.h @@ -49,6 +49,9 @@ #include "nsIURI.h" #include "nsIInputStreamPump.h" #include "nsIStreamListener.h" +#include "nsIIconURI.h" + +#include class nsIFile; @@ -78,7 +81,14 @@ protected: nsCOMPtr 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___ */ From 89053850bf6e93543cee1574daa24421b1458a61 Mon Sep 17 00:00:00 2001 From: Michael Ventnor Date: Sun, 21 Dec 2008 02:33:04 +0100 Subject: [PATCH 29/98] Bug 470165 - Cleanup the GTK nsFilePicker code; r+sr=roc --- config/system-headers | 3 + js/src/config/system-headers | 3 + widget/src/gtk2/nsFilePicker.cpp | 258 +++++-------------------------- widget/src/gtk2/nsFilePicker.h | 4 - 4 files changed, 46 insertions(+), 222 deletions(-) diff --git a/config/system-headers b/config/system-headers index 9a03619aef4b..d043e60d6c0b 100644 --- a/config/system-headers +++ b/config/system-headers @@ -304,6 +304,8 @@ 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 @@ -312,6 +314,7 @@ gtk/gtkimmulticontext.h gtk/gtkinvisible.h gtk/gtkmain.h gtk/gtkmessagedialog.h +gtk/gtkmisc.h gtk/gtkobject.h gtk/gtkprinter.h gtk/gtkprintjob.h diff --git a/js/src/config/system-headers b/js/src/config/system-headers index 9a03619aef4b..d043e60d6c0b 100644 --- a/js/src/config/system-headers +++ b/js/src/config/system-headers @@ -304,6 +304,8 @@ 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 @@ -312,6 +314,7 @@ gtk/gtkimmulticontext.h gtk/gtkinvisible.h gtk/gtkmain.h gtk/gtkmessagedialog.h +gtk/gtkmisc.h gtk/gtkobject.h gtk/gtkprinter.h gtk/gtkprintjob.h diff --git a/widget/src/gtk2/nsFilePicker.cpp b/widget/src/gtk2/nsFilePicker.cpp index 1ef0dc8ac816..b5ce43577b0f 100644 --- a/widget/src/gtk2/nsFilePicker.cpp +++ b/widget/src/gtk2/nsFilePicker.cpp @@ -40,6 +40,9 @@ #include #include #include +#include +#include +#include #include "nsIFileURL.h" #include "nsIURI.h" @@ -60,84 +63,10 @@ #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 * @@ -163,95 +92,12 @@ get_gtk_window_for_nsiwidget(nsIWidget *widget) 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) { @@ -285,10 +131,10 @@ 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; } @@ -296,7 +142,7 @@ UpdateFilePreviewWidget(GtkFileChooser *file_chooser, 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) { @@ -306,18 +152,18 @@ UpdateFilePreviewWidget(GtkFileChooser *file_chooser, 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 @@ -381,19 +227,19 @@ nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser) 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(&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(g_slist_index (filter_list, filter)); + mSelectedType = static_cast(g_slist_index(filter_list, filter)); g_slist_free(filter_list); // Remember last used directory. @@ -409,17 +255,6 @@ nsFilePicker::ReadValuesFromFileChooser(GtkWidget *file_chooser) } } -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, @@ -543,7 +378,7 @@ nsFilePicker::GetFiles(nsISimpleEnumerator **aFiles) } PRBool -confirm_overwrite_file (GtkWidget *parent, nsILocalFile* file) +confirm_overwrite_file(GtkWidget *parent, nsILocalFile* file) { nsCOMPtr sbs = do_GetService(NS_STRINGBUNDLE_CONTRACTID); nsCOMPtr bundle; @@ -580,9 +415,9 @@ confirm_overwrite_file (GtkWidget *parent, nsILocalFile* file) 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; } @@ -601,17 +436,17 @@ nsFilePicker::Show(PRInt16 *aReturn) 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); } @@ -620,11 +455,11 @@ nsFilePicker::Show(PRInt16 *aReturn) } 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(default_filename)); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(file_chooser), + static_cast(default_filename)); nsMemory::Free(default_filename); } @@ -638,8 +473,8 @@ nsFilePicker::Show(PRInt16 *aReturn) } 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(); @@ -652,10 +487,10 @@ nsFilePicker::Show(PRInt16 *aReturn) 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); @@ -663,29 +498,23 @@ nsFilePicker::Show(PRInt16 *aReturn) 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: @@ -697,16 +526,9 @@ nsFilePicker::Show(PRInt16 *aReturn) 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; diff --git a/widget/src/gtk2/nsFilePicker.h b/widget/src/gtk2/nsFilePicker.h index 3a7dd615fcc9..62077c226283 100644 --- a/widget/src/gtk2/nsFilePicker.h +++ b/widget/src/gtk2/nsFilePicker.h @@ -47,7 +47,6 @@ class nsIWidget; class nsILocalFile; -class PRLibrary; class nsFilePicker : public nsBaseFilePicker { @@ -58,7 +57,6 @@ public: 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); @@ -77,7 +75,6 @@ public: static void Shutdown(); protected: - static nsresult LoadSymbolsGTK24(); void ReadValuesFromFileChooser(GtkWidget *file_chooser); @@ -97,7 +94,6 @@ protected: private: static nsILocalFile *mPrevDisplayDirectory; - static PRLibrary *mGTK24; }; #endif From d2402cef8097db71ba6c7c9e993d127d803838ce Mon Sep 17 00:00:00 2001 From: Phil Ringnalda Date: Sat, 20 Dec 2008 21:15:36 -0800 Subject: [PATCH 30/98] Bug 469573 - Remove the unused mangle.c that creates a long filename to 8.3 mangler for Win95, since it's confusing having two very different mangle.c's around, r=ted --- config/mangle.c | 139 ---------------------------------------------- config/mangle.exe | Bin 16384 -> 0 bytes 2 files changed, 139 deletions(-) delete mode 100644 config/mangle.c delete mode 100755 config/mangle.exe diff --git a/config/mangle.c b/config/mangle.c deleted file mode 100644 index b4e945811367..000000000000 --- 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 -#include -#include - -HANDLE hMangleFile; - -void Usage(void) -{ - fprintf(stderr, "MANGLE: \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; -} diff --git a/config/mangle.exe b/config/mangle.exe deleted file mode 100755 index de63cd81d88b7d430dc0510351e7081b986034ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeI3UuaWT9LImDMWUv*Xd_M?yKd=lPD*DTI9DZ|jdnBX(my8EIj^_LZEs3)Z@9VX z6lAlcg_RiSgAXFxSW(6vd>BKvG91L!2N{zI3M-vs9mvQ-AAAxYHt)XY+@z)seR9Kx zbLj7!^EmG>*W5=%|$Ub!p{795;2YCcwEKd08!Ajj9PB|{AR^x zp6XqzT+4|Xup&9D4Qnwj>V9Vqo$+C>$BS7X-#m(qwNqGJ+}+b!l#jkQdX?=w6X5~OKbqZEp6BaW)sfs4zt)Gq z?n>E90}Fk=^;#$FJ+`->mEisSHFmg${M|x_&ofNnLeRH9(hc)^n8%CO@;5A>$9lesxdo{=5}i;>IrT4GpY1&czeBmY3yfy2?n^e<-Xm<6x=)}?xNUC>*UoZn zY8zAN{6%P`8J2MOX-p~W(e_|7+q;G3E1iKw^WaFD8(rxms8eTHg1~GcFdMdCpM+8f z%!dnsTaY^-gm;}r$Zd(I=Uo?ke9)(>)=smSDjnKl z`@ie%uNh363Edi`wJtef3=n-?lPRx!R#To(s5i2=r>{AlOcLEBSv{VxsFURWSlZf` zNLs2%Z`bfeijyp-Wm!(>2}{*Ss2}=}YNeEfu9!m^e3`&a2uV>6wv1|JGf)&uQ%#fT zQ<9bVa5iJfgYm=&eoS!k#f%jD!h*a|N zqHjr#8Mm z+UX3}_a)3sd4V>#_N!J<$yfo?G;oR?wAWM>XOnh15a{U&1Y5T|{JwX|8Ow~N(uu`O z7ZX815D)|e0YN|z5CjAPK|l}?1O$PnMj+JQwLcixCAAIW6>iT;s_1y>G)(COyb&h! zA;~hNgI$iP`K|W8l|-o#sVRfMI?O9E<$nM$Rb5G`Qomdd=nI8ef~E{yALENu@TiVp zzSTNAa7fXIlIkvrZ@|iO!g%7inv}A7ihDEE22nYg#fFK|U2m*qDARq_` M0)l`b@E;KP2ZoK>DF6Tf From a44722f71197d10094be899773c351482b02d646 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Sat, 20 Dec 2008 21:46:38 -0800 Subject: [PATCH 31/98] Bug 455057 - some chrome images have embedded profiles. r=dbaron, ui-r=faaborg --- browser/base/content/aboutRobots-icon-rtl.png | Bin 7897 -> 7884 bytes .../themes/gnomestripe/browser/Privacy-16.png | Bin 725 -> 708 bytes .../gnomestripe/browser/Search-glass-rtl.png | Bin 840 -> 757 bytes .../gnomestripe/browser/Toolbar-small.png | Bin 5754 -> 5240 bytes .../themes/gnomestripe/browser/Toolbar.png | Bin 8668 -> 8345 bytes .../themes/gnomestripe/browser/identity.png | Bin 9715 -> 9690 bytes .../themes/gnomestripe/browser/pageInfo.png | Bin 8874 -> 8849 bytes .../browser/preferences/Options.png | Bin 12334 -> 12309 bytes .../themes/gnomestripe/browser/preview.png | Bin 10715 -> 10017 bytes .../gnomestripe/browser/tabbrowser/newtab.png | Bin 804 -> 791 bytes .../pinstripe/browser/tabbrowser/newtab.png | Bin 395 -> 340 bytes .../reftests/border-image/10x5multicolor.png | Bin 213 -> 190 bytes .../reftests/border-image/3x3multicolor.png | Bin 109 -> 96 bytes .../reftests/border-image/4x4multicolor.png | Bin 118 -> 104 bytes ...os-replaced-width-offset-margin-narrow.png | Bin 87 -> 73 bytes ...spos-replaced-width-offset-margin-wide.png | Bin 96 -> 82 bytes layout/reftests/bugs/solidblue.png | Bin 148 -> 135 bytes layout/reftests/bugs/solidblue2.png | Bin 82 -> 69 bytes layout/reftests/bugs/square-outline-32x32.png | Bin 119 -> 96 bytes .../square-outline-32x32.png | Bin 119 -> 96 bytes layout/reftests/pixel-rounding/corner-bl.png | Bin 115 -> 98 bytes layout/reftests/pixel-rounding/corner-tr.png | Bin 114 -> 99 bytes .../reftests/pixel-rounding/random-10x10.png | Bin 391 -> 378 bytes ...epeatable-diagonal-gradient-with-ticks.png | Bin 14727 -> 13153 bytes .../libpr0n/test/reftest/generic/green.png | Bin 228 -> 201 bytes .../global/console/console-toolbar.png | Bin 775 -> 659 bytes .../global/icons/Search-glass-rtl.png | Bin 840 -> 757 bytes .../global/icons/blacklist_large.png | Bin 3859 -> 3846 bytes .../themes/gnomestripe/global/icons/find.png | Bin 1517 -> 1498 bytes .../gnomestripe/global/icons/folder-item.png | Bin 1186 -> 1173 bytes .../mozapps/extensions/extensionIcons.png | Bin 1336 -> 1323 bytes .../mozapps/extensions/themeGeneric.png | Bin 1835 -> 1822 bytes .../mozapps/extensions/viewButtons.png | Bin 10566 -> 10541 bytes .../gnomestripe/mozapps/update/update.png | Bin 805 -> 774 bytes .../xpinstall/xpinstallItemGeneric.png | Bin 1933 -> 1920 bytes 35 files changed, 0 insertions(+), 0 deletions(-) diff --git a/browser/base/content/aboutRobots-icon-rtl.png b/browser/base/content/aboutRobots-icon-rtl.png index 0cf87d712919a07e9be01bf4024c1a598cbd7e6f..f35501684ad17e4cfd4dc8777bea49100abb7340 100644 GIT binary patch delta 30 mcmca`sf4K^NbHPzw;$0{c3X>QEQmjeKydkh>GZx^prwCz@zZR2JSCn=c0dklqRY diff --git a/browser/themes/gnomestripe/browser/Privacy-16.png b/browser/themes/gnomestripe/browser/Privacy-16.png index 650986c94cbfdada768d78d8a48b167981d99af3..70c5dae5fb87938b53f9f2f620a0a15c86ddcefb 100644 GIT binary patch delta 646 zcmV;10(t$_1;hoABoGI5Nliru*b5643l#>e-bs-zDSrY{Nklr0bS9LLxF ze@Ua>_O2ihf(S~Z%&j+4Z$}%7jAo5Pz~tGq9!R6q{O|#zxjB zCA&q!>3_v+2LDnh9K?6eEObMBp3|y05rFPOsBcGrNJAAdf~d1hdDenoM!2+~wE01~Mv+#Vl} zT~MQ2_XscF%JIrJh5I8~9KFb6*7p;sg#@eJp3oiN>ADKbv=sVxQZ%*l zSbrvyr~~X10qB@0V9-1PepHH1%_N4bxA5l6aSU6B7(mFauv&V#8UU-pGTLt&&`N&e zne_zjJ@3U8#YY%FoWkY)5y<*Rv7TRJwWNtPlG`r=HZV53;52OJOqC_P_ThcBE$$7>xU0rAYzzA;3SS(M8qW-4<1t0Z?&1fb!< zMxO0LXI(07vOuL$LA6>%tyW{EBJY6$4lw{(q=cM+|5d(_r-1CvJs=%z;Rn^Rzdh&O gCbdb@gEKVy3rz>% delta 647 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 Y|IlM diff --git a/browser/themes/gnomestripe/browser/Toolbar.png b/browser/themes/gnomestripe/browser/Toolbar.png index 85910b16ee4ff1c2c0dd8b81b04a45cb1b306ee7..a1dca6a7220fdd93b188631cff019b00595616ff 100644 GIT binary patch delta 8308 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 KMNUMnLSTZb?_*#9 delta 2193 zcmV;C2yXYs9ezM2%XO0ZrtI$~%v)tMSALRoXLN$fG=V~}sfK;rD%T|7n58e3TMIv9K&hHe*(g*mPefQ$nkV%CY(%;EF zH-45wv*YZa-+#k%(|?bqxoDkk&CW)XQd-RskT+d5a%K=K877v?@INNLL?DvE7qsyC z1)8pEC|;br^aQrmfw>T3ID8$y@y>gelndl|Hiu_^hUa-?Q$dW(dOm&2@3JD?!$8k! zt~lpXR=%-wnkX%kPdn$h*(Fhg@tu=~xe0 zGl1jjNLiJ&Ey44^&Kj7B5UaII`7hV}))MOnC|;d=l4p+nU$T}?Ceg(wuK0acgnLT0 zMm0_2U7O#H=Nfq4iDUEiGRIptgbGz(U035h!@t4J=iY&)X$-G9hpUIL=D{ET88h?$ zPG@%le}BlrFeE}Rd{2Rs^N~r0>9n`;JGcA+o&MmGZ2yA`ukeG3zaW`OV?D_1$!}l%C5HOe zEGZAjv=cmeR$DQ_QWU2V)jWl6IJ`FhqZ8IwIWHLo zSAT4|jIZ4CzgR7g-Q=eBx_lvJx{9;X^w< z&DpCrwj?kc&Bc>Wtq}B-+k!Ksh-MD+$e}+ao;}KiD{rB{bExL7U?9j{@BCFpw(MfV zz`DBi171D;3{M{TCoWq*(y+Hf3$O9Wp$AE(6J!$+E?W5>t~+mcOZ5Xvt1T*X=YJFm zuWZ-5i~tT&wc=YVqSvh6K{T;&rI|E0}pXzVU(N|!pNS*XK(x6CD#uqZROW7g}u5m zV2LbHk0oN6BmCgtgA7HsvMRKJvDm+nux2XVWu*{Wejphq%@gAf^MA(dkFm3UvZ-!9 zx9j&<-MjP@`etg-t#1c7r!;TS_OgsGyu$dxD-|zfD4D66L>M_d>G0yzcX)c@n>a4m z*#Nh0y^9MszT@N;q9S>^QV5o-!Acf51qf&seW?N{nr`#@{FD6Pz(Y7*8YMe8Z}lbo z%FYj;bp3$*R(K;J*ndb1oaSuK>Lp4#$NAT>|4AY{jZ)w<1iLof$bvJIKh0ZC#8N?| z6MriySQ#3^r~B$gj~mMX=k&>d)(IfUX44$bjG~kdN+5*d)%hQ@Z{dZi_nDkn7*z-| zD5c@#{QT-Wew!7c-nP`B+gJ@QBLbwrb$vM55T5M=@>O7;ihn=fA^~+=C&;ht_;gb} z*aiaJWy~EGC?#;S0s7gAqe8U%UN@ycXg&mb!|ZXXY72=-6mBCK(3&%JN~9xFf+jop z@_QdTsYeBa!N!8HWNKGALv<10Eu#!jpge_8`e~~lP!as7mH}QPA-G&Jptv%pvoF=y z5`6Q8VDSW*IDdUfnv!7n<&r$^(_NfN0JFEYnLC6$lT#BX`<* z(Df|1wL)Df>a)PI3c%u?Rq)>?x**i zCR3xz0V^|+s}UgbUvMyd0-?^7WYPNb(1k#W5&=Y!0Dn>nNAq|3alA7-m(ZtmAoBz` zQ9nQkab&?hzP`U}fcebi8BKr{ft4)S#}Pu5)emshvy-vchlW>QY9ywQp3wx@zUE4f z%O}p3!_V?%P5`sf4JI*0UdwAqpEpm`(_~VT+nB?mu(?J-j!EF(@9rQ5Ankh>GZx^prwCz@zZR2F7ZVAvSXqQFz~*+zA*rSr>mdKI;Vst0IKd3(*OVf diff --git a/browser/themes/gnomestripe/browser/preferences/Options.png b/browser/themes/gnomestripe/browser/preferences/Options.png index 4ffe4dceaa1e83961b3e0b738b53fc3b4b29c8fc..a32fb7a3dee9bf455a34b0d18267fb063b8286b6 100644 GIT binary patch delta 55 zcmZ3NFg0O`sf4JJ`RQ`yhC%h@ODX)@_A+L*(lu(?KI5x>Bs{)aLQK;Y@> K=d#Wzp$P!@XAz+Q delta 65 zcmbQ5ur6VO3KwH>kh>GZx^prwCz@zZR2F7ZVAvSXqQKK9KkEmdKI;Vst0I$UpyZ`_I diff --git a/browser/themes/gnomestripe/browser/preview.png b/browser/themes/gnomestripe/browser/preview.png index 11cd60fe49c6d4820c20512654c0f9fae1f02fb5..ec75f5cdf424df52f3390716389a60acf917ed7d 100644 GIT binary patch literal 10017 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
pbhj~&Y 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 literal 10715 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 HW90t;)ty5= diff --git a/browser/themes/gnomestripe/browser/tabbrowser/newtab.png b/browser/themes/gnomestripe/browser/tabbrowser/newtab.png index e2a388d5dff773967f4322dfab21c8e338ea4f8c..032e3ff2856efe35bdc97b202a089b2622406a26 100644 GIT binary patch delta 30 mcmZ3&Hl1yPiU50wr>`sf4Nf5eBN>HvNhc@jX>H8j$piq2aS5{k delta 27 jcmbQvwuEhh3KwH>kh>GZx^prwCz@zYR1w}7x049~d*umN diff --git a/browser/themes/pinstripe/browser/tabbrowser/newtab.png b/browser/themes/pinstripe/browser/tabbrowser/newtab.png index 52300d11fadbe7b341a26595186d6e3fa52a3ca0..3bfdac1427491de6617f01c8accc25570f0a0fc7 100644 GIT binary patch delta 274 zcmV+t0qy>a1JnYLBoGI5Nliru*a;F52n-oA#^aGLDu3ZgL_t&-(_?5{b)Er+{oA(x z2Vw8#t^Yk5Hvcy-UdizD_g^q(*nIX09D@|?xbO^&9jn))Dtz+x8^gUnC;aF3>-x{> z)A66dwqh+D8{{qhpFi(7*c8E#{{J8`xMyGt5Z23G0=EvN5LpgIp;Gc3u$3T1AnTCj Y05dfK-@^nhy#N3J07*qoM6N<$f(bZ@qyPW_ delta 315 zcmV-B0mS~)0*eEXBnkm@Qb$4nuFf3kku)liBocoC3rR#lR2b7;kg-YwK@>&LhWP@) zQV}B92tg&EU}I(BPl#yYABc_CR@N3l1sg#d1r-EsHig*v0jZKrGCMnOc4pSbT@p|C z9*=w9y~)Wt$ps_RJ8ERo-9NSxMvRoKW3m)FTX!$=|Bc8Ew zOpGJTg)A2)xu9AttT-N`Vk-#x7`hf2t^NEOhydnDNcyyyF_HiP N002ovPDHLkV1nbyEBycf delta 132 zcmdnTc$IO2iacX+kh>GZx^prw85kHi3p^r=85p>QL70(Y)*Ok6ieeLeRKuM-T^vI= zt|!mgV?M1B1ROIRnV5xkd{k=%ayl9H6JA!=$Q`<5liZ=RaZ5)h$KBBBKNZ#($X2Fw f+6t;mNJuagw(-V%ky_LTw1&ac)z4*}Q$iB}3{EVi diff --git a/layout/reftests/border-image/3x3multicolor.png b/layout/reftests/border-image/3x3multicolor.png index 9be62f07a0f10aae43601e5d239a753fec9f5316..586102670ad89bb9ed1d34b31679db9392da8992 100644 GIT binary patch delta 65 zcmc~zn4n^#?&;zf!f`!0~8U2w`y*I!JNdrAC9Z-Soi&rVYv5% VclIrph1(c_z|+;wWt~$(69CTK9G(CG delta 78 zcmV-U0I~mIZIC2M0drDELIAGL9O(c604GUAK~xCWV{HGh<*?o7w0L&f@7W}O@bpQYW07*qoM6N<$f((Wr;Q#;t diff --git a/layout/reftests/border-image/4x4multicolor.png b/layout/reftests/border-image/4x4multicolor.png index c2518c3e10c601aa5d0063014ad6aef6e0c230a3..4b817a1264d6d1e2cc79714e2bd9bf458652a6b6 100644 GIT binary patch delta 52 zcmXTRm|&?d<>}%W!f`$M$N2*X7>+40o%qH7@X*l(pH7@&STvvi<9Yt5Y6c+iboFyt I=akR{0CA!g#{d8T delta 66 zcmc~On_y|nSRCZ;#IWw1%u5Ca25CpA;OXKRB5^r6A>oI8R~tJML+tYz8JmAx4`2WSPgg&ebxsLQ06mHi5&!@I delta 56 zcmeYapP*vQSRCZ;#IWw1%u5Ca20>33#}J9j$tejx&Kq#Gu`)26y2r@qe`ta>P?EvZ L)z4*}Q$iB}^*0fb diff --git a/layout/reftests/box-properties/abspos-replaced-width-offset-margin-wide.png b/layout/reftests/box-properties/abspos-replaced-width-offset-margin-wide.png index 7a27adf95087278c868aae43aaac9b3f78d89b85..ef3fce2dce3631e892a85158648818e47d0f0afb 100644 GIT binary patch delta 51 zcmYcYnxLX5>FMGaVsSb-A>oI8m)k`RDc8jrBE5?gTNpM^n%Mn!R^t)|Ane?WTIm*01qSs2LJ#7 delta 20 bcmZo?oWeN4gp08_$lZxy-8q?;6Ai-vKm-QV diff --git a/layout/reftests/bugs/solidblue2.png b/layout/reftests/bugs/solidblue2.png index 9998c98b96089d6aefa11febd60f90795a81e434..5da01370015660ee34f6c45d4ce17366707177d2 100644 GIT binary patch delta 7 OcmWG?ouD$&P!RwLc>*s0 delta 18 ZcmZ<_nxMkPSRCZ;#IWw1%*%<2DgZO|1^fU2 diff --git a/layout/reftests/bugs/square-outline-32x32.png b/layout/reftests/bugs/square-outline-32x32.png index 144cb3b10aba99f34ec7be4261bc848632008866..917163f409c0ab4a1a75c4e86542b2c13932e771 100644 GIT binary patch delta 65 zcmXRZ_hjOGB^kvI#Be_cC(hpyNg^2Og-Ee m%C^qi^Oczq1{&iVD%qFyGTWT&PLTy_X7F_Nb6Mw<&;$T-A06-j diff --git a/layout/reftests/generated-content/square-outline-32x32.png b/layout/reftests/generated-content/square-outline-32x32.png index 144cb3b10aba99f34ec7be4261bc848632008866..917163f409c0ab4a1a75c4e86542b2c13932e771 100644 GIT binary patch delta 65 zcmXRZ_hjOGB^kvI#Be_cC(hpyNg^2Og-Ee m%C^qi^Oczq1{&iVD%qFyGTWT&PLTy_X7F_Nb6Mw<&;$T-A06-j diff --git a/layout/reftests/pixel-rounding/corner-bl.png b/layout/reftests/pixel-rounding/corner-bl.png index bed9056cb61b959cf70e0318b1b47ec2744a5ffa..f9be106e07c93af259be3c6e70ed66f4de8f384a 100644 GIT binary patch delta 67 zcmXR;nxJB*>FMGa;&J@#Sw}_&0|6$5xAM29-uSzK;qE1!bS(i67N$lA1py8_w&ij% WJK`SNMSAly0D-5gpUXO@geCwUI2G~$ delta 84 zcmYc)o}l8-SRCZ;#IWw1%u5Ca23=1V#}JR>Z_he1G8hOPGMG_+-d1$aH3<(z-kFt> h#s)C(Lro*6nYr&jt92@)zaLN|gQu&X%Q~loCIFcn8kGP5 diff --git a/layout/reftests/pixel-rounding/corner-tr.png b/layout/reftests/pixel-rounding/corner-tr.png index df6590fa0429781f671fe4cb8e6cb85553fadf11..97cedba6cac41ee462562428d43343ae3e216e86 100644 GIT binary patch delta 68 zcmXR)o}gl{<>}%W;&J@#Sw}_&0|6$5xAM29-uSzK;cn5Yoifw7SeP0e6a+X}n&J;K Xmnp_QtTkL{!~g`Iu6{1-oD!MZ_he1G8hOP+Fzopr0G}Ef=>Px# diff --git a/layout/reftests/pixel-rounding/random-10x10.png b/layout/reftests/pixel-rounding/random-10x10.png index a91d31a838e20b490f68a7444147a9494304300f..466588ade136851e2cdafae95489b693e3a02e32 100644 GIT binary patch delta 270 zcmV+p0rCEa1Ns7xBTE56Nkl?lOJIll$Tlkspx;IIdJN;jiBMS$Qy$ U-)b>l4gdfE07*qoM6N<$g5UOeIsgCw delta 283 zcmV+$0p$Mr0*3>TBUk_db5ch_0Itp)=>Px$K}keGR2b6%HUY{01Kd(f=O6j}lw^5g zLkJ+i*A^HkRN3FD<2iM@-sh788bNPmn9D}u>-wn$U4+GKRpZqpx%=7c1B$w(0)s+v+ z;fZbGD#eKCDl{|?k;@++1L3WoG^@K8H9;;QPQ)0{xed*P#ljx;+a7O<`?|oB2>~Bc z0q~GM#^T>W1XKW56qYABm>+Edw+Oi~gQLS3ZM!Q2m>0Oi`oaf=+$d8b3jkhhzy6ye hq`B$#)GQuOPK6^Dl)F%It5yI2002ovPDHLkV1n5We)RwV diff --git a/layout/reftests/table-background/repeatable-diagonal-gradient-with-ticks.png b/layout/reftests/table-background/repeatable-diagonal-gradient-with-ticks.png index 9ac1548c8a68bc2031d7c3a89a7a1c5f8bdde7ba..1b019db984c730737f779ba17e5ed5f00987ce4e 100644 GIT binary patch literal 13153 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 Hu0mjfVtd}N literal 14727 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 diff --git a/toolkit/themes/gnomestripe/global/console/console-toolbar.png b/toolkit/themes/gnomestripe/global/console/console-toolbar.png index 4767a4f362e525f920a524b9a5406c96803b690b..05277b65082ad54e62bff29201098e2ec057d221 100644 GIT binary patch delta 597 zcmV-b0;>Io29pJlBoGI5Nliru*a8(25jWd-F)ooVDSrYWNkl&hwrxlSxU*|EQ_p@2Z*5)Oct%sIY4?0vvF$>nbe( z6WcpmPk)I-f{Yd%aKWhsAQd0XFDz2Cxt+eWn%)HV!T}eYS^!!@VL@Nu8}+|}-aa37 z*aQtYP;h1i;1p7im!#g}X|q_fIw=^?9~j_W@J_y~1ajgV_)47)dm6d{f+&$qa+6I= z$1VX+8o5rd8_?zRQn%knS66X9YG9tx;|G}Yl7HZGlGW)*LpQ+GDR9hIfrntsMN7LS z>*Pgs;PiON>2_-%#Kq<^v56w+s|la@DR|n-$HT)tIy*ZdIN?S>+M`qwR5 zGXflN!3j44J}_z+4UEr>CWeX8!LSqw);eMj_QC-doN)6eUB)O+PE;~JGOCk{iUDh} j2Ycaw3r_wk`ls~*XjV{WPlFae00000NkvXXu0mjf8D$Vn delta 698 zcmV;r0!96k1&0QZBnkm@Qb$4nuFf3kku)ihBNKlDheo zrM!Q4bH&IH7->2dC)w{A(I#(I6xs^r;0ji|j zL^&v%%T=^~Pe8rlM+m`_=?4sjuNIfbE|5ZD+g|GYyHzAp*?l}nqyXsaA7E*ImcIUh zJuR~=iD{bqS5~PY&|tXMo*TTx()=vvFAkLhq(rH@@}wuzl>r++67K$8>?J39PZxjX zK@^(l;Jr~Q2(~r>F#GH&0~ZDfwl?uLw(NdC+1pc5VIjo(=AhW}BS()_Jv#K#R&Q=@ ztZ5b{E9D?O9Af&>Oii;WJRB+mxZM*O9U(G0@=vb=9q<>1Rwk3KO3QoeE=rgP<>k13 z4a0CphhGO;gb=B8I@Od+ZX&A)&v$>{S2E%o0o6vr+8~=X5JIGY79B9+>+!|a)s?~S z?rzQJ^E-8}cGdi!mnu5%^uk$n-<56K+pKzWBk5cd3pKb&r0^m^T^S{s`*jrcG~Cbqv1LNl<8vTipjdOf&jW?>lg zY!er74(t<4I_RiZC>QJOry{+Es{04#-=)Yg^Zu# zE18!sWyv!SN*|QKVr>P-aWD;e{U344fCw_E2^~#B e*GVV*3*P{yDAw=&CtK?P0000uIy&3kvRxiJede6? z+Pyct#cDBC7U#iYqOeFjLf;ike~PL1y+?nRy1VaW7k@7v;MTZbsjv6M?!K5w$@W~6 zWs?a2ke@4IM`H4WngmX^=Lmu%aNr0*B9+0%r~#4w4J?XOQ`K}B!0g%;#v_q%ZLtjn z^NBQ^vIUF*S;N45G6TvJB$Fw)tMV5jk;pFq8aQxJ|XLJ~Nb zMIL5}Lv(%-*{qRlJzT~GMn_x#dRKpDY-v5)Kq-A%QQ?i)G7dO00d*e?7v^= z^?CiDSC$h5`lzn%s994rD2jrKiMMH0RZl&9@c1P*07?iKjm3UAD5cyoxxa5#1~an=lk|}bj&c+AG&g3Q=VIB&v50%KE%z~I0pHjCe;I(l M)78&qol`;+0RG4lNdN!< delta 54 zcmZpZn=Cg$g^RH`$lZxy-8q?;6HPQHDhqFnJ z+pcT3m9dR=vN`q%j181IMyH54!H)>27!`tmMu{$q0hFj=F3}7G{6k~Z1OrM;5H$XQ zN)&Z`WCHS)5!vWqV_U}tTif-!y>0Ke=hkfu0rezr-u9-??>X-|=e=cci|}56Ic>_p zG&$bJs(-RGV$S&}jN1frleit_NtPu`P1X-G?PY|K5X-UJ}`UCCJ+*BH_s z)r+CMni#sI0zh&=r3JCqt;m5RiX8cgAp6Y)=YP2|fY*+4hRr^cUTQbTTyH~XEJy&L zct*vv4}ye{W$tI%_oWtH+{27>UuUv5eW*{aU?uJl3@J9S`V10k?!AdD6gjMkX^&{2 zZ)trw2Jl_LQY2M>KcVmdqY8GgIwMrE=ek&OC)`KG+VX-;-@%M)-BLwK{!Wq$k}`_F zKz~xoRH*S5D6tlTTp2GM`5cAbvi!H}8FU!Wno=vO6yx)7cYgvp3aryMLC*#uNA^MH zyP+u8Ah8&%+7CsAW$#Zm^bCAOOA&GPp zg-4R*MRcCp9cBJ@PuXKkdvLiaYl99-7=KD+H$+iEoEI_N*NvcO7*p2xyBST4>osI2pd7Rw3$l_s2MOSbvex zFmDZxGQN&9XIepvRV$h{Fsg8g#6twRMmsIVM+g^ncx}77T zGK}HtjB;_+e_m%Tn%=8tSFEhpyMLV5z;R*u;YXIq|NDJF;*`?TnVAb0J!v?8>=)$b z70Om?t`H1*zHm6? z4?g|OTK_EpxT*lb#t(q9=6SF{Kkh`{v@p#lP2yvev2%eYLzJDb%<5M@A zQ!DH08`;B$e!#?unOgdYMLAIV2>=%fg6DaR0Nk(CHMqtDau+OET#{{_3`cKgLTomh zN$f|!??Eu+2Op1(0%!@t0v{h556H~P$*)+kvJReMC$#hX{hG4}p`cIe#(1%|i$^7D(((``>=%yAsfo;ev}$lajV>1|7%SjCo>mgD@NC*kop={*pK zN_SQeC35A^*VhaB9m;0Rgdxd@KaL$yVzF2&vu(@zDJ7*9`82vL!|DKE20X+_f}&g*q0TBboF;Q(UPdo8qq z>gwu{33htR)}7+mC=;NXE{MriQ%ipua-zZs0JYBR9j2KWL^K*fPfw>z?YrFg?q{wW xE)&(jL<2FM=VKQ9OVEtC8X7;o^v~yi0bW2xdNQy8ZvX%Q00>D%PDHLkV1k&azBB*; delta 1446 zcmV;X1zGyq3+)S#Bnkm@Qb$4nuFf3kku)ihBNKlGZAnByR7l5-lv!+5MHt8bGjq;8 z_uSjN)0UK$w$eo`qD5$t0-}N|nwa>25Bi{q#^4g4+~Pyi7-OQM4?d8(L`6l78e}k;o1p6sg}6;dURD z{8WD_w0OrXE)mKFa6j4tk-P4uYD3B`?jmZa)8N*Rr{IqaOE1%>BzsOStS1W>#WX57 z)P2#W^l~S^Ge)TfHMG_u#GQnf8I=CW5$TWb7u?vVE%`xSumfM<_28l>R|{`Ufyjde z*MiWX4*%pbDYDDJv#X_Wo2787%+YJU3^jlJWy}k*X|xeqb)R1Ov|^op225)N3p4^^ z8d78dJ`E{KRZ=+Hgm9xmxB#&0za0o{4pu%M^v(SsGzb=G0N?_=3`1lgr3)clNa@@m zr88SRQGI4!KnOB+;cF6Wd>E9)K$!;V4MU1DEQAdqTu9+S3Kvqin+dBNqH_WXfZKn4 z-kE_Lz_|vZwt&zOz_XA%e-@mB9Z2D(Sm>rT^8!M(7b@ayfoRPmnC!nF6MsGgU)F+# zwgNO+2BmX0U64R4Y{O`yXD`kQfL^7B*FjI-i^UCVz~}_}_uh=j!QFtq4K#cQ02M;G z5K=(V*JEtpn*;%X+_CU3Epp>FebIkY3}P0d^e#M4z;--LjSitWJ%##fA3&_S9e!yK zq$HThTXMAT>q8_vfD|FY@o3#!Ity<9h9J7B6IVCur z-}oSoDIm&Y!PIj>!s;OX48ZC@pg@8Fpn%9hRVktsMYxe^Thry*_D*Eynoj{T;~C!z zfPyGXL4#{Sg6lxFPC#7&&^V;@Va^;if|_`uVF3&PBs+j6!s5FmFLazgTnj=HqJEfc z^X|w0iJtE5bZF>U;K2TUfxUmv(O+s~@leEwN);*tU( zL{mrSrbw}vR~*MeJf4K22B>8jx@nn7%QR|y-(UQ}dpoM%?tPh^Bj|tW-X0ExDyq8H zZz1XQ5hM~R#1o5PnFcJYoSx^XzVBC^%|++;Al}ijiH?sALseA7Vkrpj!?sOWrUBbF z;rsqvCVk)MJ6?I#T_~`RAMZo^bzRUj9jdA#pU=WHOJ&$|;rl)~_rN&^=UzM%uCUJO z!I?9Y^6lPNK`BKdSqXntRbg8uEZds@JLeqS_rQIwHZ-(E<^>8<>T7ChNk`{K?Ed&I ze7gG`gu+oQYi@%c)XNa}$|CL~nW}86Q`r0MSCA4| zxv~R+fQDRd8jfv(`y4G-uEfCuKT!n$R8?ErcttB|Zn+w#PmO;=LZY&&8nIXcnc+bk z`RyRqZ@dZZtGX~elm-AyjE|yF$dy=6_jZ*M(z1TTZM43=38R@oxUOA(brgz7G=^w2 zhIINboES_am8t?$0{H##FT!)ZennN(nx^IzsI6^)?buM%0Kyfq^07EJG>w5VhSt{Q z$c+3ge?9cG?RkHmCxy(sx$_fKA(Yj0ZMc<2q6riWSwtc+P)b251(_|tvMnfz0*^Z2 z!V`K(`{T8j-uD&`6VHqcqPltsBGCl2pbo>B#q3NT*{qJ~sY#e-2@?~eTw(O@?w(%n zocExod%Lb_`jw7jMK3qDlq#p6f8mYe=YRhfxD~zl-dGO7yZ`_I07*qoM6N<$f-UW> A6951J diff --git a/toolkit/themes/gnomestripe/global/icons/folder-item.png b/toolkit/themes/gnomestripe/global/icons/folder-item.png index deed18f3345b5d1ea2bf7fa903ae093fc61404cd..b928454d4e42d6043ef628e47e53879109e165f0 100644 GIT binary patch delta 30 mcmZ3)IhAvQiU50wr>`sf4JI*e6)kDr6#*0VG&g2humAvk!Uz)p delta 27 jcmbQrxrlRu3KwH>kh>GZx^prwCz@zZR2JSCYrz5ldjbg8 diff --git a/toolkit/themes/gnomestripe/mozapps/extensions/extensionIcons.png b/toolkit/themes/gnomestripe/mozapps/extensions/extensionIcons.png index 0bf6442598e664630ac012103c4764e873c5d086..241d86b175c46f1150deec2b1ad4fe47cfad45f2 100644 GIT binary patch delta 30 mcmdnNwVG>!iU50wr>`sf4JI)@6V^XhT{lnE)7+SKjs*aecnWR+ delta 27 jcmZ3@wS#Md3KwH>kh>GZx^prwCz@zZR2JSCdyWMFfY=F} diff --git a/toolkit/themes/gnomestripe/mozapps/extensions/themeGeneric.png b/toolkit/themes/gnomestripe/mozapps/extensions/themeGeneric.png index f5344b854a22d879afecaa7900143dbc816d0ce4..dd70ee1b8e3dcf7f270b57a67ec5b01038f31442 100644 GIT binary patch delta 30 mcmZ3@H;-?EiU50wr>`sf4JJ_`G4b``?TQoiG&g1)WCH+)Pzfyn delta 27 jcmbQox0-K)3KwH>kh>GZx^prwCz@zZR2JSCdyowPe&h*$ diff --git a/toolkit/themes/gnomestripe/mozapps/extensions/viewButtons.png b/toolkit/themes/gnomestripe/mozapps/extensions/viewButtons.png index bdee2418559a9fd3278c29adc80093752f060661..a53a2729777cd1813050c0807bd4e55cff2dc2f7 100644 GIT binary patch delta 55 zcmX>Wv^HphiU50wr>`sf4Q3G`8IvOB0G^3@noJtIHs-J>Y_3t*#UY?q-93u|2s~Z= KT-G@yGywq3Nf1c@ delta 65 zcmZ1*bS!9s3KwH>kh>GZx^prwCz@zZR2F7ZVAvSXqQK)*d{Tvhfn%4ai(|;9Up!h_1;ld4 z$t?@0-Td6<@Ofo#94cPKf{Q7axv78(B52le`UOWqjn7fUE8Ps2@zTia5$T<9|4b#a;(!GUnkzoAWx4ZJdAPjB~9{ zNN90F-K#6sPPhZUqGH}ijKY1A;w&!t;7vM`RQz>1_(&u!xAT$S<%=>+80v>4Hi1aa zsJhGz%b&iP@x)NKaQ61jxq4$FlDl0YSt0ou@zfO=J>IBP$1R_!-t|)~b6lYP_`%IQ zb$_2tL-p_}+#HTXtuY>XT7RUf-H@tTf#Q@tH&p0C=pwyl=*uYtpK#&?({=ibkZL?p zt`A0yIR*to{*Vp`kTGb3i_^6NC=DTqRtje6;IXx5r1{m^ZNW>*{wPQu?*DbV)?=<_ z^dzpcJCI{=hs?AWm2ZziVLE~m_5iX}L4SY3OI_xv{ol0aLkT5>12_G5OrZ z+sD!~j#PIu6foDD>QE&v7EAloI{d&a8KV5>kmb_kJ*ZCuMy zMD&Srm)RS7Kcv0fj_m&3_66b+o<-W}hca^@%FPG4qUAMt5wn;*;El|FPh4sdKrU2l vXOU>OFdE6Sy0Y}lpEqpjm$f_{CSllLI%Z0HHfkC400000NkvXXu0mjf!=GNO delta 728 zcmV;}0w?{32Bij&Bnkm@Qb$4nuFf3kku)ihBNKlDrAb6VR5;6xlTB=tRTPGwd%t@- z;|wXIFfaw|FdJ7T6rx5uBpBjP2rD)0WPu55OsukFMO?K&!pfLPVnPfwx-zXsA_{4X z2B$@$7{CrtMrwb6{(Rs3-1+WtF+r+T;@O_z-_z=$vC_Hdh zJnw%D_qobLjo~rTp3V#$e(U738`f;5=0b)_pST&Mn4YVW9dIz8mKMS=V`94u&W#R5f6UxX0VvHa@w~kPu;YC@v1fnh-a;wzFKe4RXN*8XQLcAaXJ^42gPr(#>ZKpQsOghoNX)&Dt0KlmT zo6vs)NDEGTVlCNJ0c%^cjSlF4ckj{XyYerp(v5S+KRtgmYRF>BBsA(_zqBAJlc9gZ zY>}}a$CfVKA5AL7k`dwMN@HAIy*7x)*`Al4v*o2r*fz~0LJP7k{WO1Jp>4U&& zAU1%m`UP%=C9>&GOb`&XfzcYJ9&I2Vw1u!5D&XhgJ{JL~9f$0f-CMd}S(D4?^2Dv` z{Rj7?`0CcwWHg3WilkXhT0e#NLc@R6Sg1(zmr}XuoKt9~jBm<;%U8xv$rTDdmVSg| zq8)+Nq}x{0xVtJI{r*N3;F)b3QmZzK*}lHh-~uiVUd#WRk>s^~+n94@o=kQyJTMVP zVf}SLC6e~@?%lccLiHX`s0^i{%F15|tSVQ2n=P!(XKB`jD6FT3``p(6#rHsL(m97! zNv0>~(T0^q@=e))^@lqr;}IzU=zz(;e6N@(eKC~-(1x;)+5aa^&@%yk9x?m?0000< KMNUMnLSTZ8Z{VMxBEVka>FdgVgGr3fSmT>_KjTC_&5c>g>;Qv$2&4c2 delta 27 jcmZqR@8zGM!o^q| Date: Sun, 21 Dec 2008 13:42:15 +0100 Subject: [PATCH 32/98] bug 469331 - [SeaMonkey] test_bug458898.html fails, mark the test todo on SeaMonkey for now, r=dbaron --- layout/base/tests/test_bug458898.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/layout/base/tests/test_bug458898.html b/layout/base/tests/test_bug458898.html index b2f15c805e23..15e4ed1711da 100644 --- a/layout/base/tests/test_bug458898.html +++ b/layout/base/tests/test_bug458898.html @@ -22,10 +22,14 @@ SimpleTest.waitForExplicitFinish(); netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); var win = window.openDialog("data:text/html,
"); +// doesn't succeed on SeaMonkey currently, see bug 469331 +// mark it todo there instead +var testfunc = (navigator.userAgent.match(/ SeaMonkey\//)) ? todo : ok; + function loaded() { win.sizeToContent(); - ok(win.innerWidth >= 100, "innerWidth"); - ok(win.innerHeight >= 200, "innerHeight"); + testfunc(win.innerWidth >= 100, "innerWidth"); + testfunc(win.innerHeight >= 200, "innerHeight"); win.close(); SimpleTest.finish(); } From fc603724610d1f111bd9efe540df3bceedec865b Mon Sep 17 00:00:00 2001 From: Kaspar Brand Date: Sun, 21 Dec 2008 18:23:19 +0100 Subject: [PATCH 33/98] Bug 400822 - Cert Viewer crashes when encountering improperly encoded GeneralNames (in AIA or CDP extensions) [@ ProcessGeneralName]; r=kaie --- security/manager/ssl/src/nsNSSCertHelper.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/security/manager/ssl/src/nsNSSCertHelper.cpp b/security/manager/ssl/src/nsNSSCertHelper.cpp index fd7d488ce2ec..dcd4104993fb 100644 --- a/security/manager/ssl/src/nsNSSCertHelper.cpp +++ b/security/manager/ssl/src/nsNSSCertHelper.cpp @@ -1003,6 +1003,9 @@ ProcessGeneralName(PRArenaPool *arena, 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); From f04d1dd00adaab559a7209807175782ca6247c01 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Sun, 21 Dec 2008 18:24:16 +0100 Subject: [PATCH 34/98] Bug 355822 - User profile selection window cropped; r=gavin.sharp --- toolkit/profile/skin/profileSelection.css | 5 +++++ .../themes/pinstripe/mozapps/profile/profileSelection.css | 5 +++++ .../themes/winstripe/mozapps/profile/profileSelection.css | 5 +++++ 3 files changed, 15 insertions(+) diff --git a/toolkit/profile/skin/profileSelection.css b/toolkit/profile/skin/profileSelection.css index 0016db7cedcc..3086d59f3b9e 100644 --- a/toolkit/profile/skin/profileSelection.css +++ b/toolkit/profile/skin/profileSelection.css @@ -43,6 +43,11 @@ list-style-image: url("chrome://mozapps/skin/profile/profileicon.png"); } +#profiles > listitem > listcell > image { + width: 16px; + height: 16px; +} + box#managebuttons > button { min-width: 8em; } diff --git a/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css b/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css index 0016db7cedcc..3086d59f3b9e 100644 --- a/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css +++ b/toolkit/themes/pinstripe/mozapps/profile/profileSelection.css @@ -43,6 +43,11 @@ list-style-image: url("chrome://mozapps/skin/profile/profileicon.png"); } +#profiles > listitem > listcell > image { + width: 16px; + height: 16px; +} + box#managebuttons > button { min-width: 8em; } diff --git a/toolkit/themes/winstripe/mozapps/profile/profileSelection.css b/toolkit/themes/winstripe/mozapps/profile/profileSelection.css index 0016db7cedcc..3086d59f3b9e 100644 --- a/toolkit/themes/winstripe/mozapps/profile/profileSelection.css +++ b/toolkit/themes/winstripe/mozapps/profile/profileSelection.css @@ -43,6 +43,11 @@ list-style-image: url("chrome://mozapps/skin/profile/profileicon.png"); } +#profiles > listitem > listcell > image { + width: 16px; + height: 16px; +} + box#managebuttons > button { min-width: 8em; } From 7b478ee3f018fe06d1aaa59edb668c78852dcbe0 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Sun, 21 Dec 2008 15:29:22 -0800 Subject: [PATCH 35/98] Bug 455057 - some chrome images have embedded profiles. uir=faaborg --- .../winstripe/browser/tabbrowser/newtab.png | Bin 413 -> 363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/browser/themes/winstripe/browser/tabbrowser/newtab.png b/browser/themes/winstripe/browser/tabbrowser/newtab.png index f31f7d05e2ac17c881dea0d2243ceb7d1d9f799a..53fbe3c125619460c2b021edaed061a074dd0ce1 100644 GIT binary patch delta 298 zcmV+_0oDGU1M32iBoGI5Nliru*a;F4IUwwH$AytDDu4J%L_t&-(_`4XcP|4BI~-;B z55l&GSpM7W<@n#;-p=s<|9>!MxPALJ9D@{X`Zx=WEw=NaD*XEOE5ql{pBX-W{0LXL z?rk5YLYQ?hE7!g2`#=9>)qj%>!vFObi2v7_CH7yVMfyLAbs&@Gzo`1(_bBy$&27K` z8COmIhku-r`>$T7^q;}@5HnO!4~nA9tET_M&&mIf0AiIAjsFZF-+`>O1iHx-XkE>1 zAFv|LR<-}?m0JIm^Ys2JX6pQB=;`T!W5dN#|1+ Date: Mon, 22 Dec 2008 14:01:14 +0900 Subject: [PATCH 36/98] Bug 458160 - Enable downloadable .otf fonts under Windows. r=roc, sr=vlad. --- gfx/thebes/public/gfxFont.h | 2 +- gfx/thebes/public/gfxFontUtils.h | 14 ++- gfx/thebes/public/gfxWindowsFonts.h | 2 + gfx/thebes/src/gfxFontUtils.cpp | 173 ++++++++++++++++++++++++-- gfx/thebes/src/gfxWindowsFonts.cpp | 38 +++++- gfx/thebes/src/gfxWindowsPlatform.cpp | 99 ++++++++++----- 6 files changed, 280 insertions(+), 48 deletions(-) diff --git a/gfx/thebes/public/gfxFont.h b/gfx/thebes/public/gfxFont.h index 2c794f5ea942..c67029e8413c 100644 --- a/gfx/thebes/public/gfxFont.h +++ b/gfx/thebes/public/gfxFont.h @@ -1608,7 +1608,7 @@ public: // 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; diff --git a/gfx/thebes/public/gfxFontUtils.h b/gfx/thebes/public/gfxFontUtils.h index 27f1e4b1f415..bd7d52ea4097 100644 --- a/gfx/thebes/public/gfxFontUtils.h +++ b/gfx/thebes/public/gfxFontUtils.h @@ -333,17 +333,23 @@ public: // 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 *aHeader, PRBool *aIsCFF); + nsTArray *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 *aNewFont); static inline bool IsJoiner(PRUint32 ch) { return (ch == 0x200C || diff --git a/gfx/thebes/public/gfxWindowsFonts.h b/gfx/thebes/public/gfxWindowsFonts.h index df5634158269..e9ca54629d6a 100644 --- a/gfx/thebes/public/gfxWindowsFonts.h +++ b/gfx/thebes/public/gfxWindowsFonts.h @@ -370,6 +370,8 @@ public: nsTArray > *list); void UpdateFontList(); + virtual gfxFloat GetUnderlineOffset(); + protected: void InitFontList(); diff --git a/gfx/thebes/src/gfxFontUtils.cpp b/gfx/thebes/src/gfxFontUtils.cpp index 43ee60a14e55..ce4dde89c89d 100644 --- a/gfx/thebes/src/gfxFontUtils.cpp +++ b/gfx/thebes/src/gfxFontUtils.cpp @@ -46,7 +46,7 @@ #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 @@ -477,6 +477,7 @@ void gfxFontUtils::GetPrefsFontList(const char *aPrefName, nsTArray& a #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); } @@ -484,17 +485,20 @@ struct AutoSwap_PRUint16 { }; 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; }; @@ -557,8 +561,10 @@ struct NameRecord { 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 @@ -637,7 +643,9 @@ CopySwapUTF16(const PRUint16 *aInBuf, PRUint16 *aOutBuf, PRUint32 aLen) } 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"); @@ -655,6 +663,9 @@ gfxFontUtils::ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLe 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; @@ -670,11 +681,13 @@ gfxFontUtils::ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLe } // table directory entries begin immediately following SFNT header - const TableDirEntry *dirEntry = reinterpret_cast(aFontData + sizeof(SFNTHeader)); + const TableDirEntry *dirEntry = + reinterpret_cast(aFontData + sizeof(SFNTHeader)); PRUint32 checksum = 0; // checksum for font = (checksum of header) + (checksum of tables) - const AutoSwap_PRUint32 *headerData = reinterpret_cast(aFontData); + const AutoSwap_PRUint32 *headerData = + reinterpret_cast(aFontData); // header length is in bytes, checksum calculated in longwords for (i = 0; i < (headerLen >> 2); i++, headerData++) { @@ -798,6 +811,149 @@ gfxFontUtils::ValidateSFNTHeaders(const PRUint8 *aFontData, PRUint32 aFontDataLe return PR_TRUE; } +nsresult +gfxFontUtils::RenameFont(const nsAString& aName, const PRUint8 *aFontData, + PRUint32 aFontDataLength, nsTArray *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(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(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(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(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(newFontData); + + // table directory entries begin immediately following SFNT header + TableDirEntry *dirEntry = + reinterpret_cast(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 (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(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(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(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 // @@ -892,21 +1048,17 @@ DumpEOTHeader(PRUint8 *aHeader, PRUint32 aHeaderLen) nsresult gfxFontUtils::MakeEOTHeader(const PRUint8 *aFontData, PRUint32 aFontDataLength, - nsTArray *aHeader, PRBool *aIsCFF) + nsTArray *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 (aHeader->Elements()); + EOTFixedHeader *eotHeader = reinterpret_cast(aHeader->Elements()); memset(eotHeader, 0, sizeof(EOTFixedHeader)); PRUint32 fontDataSize = aFontDataLength; @@ -975,7 +1127,6 @@ gfxFontUtils::MakeEOTHeader(const PRUint8 *aFontData, PRUint32 aFontDataLength, case 'CFF ': // PS-style cubic glyph table foundGlyphs = PR_TRUE; - *aIsCFF = PR_TRUE; break; default: diff --git a/gfx/thebes/src/gfxWindowsFonts.cpp b/gfx/thebes/src/gfxWindowsFonts.cpp index 9d2c8e17b3f0..3e2dc6a925fb 100644 --- a/gfx/thebes/src/gfxWindowsFonts.cpp +++ b/gfx/thebes/src/gfxWindowsFonts.cpp @@ -981,6 +981,17 @@ gfxWindowsFontGroup::InitFontList() 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) { @@ -992,6 +1003,10 @@ gfxWindowsFontGroup::InitFontList() } } + if (mUnderlineOffset == UNDERLINE_OFFSET_NOT_SET) + mUnderlineOffset = GetFontAt(0)->GetMetrics().underlineOffset; + + return mUnderlineOffset; } static PRBool @@ -1351,7 +1366,7 @@ public: 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); @@ -1404,6 +1419,19 @@ public: 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 @@ -1528,6 +1556,9 @@ public: 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 @@ -1771,6 +1802,11 @@ private: 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 mRanges; }; diff --git a/gfx/thebes/src/gfxWindowsPlatform.cpp b/gfx/thebes/src/gfxWindowsPlatform.cpp index 396723da936f..07a9e0bcb98f 100644 --- a/gfx/thebes/src/gfxWindowsPlatform.cpp +++ b/gfx/thebes/src/gfxWindowsPlatform.cpp @@ -633,21 +633,15 @@ gfxWindowsPlatform::LookupLocalFont(const nsAString& aFontName) 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 @@ -705,17 +699,22 @@ static void InitializeFontEmbeddingProcs() 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 @@ -791,22 +790,55 @@ gfxWindowsPlatform::MakePlatformFont(const gfxProxyFontEntry *aProxyEntry, 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 eotHeader; - PRUint8 *buffer; - PRUint32 eotlen; - PRUnichar fontName[LF_FACESIZE]; - PRBool isCFF; - nsresult rv; HANDLE fontRef; - PRInt32 ret; - { - rv = gfxFontUtils::MakeEOTHeader(aFontData, aLength, &eotHeader, &isCFF); + nsAutoString uniqueName; + MakeUniqueFontName(uniqueName); + + if (isCFF) { + // Postscript-style glyphs, swizzle name table, load directly + nsTArray newFontData; + + rv = gfxFontUtils::RenameFont(uniqueName, aFontData, aLength, &newFontData); + + if (NS_FAILED(rv)) + return nsnull; + + DWORD numFonts = 0; + + PRUint8 *fontData = reinterpret_cast (newFontData.Elements()); + PRUint32 fontLength = newFontData.Length(); + NS_ASSERTION(fontData, "null font data after renaming"); + + // 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 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; @@ -814,27 +846,32 @@ gfxWindowsPlatform::MakePlatformFont(const gfxProxyFontEntry *aProxyEntry, eotlen = eotHeader.Length(); buffer = reinterpret_cast (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 From f892213edd2eafd8bf331b69e204daa9d6f01348 Mon Sep 17 00:00:00 2001 From: Ginn Chen Date: Mon, 22 Dec 2008 14:46:30 +0800 Subject: [PATCH 37/98] Bug 460926 A11y heirachy is broken on GNOME 2.24, r=surkov.alexander sr=roc --- accessible/src/atk/nsAppRootAccessible.cpp | 3 +++ toolkit/xre/nsAppRunner.cpp | 3 +++ 2 files changed, 6 insertions(+) diff --git a/accessible/src/atk/nsAppRootAccessible.cpp b/accessible/src/atk/nsAppRootAccessible.cpp index 8dbc4e11e8c5..4e3a63f503e7 100644 --- a/accessible/src/atk/nsAppRootAccessible.cpp +++ b/accessible/src/atk/nsAppRootAccessible.cpp @@ -563,6 +563,9 @@ nsApplicationAccessibleWrap::Init() // 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)) { diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp index e8e5b8869859..c4736a44c6b6 100644 --- a/toolkit/xre/nsAppRunner.cpp +++ b/toolkit/xre/nsAppRunner.cpp @@ -2537,6 +2537,9 @@ XRE_main(int argc, char* argv[], const nsXREAppData* aAppData) 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 From 32711428d4df98c9a4d51785b5ce7dc2a7d02ea2 Mon Sep 17 00:00:00 2001 From: John Daggett Date: Mon, 22 Dec 2008 16:43:56 +0900 Subject: [PATCH 38/98] Bug 458160 - Reftests for .otf fonts. r+sr=dbaron --- .../font-face/download-2-big-otf.html | 23 +++++++++++++++++++ layout/reftests/font-face/download-2-big.html | 23 +++++++++++++++++++ layout/reftests/font-face/reftest.list | 3 +++ .../font-face/src-list-2-big-otf.html | 23 +++++++++++++++++++ .../font-face/src-list-2-big-ref.html | 23 +++++++++++++++++++ 5 files changed, 95 insertions(+) create mode 100644 layout/reftests/font-face/download-2-big-otf.html create mode 100644 layout/reftests/font-face/download-2-big.html create mode 100644 layout/reftests/font-face/src-list-2-big-otf.html create mode 100644 layout/reftests/font-face/src-list-2-big-ref.html diff --git a/layout/reftests/font-face/download-2-big-otf.html b/layout/reftests/font-face/download-2-big-otf.html new file mode 100644 index 000000000000..e2a3a757d4e2 --- /dev/null +++ b/layout/reftests/font-face/download-2-big-otf.html @@ -0,0 +1,23 @@ + + + + + + + + + +

A

+ + + diff --git a/layout/reftests/font-face/download-2-big.html b/layout/reftests/font-face/download-2-big.html new file mode 100644 index 000000000000..3f57fd3307b2 --- /dev/null +++ b/layout/reftests/font-face/download-2-big.html @@ -0,0 +1,23 @@ + + + + + + + + + +

A

+ + + diff --git a/layout/reftests/font-face/reftest.list b/layout/reftests/font-face/reftest.list index b798a4a38380..0614f87c4925 100644 --- a/layout/reftests/font-face/reftest.list +++ b/layout/reftests/font-face/reftest.list @@ -5,6 +5,8 @@ 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 @@ -13,6 +15,7 @@ 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 diff --git a/layout/reftests/font-face/src-list-2-big-otf.html b/layout/reftests/font-face/src-list-2-big-otf.html new file mode 100644 index 000000000000..98b4b8ee71ef --- /dev/null +++ b/layout/reftests/font-face/src-list-2-big-otf.html @@ -0,0 +1,23 @@ + + + + + + + + + +

ABC

+ + + diff --git a/layout/reftests/font-face/src-list-2-big-ref.html b/layout/reftests/font-face/src-list-2-big-ref.html new file mode 100644 index 000000000000..ce855b7040c7 --- /dev/null +++ b/layout/reftests/font-face/src-list-2-big-ref.html @@ -0,0 +1,23 @@ + + + + + + + + + +

DBC

+ + + From cb806c0608c71c19f25d2dc20e681bc26a3d3fa2 Mon Sep 17 00:00:00 2001 From: John Daggett Date: Mon, 22 Dec 2008 17:03:32 +0900 Subject: [PATCH 39/98] Add copy of .ttf font with .eot extension for testing --- layout/reftests/fonts/markA.eot | Bin 0 -> 1528 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 layout/reftests/fonts/markA.eot diff --git a/layout/reftests/fonts/markA.eot b/layout/reftests/fonts/markA.eot new file mode 100644 index 0000000000000000000000000000000000000000..66f5fee2e4f29f68a13d286a3d790561581f100d GIT binary patch literal 1528 zcmd5+O-NKx6#nk}8AmIBNNMBZ4MmyY_+~;GWD0+3B4|`7B;3SfW}F$C@eR*0R0xWS zpj@=5jksvpN>bVcEg}kS@6ts}HzkCv%BJt$_Z*`ZZo8Lr&;PmSo_EfJ0B{U^KJfIuY8+m7@QmZi% z%uVv)d})3v99ZAgp-CwheYCf=WlX9%z?@T&e4T$9N@C!sd@Yys6iPOT zsFDbCOYFj=>amKx=wtC2F+pn$p+;pV51D6ujZa<5Vh}?Z(ydwoll0C~8Q3tRh%}X% z5u`?DAfYp`Ns^P+oiJb#8{Co~;s;iz3O51 zi`*$Ds>vFQZf%K`Y(R8Xpf|bJVBkx9HDqoj*K~~}R&^;hrFg9&Bz`8>Si&#yb8V5f zGw0e)MnvQG`ntBXHxs4IOsTN(@rRn717DonY z$GasFavY5!AHzXU=d#6F;*^S7RoG*8Io=%SwA#c2go7|X--jN=xO?iEBjrw4Q?8fK zS@EcC4Or?r;=Z0(tVbp&ul_rk3Et#kCU}*lst{B6%6eG*vF5xPKE$%^Sk$&{O8yP9 mKbf`r%;sQdNd`;)fd#EjDPC~a{eKeK4;P+%mC`@|d%pqwM$sey literal 0 HcmV?d00001 From 53b546dfd4f9957449b6add4e5437575db4cdbd8 Mon Sep 17 00:00:00 2001 From: Marco Bonardo Date: Mon, 22 Dec 2008 11:07:21 +0100 Subject: [PATCH 40/98] Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh --- .../places/tests/sync/test_database_sync_embed_visits.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js b/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js index e1fcb829c00e..48f421d7d9bf 100644 --- a/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js +++ b/toolkit/components/places/tests/sync/test_database_sync_embed_visits.js @@ -74,10 +74,7 @@ var observer = { 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"); @@ -135,7 +132,7 @@ var observer = { do_check_false(stmt.executeStep()); stmt.finalize(); - do_test_finished(); + finish_test(); } } } From 6212ba3693c822bbd4abd34fecbf31134c20c6d0 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Mon, 22 Dec 2008 15:32:19 +0000 Subject: [PATCH 41/98] Bug 399227 Crash @ nsTreeSelection::GetSingle, null mTree. r=enndeakin,sr=Neil --- .../base/src/tree/src/crashtests/399227-1.xul | 37 ++++++++++++++++ .../base/src/tree/src/crashtests/399227-2.xul | 43 +++++++++++++++++++ .../src/tree/src/crashtests/crashtests.list | 2 + .../xul/base/src/tree/src/nsTreeSelection.cpp | 22 +++++++--- 4 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 layout/xul/base/src/tree/src/crashtests/399227-1.xul create mode 100644 layout/xul/base/src/tree/src/crashtests/399227-2.xul diff --git a/layout/xul/base/src/tree/src/crashtests/399227-1.xul b/layout/xul/base/src/tree/src/crashtests/399227-1.xul new file mode 100644 index 000000000000..cafeb815f85a --- /dev/null +++ b/layout/xul/base/src/tree/src/crashtests/399227-1.xul @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/layout/xul/base/src/tree/src/crashtests/399227-2.xul b/layout/xul/base/src/tree/src/crashtests/399227-2.xul new file mode 100644 index 000000000000..abfe12ce7c42 --- /dev/null +++ b/layout/xul/base/src/tree/src/crashtests/399227-2.xul @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/layout/xul/base/src/tree/src/crashtests/crashtests.list b/layout/xul/base/src/tree/src/crashtests/crashtests.list index decf92ebd3d3..e3c7ae0c22a1 100644 --- a/layout/xul/base/src/tree/src/crashtests/crashtests.list +++ b/layout/xul/base/src/tree/src/crashtests/crashtests.list @@ -4,6 +4,8 @@ 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 diff --git a/layout/xul/base/src/tree/src/nsTreeSelection.cpp b/layout/xul/base/src/tree/src/nsTreeSelection.cpp index 4f5ce665ce1d..19bd221d6ae5 100644 --- a/layout/xul/base/src/tree/src/nsTreeSelection.cpp +++ b/layout/xul/base/src/tree/src/nsTreeSelection.cpp @@ -299,6 +299,9 @@ NS_IMETHODIMP nsTreeSelection::SetTree(nsITreeBoxObject * aTree) NS_IMETHODIMP nsTreeSelection::GetSingle(PRBool* aSingle) { + if (!mTree) + return NS_ERROR_NULL_POINTER; + nsCOMPtr boxObject = do_QueryInterface(mTree); nsCOMPtr element; @@ -410,8 +413,8 @@ NS_IMETHODIMP nsTreeSelection::ToggleSelect(PRInt32 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 @@ -430,7 +433,10 @@ NS_IMETHODIMP nsTreeSelection::ToggleSelect(PRInt32 aIndex) 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; @@ -452,7 +458,7 @@ NS_IMETHODIMP nsTreeSelection::RangedSelect(PRInt32 aStartIndex, PRInt32 aEndInd } mShiftSelectPivot = aStartIndex; - nsresult rv = SetCurrentIndex(aEndIndex); + rv = SetCurrentIndex(aEndIndex); if (NS_FAILED(rv)) return rv; @@ -534,7 +540,10 @@ NS_IMETHODIMP nsTreeSelection::SelectAll() 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; @@ -658,6 +667,9 @@ NS_IMETHODIMP nsTreeSelection::GetCurrentColumn(nsITreeColumn** aCurrentColumn) NS_IMETHODIMP nsTreeSelection::SetCurrentColumn(nsITreeColumn* aCurrentColumn) { + if (!mTree) { + return NS_ERROR_UNEXPECTED; + } if (mCurrentColumn == aCurrentColumn) { return NS_OK; } From ab95407e2c010d0d00315c98a47b4266083a3764 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Mon, 22 Dec 2008 17:05:18 +0000 Subject: [PATCH 42/98] Crashtest fix follow up from bug 399227 - Add missing removeAttribute to let the crashtests finish --- layout/xul/base/src/tree/src/crashtests/399227-1.xul | 2 ++ layout/xul/base/src/tree/src/crashtests/399227-2.xul | 2 ++ 2 files changed, 4 insertions(+) diff --git a/layout/xul/base/src/tree/src/crashtests/399227-1.xul b/layout/xul/base/src/tree/src/crashtests/399227-1.xul index cafeb815f85a..712af548eaa8 100644 --- a/layout/xul/base/src/tree/src/crashtests/399227-1.xul +++ b/layout/xul/base/src/tree/src/crashtests/399227-1.xul @@ -14,6 +14,8 @@ selection.select(0); tree.parentNode.removeChild(tree); selection.rangedSelect(1, 1, false); + + document.documentElement.removeAttribute("class"); } diff --git a/layout/xul/base/src/tree/src/crashtests/399227-2.xul b/layout/xul/base/src/tree/src/crashtests/399227-2.xul index abfe12ce7c42..12b38ad851e4 100644 --- a/layout/xul/base/src/tree/src/crashtests/399227-2.xul +++ b/layout/xul/base/src/tree/src/crashtests/399227-2.xul @@ -17,6 +17,8 @@ selection.currentColumn = treecolumn0; tree.parentNode.removeChild(tree); selection.currentColumn = treecolumn1; + + document.documentElement.removeAttribute("class"); } From df9b87090d554d635cadfe579cc46d59a4a93c13 Mon Sep 17 00:00:00 2001 From: Brad Lassey Date: Mon, 22 Dec 2008 12:28:38 -0500 Subject: [PATCH 43/98] Bug 458892 - Change deb description for xulrunner r=stuart --- xulrunner/installer/debian/control | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xulrunner/installer/debian/control b/xulrunner/installer/debian/control index 51db5c5866c4..e92266e44f6b 100644 --- a/xulrunner/installer/debian/control +++ b/xulrunner/installer/debian/control @@ -8,8 +8,8 @@ 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<'#! From 467441f46ec682ff114abc3cd6afd65e4c49279a Mon Sep 17 00:00:00 2001 From: Jeff Walden Date: Mon, 22 Dec 2008 10:58:09 -0800 Subject: [PATCH 44/98] Fix some warnings blamed on me that were pointed out by bsmedberg's warning-blame scripts. Trivial change, no review, testingonly anyway --- testing/mochitest/ssltunnel/ssltunnel.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/testing/mochitest/ssltunnel/ssltunnel.cpp b/testing/mochitest/ssltunnel/ssltunnel.cpp index eab2c5cdabeb..dce40a33272c 100644 --- a/testing/mochitest/ssltunnel/ssltunnel.cpp +++ b/testing/mochitest/ssltunnel/ssltunnel.cpp @@ -229,7 +229,6 @@ void HandleConnection(void* data) { connection_info_t* ci = static_cast(data); PRIntervalTime connect_timeout = PR_SecondsToInterval(2); - PRIntervalTime short_timeout = PR_MillisecondsToInterval(250); AutoFD other_sock(PR_NewTCPSocket()); bool client_done = false; @@ -489,7 +488,7 @@ char* password_func(PK11SlotInfo* slot, PRBool retry, void* arg) if (retry) return NULL; - return ""; + return PL_strdup(""); } server_info_t* findServerInfo(int portnumber) From 1256b0a4e4ef1e9b9546a03b80968ba0a54e5c9d Mon Sep 17 00:00:00 2001 From: Robert Strong Date: Mon, 22 Dec 2008 11:05:01 -0800 Subject: [PATCH 45/98] Bug 460669 - Installing Firefox writes incorrect file paths to DefaultIcon and open command. r=jmathies --- browser/installer/windows/nsis/installer.nsi | 25 ++++++++----------- .../installer/windows/nsis/uninstaller.nsi | 4 +-- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/browser/installer/windows/nsis/installer.nsi b/browser/installer/windows/nsis/installer.nsi index 12ecf3ba16d2..cb1c24d884d5 100755 --- a/browser/installer/windows/nsis/installer.nsi +++ b/browser/installer/windows/nsis/installer.nsi @@ -57,7 +57,8 @@ RequestExecutionLevel user !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 @@ -72,7 +73,6 @@ Var AddDesktopSC !include FileFunc.nsh !include LogicLib.nsh !include MUI.nsh -!include TextFunc.nsh !include WinMessages.nsh !include WinVer.nsh !include WordFunc.nsh @@ -83,11 +83,6 @@ Var AddDesktopSC !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 @@ -105,7 +100,6 @@ VIAddVersionKey "OriginalFilename" "setup.exe" !insertmacro ChangeMUIHeaderImage !insertmacro CheckForFilesInUse !insertmacro CleanUpdatesDir -!insertmacro CloseApp !insertmacro CopyFilesFromDir !insertmacro CreateRegKey !insertmacro GetPathFromString @@ -289,10 +283,9 @@ Section "-Application" APP_IDX 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" @@ -368,8 +361,12 @@ Section "-Application" APP_IDX ${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" diff --git a/browser/installer/windows/nsis/uninstaller.nsi b/browser/installer/windows/nsis/uninstaller.nsi index f2cbd9d48c2f..fe05d2e57fce 100755 --- a/browser/installer/windows/nsis/uninstaller.nsi +++ b/browser/installer/windows/nsis/uninstaller.nsi @@ -52,7 +52,8 @@ 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. @@ -65,7 +66,6 @@ Var TmpVal !include FileFunc.nsh !include LogicLib.nsh !include MUI.nsh -!include TextFunc.nsh !include WinMessages.nsh !include WinVer.nsh !include WordFunc.nsh From 1b4ce5b24a452633031c554e0142cfda904e0690 Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Mon, 22 Dec 2008 19:05:25 +0000 Subject: [PATCH 46/98] Additional crashtest fix follow up from bug 399227 - catch errors thrown by functions that now fail, so that the test completes properly --- layout/xul/base/src/tree/src/crashtests/399227-1.xul | 7 ++++++- layout/xul/base/src/tree/src/crashtests/399227-2.xul | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/layout/xul/base/src/tree/src/crashtests/399227-1.xul b/layout/xul/base/src/tree/src/crashtests/399227-1.xul index 712af548eaa8..bfc381892a38 100644 --- a/layout/xul/base/src/tree/src/crashtests/399227-1.xul +++ b/layout/xul/base/src/tree/src/crashtests/399227-1.xul @@ -13,7 +13,12 @@ selection.select(0); tree.parentNode.removeChild(tree); - selection.rangedSelect(1, 1, false); + + // This is expected to throw an error (it used to crash). + try { + selection.rangedSelect(1, 1, false); + } + catch (ex) {} document.documentElement.removeAttribute("class"); } diff --git a/layout/xul/base/src/tree/src/crashtests/399227-2.xul b/layout/xul/base/src/tree/src/crashtests/399227-2.xul index 12b38ad851e4..55665ec475b8 100644 --- a/layout/xul/base/src/tree/src/crashtests/399227-2.xul +++ b/layout/xul/base/src/tree/src/crashtests/399227-2.xul @@ -2,7 +2,7 @@ - + + + + + +Mozilla Bug 427060 +

+ +
+
+
+ + From 5d549a7d2f8010aaa6429f59a1bd611f85f3f702 Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Tue, 23 Dec 2008 12:35:48 +0100 Subject: [PATCH 58/98] Testcase for bug 462929 ("ASSERTION: We can't deal with objects that have the same classinfo but different offset tables" with MathML element and other element). --- content/mathml/content/crashtests/462929-1.html | 12 ++++++++++++ content/mathml/content/crashtests/crashtests.list | 1 + testing/crashtest/crashtests.list | 1 + 3 files changed, 14 insertions(+) create mode 100644 content/mathml/content/crashtests/462929-1.html create mode 100644 content/mathml/content/crashtests/crashtests.list diff --git a/content/mathml/content/crashtests/462929-1.html b/content/mathml/content/crashtests/462929-1.html new file mode 100644 index 000000000000..386d8e138f95 --- /dev/null +++ b/content/mathml/content/crashtests/462929-1.html @@ -0,0 +1,12 @@ + + + + + + + diff --git a/content/mathml/content/crashtests/crashtests.list b/content/mathml/content/crashtests/crashtests.list new file mode 100644 index 000000000000..064093053391 --- /dev/null +++ b/content/mathml/content/crashtests/crashtests.list @@ -0,0 +1 @@ +load 462929-1.html diff --git a/testing/crashtest/crashtests.list b/testing/crashtest/crashtests.list index c20eafb3792f..d983b2b79070 100644 --- a/testing/crashtest/crashtests.list +++ b/testing/crashtest/crashtests.list @@ -16,6 +16,7 @@ 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 From 469dcb7cef39c2e2eed35f0b4a54eb16b821cb2b Mon Sep 17 00:00:00 2001 From: Peter Van der Beken Date: Tue, 23 Dec 2008 12:35:48 +0100 Subject: [PATCH 59/98] Testcase for bug 462947 ("ASSERTION: already initialized" - nsMimeTypeArray::GetMimeTypes). --- dom/src/base/crashtests/462947.html | 13 +++++++++++++ dom/src/base/crashtests/crashtests.list | 1 + 2 files changed, 14 insertions(+) create mode 100644 dom/src/base/crashtests/462947.html diff --git a/dom/src/base/crashtests/462947.html b/dom/src/base/crashtests/462947.html new file mode 100644 index 000000000000..09581b3081ad --- /dev/null +++ b/dom/src/base/crashtests/462947.html @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/dom/src/base/crashtests/crashtests.list b/dom/src/base/crashtests/crashtests.list index 2c218e9f84d0..afcaef696f6e 100644 --- a/dom/src/base/crashtests/crashtests.list +++ b/dom/src/base/crashtests/crashtests.list @@ -7,4 +7,5 @@ load 359432-1.xhtml load 369413-1.html load 372554-1.html load 404869-1.xul +load 462947.html load 439206-1.html From 0935c2a89be827deada81991814d1f3be8a4928e Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:56 -0500 Subject: [PATCH 60/98] Set up image loaders before reflow for border-image in XUL just like for HTML. (Bug 468473) r+sr=roc --- layout/generic/nsFrame.cpp | 11 +++++++++++ layout/generic/nsHTMLReflowState.cpp | 12 ------------ layout/reftests/bugs/468473-1-ref.xul | 10 ++++++++++ layout/reftests/bugs/468473-1.xul | 10 ++++++++++ layout/reftests/bugs/reftest.list | 1 + 5 files changed, 32 insertions(+), 12 deletions(-) create mode 100644 layout/reftests/bugs/468473-1-ref.xul create mode 100644 layout/reftests/bugs/468473-1.xul diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 4f8497459e1d..156f70542749 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -99,6 +99,7 @@ #include "nsITextControlFrame.h" #include "nsINameSpaceManager.h" #include "nsIPercentHeightObserver.h" +#include "nsStyleStructInlines.h" #ifdef IBMBIDI #include "nsBidiPresUtils.h" @@ -553,6 +554,16 @@ nsFrame::GetOffsets(PRInt32 &aStart, PRInt32 &aEnd) const /* 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 diff --git a/layout/generic/nsHTMLReflowState.cpp b/layout/generic/nsHTMLReflowState.cpp index efd313c99e3b..9b08cd639699 100644 --- a/layout/generic/nsHTMLReflowState.cpp +++ b/layout/generic/nsHTMLReflowState.cpp @@ -57,7 +57,6 @@ #include "nsIPercentHeightObserver.h" #include "nsContentUtils.h" #include "nsLayoutUtils.h" -#include "nsStyleStructInlines.h" #ifdef IBMBIDI #include "nsBidiUtils.h" #endif @@ -287,17 +286,6 @@ nsHTMLReflowState::Init(nsPresContext* aPresContext, 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 || diff --git a/layout/reftests/bugs/468473-1-ref.xul b/layout/reftests/bugs/468473-1-ref.xul new file mode 100644 index 000000000000..617cd6aaf7e7 --- /dev/null +++ b/layout/reftests/bugs/468473-1-ref.xul @@ -0,0 +1,10 @@ + + + + +
diff --git a/layout/style/test/test_value_storage.html b/layout/style/test/test_value_storage.html index a5ee652be11c..ba1d2111f7d8 100644 --- a/layout/style/test/test_value_storage.html +++ b/layout/style/test/test_value_storage.html @@ -109,15 +109,6 @@ function xfail_ser_val(property, value) 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)$/) && From a60fb02beeeab96aba4665698101ffd22536fe9d Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:57 -0500 Subject: [PATCH 68/98] Condense box property four side shorthands in value getters, just as in serialization. (Bug 376075) r+sr=bzbarsky --- layout/style/nsCSSDeclaration.cpp | 44 +++++++++++++++---- .../test/test_shorthand_property_getters.html | 31 +++++++++++++ layout/style/test/test_value_storage.html | 14 ------ 3 files changed, 66 insertions(+), 23 deletions(-) diff --git a/layout/style/nsCSSDeclaration.cpp b/layout/style/nsCSSDeclaration.cpp index 907f6221d4ea..be5552645054 100644 --- a/layout/style/nsCSSDeclaration.cpp +++ b/layout/style/nsCSSDeclaration.cpp @@ -636,14 +636,40 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, 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(data->StorageFor(subprops[0])); + const nsCSSValue &rightValue = + *static_cast(data->StorageFor(subprops[1])); + const nsCSSValue &bottomValue = + *static_cast(data->StorageFor(subprops[2])); + const nsCSSValue &leftValue = + *static_cast(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; } @@ -861,7 +887,7 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, 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: { diff --git a/layout/style/test/test_shorthand_property_getters.html b/layout/style/test/test_shorthand_property_getters.html index 2e73837a4049..9b56da7218c3 100644 --- a/layout/style/test/test_shorthand_property_getters.html +++ b/layout/style/test/test_shorthand_property_getters.html @@ -64,6 +64,37 @@ 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"); diff --git a/layout/style/test/test_value_storage.html b/layout/style/test/test_value_storage.html index ba1d2111f7d8..0b60460ea6dd 100644 --- a/layout/style/test/test_value_storage.html +++ b/layout/style/test/test_value_storage.html @@ -76,11 +76,6 @@ var gBadCompute = { "-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 && @@ -109,15 +104,6 @@ function xfail_ser_val(property, value) if (property in gShorthandsWithoutCondensingSerialize) 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; } From b78a78989916c88e30407352a5574c8a445dc85c Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:57 -0500 Subject: [PATCH 69/98] Don't say that the font or background shorthands are present when the properties that they reset but can't otherwise specify are not their initial values. (Bug 376075) r+sr=bzbarsky --- layout/style/nsCSSDeclaration.cpp | 32 +++++++++++++++++++ layout/style/test/test_bug377947.html | 10 ++++-- .../test/test_shorthand_property_getters.html | 19 +++++++++++ 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/layout/style/nsCSSDeclaration.cpp b/layout/style/nsCSSDeclaration.cpp index be5552645054..e9b21d21be1b 100644 --- a/layout/style/nsCSSDeclaration.cpp +++ b/layout/style/nsCSSDeclaration.cpp @@ -805,6 +805,26 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, 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( + data->StorageFor(eCSSProperty__moz_background_clip)); + const nsCSSValue *originValue = static_cast( + data->StorageFor(eCSSProperty__moz_background_origin)); + const nsCSSValue *inlinePolicyValue = static_cast( + 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; @@ -853,6 +873,18 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, 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( + data->StorageFor(eCSSProperty_font_stretch)); + const nsCSSValue *sizeAdjustValue = static_cast( + 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(' ')); diff --git a/layout/style/test/test_bug377947.html b/layout/style/test/test_bug377947.html index 7c5256e0ef7b..58d961efcf6a 100644 --- a/layout/style/test/test_bug377947.html +++ b/layout/style/test/test_bug377947.html @@ -57,8 +57,8 @@ var all_but_one = { "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], ""); @@ -66,6 +66,12 @@ for (var prop in all_but_one) { 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"); diff --git a/layout/style/test/test_shorthand_property_getters.html b/layout/style/test/test_shorthand_property_getters.html index 9b56da7218c3..574664d1ef11 100644 --- a/layout/style/test/test_shorthand_property_getters.html +++ b/layout/style/test/test_shorthand_property_getters.html @@ -96,6 +96,25 @@ 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"); + From f58f64920e1a8b23e4e93847a7ffb7dc1c307c70 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:57 -0500 Subject: [PATCH 70/98] Rewrite the shorthand condensation code in nsCSSDeclaration::ToString. (Bug 376075) r+sr=bzbarsky --- layout/style/nsCSSDeclaration.cpp | 729 ++------------------ layout/style/nsCSSDeclaration.h | 53 +- layout/style/nsCSSProps.cpp | 186 ++++- layout/style/nsCSSProps.h | 34 +- layout/style/test/test_inherit_storage.html | 24 +- layout/style/test/test_initial_storage.html | 24 +- layout/style/test/test_value_storage.html | 29 +- 7 files changed, 263 insertions(+), 816 deletions(-) diff --git a/layout/style/nsCSSDeclaration.cpp b/layout/style/nsCSSDeclaration.cpp index e9b21d21be1b..097b0de4a6c8 100644 --- a/layout/style/nsCSSDeclaration.cpp +++ b/layout/style/nsCSSDeclaration.cpp @@ -59,30 +59,6 @@ #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) @@ -621,7 +597,6 @@ nsCSSDeclaration::GetValue(nsCSSProperty aProperty, return NS_OK; } - // XXXldb Can we share shorthand logic with ToString? nsCSSCompressedDataBlock *data = importantCount ? mImportantData : mData; switch (aProperty) { case eCSSProperty_margin: @@ -980,50 +955,6 @@ nsCSSDeclaration::GetValueIsImportant(nsCSSProperty aProperty) const 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) @@ -1035,636 +966,74 @@ nsCSSDeclaration::AppendImportanceToString(PRBool aIsImportant, 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); - - nsAutoString valueString; - AppendValueToString(eCSSProperty_border_top_color, valueString); - if (!valueString.EqualsLiteral("-moz-use-text-color")) { - aString.Append(PRUnichar(' ')); - /* 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 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; + PRBool doneProperty = PR_FALSE; - 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; - - 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 ((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) - - 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: - 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); + // 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; } - break; + } + if (doneProperty) + continue; } + + // 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; + + // 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; + } + } + 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 diff --git a/layout/style/nsCSSDeclaration.h b/layout/style/nsCSSDeclaration.h index 30a8a4a58e80..bcab9505424f 100644 --- a/layout/style/nsCSSDeclaration.h +++ b/layout/style/nsCSSDeclaration.h @@ -165,58 +165,9 @@ private: // 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: diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index 1709e905604a..3618720bae28 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -70,6 +70,10 @@ 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", @@ -80,6 +84,23 @@ static const char* const kCSSRawFontDescs[] = { "unicode-range" }; +struct PropertyAndCount { + nsCSSProperty property; + PRUint32 count; +}; + +static int +SortPropertyAndCount(const void* s1, const void* s2, void *closure) +{ + const PropertyAndCount *pc1 = static_cast(s1); + const PropertyAndCount *pc2 = static_cast(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) { @@ -120,21 +141,170 @@ nsCSSProps::AddRefTable(void) #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; } } diff --git a/layout/style/nsCSSProps.h b/layout/style/nsCSSProps.h index 0ecbf636c4c4..7edb68684cd7 100644 --- a/layout/style/nsCSSProps.h +++ b/layout/style/nsCSSProps.h @@ -105,9 +105,19 @@ public: 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 @@ -115,7 +125,7 @@ private: 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"); @@ -123,10 +133,26 @@ public: 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_); \ diff --git a/layout/style/test/test_inherit_storage.html b/layout/style/test/test_inherit_storage.html index 74d391903337..d000eb34c03c 100644 --- a/layout/style/test/test_inherit_storage.html +++ b/layout/style/test/test_inherit_storage.html @@ -25,25 +25,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=375363 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]; @@ -82,10 +63,7 @@ function test_property(property) // 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); diff --git a/layout/style/test/test_initial_storage.html b/layout/style/test/test_initial_storage.html index ac85197ffcc5..15060e1e31e3 100644 --- a/layout/style/test/test_initial_storage.html +++ b/layout/style/test/test_initial_storage.html @@ -25,25 +25,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=375363 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]; @@ -82,10 +63,7 @@ function test_property(property) // 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); diff --git a/layout/style/test/test_value_storage.html b/layout/style/test/test_value_storage.html index 0b60460ea6dd..7e247c2c8d00 100644 --- a/layout/style/test/test_value_storage.html +++ b/layout/style/test/test_value_storage.html @@ -46,17 +46,6 @@ * 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" ], @@ -94,19 +83,6 @@ function xfail_accepted_split(property, subprop, value) 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; - - return false; -} - function xfail_idparseser(property, value) { if (property != "font" && xfail_accepted(property, value)) @@ -188,12 +164,11 @@ function test_property(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, ""); From 4cda588725efda3e5386ec8639be741a41a9622c Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:58 -0500 Subject: [PATCH 71/98] Disallow negative values on -moz-box-ordinal-group, since it's stored in an unsigned integer and clearly intended to be only positive. (Bug 470703) r=enndeakin sr=bzbarsky --- layout/style/nsCSSParser.cpp | 2 +- layout/style/test/property_database.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index c32a15077d5d..752b5f5d02e9 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -5375,7 +5375,7 @@ CSSParserImpl::ParseSingleValueProperty(nsCSSValue& aValue, 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); diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index 4bcc639c792a..abf0ef3733be 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -308,8 +308,8 @@ var gCSSProperties = { 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", From 409bc375afe8042e702dc7d3904ae397f927fde0 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:58 -0500 Subject: [PATCH 72/98] Reject duplicate keywords for 'text-decoration'. (Bug 470704) r+sr=bzbarsky --- layout/style/nsCSSParser.cpp | 7 ++++++- layout/style/test/test_property_syntax_errors.html | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index 752b5f5d02e9..db13b2946006 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -7627,7 +7627,12 @@ CSSParserImpl::ParseTextDecoration(nsCSSValue& aValue) 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; diff --git a/layout/style/test/test_property_syntax_errors.html b/layout/style/test/test_property_syntax_errors.html index e80cfe2e6804..356cfbe4b136 100644 --- a/layout/style/test/test_property_syntax_errors.html +++ b/layout/style/test/test_property_syntax_errors.html @@ -26,7 +26,6 @@ var gKnownFails = { "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" ] } From a957e1642ee6112e1df76d5877ae16e4a71c65aa Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:58 -0500 Subject: [PATCH 73/98] Enforce the restriction that values of stroke-miterlimit are greater than 1, rather than just using ParsePositiveVariant. (Bug 470706) r=jwatt sr=bzbarsky --- layout/style/nsCSSParser.cpp | 6 ++++-- layout/style/test/property_database.js | 4 ++-- layout/style/test/test_property_syntax_errors.html | 3 +-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/layout/style/nsCSSParser.cpp b/layout/style/nsCSSParser.cpp index db13b2946006..8cceb644b2ec 100644 --- a/layout/style/nsCSSParser.cpp +++ b/layout/style/nsCSSParser.cpp @@ -5431,8 +5431,10 @@ CSSParserImpl::ParseSingleValueProperty(nsCSSValue& aValue, 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); diff --git a/layout/style/test/property_database.js b/layout/style/test/property_database.js index abf0ef3733be..3682f4f57722 100644 --- a/layout/style/test/property_database.js +++ b/layout/style/test/property_database.js @@ -1957,8 +1957,8 @@ var gCSSProperties = { 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, diff --git a/layout/style/test/test_property_syntax_errors.html b/layout/style/test/test_property_syntax_errors.html index 356cfbe4b136..f54db56be664 100644 --- a/layout/style/test/test_property_syntax_errors.html +++ b/layout/style/test/test_property_syntax_errors.html @@ -25,8 +25,7 @@ var gKnownFails = { "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" ], - "stroke-miterlimit": [ "0.9", "0" ] + "volume": [ " -0.01", "100.2", "108", "-3" ] } for (var property in gCSSProperties) { From ccd1af0eaccb87e61ad4cac7c2b77c6ebd214018 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:59 -0500 Subject: [PATCH 74/98] Fix computed style for large integers by using double instead of float. (Bug 470769) r+sr=bzbarsky --- layout/style/nsComputedDOMStyle.cpp | 2 +- layout/style/nsROCSSPrimitiveValue.cpp | 4 ++-- layout/style/nsROCSSPrimitiveValue.h | 12 +++++----- layout/style/test/Makefile.in | 1 + layout/style/test/test_bug373875.html | 32 ++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 layout/style/test/test_bug373875.html diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index 77d0a507471a..bb0dd3b34d49 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -3383,7 +3383,7 @@ nsComputedDOMStyle::SetValueToCoord(nsROCSSPrimitiveValue* aValue, break; case eStyleUnit_Integer: - aValue->SetNumber(aCoord.GetIntValue()); + aValue->SetNumber(aCoord.GetIntValue()); // XXX This should really be integer break; case eStyleUnit_Enumerated: diff --git a/layout/style/nsROCSSPrimitiveValue.cpp b/layout/style/nsROCSSPrimitiveValue.cpp index e5c333165bf8..2de3ed8f28cc 100644 --- a/layout/style/nsROCSSPrimitiveValue.cpp +++ b/layout/style/nsROCSSPrimitiveValue.cpp @@ -372,12 +372,12 @@ nsROCSSPrimitiveValue::GetFloatValue(PRUint16 aUnitType, float* aReturn) case CSS_PERCENTAGE : if (mType != CSS_PERCENTAGE) return NS_ERROR_DOM_INVALID_ACCESS_ERR; - *aReturn = mValue.mFloat * 100; + *aReturn = float(mValue.mFloat * 100); break; case CSS_NUMBER : if (mType != CSS_NUMBER) return NS_ERROR_DOM_INVALID_ACCESS_ERR; - *aReturn = mValue.mFloat; + *aReturn = float(mValue.mFloat); break; case CSS_UNKNOWN : case CSS_EMS : diff --git a/layout/style/nsROCSSPrimitiveValue.h b/layout/style/nsROCSSPrimitiveValue.h index c98aaf2286bc..cac2376f28f3 100644 --- a/layout/style/nsROCSSPrimitiveValue.h +++ b/layout/style/nsROCSSPrimitiveValue.h @@ -73,28 +73,28 @@ public: void SetNumber(float aValue) { Reset(); - mValue.mFloat = aValue; + mValue.mFloat = double(aValue); mType = CSS_NUMBER; } void SetNumber(PRInt32 aValue) { Reset(); - mValue.mFloat = float(aValue); + mValue.mFloat = double(aValue); mType = CSS_NUMBER; } void SetNumber(PRUint32 aValue) { Reset(); - mValue.mFloat = float(aValue); + mValue.mFloat = double(aValue); mType = CSS_NUMBER; } void SetPercent(float aValue) { Reset(); - mValue.mFloat = aValue; + mValue.mFloat = double(aValue); mType = CSS_PERCENTAGE; } @@ -230,10 +230,11 @@ private: void GetEscapedURI(nsIURI *aURI, PRUnichar **aReturn); PRUint16 mType; + PRInt32 mAppUnitsPerInch; union { nscoord mAppUnits; - float mFloat; + double mFloat; nsDOMCSSRGBColor* mColor; nsIDOMRect* mRect; PRUnichar* mString; @@ -241,7 +242,6 @@ private: nsIAtom* mAtom; // FIXME use nsCSSKeyword instead } mValue; - PRInt32 mAppUnitsPerInch; }; #endif /* nsROCSSPrimitiveValue_h___ */ diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 8e4eb327920d..b02f49f1fcd5 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -82,6 +82,7 @@ _TEST_FILES = test_acid3_test46.html \ test_bug365932.html \ test_bug372770.html \ test_bug373293.html \ + test_bug373875.html \ test_bug377947.html \ test_bug379440.html \ test_bug379741.html \ diff --git a/layout/style/test/test_bug373875.html b/layout/style/test/test_bug373875.html new file mode 100644 index 000000000000..410dc2a019ee --- /dev/null +++ b/layout/style/test/test_bug373875.html @@ -0,0 +1,32 @@ + + + + + Test for Bug 373875 + + + + + +Mozilla Bug 373875 +

+ +
+
+
+ + From c0dec50ee495a534a53936d9407e02463ae336de Mon Sep 17 00:00:00 2001 From: Robert Kaiser Date: Tue, 23 Dec 2008 15:58:44 +0100 Subject: [PATCH 75/98] bug 469593 - test_423060.xul fails on SeaMonkey, r=gavin --HG-- rename : toolkit/components/places/tests/chrome/Makefile.in => browser/components/feeds/test/chrome/Makefile.in rename : toolkit/components/places/tests/chrome/sample_feed.atom => browser/components/feeds/test/chrome/sample_feed.atom rename : toolkit/components/places/tests/chrome/test_423060.xul => browser/components/feeds/test/chrome/test_423060.xul --- browser/components/feeds/test/Makefile.in | 4 ++ .../components/feeds/test/chrome/Makefile.in | 61 +++++++++++++++++++ .../feeds/test/chrome/sample_feed.atom | 23 +++++++ .../feeds/test}/chrome/test_423060.xul | 0 .../places/tests/chrome/Makefile.in | 1 - 5 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 browser/components/feeds/test/chrome/Makefile.in create mode 100644 browser/components/feeds/test/chrome/sample_feed.atom rename {toolkit/components/places/tests => browser/components/feeds/test}/chrome/test_423060.xul (100%) diff --git a/browser/components/feeds/test/Makefile.in b/browser/components/feeds/test/Makefile.in index 1360a42b7273..36265d91dab6 100644 --- a/browser/components/feeds/test/Makefile.in +++ b/browser/components/feeds/test/Makefile.in @@ -45,6 +45,10 @@ 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 \ diff --git a/browser/components/feeds/test/chrome/Makefile.in b/browser/components/feeds/test/chrome/Makefile.in new file mode 100644 index 000000000000..ed3f8d957b1a --- /dev/null +++ b/browser/components/feeds/test/chrome/Makefile.in @@ -0,0 +1,61 @@ +# +# ***** 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 +# Mozilla.org. +# Portions created by the Initial Developer are Copyright (C) 2005 +# 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 ***** + +DEPTH = ../../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +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 \ + $(NULL) + +_CHROME_FILES = \ + 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) + diff --git a/browser/components/feeds/test/chrome/sample_feed.atom b/browser/components/feeds/test/chrome/sample_feed.atom new file mode 100644 index 000000000000..add75efb4d68 --- /dev/null +++ b/browser/components/feeds/test/chrome/sample_feed.atom @@ -0,0 +1,23 @@ + + + + Example Feed + + 2003-12-13T18:30:02Z + + + John Doe + + urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 + + + + Atom-Powered Robots Run Amok + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2003-12-13T18:30:02Z + + Some text. + + + diff --git a/toolkit/components/places/tests/chrome/test_423060.xul b/browser/components/feeds/test/chrome/test_423060.xul similarity index 100% rename from toolkit/components/places/tests/chrome/test_423060.xul rename to browser/components/feeds/test/chrome/test_423060.xul diff --git a/toolkit/components/places/tests/chrome/Makefile.in b/toolkit/components/places/tests/chrome/Makefile.in index 6699b19b285b..acbacf30a380 100644 --- a/toolkit/components/places/tests/chrome/Makefile.in +++ b/toolkit/components/places/tests/chrome/Makefile.in @@ -57,7 +57,6 @@ _CHROME_FILES = \ test_342484.xul \ test_341972a.xul \ test_381357.xul \ - test_423060.xul \ $(NULL) libs:: $(_HTTP_FILES) From db5d6b1fad707befa0375327dc878e832be93450 Mon Sep 17 00:00:00 2001 From: Robert Kaiser Date: Tue, 23 Dec 2008 16:03:25 +0100 Subject: [PATCH 76/98] bug 469331 - [SeaMonkey] test_bug458898.html fails, make the width test function always ok on Windows, r=dbaron --- layout/base/tests/test_bug458898.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/layout/base/tests/test_bug458898.html b/layout/base/tests/test_bug458898.html index 15e4ed1711da..d3929692121c 100644 --- a/layout/base/tests/test_bug458898.html +++ b/layout/base/tests/test_bug458898.html @@ -24,12 +24,13 @@ var win = window.openDialog("data:text/html,
= 100, "innerWidth"); - testfunc(win.innerHeight >= 200, "innerHeight"); + testfunc_w(win.innerWidth >= 100, "innerWidth"); + testfunc_h(win.innerHeight >= 200, "innerHeight"); win.close(); SimpleTest.finish(); } From 9ef05fcc7a11506d6da3984e53ead5f61b6eed14 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 11:11:51 -0500 Subject: [PATCH 77/98] Backed out changeset 441f119f1a0c (Bug 470769) due to failures in layout/style/test/test_bug365932.html --- layout/style/nsComputedDOMStyle.cpp | 2 +- layout/style/nsROCSSPrimitiveValue.cpp | 4 ++-- layout/style/nsROCSSPrimitiveValue.h | 12 +++++----- layout/style/test/Makefile.in | 1 - layout/style/test/test_bug373875.html | 32 -------------------------- 5 files changed, 9 insertions(+), 42 deletions(-) delete mode 100644 layout/style/test/test_bug373875.html diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index bb0dd3b34d49..77d0a507471a 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -3383,7 +3383,7 @@ nsComputedDOMStyle::SetValueToCoord(nsROCSSPrimitiveValue* aValue, break; case eStyleUnit_Integer: - aValue->SetNumber(aCoord.GetIntValue()); // XXX This should really be integer + aValue->SetNumber(aCoord.GetIntValue()); break; case eStyleUnit_Enumerated: diff --git a/layout/style/nsROCSSPrimitiveValue.cpp b/layout/style/nsROCSSPrimitiveValue.cpp index 2de3ed8f28cc..e5c333165bf8 100644 --- a/layout/style/nsROCSSPrimitiveValue.cpp +++ b/layout/style/nsROCSSPrimitiveValue.cpp @@ -372,12 +372,12 @@ nsROCSSPrimitiveValue::GetFloatValue(PRUint16 aUnitType, float* aReturn) case CSS_PERCENTAGE : if (mType != CSS_PERCENTAGE) return NS_ERROR_DOM_INVALID_ACCESS_ERR; - *aReturn = float(mValue.mFloat * 100); + *aReturn = mValue.mFloat * 100; break; case CSS_NUMBER : if (mType != CSS_NUMBER) return NS_ERROR_DOM_INVALID_ACCESS_ERR; - *aReturn = float(mValue.mFloat); + *aReturn = mValue.mFloat; break; case CSS_UNKNOWN : case CSS_EMS : diff --git a/layout/style/nsROCSSPrimitiveValue.h b/layout/style/nsROCSSPrimitiveValue.h index cac2376f28f3..c98aaf2286bc 100644 --- a/layout/style/nsROCSSPrimitiveValue.h +++ b/layout/style/nsROCSSPrimitiveValue.h @@ -73,28 +73,28 @@ public: void SetNumber(float aValue) { Reset(); - mValue.mFloat = double(aValue); + mValue.mFloat = aValue; mType = CSS_NUMBER; } void SetNumber(PRInt32 aValue) { Reset(); - mValue.mFloat = double(aValue); + mValue.mFloat = float(aValue); mType = CSS_NUMBER; } void SetNumber(PRUint32 aValue) { Reset(); - mValue.mFloat = double(aValue); + mValue.mFloat = float(aValue); mType = CSS_NUMBER; } void SetPercent(float aValue) { Reset(); - mValue.mFloat = double(aValue); + mValue.mFloat = aValue; mType = CSS_PERCENTAGE; } @@ -230,11 +230,10 @@ private: void GetEscapedURI(nsIURI *aURI, PRUnichar **aReturn); PRUint16 mType; - PRInt32 mAppUnitsPerInch; union { nscoord mAppUnits; - double mFloat; + float mFloat; nsDOMCSSRGBColor* mColor; nsIDOMRect* mRect; PRUnichar* mString; @@ -242,6 +241,7 @@ private: nsIAtom* mAtom; // FIXME use nsCSSKeyword instead } mValue; + PRInt32 mAppUnitsPerInch; }; #endif /* nsROCSSPrimitiveValue_h___ */ diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index b02f49f1fcd5..8e4eb327920d 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -82,7 +82,6 @@ _TEST_FILES = test_acid3_test46.html \ test_bug365932.html \ test_bug372770.html \ test_bug373293.html \ - test_bug373875.html \ test_bug377947.html \ test_bug379440.html \ test_bug379741.html \ diff --git a/layout/style/test/test_bug373875.html b/layout/style/test/test_bug373875.html deleted file mode 100644 index 410dc2a019ee..000000000000 --- a/layout/style/test/test_bug373875.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - Test for Bug 373875 - - - - - -Mozilla Bug 373875 -

- -
-
-
- - From ed617caa42e019f4d973670f909faf063a0e8d00 Mon Sep 17 00:00:00 2001 From: "L. David Baron" Date: Tue, 23 Dec 2008 09:06:59 -0500 Subject: [PATCH 78/98] Readd test for computed style for large integers (even though patch was backed out). (Bug 470769) r+sr=bzbarsky --- layout/style/test/Makefile.in | 1 + layout/style/test/test_bug470769.html | 32 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 layout/style/test/test_bug470769.html diff --git a/layout/style/test/Makefile.in b/layout/style/test/Makefile.in index 8e4eb327920d..556de3ba0b2d 100644 --- a/layout/style/test/Makefile.in +++ b/layout/style/test/Makefile.in @@ -98,6 +98,7 @@ _TEST_FILES = test_acid3_test46.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 \ diff --git a/layout/style/test/test_bug470769.html b/layout/style/test/test_bug470769.html new file mode 100644 index 000000000000..103fec9fcc13 --- /dev/null +++ b/layout/style/test/test_bug470769.html @@ -0,0 +1,32 @@ + + + + + Test for Bug 470769 + + + + + +Mozilla Bug 470769 +

+ +
+
+
+ + From 4a238ad91968dbf6276f370d431477c19111b4f7 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Tue, 23 Dec 2008 20:31:30 -0500 Subject: [PATCH 79/98] Bug 468160 - Add test that does a redirect to a PNG inside an tag. Our Mochitest framework will test for leaks for us. --- modules/libpr0n/test/mochitest/Makefile.in | 3 ++ modules/libpr0n/test/mochitest/bug468160.sjs | 6 ++++ modules/libpr0n/test/mochitest/red.png | Bin 0 -> 82 bytes .../test/mochitest/test_bug468160.html | 30 ++++++++++++++++++ 4 files changed, 39 insertions(+) create mode 100644 modules/libpr0n/test/mochitest/bug468160.sjs create mode 100644 modules/libpr0n/test/mochitest/red.png create mode 100644 modules/libpr0n/test/mochitest/test_bug468160.html diff --git a/modules/libpr0n/test/mochitest/Makefile.in b/modules/libpr0n/test/mochitest/Makefile.in index 55e1af84b406..a49a2a9a3637 100644 --- a/modules/libpr0n/test/mochitest/Makefile.in +++ b/modules/libpr0n/test/mochitest/Makefile.in @@ -46,6 +46,9 @@ include $(topsrcdir)/config/rules.mk _TEST_FILES = test_bug399925.html \ bug399925.gif \ + bug468160.sjs \ + test_bug468160.html \ + red.png \ $(NULL) libs:: $(_TEST_FILES) diff --git a/modules/libpr0n/test/mochitest/bug468160.sjs b/modules/libpr0n/test/mochitest/bug468160.sjs new file mode 100644 index 000000000000..4a654216a57d --- /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); +} diff --git a/modules/libpr0n/test/mochitest/red.png b/modules/libpr0n/test/mochitest/red.png new file mode 100644 index 0000000000000000000000000000000000000000..aa9ce252631ec850b02009a4a2fe9dd5e79cf09f GIT binary patch literal 82 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2s6ii6yp7}lMWc?sn3c)B=-a9mIR casB`U12ZEdgT&q54M1@QPgg&ebxsLQ0F+!45&!@I literal 0 HcmV?d00001 diff --git a/modules/libpr0n/test/mochitest/test_bug468160.html b/modules/libpr0n/test/mochitest/test_bug468160.html new file mode 100644 index 000000000000..331406e782fc --- /dev/null +++ b/modules/libpr0n/test/mochitest/test_bug468160.html @@ -0,0 +1,30 @@ + + + + + Test for Bug 468160 + + + + + +Mozilla Bug 468160 +

+ +
+
+
+ + From 04d8cbf6b12a22012b3dc9242700b98de1d2d479 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Tue, 23 Dec 2008 20:31:30 -0500 Subject: [PATCH 80/98] Keep track of the URI we're keyed on in imgRequests. This makes it possible to avoid leaks. b=468160 r=bzbarsky sr=vlad --- modules/libpr0n/src/imgLoader.cpp | 12 ++++++------ modules/libpr0n/src/imgRequest.cpp | 22 ++++++++++++++++++---- modules/libpr0n/src/imgRequest.h | 5 +++++ 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/modules/libpr0n/src/imgLoader.cpp b/modules/libpr0n/src/imgLoader.cpp index 3f68b48b9e65..d5a070141957 100644 --- a/modules/libpr0n/src/imgLoader.cpp +++ b/modules/libpr0n/src/imgLoader.cpp @@ -255,7 +255,7 @@ void imgCacheEntry::TouchWithSize(PRInt32 diff) if (!Evicted()) { nsCOMPtr uri; - mRequest->GetURI(getter_AddRefs(uri)); + mRequest->GetKeyURI(getter_AddRefs(uri)); imgLoader::CacheEntriesChanged(uri, diff); } } @@ -269,7 +269,7 @@ void imgCacheEntry::Touch(PRBool updateTime /* = PR_TRUE */) if (!Evicted()) { nsCOMPtr uri; - mRequest->GetURI(getter_AddRefs(uri)); + mRequest->GetKeyURI(getter_AddRefs(uri)); imgLoader::CacheEntriesChanged(uri); } } @@ -909,7 +909,7 @@ PRBool imgLoader::RemoveFromCache(imgCacheEntry *entry) nsRefPtr request(getter_AddRefs(entry->GetRequest())); if (request) { nsCOMPtr key; - if (NS_SUCCEEDED(request->GetURI(getter_AddRefs(key))) && key) + if (NS_SUCCEEDED(request->GetKeyURI(getter_AddRefs(key))) && key) ret = RemoveFromCache(key); } @@ -1061,7 +1061,7 @@ NS_IMETHODIMP imgLoader::LoadImage(nsIURI *aURI, newChannel->SetLoadGroup(loadGroup); void *cacheId = NS_GetCurrentThread(); - request->Init(aURI, loadGroup, newChannel, entry, cacheId, aCX); + request->Init(aURI, aURI, loadGroup, newChannel, entry, cacheId, aCX); // create the proxy listener ProxyListener *pl = new ProxyListener(static_cast(request.get())); @@ -1198,7 +1198,7 @@ NS_IMETHODIMP imgLoader::LoadImageWithChannel(nsIChannel *channel, imgIDecoderOb // We use originalURI here to fulfil the imgIRequest contract on GetURI. nsCOMPtr originalURI; channel->GetOriginalURI(getter_AddRefs(originalURI)); - request->Init(originalURI, channel, channel, entry, NS_GetCurrentThread(), aCX); + request->Init(originalURI, uri, channel, channel, entry, NS_GetCurrentThread(), aCX); ProxyListener *pl = new ProxyListener(static_cast(request.get())); if (!pl) @@ -1471,7 +1471,7 @@ NS_IMETHODIMP imgCacheValidator::OnStartRequest(nsIRequest *aRequest, nsISupport // We use originalURI here to fulfil the imgIRequest contract on GetURI. nsCOMPtr originalURI; channel->GetOriginalURI(getter_AddRefs(originalURI)); - request->Init(originalURI, channel, channel, entry, NS_GetCurrentThread(), mContext); + request->Init(originalURI, uri, channel, channel, entry, NS_GetCurrentThread(), mContext); ProxyListener *pl = new ProxyListener(static_cast(request)); if (!pl) { diff --git a/modules/libpr0n/src/imgRequest.cpp b/modules/libpr0n/src/imgRequest.cpp index 3809c99017f1..db652dfbb065 100644 --- a/modules/libpr0n/src/imgRequest.cpp +++ b/modules/libpr0n/src/imgRequest.cpp @@ -96,6 +96,7 @@ imgRequest::~imgRequest() } nsresult imgRequest::Init(nsIURI *aURI, + nsIURI *aKeyURI, nsIRequest *aRequest, nsIChannel *aChannel, imgCacheEntry *aCacheEntry, @@ -114,6 +115,7 @@ nsresult imgRequest::Init(nsIURI *aURI, return NS_ERROR_OUT_OF_MEMORY; mURI = aURI; + mKeyURI = aKeyURI; mRequest = aRequest; mChannel = aChannel; mChannel->GetNotificationCallbacks(getter_AddRefs(mPrevChannelSink)); @@ -336,6 +338,19 @@ nsresult imgRequest::GetURI(nsIURI **aURI) 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"); @@ -1024,12 +1039,11 @@ imgRequest::OnChannelRedirect(nsIChannel *oldChannel, nsIChannel *newChannel, PR mChannel = newChannel; - nsCOMPtr uri; - newChannel->GetOriginalURI(getter_AddRefs(uri)); + newChannel->GetOriginalURI(getter_AddRefs(mKeyURI)); // If we don't still have a cache entry, we don't want to refresh the cache. - if (uri && mCacheEntry) - imgLoader::PutIntoCache(uri, mCacheEntry); + if (mKeyURI && mCacheEntry) + imgLoader::PutIntoCache(mKeyURI, mCacheEntry); return rv; } diff --git a/modules/libpr0n/src/imgRequest.h b/modules/libpr0n/src/imgRequest.h index e4dbcf17cfa1..cc1b5d55d965 100644 --- a/modules/libpr0n/src/imgRequest.h +++ b/modules/libpr0n/src/imgRequest.h @@ -89,6 +89,7 @@ public: NS_DECL_ISUPPORTS nsresult Init(nsIURI *aURI, + nsIURI *aKeyURI, nsIRequest *aRequest, nsIChannel *aChannel, imgCacheEntry *aCacheEntry, @@ -132,6 +133,7 @@ private: 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(); @@ -165,7 +167,10 @@ public: private: nsCOMPtr mRequest; + // The original URI we were loaded with. nsCOMPtr mURI; + // The URI we are keyed on in the cache. + nsCOMPtr mKeyURI; nsCOMPtr mPrincipal; nsCOMPtr mImage; nsCOMPtr mDecoder; From 0a934b0b6c17cb8ba5526bc6d24dab84291e285c Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Tue, 23 Dec 2008 22:26:41 -0500 Subject: [PATCH 81/98] Bug 455508 - Double the image cache size to see if that has a material effect on fast Tp as theorized. CLOSED TREE for perf numbers. --- modules/libpref/src/init/all.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 8d5ffafd83cd..e18f74f6f173 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -2668,7 +2668,7 @@ pref("toolkit.zoomManager.zoomValues", ".3,.5,.67,.8,.9,1,1.1,1.2,1.33,1.5,1.7,2 // Image cache prefs // The maximum size, in bytes, of the decoded images we cache -pref("image.cache.size", 5242880); +pref("image.cache.size", 10485760); // A weight, from 0-1000, to place on time when comparing to size. // Size is given a weight of 1000 - timeweight. pref("image.cache.timeweight", 500); From 0cbe7ceebd2611e3926e274edfaa4650a75d4590 Mon Sep 17 00:00:00 2001 From: John Daggett Date: Wed, 24 Dec 2008 12:57:25 +0900 Subject: [PATCH 82/98] add valid EOT font and note describing reftest font directory contents --- layout/reftests/fonts/README | 18 ++++++++++++++++++ layout/reftests/fonts/markB.eot | Bin 0 -> 1692 bytes 2 files changed, 18 insertions(+) create mode 100755 layout/reftests/fonts/README create mode 100755 layout/reftests/fonts/markB.eot diff --git a/layout/reftests/fonts/README b/layout/reftests/fonts/README new file mode 100755 index 000000000000..d8825c8091a0 --- /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). diff --git a/layout/reftests/fonts/markB.eot b/layout/reftests/fonts/markB.eot new file mode 100755 index 0000000000000000000000000000000000000000..fc6334e70d432d2bf3c9757bcac54b95f3b3f987 GIT binary patch literal 1692 zcmd5-O=w$35dQZ4$co)2aY@L7_Ql~P@#%VHhdSiU}LUSx?H|+Z|fhx-K2Et;-!Pk`;fg&{tu2~^{bvn%31+zhkB>scRPatEx~b}tcdQe3dxKvw!~K7u{)9Oj&zGLqxqtOg;VCBUEz0qCKGPo2 z)L_kBwjPjA#@9siwDw@IhASoxaF>lGS+d(4BXM{IJT04Curji9$QX%oH&q|Jed~K; z{mzi8C&((!-pd8E(kvN%=H@@E;T(!6+Io=36|S!B&7nsrnJ1och(63*JVDA$Z%2|GCcOF!Mz^>xfZE@#rV4 zRYr0QnRSJeg^e)>+qw0GyII(HCuyJ8;#(7`r&EPRBSw`6bB`N8Y3J97C)yj-?n|%IUv#xVSi`^$Lt0JzGug^6B z(IPM#c2=UG(d_AT^|;P?US5~O>p`pK>)9~sgpuD1Le3jKaD;xeP!vg>r4jHjEc9}{ z7A%pLjMbi@5xuJ$pEC4GHN|?Vs`C&)s>+jwxKLX?W literal 0 HcmV?d00001 From 0e2831b69d43c8f243b4aa2a8a439397e4afa605 Mon Sep 17 00:00:00 2001 From: Joe Drew Date: Tue, 23 Dec 2008 23:17:31 -0500 Subject: [PATCH 83/98] Bug 455508 - Revert experimental change. --- modules/libpref/src/init/all.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index e18f74f6f173..8d5ffafd83cd 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -2668,7 +2668,7 @@ pref("toolkit.zoomManager.zoomValues", ".3,.5,.67,.8,.9,1,1.1,1.2,1.33,1.5,1.7,2 // Image cache prefs // The maximum size, in bytes, of the decoded images we cache -pref("image.cache.size", 10485760); +pref("image.cache.size", 5242880); // A weight, from 0-1000, to place on time when comparing to size. // Size is given a weight of 1000 - timeweight. pref("image.cache.timeweight", 500); From 34ee3ec6309e8ab1133fb2162150b5dde59bd1d6 Mon Sep 17 00:00:00 2001 From: Ben Hearsum Date: Wed, 24 Dec 2008 09:05:00 -0500 Subject: [PATCH 84/98] bug 455578: create a post-upload script on stage to do release-to-dated, etc. - upload.py fixes and enhancements. r=ted --- build/upload.py | 45 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/build/upload.py b/build/upload.py index d7ea1afbed42..d6f039cf5438 100644 --- a/build/upload.py +++ b/build/upload.py @@ -57,6 +57,7 @@ import sys, os from optparse import OptionParser +from subprocess import Popen, PIPE from util import check_call def RequireEnvironmentVariable(v): @@ -104,7 +105,10 @@ def AppendOptionalArgsToSSHCommandline(cmdline, port, ssh_key): 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 @@ -112,7 +116,12 @@ def DoSSHCommand(command, user, host, port=None, ssh_key=None): 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 @@ -135,13 +144,19 @@ def GetRemotePath(path, local_file, base_path): 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: @@ -163,20 +178,28 @@ def UploadFiles(user, host, path, files, verbose=False, port=None, ssh_key=None, 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) @@ -190,10 +213,10 @@ if __name__ == '__main__': 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 - From ab629e5d03a114304a2a2715ce2bc6a25bd51051 Mon Sep 17 00:00:00 2001 From: Ben Hearsum Date: Wed, 24 Dec 2008 09:08:08 -0500 Subject: [PATCH 85/98] bug 464154: l10n-for-releases fixes, l10n-upload-% target. r=pike,ted --- browser/locales/Makefile.in | 22 ++++++++++++++++------ toolkit/mozapps/installer/package-name.mk | 7 ++++++- toolkit/mozapps/installer/packager.mk | 2 -- tools/update-packaging/Makefile.in | 2 +- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in index c230cb2ac6af..f08c7b20b355 100644 --- a/browser/locales/Makefile.in +++ b/browser/locales/Makefile.in @@ -84,11 +84,12 @@ 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) \ @@ -240,7 +241,6 @@ endif 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 @@ -250,7 +250,7 @@ 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 @@ -318,7 +318,6 @@ endif $(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) @@ -425,6 +424,17 @@ 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) diff --git a/toolkit/mozapps/installer/package-name.mk b/toolkit/mozapps/installer/package-name.mk index f1f5048337ee..892294957720 100644 --- a/toolkit/mozapps/installer/package-name.mk +++ b/toolkit/mozapps/installer/package-name.mk @@ -87,6 +87,7 @@ 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 @@ -100,8 +101,10 @@ 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 = @@ -136,8 +139,10 @@ 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/ diff --git a/toolkit/mozapps/installer/packager.mk b/toolkit/mozapps/installer/packager.mk index 54e9138ab7b8..12ffd79df0cf 100644 --- a/toolkit/mozapps/installer/packager.mk +++ b/toolkit/mozapps/installer/packager.mk @@ -74,8 +74,6 @@ 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) diff --git a/tools/update-packaging/Makefile.in b/tools/update-packaging/Makefile.in index 69821698a624..4c57f831db60 100644 --- a/tools/update-packaging/Makefile.in +++ b/tools/update-packaging/Makefile.in @@ -64,7 +64,7 @@ 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) From 46dc3bd990f50a0e56ac223eb9cde8dd41f4fdf1 Mon Sep 17 00:00:00 2001 From: Ben Hearsum Date: Wed, 24 Dec 2008 09:41:52 -0500 Subject: [PATCH 86/98] Bustage fix for redness --- browser/locales/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in index f08c7b20b355..b230a9c46671 100644 --- a/browser/locales/Makefile.in +++ b/browser/locales/Makefile.in @@ -428,7 +428,7 @@ 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); \ + $(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)" From ac0cef519c3e42a3e179f6fd13874b6bba679852 Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Wed, 24 Dec 2008 14:04:43 -0500 Subject: [PATCH 87/98] bug 469814 - Nightly mac builds contain .dSYM bundles. do some better cleanup when building symbols. r=bsmedberg --- toolkit/crashreporter/tools/symbolstore.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/toolkit/crashreporter/tools/symbolstore.py b/toolkit/crashreporter/tools/symbolstore.py index 937e4d872df4..f60915c2f9c2 100755 --- a/toolkit/crashreporter/tools/symbolstore.py +++ b/toolkit/crashreporter/tools/symbolstore.py @@ -691,7 +691,10 @@ class Dumper_Mac(Dumper): # 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(): From 4b9a084bf4032ab567ad15b7827c1da34e9b54b0 Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Wed, 24 Dec 2008 14:04:43 -0500 Subject: [PATCH 88/98] bug 467862 - Build system should support building both a static and a shared library from the same Makefile. r=bsmedberg --- config/config.mk | 14 ++++++++++++++ config/rules.mk | 37 +++++++++++++++---------------------- js/src/config/config.mk | 14 ++++++++++++++ js/src/config/rules.mk | 37 +++++++++++++++---------------------- 4 files changed, 58 insertions(+), 44 deletions(-) diff --git a/config/config.mk b/config/config.mk index 9a222eacdf73..910032530147 100644 --- a/config/config.mk +++ b/config/config.mk @@ -73,6 +73,8 @@ CHECK_VARS := \ SHORT_LIBNAME \ XPI_PKGNAME \ INSTALL_EXTENSION_ID \ + SHARED_LIBRARY_NAME \ + STATIC_LIBRARY_NAME \ $(NULL) # checks for internal spaces or trailing spaces in the variable @@ -359,6 +361,18 @@ 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 diff --git a/config/rules.mk b/config/rules.mk index 5e6b589add1c..1d5b7443da1e 100644 --- a/config/rules.mk +++ b/config/rules.mk @@ -219,15 +219,15 @@ endif # ENABLE_TESTS # ifndef LIBRARY -ifdef LIBRARY_NAME +ifdef STATIC_LIBRARY_NAME ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH))) ifdef SHORT_LIBNAME -LIBRARY_NAME := $(SHORT_LIBNAME) -endif -endif -LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(LIB_SUFFIX) +STATIC_LIBRARY_NAME := $(SHORT_LIBNAME) endif endif +LIBRARY := $(LIB_PREFIX)$(STATIC_LIBRARY_NAME).$(LIB_SUFFIX) +endif # STATIC_LIBRARY_NAME +endif # LIBRARY ifndef HOST_LIBRARY ifdef HOST_LIBRARY_NAME @@ -244,9 +244,9 @@ 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) @@ -254,7 +254,7 @@ 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 @@ -319,8 +319,8 @@ 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 @@ -333,15 +333,8 @@ 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 @@ -841,13 +834,13 @@ 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 @@ -1183,7 +1176,7 @@ 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 >> $@ diff --git a/js/src/config/config.mk b/js/src/config/config.mk index 9a222eacdf73..910032530147 100644 --- a/js/src/config/config.mk +++ b/js/src/config/config.mk @@ -73,6 +73,8 @@ CHECK_VARS := \ SHORT_LIBNAME \ XPI_PKGNAME \ INSTALL_EXTENSION_ID \ + SHARED_LIBRARY_NAME \ + STATIC_LIBRARY_NAME \ $(NULL) # checks for internal spaces or trailing spaces in the variable @@ -359,6 +361,18 @@ 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 diff --git a/js/src/config/rules.mk b/js/src/config/rules.mk index 5e6b589add1c..1d5b7443da1e 100644 --- a/js/src/config/rules.mk +++ b/js/src/config/rules.mk @@ -219,15 +219,15 @@ endif # ENABLE_TESTS # ifndef LIBRARY -ifdef LIBRARY_NAME +ifdef STATIC_LIBRARY_NAME ifneq (,$(filter OS2 WINNT WINCE,$(OS_ARCH))) ifdef SHORT_LIBNAME -LIBRARY_NAME := $(SHORT_LIBNAME) -endif -endif -LIBRARY := $(LIB_PREFIX)$(LIBRARY_NAME).$(LIB_SUFFIX) +STATIC_LIBRARY_NAME := $(SHORT_LIBNAME) endif endif +LIBRARY := $(LIB_PREFIX)$(STATIC_LIBRARY_NAME).$(LIB_SUFFIX) +endif # STATIC_LIBRARY_NAME +endif # LIBRARY ifndef HOST_LIBRARY ifdef HOST_LIBRARY_NAME @@ -244,9 +244,9 @@ 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) @@ -254,7 +254,7 @@ 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 @@ -319,8 +319,8 @@ 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 @@ -333,15 +333,8 @@ 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 @@ -841,13 +834,13 @@ 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 @@ -1183,7 +1176,7 @@ 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 >> $@ From f00a2cb27901a096bbec7070d04ecfcec1c1fcbb Mon Sep 17 00:00:00 2001 From: Ted Mielczarek Date: Wed, 3 Dec 2008 08:55:27 -0500 Subject: [PATCH 89/98] bug 462004 - JavaScript shell should provide line editing facilities. r=bsmedberg --HG-- rename : js/src/js.cpp => js/src/shell/js.cpp --- config/autoconf.mk.in | 1 - configure.in | 22 ------------- js/src/Makefile.in | 39 +++++++++++++---------- js/src/config/autoconf.mk.in | 4 ++- js/src/configure.in | 44 +++++++++++++++++--------- js/src/editline/Makefile.in | 55 +++++++++++++++++++++++++++++++++ js/src/shell/Makefile.in | 60 ++++++++++++++++++++++++++++++++++++ js/src/{ => shell}/js.cpp | 0 8 files changed, 171 insertions(+), 54 deletions(-) create mode 100644 js/src/editline/Makefile.in create mode 100644 js/src/shell/Makefile.in rename js/src/{ => shell}/js.cpp (100%) diff --git a/config/autoconf.mk.in b/config/autoconf.mk.in index 80339f290377..0444e40fbf9e 100644 --- a/config/autoconf.mk.in +++ b/config/autoconf.mk.in @@ -132,7 +132,6 @@ 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@ diff --git a/configure.in b/configure.in index ac6f2fc40210..f5a77b3c8a12 100644 --- a/configure.in +++ b/configure.in @@ -4379,7 +4379,6 @@ 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= @@ -4472,7 +4471,6 @@ basic) NECKO_SMALL_BUFFERS=1 NS_DISABLE_LOGGING=1 NS_PRINTING= - JS_STATIC_BUILD=1 ;; minimal) @@ -4520,7 +4518,6 @@ minimal) NECKO_SMALL_BUFFERS=1 NS_DISABLE_LOGGING=1 NS_PRINTING= - JS_STATIC_BUILD=1 ;; *) @@ -7187,25 +7184,6 @@ else 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 diff --git a/js/src/Makefile.in b/js/src/Makefile.in index ce3bc1e03e00..99f6492e129f 100644 --- a/js/src/Makefile.in +++ b/js/src/Makefile.in @@ -52,15 +52,18 @@ ifndef JS_MOZ_INSTALL NSDISTMODE = copy endif -MODULE = js -LIBRARY_NAME = mozjs -GRE_MODULE = 1 +ifdef JS_NATIVE_EDITLINE +DIRS += editline +endif + +# editline needs to get built before the shell +DIRS += shell + +MODULE = js +LIBRARY_NAME = mozjs +STATIC_LIBRARY_NAME = js_static +GRE_MODULE = 1 -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) LIBS = $(NSPR_LIBS) ifdef GNU_CXX @@ -100,10 +103,12 @@ endif # 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))) @@ -615,20 +620,22 @@ install:: $(INSTALLED_HEADERS) 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 diff --git a/js/src/config/autoconf.mk.in b/js/src/config/autoconf.mk.in index 43a6c700d2f2..606393e4da9b 100644 --- a/js/src/config/autoconf.mk.in +++ b/js/src/config/autoconf.mk.in @@ -106,7 +106,6 @@ 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@ @@ -269,6 +268,9 @@ 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 diff --git a/js/src/configure.in b/js/src/configure.in index 1ad90e8a3dcf..6eb44d4a1c4c 100644 --- a/js/src/configure.in +++ b/js/src/configure.in @@ -3808,7 +3808,6 @@ MOZ_ARG_HEADER(Application) BUILD_STATIC_LIBS= ENABLE_TESTS=1 MOZ_DBGRINFO_MODULES= -JS_STATIC_BUILD= dnl ======================================================== dnl = @@ -4746,23 +4745,33 @@ MOZ_ARG_ENABLE_BOOL(static, 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= ) +MOZ_ARG_ENABLE_BOOL(readline, +[ --enable-readline Link js shell to system readline library], + JS_WANT_READLINE=1, + JS_WANT_READLINE= ) -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 +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 +AC_SUBST(JS_NATIVE_EDITLINE) +AC_SUBST(EDITLINE_LIBS) dnl ======================================================== dnl = @@ -5147,11 +5156,18 @@ 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 diff --git a/js/src/editline/Makefile.in b/js/src/editline/Makefile.in new file mode 100644 index 000000000000..acf5a6ddb839 --- /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 +# +# 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 diff --git a/js/src/shell/Makefile.in b/js/src/shell/Makefile.in new file mode 100644 index 000000000000..bf59bb69b64c --- /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 +# +# 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) diff --git a/js/src/js.cpp b/js/src/shell/js.cpp similarity index 100% rename from js/src/js.cpp rename to js/src/shell/js.cpp From 86105e8f2d1c34add6195026628da07bf0547787 Mon Sep 17 00:00:00 2001 From: Michael Ventnor Date: Thu, 25 Dec 2008 00:04:06 +0100 Subject: [PATCH 90/98] Bug 430259 - Location bar auto-complete results box has no bottom border; r=rflint --- toolkit/themes/gnomestripe/global/autocomplete.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/themes/gnomestripe/global/autocomplete.css b/toolkit/themes/gnomestripe/global/autocomplete.css index de33bcab41cd..902e9e9978c3 100644 --- a/toolkit/themes/gnomestripe/global/autocomplete.css +++ b/toolkit/themes/gnomestripe/global/autocomplete.css @@ -137,7 +137,7 @@ treechildren.autocomplete-treebody::-moz-tree-cell-text(selected) { /* ::::: richlistbox autocomplete ::::: */ .autocomplete-richlistbox { - margin: 0; + margin: 1px; background-color: transparent; } From bd57071089eaa6abc49c20a2f9c658211d099bbf Mon Sep 17 00:00:00 2001 From: Tyler Date: Thu, 25 Dec 2008 00:07:41 +0100 Subject: [PATCH 91/98] Bug 470573 - Change "Remove Reports" to "Remove All Reports"; r=ted.mielczarek --- toolkit/locales/en-US/crashreporter/crashes.dtd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolkit/locales/en-US/crashreporter/crashes.dtd b/toolkit/locales/en-US/crashreporter/crashes.dtd index 23b0def9d413..3a7c19c18035 100644 --- a/toolkit/locales/en-US/crashreporter/crashes.dtd +++ b/toolkit/locales/en-US/crashreporter/crashes.dtd @@ -3,5 +3,5 @@ breakpad.reportURL must be set."> - + From 046423c4411d48c7a69af6e8ab8e054228f63124 Mon Sep 17 00:00:00 2001 From: Masatoshi Kimura Date: Thu, 25 Dec 2008 00:47:51 +0100 Subject: [PATCH 92/98] Bug 470209 - intl.charsetmenu.browser.unicode should not be included in localizable file; r=smontagu sr=dbaron --- browser/app/profile/firefox.js | 2 +- modules/libpref/src/init/all.js | 2 +- toolkit/locales/en-US/chrome/global/intl.properties | 2 -- xpfe/components/intl/nsCharsetMenu.cpp | 2 +- xulrunner/app/xulrunner.js | 2 +- 5 files changed, 4 insertions(+), 6 deletions(-) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index 91dad5fa7cbe..0d258edef5fb 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -431,7 +431,7 @@ 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"); diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 8d5ffafd83cd..5ec8aa68fe11 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -860,7 +860,7 @@ pref("intl.charsetmenu.browser.more2", "chrome://global/locale/intl.propert 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", ""); diff --git a/toolkit/locales/en-US/chrome/global/intl.properties b/toolkit/locales/en-US/chrome/global/intl.properties index c7a4014e894c..974ea7f381de 100644 --- a/toolkit/locales/en-US/chrome/global/intl.properties +++ b/toolkit/locales/en-US/chrome/global/intl.properties @@ -28,8 +28,6 @@ intl.charsetmenu.browser.more2=ISO-8859-4, ISO-8859-13, windows-1257, IBM852, IS 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 diff --git a/xpfe/components/intl/nsCharsetMenu.cpp b/xpfe/components/intl/nsCharsetMenu.cpp index 27596e5b48c4..fa6162433646 100644 --- a/xpfe/components/intl/nsCharsetMenu.cpp +++ b/xpfe/components/intl/nsCharsetMenu.cpp @@ -1294,7 +1294,7 @@ nsresult nsCharsetMenu::InitMoreSubmenus(nsCStringArray& aDecs) 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"); diff --git a/xulrunner/app/xulrunner.js b/xulrunner/app/xulrunner.js index 9a9ae9fad65b..21072ef56cbd 100644 --- a/xulrunner/app/xulrunner.js +++ b/xulrunner/app/xulrunner.js @@ -48,7 +48,7 @@ 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"); From d49d78dee25e3f0201ddc10d0fe3c435db43fc27 Mon Sep 17 00:00:00 2001 From: Atsushi Sakai Date: Thu, 25 Dec 2008 00:56:20 +0100 Subject: [PATCH 93/98] Bug 460977 - make -C browser/locales langpack-AB_CD is not compatible with --enable-chrome-format=flat; r=(bhearsum + l10n + ted.mielczarek) --- browser/locales/Makefile.in | 1 + 1 file changed, 1 insertion(+) diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in index b230a9c46671..5d4397077ea0 100644 --- a/browser/locales/Makefile.in +++ b/browser/locales/Makefile.in @@ -330,6 +330,7 @@ langpack-%: libs-% $(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 From be81a3ecf721e89297e16ed0bf05e3a86e1f8eb9 Mon Sep 17 00:00:00 2001 From: Serge Gautherie Date: Thu, 25 Dec 2008 01:06:37 +0100 Subject: [PATCH 94/98] Bug 460977 - make -C browser/locales langpack-AB_CD is not compatible with --enable-chrome-format=flat; r=(bhearsum + l10n + ted.mielczarek) [Fixing mistake during manual apply of the patch :-<] --- browser/locales/Makefile.in | 1 - 1 file changed, 1 deletion(-) diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in index 5d4397077ea0..f423884e370a 100644 --- a/browser/locales/Makefile.in +++ b/browser/locales/Makefile.in @@ -329,7 +329,6 @@ langpack-%: libs-% $(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) From b15524fc0236ccc9809fa019710630ea7ff1e708 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Wed, 24 Dec 2008 21:13:50 -0800 Subject: [PATCH 95/98] Try reenabling dom-level2-html tests to see if they're still problematic (bug 427878) --- dom/tests/mochitest/Makefile.in | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dom/tests/mochitest/Makefile.in b/dom/tests/mochitest/Makefile.in index 42f4bd3b3ca8..daa65a391115 100644 --- a/dom/tests/mochitest/Makefile.in +++ b/dom/tests/mochitest/Makefile.in @@ -46,6 +46,7 @@ DIRS += \ dom-level0 \ dom-level1-core \ dom-level2-core \ + dom-level2-html \ ajax \ bugs \ chrome \ @@ -54,9 +55,5 @@ DIRS += \ geolocation \ $(NULL) -# dom-level2-html disabled due to failures on multiple platforms -# (bug 427878) -# dom-level2-html \ - include $(topsrcdir)/config/rules.mk From 7ea86af168409da840400415babcf978aed025ba Mon Sep 17 00:00:00 2001 From: Boying Lu Date: Thu, 25 Dec 2008 12:30:21 +0100 Subject: [PATCH 96/98] Bug 469639 - failed to build firefox trunk on OpenSolaris; define HAVE_ALLOCA_H on Solaris; r=chris.double sr=roc --- media/libvorbis/README_MOZILLA | 2 ++ media/libvorbis/alloca.diff | 14 ++++++++++++++ media/libvorbis/lib/os.h | 4 ++++ media/libvorbis/update.sh | 1 + 4 files changed, 21 insertions(+) create mode 100644 media/libvorbis/alloca.diff diff --git a/media/libvorbis/README_MOZILLA b/media/libvorbis/README_MOZILLA index 04855409a2b7..f8581995d8b4 100644 --- a/media/libvorbis/README_MOZILLA +++ b/media/libvorbis/README_MOZILLA @@ -9,3 +9,5 @@ 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 + diff --git a/media/libvorbis/alloca.diff b/media/libvorbis/alloca.diff new file mode 100644 index 000000000000..6e67aff9eb32 --- /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 + + #include "misc.h" ++ ++#ifdef SOLARIS ++#define HAVE_ALLOCA_H ++#endif + + #ifndef _V_IFDEFJAIL_H_ + # define _V_IFDEFJAIL_H_ diff --git a/media/libvorbis/lib/os.h b/media/libvorbis/lib/os.h index 3c636e712a28..5bfaa7a688ca 100644 --- a/media/libvorbis/lib/os.h +++ b/media/libvorbis/lib/os.h @@ -26,6 +26,10 @@ #include "misc.h" +#ifdef SOLARIS +#define HAVE_ALLOCA_H +#endif + #ifndef _V_IFDEFJAIL_H_ # define _V_IFDEFJAIL_H_ diff --git a/media/libvorbis/update.sh b/media/libvorbis/update.sh index da8195aa0450..e3559ea39c2b 100644 --- a/media/libvorbis/update.sh +++ b/media/libvorbis/update.sh @@ -46,3 +46,4 @@ cp $1/todo.txt ./todo.txt cp $1/COPYING ./COPYING cp $1/README ./README cp $1/AUTHORS ./AUTHORS +patch -p3 < ./alloca.diff From dcbaa5986c476d2a39284b3aff4dd8f2ce80ea00 Mon Sep 17 00:00:00 2001 From: Justin Dolske Date: Thu, 25 Dec 2008 12:29:50 -0800 Subject: [PATCH 97/98] Disabled failing test -- Bug 471139 - mochitest failure in test_HTMLDocument12.html --- dom/tests/mochitest/dom-level2-html/Makefile.in | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dom/tests/mochitest/dom-level2-html/Makefile.in b/dom/tests/mochitest/dom-level2-html/Makefile.in index 7ba5d730a4c1..b101987f3eaf 100644 --- a/dom/tests/mochitest/dom-level2-html/Makefile.in +++ b/dom/tests/mochitest/dom-level2-html/Makefile.in @@ -134,6 +134,9 @@ _TEST_FILES_A = \ 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 \ @@ -148,7 +151,6 @@ _TEST_FILES_B = \ test_HTMLDocument09.html \ test_HTMLDocument10.html \ test_HTMLDocument11.html \ - test_HTMLDocument12.html \ test_HTMLDocument13.html \ test_HTMLDocument14.html \ test_HTMLDocument15.html \ From 27166ccdbfb8f1a36e11694408666b8b2f81bc11 Mon Sep 17 00:00:00 2001 From: Jesse Ruderman Date: Fri, 26 Dec 2008 00:15:48 +0100 Subject: [PATCH 98/98] Tests for bug 435529 and bug 436823. --- layout/generic/crashtests/435529.html | 20 ++++++++++++++++++++ layout/generic/crashtests/436823.html | 10 ++++++++++ layout/generic/crashtests/crashtests.list | 2 ++ 3 files changed, 32 insertions(+) create mode 100644 layout/generic/crashtests/435529.html create mode 100644 layout/generic/crashtests/436823.html diff --git a/layout/generic/crashtests/435529.html b/layout/generic/crashtests/435529.html new file mode 100644 index 000000000000..736e3377cb13 --- /dev/null +++ b/layout/generic/crashtests/435529.html @@ -0,0 +1,20 @@ + + + + + + +
AB
+ + diff --git a/layout/generic/crashtests/436823.html b/layout/generic/crashtests/436823.html new file mode 100644 index 000000000000..aa6caeff1541 --- /dev/null +++ b/layout/generic/crashtests/436823.html @@ -0,0 +1,10 @@ + + + + + + +
A B
+ + + diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 27e2217195d9..d7913f87ac41 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -154,6 +154,8 @@ 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