1
0
MozillaThunderbird/thunderbird-2.0.0.14-backports.patch

3216 lines
105 KiB
Diff

=== modified file 'content/base/src/nsDOMParser.cpp'
--- content/base/src/nsDOMParser.cpp 2008-05-29 16:56:50 +0000
+++ content/base/src/nsDOMParser.cpp 2008-05-30 15:07:38 +0000
@@ -66,6 +66,7 @@
#include "nsStreamUtils.h"
#include "nsNetCID.h"
#include "nsContentUtils.h"
+#include "nsPIDOMWindow.h"
static NS_DEFINE_IID(kEventQueueServiceCID, NS_EVENTQUEUESERVICE_CID);
@@ -348,6 +349,7 @@
NS_INTERFACE_MAP_ENTRY(nsIDOMParser)
NS_INTERFACE_MAP_ENTRY(nsIDOMLoadListener)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
+ NS_INTERFACE_MAP_ENTRY(nsIJSNativeInitializer_MOZILLA_1_8_BRANCH)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(DOMParser)
NS_INTERFACE_MAP_END
@@ -503,35 +505,45 @@
// Try to find a base URI for the document we're creating.
nsCOMPtr<nsIURI> baseURI;
-
- nsCOMPtr<nsIXPCNativeCallContext> cc;
- nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
- if(NS_SUCCEEDED(rv)) {
- rv = xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
- }
-
nsCOMPtr<nsIDOMDocument> contextDoc;
- if (NS_SUCCEEDED(rv) && cc) {
- JSContext* cx;
- rv = cc->GetJSContext(&cx);
- if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
-
- nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx);
- if (scriptContext) {
- nsCOMPtr<nsIDOMWindow> window =
- do_QueryInterface(scriptContext->GetGlobalObject());
-
- if (window) {
- window->GetDocument(getter_AddRefs(contextDoc));
-
- nsCOMPtr<nsIDocument> doc = do_QueryInterface(contextDoc);
- if (doc) {
- baseURI = doc->GetBaseURI();
+ if (mOwner) {
+ nsCOMPtr<nsPIDOMWindow> win = do_QueryReferent(mOwner);
+ NS_ENSURE_STATE(win);
+ nsPIDOMWindow* outer = win->GetOuterWindow();
+ NS_ENSURE_STATE(outer && outer->GetCurrentInnerWindow() == win);
+ nsCOMPtr<nsIDOMWindow> window = do_QueryInterface(win);
+ if (window) {
+ window->GetDocument(getter_AddRefs(contextDoc));
+ }
+ } else {
+ nsCOMPtr<nsIXPCNativeCallContext> cc;
+ nsCOMPtr<nsIXPConnect> xpc(do_GetService(nsIXPConnect::GetCID(), &rv));
+ if(NS_SUCCEEDED(rv)) {
+ rv = xpc->GetCurrentNativeCallContext(getter_AddRefs(cc));
+ }
+
+ if (NS_SUCCEEDED(rv) && cc) {
+ JSContext* cx;
+ rv = cc->GetJSContext(&cx);
+ if (NS_FAILED(rv)) return NS_ERROR_FAILURE;
+
+ nsIScriptContext *scriptContext = GetScriptContextFromJSContext(cx);
+ if (scriptContext) {
+ nsCOMPtr<nsIDOMWindow> window =
+ do_QueryInterface(scriptContext->GetGlobalObject());
+
+ if (window) {
+ window->GetDocument(getter_AddRefs(contextDoc));
}
}
}
}
+ nsCOMPtr<nsIDocument> doc = do_QueryInterface(contextDoc);
+ if (doc) {
+ baseURI = doc->GetBaseURI();
+ }
+
if (!baseURI) {
// No URI from script environment (we are running from command line, for example).
// Create a dummy one.
@@ -688,3 +700,11 @@
return NS_OK;
}
+
+NS_IMETHODIMP
+nsDOMParser::Initialize(nsISupports* aOwner, JSContext* cx, JSObject* obj,
+ PRUint32 argc, jsval *argv)
+{
+ mOwner = do_GetWeakReference(aOwner);
+ return NS_OK;
+}
=== modified file 'content/base/src/nsDOMParser.h'
--- content/base/src/nsDOMParser.h 2008-05-29 16:56:50 +0000
+++ content/base/src/nsDOMParser.h 2008-05-30 15:07:38 +0000
@@ -44,10 +44,13 @@
#include "nsIEventQueueService.h"
#include "nsIDOMLoadListener.h"
#include "nsWeakReference.h"
+#include "nsWeakPtr.h"
+#include "nsIJSNativeInitializer.h"
class nsDOMParser : public nsIDOMParser,
public nsIDOMLoadListener,
- public nsSupportsWeakReference
+ public nsSupportsWeakReference,
+ public nsIJSNativeInitializer_MOZILLA_1_8_BRANCH
{
public:
nsDOMParser();
@@ -68,10 +71,14 @@
NS_IMETHOD Abort(nsIDOMEvent* aEvent);
NS_IMETHOD Error(nsIDOMEvent* aEvent);
+ // nsIJSNativeInitializer_MOZILLA_1_8_BRANCH
+ NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* cx, JSObject* obj,
+ PRUint32 argc, jsval* argv);
private:
nsCOMPtr<nsIURI> mBaseURI;
nsCOMPtr<nsIEventQueueService> mEventQService;
PRBool mLoopingForSyncLoad;
+ nsWeakPtr mOwner;
};
#endif
=== modified file 'content/base/src/nsXMLHttpRequest.cpp'
--- content/base/src/nsXMLHttpRequest.cpp 2008-05-29 16:56:50 +0000
+++ content/base/src/nsXMLHttpRequest.cpp 2008-05-30 15:07:38 +0000
@@ -83,6 +83,7 @@
#include "nsContentPolicyUtils.h"
#include "nsContentErrors.h"
#include "nsLayoutStatics.h"
+#include "nsIScriptObjectPrincipal.h"
static const char* kLoadAsData = "loadAsData";
#define LOADSTR NS_LITERAL_STRING("load")
@@ -222,25 +223,66 @@
count);
}
-
-static nsIScriptContext *
-GetCurrentContext()
+nsresult
+nsXMLHttpRequest::Init()
{
+ // Set the original mScriptContext and mPrincipal, if available.
// Get JSContext from stack.
nsCOMPtr<nsIJSContextStack> stack =
do_GetService("@mozilla.org/js/xpc/ContextStack;1");
if (!stack) {
- return nsnull;
+ return NS_OK;
}
JSContext *cx;
if (NS_FAILED(stack->Peek(&cx)) || !cx) {
- return nsnull;
- }
-
- return GetScriptContextFromJSContext(cx);
+ return NS_OK;
+ }
+
+ nsIScriptContext* context = GetScriptContextFromJSContext(cx);
+ if (!context) {
+ return NS_OK;
+ }
+ nsIScriptSecurityManager *secMan = nsContentUtils::GetSecurityManager();
+ nsCOMPtr<nsIPrincipal> subjectPrincipal;
+ if (secMan) {
+ secMan->GetSubjectPrincipal(getter_AddRefs(subjectPrincipal));
+ }
+ NS_ENSURE_STATE(subjectPrincipal);
+
+ mScriptContext = context;
+ mPrincipal = subjectPrincipal;
+ nsCOMPtr<nsPIDOMWindow> window =
+ do_QueryInterface(context->GetGlobalObject());
+ if (window) {
+ mOwner = do_GetWeakReference(window->GetCurrentInnerWindow());
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsXMLHttpRequest::Initialize(nsISupports* aOwner, JSContext* cx, JSObject* obj,
+ PRUint32 argc, jsval *argv)
+{
+ mOwner = do_GetWeakReference(aOwner);
+ if (!mOwner) {
+ NS_WARNING("Unexpected nsIJSNativeInitializer owner");
+ return NS_OK;
+ }
+
+ // This XHR object is bound to a |window|,
+ // so re-set principal and script context.
+ nsCOMPtr<nsIScriptObjectPrincipal> scriptPrincipal = do_QueryInterface(aOwner);
+ NS_ENSURE_STATE(scriptPrincipal);
+ mPrincipal = scriptPrincipal->GetPrincipal();
+ nsCOMPtr<nsIScriptGlobalObject> sgo = do_QueryInterface(aOwner);
+ NS_ENSURE_STATE(sgo);
+ mScriptContext = sgo->GetContext();
+ NS_ENSURE_STATE(mScriptContext);
+ return NS_OK;
}
/**
@@ -311,6 +353,7 @@
NS_INTERFACE_MAP_ENTRY(nsIInterfaceRequestor)
NS_INTERFACE_MAP_ENTRY(nsIDOMGCParticipant)
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
+ NS_INTERFACE_MAP_ENTRY(nsIJSNativeInitializer_MOZILLA_1_8_BRANCH)
NS_INTERFACE_MAP_ENTRY_CONTENT_CLASSINFO(XMLHttpRequest)
NS_INTERFACE_MAP_END
@@ -344,8 +387,6 @@
holder->Set(listener, this);
array->AppendElement(holder);
- mScriptContext = GetCurrentContext();
-
return NS_OK;
}
@@ -407,8 +448,6 @@
{
mOnReadystatechangeListener.Set(aOnreadystatechange, this);
- mScriptContext = GetCurrentContext();
-
return NS_OK;
}
@@ -429,8 +468,6 @@
{
mOnLoadListener.Set(aOnLoad, this);
- mScriptContext = GetCurrentContext();
-
return NS_OK;
}
@@ -450,8 +487,6 @@
{
mOnErrorListener.Set(aOnerror, this);
- mScriptContext = GetCurrentContext();
-
return NS_OK;
}
@@ -471,8 +506,6 @@
{
mOnProgressListener.Set(aOnprogress, this);
- mScriptContext = GetCurrentContext();
-
return NS_OK;
}
@@ -745,10 +778,6 @@
NS_ENSURE_ARG_POINTER(aLoadGroup);
*aLoadGroup = nsnull;
- if (!mScriptContext) {
- mScriptContext = GetCurrentContext();
- }
-
nsCOMPtr<nsIDocument> doc = GetDocumentFromScriptContext(mScriptContext);
if (doc) {
*aLoadGroup = doc->GetDocumentLoadGroup().get(); // already_AddRefed
@@ -761,10 +790,7 @@
nsXMLHttpRequest::GetBaseURI()
{
if (!mScriptContext) {
- mScriptContext = GetCurrentContext();
- if (!mScriptContext) {
- return nsnull;
- }
+ return nsnull;
}
nsCOMPtr<nsIDocument> doc = GetDocumentFromScriptContext(mScriptContext);
@@ -828,6 +854,10 @@
nsCOMPtr<nsIJSContextStack> stack;
JSContext *cx = nsnull;
+ if (NS_FAILED(CheckInnerWindowCorrectness())) {
+ return;
+ }
+
if (mScriptContext) {
stack = do_GetService("@mozilla.org/js/xpc/ContextStack;1");
@@ -956,8 +986,10 @@
rv = NS_NewURI(getter_AddRefs(uri), url, nsnull, GetBaseURI());
if (NS_FAILED(rv)) return rv;
- // mScriptContext should be initialized because of GetBaseURI() above.
+ // mScriptContext should be initialized because of Init()/Initialize().
// Still need to consider the case that doc is nsnull however.
+ rv = CheckInnerWindowCorrectness();
+ NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIDocument> doc = GetDocumentFromScriptContext(mScriptContext);
PRInt16 shouldLoad = nsIContentPolicy::ACCEPT;
rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_OTHER,
@@ -1478,7 +1510,8 @@
NS_IMETHODIMP
nsXMLHttpRequest::Send(nsIVariant *aBody)
{
- nsresult rv;
+ nsresult rv = CheckInnerWindowCorrectness();
+ NS_ENSURE_SUCCESS(rv, rv);
// Return error if we're already processing a request
if (XML_HTTP_REQUEST_SENT & mState) {
@@ -1502,18 +1535,11 @@
if (httpChannel) {
httpChannel->GetRequestMethod(method); // If GET, method name will be uppercase
- nsCOMPtr<nsIDocument> doc =
- do_QueryInterface(nsContentUtils::GetDocumentFromCaller());
-
- if (doc) {
- nsIPrincipal *principal = doc->GetPrincipal();
-
- if (principal) {
- nsCOMPtr<nsIURI> codebase;
- principal->GetURI(getter_AddRefs(codebase));
-
- httpChannel->SetReferrer(codebase);
- }
+ if (mPrincipal) {
+ nsCOMPtr<nsIURI> codebase;
+ mPrincipal->GetURI(getter_AddRefs(codebase));
+
+ httpChannel->SetReferrer(codebase);
}
}
@@ -1631,11 +1657,6 @@
}
}
- if (!mScriptContext) {
- // We need a context to check if redirect (if any) is allowed
- mScriptContext = GetCurrentContext();
- }
-
// Hook us up to listen to redirects and the like
mChannel->GetNotificationCallbacks(getter_AddRefs(mNotificationCallbacks));
mChannel->SetNotificationCallbacks(this);
=== modified file 'content/base/src/nsXMLHttpRequest.h'
--- content/base/src/nsXMLHttpRequest.h 2008-05-29 16:56:50 +0000
+++ content/base/src/nsXMLHttpRequest.h 2008-05-30 15:07:38 +0000
@@ -51,6 +51,7 @@
#include "nsIStreamListener.h"
#include "nsIEventQueueService.h"
#include "nsWeakReference.h"
+#include "nsWeakPtr.h"
#include "jsapi.h"
#include "nsIScriptContext.h"
#include "nsIChannelEventSink.h"
@@ -60,7 +61,8 @@
#include "nsJSUtils.h"
#include "nsTArray.h"
#include "nsIDOMGCParticipant.h"
-
+#include "nsIJSNativeInitializer.h"
+#include "nsPIDOMWindow.h"
#include "nsIDOMLSProgressEvent.h"
class nsILoadGroup;
@@ -74,7 +76,8 @@
public nsIProgressEventSink,
public nsIInterfaceRequestor,
public nsIDOMGCParticipant,
- public nsSupportsWeakReference
+ public nsSupportsWeakReference,
+ public nsIJSNativeInitializer_MOZILLA_1_8_BRANCH
{
public:
nsXMLHttpRequest();
@@ -116,6 +119,13 @@
// nsIInterfaceRequestor
NS_DECL_NSIINTERFACEREQUESTOR
+ // nsIJSNativeInitializer
+ NS_IMETHOD Initialize(nsISupports* aOwner, JSContext* cx, JSObject* obj,
+ PRUint32 argc, jsval* argv);
+
+ // This is called by the factory constructor.
+ nsresult Init();
+
// nsIDOMGCParticipant
virtual nsIDOMGCParticipant* GetSCCIndex();
virtual void AppendReachableList(nsCOMArray<nsIDOMGCParticipant>& aArray);
@@ -152,7 +162,22 @@
void ClearEventListeners();
already_AddRefed<nsIHttpChannel> GetCurrentHttpChannel();
+ nsresult CheckInnerWindowCorrectness()
+ {
+ if (mOwner) {
+ nsCOMPtr<nsPIDOMWindow> win = do_QueryReferent(mOwner);
+ NS_ENSURE_STATE(win);
+ NS_ASSERTION(win->IsInnerWindow(), "Should have inner window here!\n");
+ nsPIDOMWindow* outer = win->GetOuterWindow();
+ if (!outer || outer->GetCurrentInnerWindow() != win) {
+ return NS_ERROR_FAILURE;
+ }
+ }
+ return NS_OK;
+ }
+
nsCOMPtr<nsISupports> mContext;
+ nsCOMPtr<nsIPrincipal> mPrincipal;
nsCOMPtr<nsIChannel> mChannel;
nsCOMPtr<nsIRequest> mReadRequest;
nsCOMPtr<nsIDOMDocument> mDocument;
@@ -160,6 +185,7 @@
nsTArray<ListenerHolder*> mLoadEventListeners;
nsTArray<ListenerHolder*> mErrorEventListeners;
nsCOMPtr<nsIScriptContext> mScriptContext;
+ nsWeakPtr mOwner; // Inner window.
nsMarkedJSFunctionHolder<nsIDOMEventListener> mOnLoadListener;
nsMarkedJSFunctionHolder<nsIDOMEventListener> mOnErrorListener;
=== modified file 'content/xul/document/src/nsXULDocument.cpp'
--- content/xul/document/src/nsXULDocument.cpp 2008-05-29 16:56:50 +0000
+++ content/xul/document/src/nsXULDocument.cpp 2008-05-30 15:07:40 +0000
@@ -2883,12 +2883,10 @@
mResolutionPhase = nsForwardReference::eStart;
// Chrome documents are allowed to load overlays from anywhere.
- // Also, any document may load a chrome:// overlay.
// In all other cases, the overlay is only allowed to load if
// the master document and prototype document have the same origin.
- PRBool overlayIsChrome = IsChromeURI(aURI);
- if (!IsChromeURI(mDocumentURI) && !overlayIsChrome) {
+ if (!IsChromeURI(mDocumentURI)) {
// Make sure we're allowed to load this overlay.
rv = secMan->CheckSameOriginURI(mDocumentURI, aURI);
if (NS_FAILED(rv)) return rv;
@@ -2896,6 +2894,7 @@
// Look in the prototype cache for the prototype document with
// the specified overlay URI.
+ PRBool overlayIsChrome = IsChromeURI(aURI);
if (overlayIsChrome)
gXULCache->GetPrototype(aURI, getter_AddRefs(mCurrentPrototype));
else
@@ -3218,12 +3217,10 @@
#endif
// Chrome documents are allowed to load overlays from anywhere.
- // Also, any document may load a chrome:// overlay.
// In all other cases, the overlay is only allowed to load if
// the master document and prototype document have the same origin.
- PRBool overlayIsChrome = IsChromeURI(uri);
- if (!IsChromeURI(mDocumentURI) && !overlayIsChrome) {
+ if (!IsChromeURI(mDocumentURI)) {
// Make sure we're allowed to load this overlay.
rv = secMan->CheckSameOriginURI(mDocumentURI, uri);
if (NS_FAILED(rv)) {
@@ -3234,6 +3231,7 @@
// Look in the prototype cache for the prototype document with
// the specified overlay URI.
+ PRBool overlayIsChrome = IsChromeURI(uri);
if (overlayIsChrome)
gXULCache->GetPrototype(uri, getter_AddRefs(mCurrentPrototype));
else
=== modified file 'directory/c-sdk/config/Makefile'
--- directory/c-sdk/config/Makefile 2008-05-29 16:56:50 +0000
+++ directory/c-sdk/config/Makefile 2008-05-30 15:10:53 +0000
@@ -1,37 +1,41 @@
# Generated automatically from Makefile.in by configure.
#! gmake
#
-# 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.
-#
+# ***** 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 the Netscape Portable Runtime (NSPR).
-#
-# The Initial Developer of the Original Code is Netscape
-# Communications Corporation. Portions created by Netscape are
-# Copyright (C) 1998-2000 Netscape Communications Corporation. All
-# Rights Reserved.
-#
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-2000
+# the Initial Developer. All Rights Reserved.
+#
# Contributor(s):
-#
-# Alternatively, the contents of this file may be used under the
-# terms of the GNU General Public License Version 2 or later (the
-# "GPL"), in which case the provisions of the GPL are applicable
-# instead of those above. If you wish to allow use of your
-# version of this file only under the terms of the GPL and not to
-# allow others to use your version of this file under the MPL,
-# indicate your decision by deleting the provisions above and
-# replace them with the notice and other provisions required by
-# the GPL. If you do not delete the provisions above, a recipient
-# may use your version of this file under either the MPL or the
-# GPL.
-#
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either 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 *****
MOD_DEPTH = ..
topsrcdir = ..
@@ -98,7 +102,7 @@
ifeq ($(MOZ_OS2_TOOLS),EMX)
XCFLAGS = $(OS_EXE_CFLAGS)
-XLDOPTS = -Zomf -Zlinker /PM:VIO
+XLDOPTS = -Zomf -Zlinker -PM:VIO
endif
ifeq ($(MOZ_OS2_TOOLS),VACPP)
@@ -119,7 +123,7 @@
OUTOPTION = -o # end of the line
ifeq (,$(filter-out WINNT OS2,$(OS_ARCH)))
ifndef NS_USE_GCC
-OUTOPTION = /Fe
+OUTOPTION = -Fe
endif
endif
=== modified file 'directory/c-sdk/ldap/clients/tools/Makefile'
--- directory/c-sdk/ldap/clients/tools/Makefile 2008-05-29 16:56:50 +0000
+++ directory/c-sdk/ldap/clients/tools/Makefile 2008-05-30 15:10:53 +0000
@@ -1,25 +1,41 @@
# Generated automatically from Makefile.in by configure.
#
-# The contents of this file are subject to the Netscape 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/NPL/
-#
-# 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.
-#
+# ***** 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 Communicator client code, released
# March 31, 1998.
-#
-# The Initial Developer of the Original Code is Netscape
-# Communications Corporation. Portions created by Netscape are
-# Copyright (C) 1998-1999 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s):
-#
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-1999
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either 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 *****
MOD_DEPTH = ../../..
srcdir = .
=== modified file 'directory/c-sdk/ldap/libraries/libiutil/Makefile'
--- directory/c-sdk/ldap/libraries/libiutil/Makefile 2008-05-29 16:56:50 +0000
+++ directory/c-sdk/ldap/libraries/libiutil/Makefile 2008-05-30 15:10:54 +0000
@@ -1,25 +1,41 @@
# Generated automatically from Makefile.in by configure.
#
-# The contents of this file are subject to the Netscape 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/NPL/
-#
-# 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.
-#
+# ***** 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 Communicator client code, released
# March 31, 1998.
-#
-# The Initial Developer of the Original Code is Netscape
-# Communications Corporation. Portions created by Netscape are
-# Copyright (C) 1998-1999 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s):
-#
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-1999
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either 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 *****
MOD_DEPTH = ../../..
=== modified file 'directory/c-sdk/ldap/libraries/libldif/Makefile' (properties changed: +x to -x)
--- directory/c-sdk/ldap/libraries/libldif/Makefile 2008-05-29 16:56:50 +0000
+++ directory/c-sdk/ldap/libraries/libldif/Makefile 2008-05-30 15:10:54 +0000
@@ -1,25 +1,41 @@
# Generated automatically from Makefile.in by configure.
#
-# The contents of this file are subject to the Netscape 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/NPL/
-#
-# 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.
-#
+# ***** 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 Communicator client code, released
# March 31, 1998.
-#
-# The Initial Developer of the Original Code is Netscape
-# Communications Corporation. Portions created by Netscape are
-# Copyright (C) 1998-1999 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s):
-#
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-1999
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either 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 *****
MOD_DEPTH = ../../..
srcdir = .
=== modified file 'directory/c-sdk/ldap/libraries/libssldap/Makefile'
--- directory/c-sdk/ldap/libraries/libssldap/Makefile 2008-05-29 16:56:50 +0000
+++ directory/c-sdk/ldap/libraries/libssldap/Makefile 2008-05-30 15:10:54 +0000
@@ -1,25 +1,41 @@
# Generated automatically from Makefile.in by configure.
#
-# The contents of this file are subject to the Netscape 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/NPL/
-#
-# 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.
-#
+# ***** 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 Communicator client code, released
# March 31, 1998.
-#
-# The Initial Developer of the Original Code is Netscape
-# Communications Corporation. Portions created by Netscape are
-# Copyright (C) 1998-1999 Netscape Communications Corporation. All
-# Rights Reserved.
-#
-# Contributor(s):
-#
+#
+# The Initial Developer of the Original Code is
+# Netscape Communications Corporation.
+# Portions created by the Initial Developer are Copyright (C) 1998-1999
+# the Initial Developer. All Rights Reserved.
+#
+# Contributor(s):
+#
+# Alternatively, the contents of this file may be used under the terms of
+# either 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 *****
MOD_DEPTH = ../../..
srcdir = .
@@ -76,7 +92,7 @@
# variable definitions for exported symbols
ifeq ($(OS_ARCH), WINNT)
- SSLDAP_EXPORT_DEFS= $(srcdir)/../msdos/winsock/nsldapssl32.def
+ SSLDAP_EXPORT_DEFS= $(win_srcdir)/../msdos/winsock/nsldapssl32.def
else
SSLDAP_EXPORT_DEFS= $(SSLOBJDEST)/libldap_ssl.exp
endif
=== modified file 'dom/public/nsIJSNativeInitializer.h'
--- dom/public/nsIJSNativeInitializer.h 2008-05-29 16:56:50 +0000
+++ dom/public/nsIJSNativeInitializer.h 2008-05-30 15:07:43 +0000
@@ -64,5 +64,23 @@
PRUint32 argc, jsval *argv) = 0;
};
+#define NS_IJSNATIVEINITIALIZER_MOZILLA_1_8_BRANCH_IID \
+ { 0xa26542c9, 0xc825, 0x45e9, \
+ { 0xb3, 0xcc, 0x66, 0x87, 0x31, 0x3c, 0xf5, 0x73 } }
+
+// If an object doesn't implement this interface, but does implement
+// nsIJSNativeInitializer, nsIJSNativeInitializer::Initialize(...) is called.
+class nsIJSNativeInitializer_MOZILLA_1_8_BRANCH : public nsISupports {
+public:
+ NS_DEFINE_STATIC_IID_ACCESSOR(NS_IJSNATIVEINITIALIZER_MOZILLA_1_8_BRANCH_IID)
+
+ /**
+ * Initialize a newly created native instance using the owner of the
+ * constructor and the parameters passed into the JavaScript constructor.
+ */
+ NS_IMETHOD Initialize(nsISupports* aOwner, JSContext *cx, JSObject *obj,
+ PRUint32 argc, jsval *argv) = 0;
+};
+
#endif // nsIJSNativeInitializer_h__
=== modified file 'dom/src/base/nsDOMClassInfo.cpp'
--- dom/src/base/nsDOMClassInfo.cpp 2008-05-29 16:56:50 +0000
+++ dom/src/base/nsDOMClassInfo.cpp 2008-05-30 15:07:44 +0000
@@ -4468,7 +4468,8 @@
}
static nsresult
-BaseStubConstructor(const nsGlobalNameStruct *name_struct, JSContext *cx,
+BaseStubConstructor(nsIWeakReference* aWeakOwner,
+ const nsGlobalNameStruct *name_struct, JSContext *cx,
JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
nsresult rv;
@@ -4489,12 +4490,23 @@
return rv;
}
- nsCOMPtr<nsIJSNativeInitializer> initializer(do_QueryInterface(native));
- if (initializer) {
- rv = initializer->Initialize(cx, obj, argc, argv);
+ nsCOMPtr<nsIJSNativeInitializer_MOZILLA_1_8_BRANCH> initializer18 =
+ do_QueryInterface(native);
+ if (initializer18) {
+ nsCOMPtr<nsISupports> owner = do_QueryReferent(aWeakOwner);
+ NS_ENSURE_STATE(owner);
+ rv = initializer18->Initialize(owner, cx, obj, argc, argv);
if (NS_FAILED(rv)) {
return NS_ERROR_NOT_INITIALIZED;
}
+ } else {
+ nsCOMPtr<nsIJSNativeInitializer> initializer(do_QueryInterface(native));
+ if (initializer) {
+ rv = initializer->Initialize(cx, obj, argc, argv);
+ if (NS_FAILED(rv)) {
+ return NS_ERROR_NOT_INITIALIZED;
+ }
+ }
}
nsCOMPtr<nsIScriptObjectOwner> owner(do_QueryInterface(native));
@@ -4598,8 +4610,11 @@
class nsDOMConstructor : public nsIDOMConstructor
{
public:
- nsDOMConstructor(const PRUnichar *aName)
- : mClassName(aName)
+ nsDOMConstructor(const PRUnichar *aName,
+ nsISupports* aOwner)
+ : mClassName(aName),
+ mWeakOwner(do_GetWeakReference(aOwner))
+
{
}
@@ -4635,6 +4650,7 @@
private:
const PRUnichar *mClassName;
+ nsWeakPtr mWeakOwner;
};
NS_IMPL_ADDREF(nsDOMConstructor)
@@ -4684,7 +4700,7 @@
return NS_ERROR_DOM_NOT_SUPPORTED_ERR;
}
- return BaseStubConstructor(name_struct, cx, obj, argc, argv, vp);
+ return BaseStubConstructor(mWeakOwner, name_struct, cx, obj, argc, argv, vp);
}
nsresult
@@ -5409,7 +5425,8 @@
nsRefPtr<nsDOMConstructor> constructor =
new nsDOMConstructor(NS_REINTERPRET_CAST(PRUnichar *,
- ::JS_GetStringChars(str)));
+ ::JS_GetStringChars(str)),
+ NS_STATIC_CAST(nsPIDOMWindow*, aWin));
if (!constructor) {
return NS_ERROR_OUT_OF_MEMORY;
}
@@ -5470,7 +5487,8 @@
const PRUnichar *name = NS_REINTERPRET_CAST(PRUnichar *,
::JS_GetStringChars(str));
- nsRefPtr<nsDOMConstructor> constructor = new nsDOMConstructor(name);
+ nsRefPtr<nsDOMConstructor> constructor =
+ new nsDOMConstructor(name, NS_STATIC_CAST(nsPIDOMWindow*, aWin));
if (!constructor) {
return NS_ERROR_OUT_OF_MEMORY;
}
@@ -5686,7 +5704,8 @@
}
if (name_struct->mType == nsGlobalNameStruct::eTypeExternalConstructor) {
- nsRefPtr<nsDOMConstructor> constructor = new nsDOMConstructor(class_name);
+ nsRefPtr<nsDOMConstructor> constructor =
+ new nsDOMConstructor(class_name, NS_STATIC_CAST(nsPIDOMWindow*, aWin));
if (!constructor) {
return NS_ERROR_OUT_OF_MEMORY;
}
=== modified file 'dom/src/base/nsGlobalWindow.cpp'
--- dom/src/base/nsGlobalWindow.cpp 2008-05-29 16:56:50 +0000
+++ dom/src/base/nsGlobalWindow.cpp 2008-05-30 15:07:44 +0000
@@ -6525,8 +6525,21 @@
}
}
+ nsCOMPtr<nsIPrincipal> ourPrincipal = GetPrincipal();
+ JSPrincipals *jsprins;
+ rv = ourPrincipal->GetJSPrincipals(cx, &jsprins);
+ if (NS_FAILED(rv)) {
+ timeout->Release(scx);
+
+ return rv;
+ }
+
+ // We know that ourPrincipal holds a strong ref to jsprins.
+ JSPRINCIPALS_DROP(cx, jsprins);
+
const char *filename;
- if (nsJSUtils::GetCallingLocation(cx, &filename, &timeout->mLineNo)) {
+ if (nsJSUtils::GetCallingLocation(cx, &filename, &timeout->mLineNo,
+ jsprins)) {
timeout->mFileName = PL_strdup(filename);
if (!timeout->mFileName) {
@@ -6552,7 +6565,6 @@
}
PRBool subsumes = PR_FALSE;
- nsCOMPtr<nsIPrincipal> ourPrincipal = GetPrincipal();
// Note the direction of this test: We don't allow chrome setTimeouts on
// content windows, but we do allow content setTimeouts on chrome windows.
=== modified file 'dom/src/base/nsJSUtils.cpp'
--- dom/src/base/nsJSUtils.cpp 2008-05-29 16:56:50 +0000
+++ dom/src/base/nsJSUtils.cpp 2008-05-30 15:07:44 +0000
@@ -1,4 +1,5 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=2 sw=2 et tw=78: */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
@@ -58,11 +59,12 @@
#include "nsDOMClassInfo.h"
#include "nsIDOMGCParticipant.h"
#include "nsIWeakReference.h"
+#include "nsIScriptSecurityManager.h"
JSBool
nsJSUtils::GetCallingLocation(JSContext* aContext, const char* *aFilename,
- PRUint32 *aLineno)
+ PRUint32* aLineno, JSPrincipals* aPrincipals)
{
// Get the current filename and line number
JSStackFrame* frame = nsnull;
@@ -76,6 +78,37 @@
} while (frame && !script);
if (script) {
+ // If aPrincipals is non-null then our caller is asking us to ensure
+ // that the filename we return does not have elevated privileges.
+ if (aPrincipals) {
+ // The principals might not be in the script, but we can always
+ // find the right principals in the frame's callee.
+ JSPrincipals* scriptPrins = JS_GetScriptPrincipals(aContext, script);
+ if (!scriptPrins) {
+ JSObject *callee = JS_GetFrameCalleeObject(aContext, frame);
+ nsCOMPtr<nsIPrincipal> prin;
+ nsIScriptSecurityManager *ssm = nsContentUtils::GetSecurityManager();
+ if (NS_FAILED(ssm->GetObjectPrincipal(aContext, callee,
+ getter_AddRefs(prin))) ||
+ !prin) {
+ return JS_FALSE;
+ }
+
+ prin->GetJSPrincipals(aContext, &scriptPrins);
+
+ // The script has a reference to the principals.
+ JSPRINCIPALS_DROP(aContext, scriptPrins);
+ }
+
+ // Return the weaker of the two principals if they differ.
+ if (scriptPrins != aPrincipals &&
+ scriptPrins->subsume(scriptPrins, aPrincipals)) {
+ *aFilename = aPrincipals->codebase;
+ *aLineno = 0;
+ return JS_TRUE;
+ }
+ }
+
const char* filename = ::JS_GetScriptFilename(aContext, script);
if (filename) {
=== modified file 'dom/src/base/nsJSUtils.h'
--- dom/src/base/nsJSUtils.h 2008-05-29 16:56:50 +0000
+++ dom/src/base/nsJSUtils.h 2008-05-30 15:07:44 +0000
@@ -60,7 +60,7 @@
{
public:
static JSBool GetCallingLocation(JSContext* aContext, const char* *aFilename,
- PRUint32 *aLineno);
+ PRUint32* aLineno, JSPrincipals* aPrincipals);
static jsval ConvertStringToJSVal(const nsString& aProp,
JSContext* aContext);
=== modified file 'js/src/jsapi.c'
--- js/src/jsapi.c 2008-05-29 16:56:50 +0000
+++ js/src/jsapi.c 2008-05-30 15:08:08 +0000
@@ -1385,6 +1385,7 @@
{js_InitObjectClass, EAGER_ATOM(toString), NULL},
{js_InitObjectClass, EAGER_ATOM(toLocaleString), NULL},
{js_InitObjectClass, EAGER_ATOM(valueOf), NULL},
+ {js_InitObjectClass, EAGER_ATOM(eval), NULL},
#if JS_HAS_OBJ_WATCHPOINT
{js_InitObjectClass, LAZY_ATOM(watch), NULL},
{js_InitObjectClass, LAZY_ATOM(unwatch), NULL},
@@ -2056,7 +2057,7 @@
*idp = INT_JSVAL_TO_JSID(v);
} else {
#if JS_HAS_XML_SUPPORT
- if (JSVAL_IS_OBJECT(v)) {
+ if (!JSVAL_IS_PRIMITIVE(v)) {
*idp = OBJECT_JSVAL_TO_JSID(v);
return JS_TRUE;
}
@@ -4062,6 +4063,7 @@
JSTokenStream *ts;
JSFunction *fun;
JSAtom *funAtom, *argAtom;
+ JSTempValueRooter tvr;
uintN i;
CHECK_REQUEST(cx);
@@ -4069,7 +4071,7 @@
ts = js_NewTokenStream(cx, chars, length, filename, lineno, principals);
if (!ts) {
fun = NULL;
- goto out;
+ goto out2;
}
if (!name) {
funAtom = NULL;
@@ -4077,12 +4079,15 @@
funAtom = js_Atomize(cx, name, strlen(name), 0);
if (!funAtom) {
fun = NULL;
- goto out;
+ goto out2;
}
}
fun = js_NewFunction(cx, NULL, NULL, nargs, 0, obj, funAtom);
if (!fun)
goto out;
+
+ /* From this point the control must flow through the label out. */
+ JS_PUSH_TEMP_ROOT_FUNCTION(cx, fun, &tvr);
if (nargs) {
for (i = 0; i < nargs; i++) {
argAtom = js_Atomize(cx, argnames[i], strlen(argnames[i]), 0);
@@ -4112,7 +4117,12 @@
return NULL;
}
}
-out:
+
+ out:
+ cx->weakRoots.newborn[GCX_PRIVATE] = (JSGCThing *) fun;
+ JS_POP_TEMP_ROOT(cx, &tvr);
+
+ out2:
if (ts)
js_CloseTokenStream(cx, ts);
JS_ARENA_RELEASE(&cx->tempPool, mark);
=== modified file 'js/src/jscntxt.h'
--- js/src/jscntxt.h 2008-05-29 16:56:50 +0000
+++ js/src/jscntxt.h 2008-05-30 15:08:08 +0000
@@ -525,132 +525,88 @@
* a C function across several layers of other functions, use the
* js_LeaveLocalRootScopeWithResult internal API (see further below) instead.
*
+ * The macros also provide a simple way to get a single rooted pointer via
+ * JS_PUSH_TEMP_ROOT_<KIND>(cx, NULL, &tvr). Then &tvr.u.<kind> gives the
+ * necessary pointer.
+ *
* JSTempValueRooter.count defines the type of the rooted value referenced by
- * JSTempValueRooter.u union of type JSTempValueUnion according to the
- * following table:
- *
- * count description
- * JSTVU_SINGLE u.value contains the single value or GC-thing to root.
- * JSTVU_MARKER u.marker holds a hook that GC calls to mark the values.
- * JSTVU_SPROP u.sprop points to the property tree node to mark.
- * JSTVU_WEAK_ROOTS u.weakRoots points to saved weak roots.
- * JSTVU_SCRIPT u.script roots a pointer to JSScript.
- * >= 0 u.array points to a stack-allocated vector of jsvals.
+ * JSTempValueRooter.u union of type JSTempValueUnion. When count is positive
+ * or zero, u.array points to a vector of jsvals. Otherwise it must be one of
+ * the following constants:
*/
-#define JSTVU_SINGLE (-1)
-#define JSTVU_MARKER (-2)
-#define JSTVU_SPROP (-3)
-#define JSTVU_WEAK_ROOTS (-4)
-#define JSTVU_SCRIPT (-5)
+#define JSTVU_SINGLE (-1) /* u.value or u.<gcthing> is single jsval
+ or GC-thing */
+#define JSTVU_MARKER (-2) /* u.marker is a hook to mark a custom
+ * structure */
+#define JSTVU_SPROP (-3) /* u.sprop roots property tree node */
+#define JSTVU_WEAK_ROOTS (-4) /* u.weakRoots points to saved weak roots */
+#define JSTVU_SCRIPT (-5) /* u.script roots JSScript* */
/*
- * To root a single GC-thing pointer, which need not be tagged and stored as a
- * jsval, use JS_PUSH_TEMP_ROOT_GCTHING. The macro reinterprets an arbitrary
- * GC-thing as jsval. It works because a GC-thing is aligned on a 0 mod 8
- * boundary, and object has the 0 jsval tag. So any GC-thing may be tagged as
- * if it were an object and untagged, if it's then used only as an opaque
- * pointer until discriminated by other means than tag bits (this is how the
- * GC mark function uses its |thing| parameter -- it consults GC-thing flags
- * stored separately from the thing to decide the type of thing).
- *
- * JS_PUSH_TEMP_ROOT_OBJECT and JS_PUSH_TEMP_ROOT_STRING are type-safe
- * alternatives to JS_PUSH_TEMP_ROOT_GCTHING for JSObject and JSString. They
- * also provide a simple way to get a single pointer to rooted JSObject or
- * JSString via JS_PUSH_TEMP_ROOT_(OBJECT|STRTING)(cx, NULL, &tvr). Then
- * &tvr.u.object or tvr.u.string gives the necessary pointer, which puns
- * tvr.u.value safely because JSObject * and JSString * are GC-things and, as
- * such, their tag bits are all zeroes.
+ * Here single JSTVU_SINGLE covers both jsval and pointers to any GC-thing via
+ * reinterpreting the thing as JSVAL_OBJECT. It works because the GC-thing is
+ * aligned on a 0 mod 8 boundary, and object has the 0 jsval tag. So any
+ * GC-thing may be tagged as if it were an object and untagged, if it's then
+ * used only as an opaque pointer until discriminated by other means than tag
+ * bits. This is how, for example, js_GetGCThingTraceKind uses its |thing|
+ * parameter -- it consults GC-thing flags stored separately from the thing to
+ * decide the kind of thing.
*
* The following checks that this type-punning is possible.
*/
JS_STATIC_ASSERT(sizeof(JSTempValueUnion) == sizeof(jsval));
-JS_STATIC_ASSERT(sizeof(JSTempValueUnion) == sizeof(JSObject *));
+JS_STATIC_ASSERT(sizeof(JSTempValueUnion) == sizeof(void *));
-#define JS_PUSH_TEMP_ROOT_COMMON(cx,tvr) \
+#define JS_PUSH_TEMP_ROOT_COMMON(cx,x,tvr,cnt,kind) \
JS_BEGIN_MACRO \
JS_ASSERT((cx)->tempValueRooters != (tvr)); \
+ (tvr)->count = (cnt); \
+ (tvr)->u.kind = (x); \
(tvr)->down = (cx)->tempValueRooters; \
(cx)->tempValueRooters = (tvr); \
JS_END_MACRO
-#define JS_PUSH_SINGLE_TEMP_ROOT(cx,val,tvr) \
+#define JS_POP_TEMP_ROOT(cx,tvr) \
JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_SINGLE; \
- (tvr)->u.value = val; \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
+ JS_ASSERT((cx)->tempValueRooters == (tvr)); \
+ (cx)->tempValueRooters = (tvr)->down; \
JS_END_MACRO
#define JS_PUSH_TEMP_ROOT(cx,cnt,arr,tvr) \
JS_BEGIN_MACRO \
JS_ASSERT((ptrdiff_t)(cnt) >= 0); \
- (tvr)->count = (ptrdiff_t)(cnt); \
- (tvr)->u.array = (arr); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, arr, tvr, (ptrdiff_t) (cnt), array); \
JS_END_MACRO
-#define JS_PUSH_TEMP_ROOT_MARKER(cx,marker_,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_MARKER; \
- (tvr)->u.marker = (marker_); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
+#define JS_PUSH_SINGLE_TEMP_ROOT(cx,val,tvr) \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, val, tvr, JSTVU_SINGLE, value)
#define JS_PUSH_TEMP_ROOT_OBJECT(cx,obj,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_SINGLE; \
- (tvr)->u.object = (obj); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
+ JS_PUSH_TEMP_ROOT_COMMON(cx, obj, tvr, JSTVU_SINGLE, object)
#define JS_PUSH_TEMP_ROOT_STRING(cx,str,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_SINGLE; \
- (tvr)->u.string = (str); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
-
-#define JS_PUSH_TEMP_ROOT_GCTHING(cx,thing,tvr) \
- JS_BEGIN_MACRO \
- JS_ASSERT(JSVAL_IS_OBJECT((jsval)thing)); \
- (tvr)->count = JSTVU_SINGLE; \
- (tvr)->u.gcthing = (thing); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
-
-#define JS_POP_TEMP_ROOT(cx,tvr) \
- JS_BEGIN_MACRO \
- JS_ASSERT((cx)->tempValueRooters == (tvr)); \
- (cx)->tempValueRooters = (tvr)->down; \
- JS_END_MACRO
-
-#define JS_TEMP_ROOT_EVAL(cx,cnt,val,expr) \
- JS_BEGIN_MACRO \
- JSTempValueRooter tvr; \
- JS_PUSH_TEMP_ROOT(cx, cnt, val, &tvr); \
- (expr); \
- JS_POP_TEMP_ROOT(cx, &tvr); \
- JS_END_MACRO
+ JS_PUSH_TEMP_ROOT_COMMON(cx, str, tvr, JSTVU_SINGLE, string)
+
+#define JS_PUSH_TEMP_ROOT_FUNCTION(cx,fun,tvr) \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, fun, tvr, JSTVU_SINGLE, function)
+
+#define JS_PUSH_TEMP_ROOT_QNAME(cx,qn,tvr) \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, qn, tvr, JSTVU_SINGLE, qname)
+
+#define JS_PUSH_TEMP_ROOT_XML(cx,xml_,tvr) \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, xml_, tvr, JSTVU_SINGLE, xml)
+
+#define JS_PUSH_TEMP_ROOT_MARKER(cx,marker_,tvr) \
+ JS_PUSH_TEMP_ROOT_COMMON(cx, marker_, tvr, JSTVU_MARKER, marker)
#define JS_PUSH_TEMP_ROOT_SPROP(cx,sprop_,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_SPROP; \
- (tvr)->u.sprop = (sprop_); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
+ JS_PUSH_TEMP_ROOT_COMMON(cx, sprop_, tvr, JSTVU_SPROP, sprop)
#define JS_PUSH_TEMP_ROOT_WEAK_COPY(cx,weakRoots_,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_WEAK_ROOTS; \
- (tvr)->u.weakRoots = (weakRoots_); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
+ JS_PUSH_TEMP_ROOT_COMMON(cx, weakRoots_, tvr, JSTVU_WEAK_ROOTS, weakRoots)
#define JS_PUSH_TEMP_ROOT_SCRIPT(cx,script_,tvr) \
- JS_BEGIN_MACRO \
- (tvr)->count = JSTVU_SCRIPT; \
- (tvr)->u.script = (script_); \
- JS_PUSH_TEMP_ROOT_COMMON(cx, tvr); \
- JS_END_MACRO
+ JS_PUSH_TEMP_ROOT_COMMON(cx, script_, tvr, JSTVU_SCRIPT, script)
struct JSContext {
/* JSRuntime contextList linkage. */
=== modified file 'js/src/jsfun.c'
--- js/src/jsfun.c 2008-05-29 16:56:50 +0000
+++ js/src/jsfun.c 2008-05-30 15:08:08 +0000
@@ -1855,9 +1855,14 @@
JS_ASSERT(!fp->script && fp->fun && fp->fun->u.n.native == Function);
caller = JS_GetScriptedCaller(cx, fp);
if (caller) {
- filename = caller->script->filename;
- lineno = js_PCToLineNumber(cx, caller->script, caller->pc);
principals = JS_EvalFramePrincipals(cx, fp, caller);
+ if (principals == caller->script->principals) {
+ filename = caller->script->filename;
+ lineno = js_PCToLineNumber(cx, caller->script, caller->pc);
+ } else {
+ filename = principals->codebase;
+ lineno = 0;
+ }
} else {
filename = NULL;
lineno = 0;
@@ -2262,7 +2267,7 @@
caller = JS_GetScriptedCaller(cx, cx->fp);
if (caller) {
- principals = caller->script->principals;
+ principals = JS_StackFramePrincipals(cx, caller);
} else {
/* No scripted caller, don't allow access. */
principals = NULL;
=== modified file 'js/src/jsinterp.c'
--- js/src/jsinterp.c 2008-05-29 16:56:50 +0000
+++ js/src/jsinterp.c 2008-05-30 15:08:08 +0000
@@ -144,9 +144,11 @@
* homes in fp, when calling out of the interpreter loop or threaded code.
* RESTORE_SP_AND_PC copies the other way, to update registers after a call
* to a subroutine that interprets a piece of the current script.
+ * ASSERT_SAVED_SP_AND_PC checks that SAVE_SP_AND_PC was called.
*/
#define SAVE_SP_AND_PC(fp) (SAVE_SP(fp), (fp)->pc = pc)
#define RESTORE_SP_AND_PC(fp) (RESTORE_SP(fp), pc = (fp)->pc)
+#define ASSERT_SAVED_SP_AND_PC(fp) JS_ASSERT((fp)->sp == sp && (fp)->pc == pc);
/*
* Push the generating bytecode's pc onto the parallel pc stack that runs
@@ -173,6 +175,7 @@
if (JSDOUBLE_IS_INT(d, i_) && INT_FITS_IN_JSVAL(i_)) { \
v_ = INT_TO_JSVAL(i_); \
} else { \
+ SAVE_SP_AND_PC(fp); \
ok = js_NewDoubleValue(cx, d, &v_); \
if (!ok) \
goto out; \
@@ -187,6 +190,7 @@
if (INT_FITS_IN_JSVAL(i)) { \
v_ = INT_TO_JSVAL(i); \
} else { \
+ SAVE_SP_AND_PC(fp); \
ok = js_NewDoubleValue(cx, (jsdouble)(i), &v_); \
if (!ok) \
goto out; \
@@ -201,6 +205,7 @@
if ((u) <= JSVAL_INT_MAX) { \
v_ = INT_TO_JSVAL(u); \
} else { \
+ SAVE_SP_AND_PC(fp); \
ok = js_NewDoubleValue(cx, (jsdouble)(u), &v_); \
if (!ok) \
goto out; \
@@ -3348,10 +3353,10 @@
JS_ASSERT(INT_FITS_IN_JSVAL(i));
rval = INT_TO_JSVAL(i);
} else {
+ SAVE_SP_AND_PC(fp);
if (JSVAL_IS_DOUBLE(rval)) {
d = *JSVAL_TO_DOUBLE(rval);
} else {
- SAVE_SP_AND_PC(fp);
ok = js_ValueToNumber(cx, rval, &d);
if (!ok)
goto out;
@@ -5123,7 +5128,8 @@
id = ATOM_TO_JSID(atom);
goto gs_get_lval;
- case JSOP_INITELEM:
+ default:
+ JS_ASSERT(op2 == JSOP_INITELEM);
JS_ASSERT(sp - fp->spbase >= 3);
rval = FETCH_OPND(-1);
FETCH_ELEMENT_ID(-2, id);
@@ -5133,9 +5139,6 @@
JS_ASSERT(JSVAL_IS_OBJECT(lval));
obj = JSVAL_TO_OBJECT(lval);
break;
-
- default:
- JS_ASSERT(0);
}
/* Ensure that id has a type suitable for use with obj. */
@@ -5978,6 +5981,7 @@
ASSERT_NOT_THROWING(cx);
if (fp->flags & JSFRAME_FILTERING) {
/* FIXME: bug 309894 -- fix to eliminate this error. */
+ SAVE_SP_AND_PC(fp);
JS_ReportErrorNumberUC(cx, js_GetErrorMessage, NULL,
JSMSG_YIELD_FROM_FILTER);
ok = JS_FALSE;
@@ -6201,7 +6205,10 @@
atom_not_defined:
{
- const char *printable = js_AtomToPrintableString(cx, atom);
+ const char *printable;
+
+ ASSERT_SAVED_SP_AND_PC(fp);
+ printable = js_AtomToPrintableString(cx, atom);
if (printable)
js_ReportIsNotDefined(cx, printable);
ok = JS_FALSE;
=== modified file 'js/src/jsobj.c'
--- js/src/jsobj.c 2008-05-29 16:56:50 +0000
+++ js/src/jsobj.c 2008-05-30 15:08:08 +0000
@@ -1260,13 +1260,19 @@
JS_ASSERT(!caller || caller->pc);
indirectCall = (caller && *caller->pc != JSOP_EVAL);
- if (indirectCall &&
- !JS_ReportErrorFlagsAndNumber(cx,
- JSREPORT_WARNING | JSREPORT_STRICT,
- js_GetErrorMessage, NULL,
- JSMSG_BAD_INDIRECT_CALL,
- js_eval_str)) {
- return JS_FALSE;
+ /*
+ * Note: This restriction allows for Array.map(array, eval), but does not
+ * allow the user to pass a this parameter that isn't a global object.
+ */
+ if (indirectCall || OBJ_GET_PARENT(cx, obj)) {
+ uintN flags = (OBJ_GET_PARENT(cx, obj) != NULL)
+ ? JSREPORT_ERROR
+ : JSREPORT_WARNING | JSREPORT_STRICT;
+ if (!JS_ReportErrorFlagsAndNumber(cx, flags, js_GetErrorMessage, NULL,
+ JSMSG_BAD_INDIRECT_CALL,
+ js_eval_str)) {
+ return JS_FALSE;
+ }
}
if (!JSVAL_IS_STRING(argv[0])) {
@@ -1776,7 +1782,6 @@
{js_toString_str, js_obj_toString, 0, 0, OBJ_TOSTRING_EXTRA},
{js_toLocaleString_str, js_obj_toLocaleString, 0, 0, OBJ_TOSTRING_EXTRA},
{js_valueOf_str, obj_valueOf, 0,0,0},
- {js_eval_str, obj_eval, 1,0,0},
#if JS_HAS_OBJ_WATCHPOINT
{js_watch_str, obj_watch, 2,0,0},
{js_unwatch_str, obj_unwatch, 1,0,0},
@@ -2230,22 +2235,15 @@
js_InitObjectClass(JSContext *cx, JSObject *obj)
{
JSObject *proto;
- jsval eval;
proto = JS_InitClass(cx, obj, NULL, &js_ObjectClass, Object, 1,
object_props, object_methods, NULL, NULL);
if (!proto)
return NULL;
- /* ECMA (15.1.2.1) says 'eval' is also a property of the global object. */
- if (!OBJ_GET_PROPERTY(cx, proto,
- ATOM_TO_JSID(cx->runtime->atomState.evalAtom),
- &eval)) {
- return NULL;
- }
- if (!OBJ_DEFINE_PROPERTY(cx, obj,
- ATOM_TO_JSID(cx->runtime->atomState.evalAtom),
- eval, NULL, NULL, 0, NULL)) {
+ /* ECMA (15.1.2.1) says 'eval' is a property of the global object. */
+ if (!js_DefineFunction(cx, obj, cx->runtime->atomState.evalAtom,
+ obj_eval, 1, 0)) {
return NULL;
}
=== modified file 'js/src/jsparse.c'
--- js/src/jsparse.c 2008-05-29 16:56:50 +0000
+++ js/src/jsparse.c 2008-05-30 15:08:08 +0000
@@ -4431,7 +4431,7 @@
/* Pick JSOP_EVAL and flag tc as heavyweight if eval(...). */
pn2->pn_op = JSOP_CALL;
- if (pn->pn_op == JSOP_NAME &&
+ if (pn->pn_arity == PN_NAME &&
pn->pn_atom == cx->runtime->atomState.evalAtom) {
pn2->pn_op = JSOP_EVAL;
tc->flags |= TCF_FUN_HEAVYWEIGHT;
=== modified file 'js/src/jsprvtd.h'
--- js/src/jsprvtd.h 2008-05-29 16:56:50 +0000
+++ js/src/jsprvtd.h 2008-05-30 15:08:08 +0000
@@ -212,7 +212,9 @@
jsval value;
JSObject *object;
JSString *string;
- void *gcthing;
+ JSFunction *function;
+ JSXML *xml;
+ JSXMLQName *qname;
JSTempValueMarker marker;
JSScopeProperty *sprop;
JSWeakRoots *weakRoots;
=== modified file 'js/src/jsxml.c'
--- js/src/jsxml.c 2008-05-29 16:56:50 +0000
+++ js/src/jsxml.c 2008-05-30 15:08:08 +0000
@@ -3108,7 +3108,7 @@
if (!qn)
return NULL;
- JS_PUSH_TEMP_ROOT_GCTHING(cx, qn, &tvr);
+ JS_PUSH_TEMP_ROOT_QNAME(cx, qn, &tvr);
obj = js_GetAttributeNameObject(cx, qn);
JS_POP_TEMP_ROOT(cx, &tvr);
if (!obj)
@@ -7574,7 +7574,7 @@
xml = js_NewXML(cx, xml_class);
if (!xml)
return NULL;
- JS_PUSH_TEMP_ROOT_GCTHING(cx, xml, &tvr);
+ JS_PUSH_TEMP_ROOT_XML(cx, xml, &tvr);
obj = js_GetXMLObject(cx, xml);
JS_POP_TEMP_ROOT(cx, &tvr);
return obj;
@@ -8194,7 +8194,7 @@
JSBool ok, match;
JSStackFrame *fp;
uint32 flags;
- JSObject *scobj, *listobj, *resobj, *withobj, *kidobj;
+ JSObject *scobj, *listobj, *resobj, *withobj, *kidobj, *obj2;
JSXML *xml, *list, *result, *kid;
JSXMLArrayCursor cursor;
@@ -8245,6 +8245,15 @@
break;
OBJ_SET_PROTO(cx, withobj, kidobj);
ok = js_Interpret(cx, pc, vp) && js_ValueToBoolean(cx, *vp, &match);
+ for (obj2 = fp->scopeChain;
+ obj2 != withobj;
+ obj2 = OBJ_GET_PARENT(cx, obj2)) {
+ if (OBJ_GET_CLASS(cx, obj2) == &js_BlockClass) {
+ if (JS_GetPrivate(cx, obj2) != fp)
+ break;
+ ok &= js_PutBlockObject(cx, obj2);
+ }
+ }
if (ok && match)
ok = Append(cx, result, kid);
if (!ok)
=== modified file 'js/src/xpconnect/src/XPCNativeWrapper.cpp'
--- js/src/xpconnect/src/XPCNativeWrapper.cpp 2008-05-29 16:56:50 +0000
+++ js/src/xpconnect/src/XPCNativeWrapper.cpp 2008-05-30 15:08:09 +0000
@@ -223,6 +223,32 @@
return ID_TO_VALUE(rt->GetStringID(index));
}
+static inline
+JSBool
+EnsureLegalActivity(JSContext *cx, JSObject *obj)
+{
+ jsval flags;
+
+ ::JS_GetReservedSlot(cx, obj, 0, &flags);
+ if (HAS_FLAGS(flags, FLAG_EXPLICIT)) {
+ // Can't make any assertions about the owner of this wrapper.
+ return JS_TRUE;
+ }
+
+ JSStackFrame *frame = nsnull;
+ uint32 fileFlags = JS_GetTopScriptFilenameFlags(cx, NULL);
+ if (!JS_FrameIterator(cx, &frame) ||
+ fileFlags == JSFILENAME_NULL ||
+ (fileFlags & JSFILENAME_SYSTEM)) {
+ // We expect implicit native wrappers in system files.
+ return JS_TRUE;
+ }
+
+ // Otherwise, we're looking at a non-system file with a handle on an
+ // implcit wrapper. This is a bug! Deny access.
+ return ThrowException(NS_ERROR_XPC_SECURITY_MANAGER_VETO, cx);
+}
+
static JSBool
WrapFunction(JSContext* cx, JSObject* funobj, jsval *rval)
{
@@ -264,6 +290,25 @@
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_NW_AddProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
+ JSProperty *prop;
+ JSObject *objp;
+ jsid idAsId;
+
+ if (!::JS_ValueToId(cx, id, &idAsId) ||
+ !OBJ_LOOKUP_PROPERTY(cx, obj, idAsId, &objp, &prop)) {
+ return JS_FALSE;
+ }
+
+ // Do not allow scripted getters or setters on XPCNativeWrappers.
+ NS_ASSERTION(prop && objp == obj, "Wasn't this property just added?");
+ JSScopeProperty *sprop = (JSScopeProperty *) prop;
+ if (sprop->attrs & (JSPROP_GETTER | JSPROP_SETTER)) {
+ OBJ_DROP_PROPERTY(cx, objp, prop);
+ return ThrowException(NS_ERROR_ILLEGAL_VALUE, cx);
+ }
+
+ OBJ_DROP_PROPERTY(cx, objp, prop);
+
jsval flags;
::JS_GetReservedSlot(cx, obj, 0, &flags);
if (!HAS_FLAGS(flags, FLAG_RESOLVING)) {
@@ -272,12 +317,17 @@
// Note: no need to protect *vp from GC here, since it's already in the slot
// on |obj|.
- return RewrapIfDeepWrapper(cx, obj, *vp, vp);
+ return EnsureLegalActivity(cx, obj) &&
+ RewrapIfDeepWrapper(cx, obj, *vp, vp);
}
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_NW_DelProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
{
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
XPC_NW_BYPASS_BASE(cx, obj,
// We're being notified of a delete operation on id in this
// XPCNativeWrapper, so forward to the right high-level hook,
@@ -421,6 +471,10 @@
}
}
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
XPCWrappedNative *wrappedNative =
XPCNativeWrapper::GetWrappedNative(cx, obj);
@@ -630,6 +684,10 @@
// JS_Enumerate API. Then reflect properties named by the enumerated
// identifiers from the wrapped native to the native wrapper.
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
XPCWrappedNative *wn = XPCNativeWrapper::GetWrappedNative(cx, obj);
if (!wn) {
return JS_TRUE;
@@ -688,6 +746,10 @@
return JS_TRUE;
}
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
if (id == GetStringByIndex(cx, XPCJSRuntime::IDX_TO_STRING)) {
*objp = obj;
return JS_DefineFunction(cx, obj, "toString",
@@ -903,8 +965,11 @@
JS_STATIC_DLL_CALLBACK(JSBool)
XPC_NW_Convert(JSContext *cx, JSObject *obj, JSType type, jsval *vp)
{
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
XPC_NW_BYPASS(cx, obj, convert, (cx, obj, type, vp));
-
return JS_TRUE;
}
@@ -1261,6 +1326,10 @@
}
}
+ if (!EnsureLegalActivity(cx, obj)) {
+ return JS_FALSE;
+ }
+
// Check whether toString was overridden in any object along
// the wrapped native's object's prototype chain.
XPCJSRuntime *rt = nsXPConnect::GetRuntime();
=== modified file 'js/src/xpconnect/src/nsXPConnect.cpp'
--- js/src/xpconnect/src/nsXPConnect.cpp 2008-05-29 16:56:50 +0000
+++ js/src/xpconnect/src/nsXPConnect.cpp 2008-05-30 15:08:09 +0000
@@ -420,6 +420,23 @@
return rv;
}
+class SaveFrame
+{
+public:
+ SaveFrame(JSContext *cx)
+ : mJSContext(cx) {
+ mFrame = JS_SaveFrameChain(mJSContext);
+ }
+
+ ~SaveFrame() {
+ JS_RestoreFrameChain(mJSContext, mFrame);
+ }
+
+private:
+ JSContext *mJSContext;
+ JSStackFrame *mFrame;
+};
+
/* void initClasses (in JSContextPtr aJSContext, in JSObjectPtr aGlobalJSObj); */
NS_IMETHODIMP
nsXPConnect::InitClasses(JSContext * aJSContext, JSObject * aGlobalJSObj)
@@ -427,6 +444,7 @@
NS_ASSERTION(aJSContext, "bad param");
NS_ASSERTION(aGlobalJSObj, "bad param");
+ SaveFrame sf(aJSContext);
XPCCallContext ccx(NATIVE_CALLER, aJSContext);
if(!ccx.IsValid())
return UnexpectedFailure(NS_ERROR_FAILURE);
@@ -561,6 +579,7 @@
JS_SetPrototype(aJSContext, protoJSObject, scope->GetPrototypeJSObject());
}
+ SaveFrame sf(ccx);
if(!nsXPCComponents::AttachNewComponentsObject(ccx, scope, globalJSObj))
return UnexpectedFailure(NS_ERROR_FAILURE);
=== modified file 'layout/base/nsCSSFrameConstructor.cpp'
--- layout/base/nsCSSFrameConstructor.cpp 2008-05-29 16:56:50 +0000
+++ layout/base/nsCSSFrameConstructor.cpp 2008-05-30 15:08:09 +0000
@@ -12659,7 +12659,10 @@
NS_ASSERTION(letterContent->GetBindingParent() != letterContent,
"Reframes of this letter frame will mess with the root of a "
"native anonymous content subtree!");
- InitAndRestoreFrame(aState, letterContent, aParentFrame, aStyleContext,
+ InitAndRestoreFrame(aState, letterContent,
+ aState.GetGeometricParent(aStyleContext->GetStyleDisplay(),
+ aParentFrame),
+ aStyleContext,
nsnull, letterFrame);
// Init the text frame to refer to the letter frame. Make sure we
=== modified file 'layout/base/nsLayoutAtomList.h'
--- layout/base/nsLayoutAtomList.h 2008-05-29 16:56:50 +0000
+++ layout/base/nsLayoutAtomList.h 2008-05-30 15:08:09 +0000
@@ -111,6 +111,7 @@
LAYOUT_ATOM(letterFrame, "LetterFrame")
LAYOUT_ATOM(lineFrame, "LineFrame")
LAYOUT_ATOM(listControlFrame,"ListControlFrame")
+LAYOUT_ATOM(menuPopupFrame, "MenuPopupFrame")
LAYOUT_ATOM(objectFrame, "ObjectFrame")
LAYOUT_ATOM(pageFrame, "PageFrame")
LAYOUT_ATOM(pageBreakFrame, "PageBreakFrame")
=== modified file 'layout/build/nsLayoutModule.cpp'
--- layout/build/nsLayoutModule.cpp 2008-05-29 16:56:50 +0000
+++ layout/build/nsLayoutModule.cpp 2008-05-30 15:08:10 +0000
@@ -196,7 +196,7 @@
#endif // MOZ_SVG
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDOMSerializer)
-NS_GENERIC_FACTORY_CONSTRUCTOR(nsXMLHttpRequest)
+NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsXMLHttpRequest, Init)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDOMParser)
//-----------------------------------------------------------------------------
=== modified file 'layout/generic/nsFrame.cpp'
--- layout/generic/nsFrame.cpp 2008-05-29 17:00:54 +0000
+++ layout/generic/nsFrame.cpp 2008-05-30 15:08:10 +0000
@@ -1752,6 +1752,10 @@
return NS_OK;
frameselection->StopAutoScrollTimer();
+ // If we have capturing view, it must be ensured that |this| doesn't
+ // get deleted during HandleDrag.
+ nsWeakFrame weakFrame = GetNearestCapturingView(this) ? this : nsnull;
+
// Check if we are dragging in a table cell
nsCOMPtr<nsIContent> parentContent;
PRInt32 contentOffset;
@@ -1766,14 +1770,16 @@
else
frameselection->HandleDrag(aPresContext, this, aEvent->point);
- nsIView* captureView = GetNearestCapturingView(this);
- if (captureView) {
- // Get the view that aEvent->point is relative to. This is disgusting.
- nsPoint dummyPoint;
- nsIView* eventView;
- GetOffsetFromView(dummyPoint, &eventView);
- nsPoint pt = aEvent->point + eventView->GetOffsetTo(captureView);
- frameselection->StartAutoScrollTimer(aPresContext, captureView, pt, 30);
+ if (weakFrame) {
+ nsIView* captureView = GetNearestCapturingView(this);
+ if (captureView) {
+ // Get the view that aEvent->point is relative to. This is disgusting.
+ nsPoint dummyPoint;
+ nsIView* eventView;
+ GetOffsetFromView(dummyPoint, &eventView);
+ nsPoint pt = aEvent->point + eventView->GetOffsetTo(captureView);
+ frameselection->StartAutoScrollTimer(aPresContext, captureView, pt, 30);
+ }
}
return NS_OK;
=== modified file 'layout/generic/nsInlineFrame.cpp'
--- layout/generic/nsInlineFrame.cpp 2008-05-29 16:56:50 +0000
+++ layout/generic/nsInlineFrame.cpp 2008-05-30 15:08:10 +0000
@@ -339,6 +339,11 @@
aOurLineContainer->GetPrevInFlow(),
"Don't call this when we have no continuation, it's a waste");
+ if (!aFrame) {
+ NS_ASSERTION(aReparentSiblings, "Why did we get called?");
+ return;
+ }
+
nsIFrame* ancestor = aFrame;
nsIFrame* ancestorBlockChild;
do {
=== modified file 'layout/generic/nsSelection.cpp'
--- layout/generic/nsSelection.cpp 2008-05-29 16:56:50 +0000
+++ layout/generic/nsSelection.cpp 2008-05-30 15:08:10 +0000
@@ -7996,6 +7996,7 @@
return NS_OK;
}
PRInt32 cnt = mSelectionListeners.Count();
+ nsCOMArray<nsISelectionListener> selectionListeners(mSelectionListeners);
nsCOMPtr<nsIDOMDocument> domdoc;
nsCOMPtr<nsIPresShell> shell;
@@ -8005,7 +8006,7 @@
short reason = mFrameSelection->PopReason();
for (PRInt32 i = 0; i < cnt; i++)
{
- nsISelectionListener* thisListener = mSelectionListeners[i];
+ nsISelectionListener* thisListener = selectionListeners[i];
if (thisListener)
thisListener->NotifySelectionChanged(domdoc, this, reason);
}
=== modified file 'layout/xul/base/src/nsMenuPopupFrame.h'
--- layout/xul/base/src/nsMenuPopupFrame.h 2008-05-29 16:56:50 +0000
+++ layout/xul/base/src/nsMenuPopupFrame.h 2008-05-30 15:08:18 +0000
@@ -54,6 +54,7 @@
#include "nsBoxFrame.h"
#include "nsIMenuParent.h"
#include "nsIWidget.h"
+#include "nsLayoutAtoms.h"
#include "nsITimer.h"
@@ -188,6 +189,8 @@
NS_IMETHOD KillCloseTimer();
+ virtual nsIAtom* GetType() const { return nsLayoutAtoms::menuPopupFrame; }
+
#ifdef DEBUG
NS_IMETHOD GetFrameName(nsAString& aResult) const
{
=== modified file 'layout/xul/base/src/nsPopupBoxObject.cpp'
--- layout/xul/base/src/nsPopupBoxObject.cpp 2008-05-29 16:56:50 +0000
+++ layout/xul/base/src/nsPopupBoxObject.cpp 2008-05-30 15:08:18 +0000
@@ -65,6 +65,13 @@
nsPopupBoxObject();
virtual ~nsPopupBoxObject();
+ nsMenuPopupFrame* GetMenuPopupFrame()
+ {
+ nsIFrame* frame = GetFrame();
+ if (frame && frame->GetType() == nsLayoutAtoms::menuPopupFrame)
+ return NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ return nsnull;
+ }
};
/* Implementation file */
@@ -209,10 +216,7 @@
NS_IMETHODIMP
nsPopupBoxObject::MoveTo(PRInt32 aLeft, PRInt32 aTop)
{
- nsIFrame* frame = GetFrame();
- if (!frame) return NS_OK;
-
- nsMenuPopupFrame* menuPopupFrame = NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ nsMenuPopupFrame* menuPopupFrame = GetMenuPopupFrame();
if (!menuPopupFrame) return NS_OK;
menuPopupFrame->MoveTo(aLeft, aTop);
@@ -237,10 +241,7 @@
NS_IMETHODIMP
nsPopupBoxObject::GetAutoPosition(PRBool* aShouldAutoPosition)
{
- nsIFrame* frame = GetFrame();
- if (!frame) return NS_OK;
-
- nsMenuPopupFrame* menuPopupFrame = NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ nsMenuPopupFrame* menuPopupFrame = GetMenuPopupFrame();
if (!menuPopupFrame) return NS_OK;
menuPopupFrame->GetAutoPosition(aShouldAutoPosition);
@@ -251,10 +252,7 @@
NS_IMETHODIMP
nsPopupBoxObject::SetAutoPosition(PRBool aShouldAutoPosition)
{
- nsIFrame* frame = GetFrame();
- if (!frame) return NS_OK;
-
- nsMenuPopupFrame* menuPopupFrame = NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ nsMenuPopupFrame* menuPopupFrame = GetMenuPopupFrame();
if (!menuPopupFrame) return NS_OK;
menuPopupFrame->SetAutoPosition(aShouldAutoPosition);
@@ -265,10 +263,7 @@
NS_IMETHODIMP
nsPopupBoxObject::EnableRollup(PRBool aShouldRollup)
{
- nsIFrame* frame = GetFrame();
- if (!frame) return NS_OK;
-
- nsMenuPopupFrame* menuPopupFrame = NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ nsMenuPopupFrame* menuPopupFrame = GetMenuPopupFrame();
if (!menuPopupFrame) return NS_OK;
menuPopupFrame->EnableRollup(aShouldRollup);
@@ -279,10 +274,7 @@
NS_IMETHODIMP
nsPopupBoxObject::EnableKeyboardNavigator(PRBool aEnableKeyboardNavigator)
{
- nsIFrame* frame = GetFrame();
- if (!frame) return NS_OK;
-
- nsMenuPopupFrame* menuPopupFrame = NS_STATIC_CAST(nsMenuPopupFrame*, frame);
+ nsMenuPopupFrame* menuPopupFrame = GetMenuPopupFrame();
if (!menuPopupFrame) return NS_OK;
if (aEnableKeyboardNavigator)
=== modified file 'mail/app/icons/gtk/messengerWindow.xpm'
--- mail/app/icons/gtk/messengerWindow.xpm 2008-05-29 16:56:50 +0000
+++ mail/app/icons/gtk/messengerWindow.xpm 2008-05-30 15:15:15 +0000
@@ -1,295 +1,278 @@
-/* XPM */
-static char *messengerWindow.xpm[] = {
-/* columns rows colors chars-per-pixel */
-"32 32 257 2",
-" c #000000",
-". c #080704",
-"X c #0b0a03",
-"o c #010912",
-"O c #15130d",
-"+ c #1e1810",
-"@ c #021326",
-"# c #021a33",
-"$ c #282117",
-"% c #2b241b",
-"& c #342b1c",
-"* c #3e311d",
-"= c #38381c",
-"- c #3a3628",
-"; c #3a3122",
-": c #3d3e3b",
-"> c #06175e",
-", c #04284e",
-"< c #04264b",
-"1 c #05255e",
-"2 c #08227d",
-"3 c #053464",
-"4 c #0f3c75",
-"5 c #1a257a",
-"6 c #323641",
-"7 c #313940",
-"8 c #393848",
-"9 c #26394a",
-"0 c #273b62",
-"q c #06407f",
-"w c #16406c",
-"e c #1a4571",
-"r c #3c4449",
-"t c #24476c",
-"y c #40321e",
-"u c #423624",
-"i c #473925",
-"p c #403d2e",
-"a c #4b3d29",
-"s c #4e412d",
-"d c #4b4538",
-"f c #50422c",
-"g c #524632",
-"h c #564932",
-"j c #5c4e39",
-"k c #564b37",
-"l c #5d503b",
-"z c #62543d",
-"x c #7f7f3f",
-"c c #404a4d",
-"v c #4a4647",
-"b c #4a4d4d",
-"n c #484754",
-"m c #424e59",
-"M c #5b5548",
-"N c #4d546e",
-"B c #5a6368",
-"V c #665842",
-"C c #6c5f49",
-"Z c #685b45",
-"A c #6c614e",
-"S c #72644c",
-"D c #756953",
-"F c #7a6c54",
-"G c #7b6e58",
-"H c #746c5e",
-"J c #7e725a",
-"K c #63646b",
-"L c #6c6f7d",
-"P c #7f7766",
-"I c #787974",
-"U c #787d7f",
-"Y c #092a8c",
-"T c #0e219e",
-"R c #0a289c",
-"E c #093c9c",
-"W c #0c21ab",
-"Q c #0b2aab",
-"! c #0d23bb",
-"~ c #1022a0",
-"^ c #253293",
-"/ c #0f2ada",
-"( c #102ce9",
-") c #1130f9",
-"_ c #08469d",
-"` c #0f5096",
-"' c #08519d",
-"] c #195594",
-"[ c #0948ac",
-"{ c #0851a0",
-"} c #0958ad",
-"| c #0e5db1",
-" . c #1158a4",
-".. c #165eaa",
-"X. c #0960bc",
-"o. c #2b5d91",
-"O. c #33409e",
-"+. c #0a68cc",
-"@. c #0b71dc",
-"#. c #0b77eb",
-"$. c #424d85",
-"%. c #44578d",
-"&. c #4f5c84",
-"*. c #616d91",
-"=. c #68708b",
-"-. c #6f7996",
-";. c #7e7d81",
-":. c #6d7caa",
-">. c #717ea7",
-",. c #0c80fb",
-"<. c #7e898f",
-"1. c #7d8497",
-"2. c #7481a7",
-"3. c #7280ab",
-"4. c #7a87ac",
-"5. c #7685b1",
-"6. c #82745b",
-"7. c #897a5e",
-"8. c #877860",
-"9. c #8c7e66",
-"0. c #857a69",
-"q. c #8f8064",
-"w. c #8e836f",
-"e. c #8c8271",
-"r. c #94856a",
-"t. c #96886e",
-"y. c #9b8c6f",
-"u. c #918165",
-"i. c #918672",
-"p. c #918978",
-"a. c #9b8d73",
-"s. c #998e7a",
-"d. c #9e9175",
-"f. c #9d917b",
-"g. c #a19274",
-"h. c #a4957a",
-"j. c #a7997e",
-"k. c #ab9b7c",
-"l. c #838389",
-"z. c #868886",
-"x. c #898787",
-"c. c #878992",
-"v. c #848999",
-"b. c #859097",
-"n. c #8e9098",
-"m. c #908a83",
-"M. c #94918e",
-"N. c #999387",
-"B. c #969290",
-"V. c #9a9691",
-"C. c #9f9b93",
-"Z. c #9d9b9b",
-"A. c #858da5",
-"S. c #808db4",
-"D. c #8190bd",
-"F. c #8e98b1",
-"G. c #9195a3",
-"H. c #9c9ea6",
-"J. c #a49981",
-"K. c #a39c8d",
-"L. c #a99c84",
-"P. c #a19682",
-"I. c #a39d93",
-"U. c #aea083",
-"Y. c #ada189",
-"T. c #a6a196",
-"R. c #a7a299",
-"E. c #aca79c",
-"W. c #aca495",
-"Q. c #b3a484",
-"!. c #b1a68b",
-"~. c #b6aa8f",
-"^. c #b1aa9c",
-"/. c #b8ac92",
-"(. c #bdb090",
-"). c #bbb099",
-"_. c #a4a4aa",
-"`. c #b6afa0",
-"'. c #b6b0a5",
-"]. c #bab3a5",
-"[. c #bcb6a9",
-"{. c #beb8aa",
-"}. c #8796c1",
-"|. c #8d9cca",
-" X c #9fa8c4",
-".X c #9da8c6",
-"XX c #97a6d1",
-"oX c #98a9da",
-"OX c #a3adcb",
-"+X c #adb3c3",
-"@X c #abb6d3",
-"#X c #b0b6c1",
-"$X c #b1bcdb",
-"%X c #a8b8e1",
-"&X c #b5c0de",
-"*X c #b8c2d8",
-"=X c #bac5e4",
-"-X c #bbc7e8",
-";X c #c0af87",
-":X c #c4b38d",
-">X c #c3b493",
-",X c #c6b89d",
-"<X c #c9b994",
-"1X c #ccbd9a",
-"2X c #c1b69b",
-"3X c #c3b8a0",
-"4X c #c2bbad",
-"5X c #c4beb1",
-"6X c #cec2a3",
-"7X c #c6c0b2",
-"8X c #c9c2b5",
-"9X c #ccc6b9",
-"0X c #d1c4a4",
-"qX c #d2c5a8",
-"wX c #d5c9ab",
-"eX c #d8cbae",
-"rX c #d5c9b0",
-"tX c #d9ceb2",
-"yX c #dbd0b5",
-"uX c #ddd3ba",
-"iX c #e0d6bd",
-"pX c #c0c7db",
-"aX c #c0c9da",
-"sX c #d2cec4",
-"dX c #c3cdea",
-"fX c #c8d4ee",
-"gX c #cad3e6",
-"hX c #c7d3f5",
-"jX c #cad6f8",
-"kX c #cddaf4",
-"lX c #d2dbed",
-"zX c #d8deee",
-"xX c #d1dbf2",
-"cX c #d0dbfb",
-"vX c #dbe1ed",
-"bX c #d6e1fc",
-"nX c #dfe4f0",
-"mX c #dae5fd",
-"MX c #dee9fe",
-"NX c #e3d9c3",
-"BX c #e6ddc8",
-"VX c #e8dfca",
-"CX c #e8e0cc",
-"ZX c #ebe4d2",
-"AX c #eee8d6",
-"SX c #f1ebdb",
-"DX c #e2e9f7",
-"FX c #e3ecfd",
-"GX c #e9effc",
-"HX c #e7f0fe",
-"JX c #ebf2fd",
-"KX c #f5f0e1",
-"LX c #f9f5e9",
-"PX c #f1f6fd",
-"IX c #f5f9fe",
-"UX c #fefefe",
-"YX c None",
-/* pixels */
-"YXYXYXYXYXYXYXYXYXYXYXYXYXYXy * * * & YXYXYXYXYXYXYXYXYXYXYX",
-"YXYXYXYXYXYXYXYXYXYXYXYX= i j N.W.w.f & YXYXYXYXYXYXYXYXYXYX",
-"YXYXYXYXYXYXYXYXYXYXYXa f D `.].].].K.z u YXYXYXYXYXYXYXYXYX",
-"YXYXYXYXYXYXYXYXYXYXh h i.[.[.4X4X[.4X^.C s YXYXYXYXYXYXYXYX",
-"YXYXYXYXYXYXYX%.0 h V K.4X4X4X4X4X4X5X4X[.G j X YXYXYXYXYXYXYX",
-"YXYXYXYXYXYX$.:.>.N ;.I.^.].4X4X5X5X8X8X8X4X0.V O YXYXYXYXYXYX",
-"YXYXYXYXYXYX%.pXUXzXOX3.-.c.C.E.].4X5X8X8X9X9Xs.S % YXYXYXYXYX",
-"YXYXYXYXYXg &.PXIXUXIXIXvX$X}.>.1.n.C.E.'.{.5X8XP.J - YXYXYXYX",
-"YXYXYXYXS M 4.UXUXUXIXIXIXIXIXIXzX&XXXD.4.A.G.Z.R.p.D - YXYX",
-"YXYXx 7.J L *XUXIXIXPXIXIXIXIXUXIXUXUXIXDXkX=X$XoX|.3.=.d . YX",
-"YXF 6.f.T.*.DXIXIXPXJXIXJXJXJXJXJXIXIXPXJXIXJXJXJXvX[.l.U. YX",
-"YXk.t.w.H 5.JXJXPXJXJXJXJXJXJXFXJXJXPXJXJXJXJXJXvX+Xn.!.k. YX",
-"YXk.Q.a.K .XMXFXHXHXFXJXJXFXFXFXMXHXFXHXFXJXJXlX[.V.k.;Xk. YX",
-"YXg.qX>Xf._.gXDXFXMXFXFXHXMXbXmXMXFXFXMXFXMXzX+Xn.h.:X:Xg. YX",
-"YXy.wXeX6Xh.I.*XxXbXMXMXMXMXMXbXmXMXmXbXmXlX+XB.h.>X<X:Xy. YX",
-"YXr.wXeXuXuXQ.s.+XdXcXMXMXMXbXcXbXMXcXcXfX1.6 C (.1X<X:Xr. YX",
-"YXq.wXtXuXuXNX3Xr.H.=XjXcXkX-X=X=XhXhX-X.Xl.M W n !.<X<Xq. YX",
-"YX7.rXyXuXNXBXVXuXa.m.@X$X.XG.x.B.H.OXF.: J ~.^ ( v k.:XJ YX",
-"YX6.eXyXuXNXNXVXZXCXL.0.v.m.L.b K.Y.t.t r N.).O.) ~ J Q.: ",
-"YXF eXyXuXNXBXVXZXAXSX4Xr.).LX| U sXz.#.M M P W ) ) 8 d.` < ",
-"YXS eXyXuXNXNXBXCXAXAXY./.LX[.#.` N.o.,.9 : 4 ) ) ) 5 r #.{ ",
-"YXS eXeXyXNXNXBXCXCXL.W.KXKXb.#.,.e X.,.| w +./ ) ) ~ +.,.X. ",
-"YXZ wXeXyXuXNXNXBXL.L.SXSXSXv.#.,.,.X.,.,.} X.! ) ) ! ,.,.X. ",
-"YXz wXeXtXuXuXNXJ.h.ZXAXAXC.m | ,.+.X.,.,.,.X.Q ) ) Q ,.,., o ",
-"YXj 0XwXtXyXyXk.a.VXZXVXVXNX] @.,.1 ' @.,.,.,.@.Y ) [ #.,.+.o ",
-"YXh 0X0XwXtXj.r.NXVXVXBXNXNXI +.,.W > ' ,.,.,.,.#.Y +.,.,.` ",
-"YXf 6X0XqXh.q.uXiXNXiXiXiXuXB } ,.R ! +.X.,.,.,.#.#.,.,.#., ",
-"YXa 1X0Xf.8.tXNXiXiXiXtXtXtX!. .,.[ / X.,.,.,.,.,.,.,.,.,.# ",
-"YXy 1Xa.6.rXuXyXtXtXtXeXqX/.g.d } ,.{ 1 #.,.,.,.,.,.,.#.3 ",
-"YX* g.F qXeXeX,XQ.a.6.Z k a u % X 3 } #.#.,.#.,.,.@.' @ ",
-"YXa V t.9.D z h a ; $ O ",
-"YXh f u & + . YXYX"
-};
+/* XPM */
+static char * thunderbird3_xpm[] = {
+"48 48 227 2",
+" c None",
+"! c black",
+"# c #7693BC",
+"$ c #C4DAE4",
+"% c #7186B1",
+"& c #90C7D9",
+"' c #D1E7EE",
+"( c #7396C1",
+") c #9ED5E1",
+"* c #B3D6E3",
+"+ c #98BAD3",
+", c #6381AA",
+"- c #9DAED1",
+". c #6FABCA",
+"0 c #5695BD",
+"1 c #4E91BB",
+"2 c #3C82B2",
+"3 c #2B73AA",
+"4 c #1A65A2",
+"5 c #0E5196",
+"6 c #3277AC",
+"7 c #6A71A6",
+"8 c #85BAD1",
+"9 c #256AA5",
+": c #15609F",
+"; c #282E7C",
+"< c #0D1368",
+"= c #5B9CC1",
+"> c #4387B5",
+"? c #44609C",
+"@ c #27438B",
+"A c #566BA3",
+"B c #5886B7",
+"C c #0B3F90",
+"D c #314D92",
+"E c #233B86",
+"F c #45498D",
+"G c #6889B9",
+"H c #387CB0",
+"I c #305DA0",
+"J c #254995",
+"K c #535997",
+"L c #E1F1F5",
+"M c #6592BD",
+"N c #1C5FA0",
+"O c #EAEEEF",
+"P c #547CB2",
+"Q c #4871AC",
+"R c #497AB0",
+"S c #0D2478",
+"T c #889AC3",
+"U c #436CA9",
+"V c #3965A4",
+"W c #27599C",
+"X c #10093A",
+"Y c #AFCBDC",
+"Z c #093479",
+"[ c #09316E",
+"] c #15417B",
+"^ c #537AAE",
+"_ c #0C3589",
+"` c #231939",
+"a c #090136",
+"b c #172779",
+"c c #0A1457",
+"d c #0D2981",
+"e c #191446",
+"f c #8A5A1C",
+"g c #8B601D",
+"h c #B8C0B9",
+"i c #755657",
+"j c #7C4C22",
+"k c #8EA1C9",
+"l c #5D3A23",
+"m c #A5A797",
+"n c #2D2364",
+"o c #583A31",
+"p c #987559",
+"q c #0B0A47",
+"r c #2B5385",
+"s c #131C72",
+"t c #352C44",
+"u c #9A7E49",
+"v c #7D4A1C",
+"w c #916A2B",
+"x c #989387",
+"y c #9895AC",
+"z c #2F334D",
+"{ c #684627",
+"| c #5C4A43",
+"} c #4A3350",
+"~ c #0C124D",
+" ! c #130C40",
+"!! c #0A2569",
+"#! c #715D44",
+"$! c #AC9150",
+"%! c #865D44",
+"&! c #8E7643",
+"'! c #D8C7A8",
+"(! c #79A2BD",
+")! c #273559",
+"*! c #A66419",
+"+! c #AE732E",
+",! c #C78D46",
+"-! c #D8A866",
+".! c #C6A35A",
+"0! c #A9823E",
+"1! c #76582C",
+"2! c #644836",
+"3! c #473638",
+"4! c #373035",
+"5! c #0D2055",
+"6! c #32589C",
+"7! c #0E1B73",
+"8! c #143589",
+"9! c #BA9B57",
+":! c #74563B",
+";! c #F6F7F9",
+"<! c #585454",
+"=! c #1A396A",
+">! c #F3BD7B",
+"?! c #F5C27F",
+"@! c #F8C685",
+"A! c #795A16",
+"B! c #33232B",
+"C! c #193E90",
+"D! c #1D1438",
+"E! c #B68E62",
+"F! c #D7C398",
+"G! c #E6D1A8",
+"H! c #C7B07F",
+"I! c #454151",
+"J! c #928278",
+"K! c #BA874B",
+"L! c #AA7D43",
+"M! c #F9CD92",
+"N! c #B4964B",
+"O! c #5C421C",
+"P! c #162D81",
+"Q! c #32233B",
+"R! c #C9A867",
+"S! c #FBF6D8",
+"T! c #FEFDE5",
+"U! c #93999A",
+"V! c #7B787B",
+"W! c #EBE2C5",
+"X! c #E6D8B7",
+"Y! c #C39966",
+"Z! c #BA8C57",
+"[! c #DDB978",
+"]! c #FBE2B6",
+"^! c #F9D9A6",
+"_! c #F9D39A",
+"`! c #211B4C",
+"a! c #0E0E5A",
+"b! c #95A6CA",
+"c! c #8E7768",
+"d! c #F9EBC6",
+"e! c #D0A376",
+"f! c #C69E76",
+"g! c #111A59",
+"h! c #A88758",
+"i! c #BEBDAF",
+"j! c #CDB48D",
+"k! c #FCF0CC",
+"l! c #4E3621",
+"m! c #F2E6D6",
+"n! c #E7C998",
+"o! c #936847",
+"p! c #8B6347",
+"q! c #9D8450",
+"r! c #42548A",
+"s! c #92A7AE",
+"t! c #AB968A",
+"u! c #E9D9C5",
+"v! c #B8997B",
+"w! c #C7A778",
+"x! c #152467",
+"y! c #4A4F91",
+"z! c #868799",
+"{! c #B3966C",
+"|! c #223479",
+"}! c #193077",
+"~! c #686485",
+" # c #F1DCB1",
+"!# c #A7866B",
+"## c #B8A792",
+"$# c #A4A6A4",
+"%# c #455B92",
+"&# c #4C4A76",
+"'# c #8F6A54",
+"(# c #5E84AB",
+")# c #27224B",
+"*# c #4D5F7C",
+"+# c #553D1E",
+",# c #5B4F6C",
+"-# c #E8C387",
+".# c #161969",
+"0# c #D3B069",
+"1# c #E0AF6C",
+"2# c #848DB3",
+"3# c #292452",
+"4# c #675441",
+"5# c #55453D",
+"6# c #352C57",
+"7# c #E5B978",
+"8# c #373058",
+"9# c #645654",
+":# c #7B6644",
+";# c #EAC27E",
+"<# c #7D6568",
+"=# c #3C3663",
+"># c #7B7895",
+"?# c #AC904D",
+"@# c #595579",
+"A# c #625E80",
+"B# c #76728E",
+"C# c #695B61",
+"D# c #544758",
+"E# c #6B6378",
+"F# c #454169",
+"G# c #403B65",
+"H# c #A7A8BC",
+"I# c #716D8D",
+"J# c #B6B4C4",
+"K# c #827E9A",
+"L# c #C4CAD4",
+" ",
+" # $ ",
+" % & ' ",
+" ( ) ' * * ) + & & ",
+" , ) & - ) & . . 0 1 2 3 4 4 5 5 6 ( ",
+" 7 ) ) 8 8 ) & & . 1 2 6 9 : 5 : 4 4 3 9 9 ",
+" ; < 8 ) ) ) ) 8 . = 1 2 6 4 4 6 2 2 2 > > 1 1 2 1 ",
+" ? @ ; A ) ) & & . . = 1 2 6 3 6 2 2 2 1 1 > > 1 = 2 2 = 8 ",
+" B C D E F & ) & & . . = G B 3 3 6 H 2 2 1 2 2 1 1 = . 8 = = . 3 ",
+" 9 I J E K L ' & & . M B G B 6 3 3 6 H 2 2 1 > 2 2 = . 2 H 3 . 4 : 3 ",
+" > N I E E ' O $ 8 = P Q G G 6 9 3 3 6 > 0 > 2 1 = 2 . 1 3 8 . & . H 1 H ",
+" = 1 R Q S T L L 8 P U U G # 6 4 : 5 : : 9 6 2 1 9 = . ) 8 & ) = 4 : 4 3 9 V ",
+" . . 1 W S X $ L Y V I V P T 2 4 : 5 5 C Z [ ] 3 6 9 4 1 2 3 6 H 3 3 6 > 1 : 5 P ",
+" * 0 3 ^ _ ` a $ L B J b ; T M 4 : 5 5 5 5 C C S c ] 2 . 8 = 1 1 0 1 1 > : 6 : d V ",
+" 8 . . 5 e f g h * V F i j k 9 : 5 5 5 5 C C C _ _ c Z 9 9 9 : 3 2 : 9 > N 5 5 d D J ",
+" * 8 . 9 < l g g m + I n o p B : 5 5 5 C C C C _ _ d [ q r > 1 9 : 5 : 5 : V N 5 S E s ",
+" . > 3 C t u v w x = I A y - N _ z l v j { | } t ~ !a a a 6 . B 5 5 5 5 5 V N 5 < s < 7 ",
+" . > 6 !!#!$!%!&!'!1 Q (!B : )!j *!*!*!*!+!,!-!.!0!1!2!3!4!5!3 B : N 6!N V V D 7!< < 7!8! ",
+" * 0 2 W ~ $!9!9!:!;!$ <!r =!2!+!+!+!+!+!,!>!?!@!@!>!-!+!A!A!B!5 9 N 5 N 5 U Q E 7!< < d C! ",
+" 8 2 9 C D!E!F!G!H!L <!I!J!K!K!K!K!L!K!-!M!M!M!@!@!@!@!>!N!f O![ 5 N 5 N b Q U S < d 7!d 8! ",
+" = P!5 _ Q!R!S!T!F!U!V!W!X!Y!Y!Z!Z!Z![!]!^!^!_!M!M!M!@!@!@!K!A!`!: 9 I @ a!9 C!d d _ d P!J b! ",
+" H _ S _ t F!T!T!S!c!p T!d!e!f!Y!f!e!]!]!]!]!]!]!_!_!_!M!M!?!0!4!Q Q U 7!q C!_ 8!s 8!C!b 6!- ",
+" 9 C s 8!g!'!T!T!T!d!h!i!S!'!H!j!e!X!k!d!d!]!]!]!]!]!^!^!_!_!Z!l!I Q 6!d a C!C!C!P!C!8!b U P ",
+" 5 C S C!@ j!T!T!T!T!X!&!S!W!F!F!F!m!T!T!S!k!k!d!]!]!]!n!o!p!q!:!6!6!C!8!c 6!C!J E J s P!Q Q ",
+" @ C s r!V s!T!T!T!T!T!F!t!S!X!'!u!T!T!T!T!T!S!S!W!v!p!o!w!H!n!9!I 6!6!C!x!6!6!@ J C!d E R Q ",
+" y!d d J!z!M S!T!T!T!T!S!v!'!m!u!W!T!T!T!T!T!X!p p!{!F!n!^!^!_!j!U U V @ |!V V P!s _ 8!J D ( ",
+" 7 < < J!F!H!X!T!T!T!T!T!d!p S!T!T!T!T!W!t!p!p F!n!^!]!^!^!^!^!F!B R ^ }!6!U V d P!8!C!6!< T ",
+" < < ~!m!X!'!T!T!T!T!T!T! #!#T!S!##p!p j! # #]!]!]!^!^!^!_!_!$#( M %#!!B Q J C!8!J J < < T ",
+" s d &#X!T!T!T!T!T!T!T!S!S!F!'#p!H!W!]!]!]!]!]!^!^!^!^!_!_!_!(!. (#)#@ P I 6!J C!6!8!< < ",
+" E C!E '!S!T!T!T!T!T!S!S!S!k!]!d!d!]!]!]!]!]!]!^!^!^!_!_!_!i!(!*#+#l!C 8!U V @ 6!6!S S S ",
+" % b @ ##u!T!T!T!T!S!S!S!k!k!d!d!]!d!]!]!]!^!^!^!^!_!_!M!M!M!?!w A!B!_ J P Q 8!I P!d d S ",
+" < < ,#-#X!T!T!S!S!S!k!k!d!d!d!]!]!]!]!]!^!^!^!_!_!_!M!M!@!>!g f a d P B E _ d d _ 8!%# ",
+" F < .#$!.!0#-# #k!k!k!d!d!d!]!]!]!]!^!^!^!^!_!_!M!M!M!@!@!1#w h!X S I c C!8!x!C!C!S 2# ",
+" < < 3#4#u N!.!0#[!^!]!d!]!]!]!]!^!^!^!^!_!_!_!M!M!@!@!@!1#1#p q a!d g!J C!g!J @ ~ ",
+" 7 7!7!a a `!5#&!9!.!0#[!M!^!]!]!^!^!^!_!_!M!M!M!@!@!@!@!?!?!6#q q < ] J < ] J ~ `! ",
+" b 8!a!a a a a e 3!&!9!.!0#7#-#_!^!_!_!_!M!M!@!@!@!?!?!?!e!3#X a a 8!S a S < a ",
+" b @ X a a e a a a 8#9#:#N!.!0#7#;#M!M!M!@!@!@!@!@!@!?!<#3#X a a 7!q q < a e ",
+" s < a a a =#a ! >#9#:#?#.!0#7#;#@!@!?!?!?!?![!=#e a a X a a a a a ",
+" 7!s X a ># @#A# B#<!#!?#.!0#7#;#@!@!?!c!=#a a a e X a a a 8# ",
+" P!P!e 3# C#4#q!.!0#7#H!&#3#a a a 3#a a a e ",
+" 7 E a D#4#q!E#F#a a a `!3#a a a ",
+" 7 =# >#@# !a a X G# !a a ",
+" H#I#e a a a &#`!a a ",
+" J#>#e a a a F#G#a K# ",
+" H#I# !a a X @#8#a ",
+" L#K#3#a a 3#6#A#`!A# ",
+" y @#F#B# z!B#># ",
+" "};
\ No newline at end of file
=== modified file 'mail/app/icons/gtk/messengerWindow16.xpm'
--- mail/app/icons/gtk/messengerWindow16.xpm 2008-05-29 16:56:50 +0000
+++ mail/app/icons/gtk/messengerWindow16.xpm 2008-05-30 15:15:15 +0000
@@ -1,143 +1,186 @@
/* XPM */
-static char *messengerWindow.xpm[] = {
-/* columns rows colors chars-per-pixel */
-"16 16 121 2",
-" c #000000",
-". c #090704",
-"X c #0a0906",
-"o c #19150f",
-"O c #1c1810",
-"+ c #2a251b",
-"@ c #2f281e",
-"# c #2f2920",
-"$ c #332d23",
-"% c #373126",
-"& c #3d3629",
-"* c #41371f",
-"= c #473c26",
-"- c #483e28",
-"; c #423c30",
-": c #544837",
-"> c #514838",
-", c #61523b",
-"< c #57585e",
-"1 c #5f5c5c",
-"2 c #515361",
-"3 c #655944",
-"4 c #645b4a",
-"5 c #695f4d",
-"6 c #7a6d4f",
-"7 c #736856",
-"8 c #7e6e53",
-"9 c #7a6e58",
-"0 c #424e88",
-"q c #52618b",
-"w c #897a5e",
-"e c #817764",
-"r c #817a6f",
-"t c #8c7f67",
-"y c #8e8063",
-"u c #918369",
-"i c #948974",
-"p c #988b71",
-"a c #988e7d",
-"s c #a2947b",
-"d c #af9e7a",
-"f c #858995",
-"g c #958d83",
-"h c #9b9da6",
-"j c #9ea3b2",
-"k c #99a0b8",
-"l c #a09682",
-"z c #aa9c81",
-"x c #a09a90",
-"c c #afa285",
-"v c #afa288",
-"b c #a8a090",
-"n c #b4a586",
-"m c #b3a689",
-"M c #b8aa8c",
-"N c #b8ad96",
-"B c #bcb199",
-"V c #a1a0a2",
-"C c #a8a6a4",
-"Z c #aca9a5",
-"A c #a7aab6",
-"S c #a6a9b8",
-"D c #aab0bd",
-"F c #b6afa1",
-"G c #b5b1aa",
-"H c #bbb4a4",
-"J c #b1b3be",
-"K c #adb6cc",
-"L c #adb7d1",
-"P c #b1b9cd",
-"I c #b7c0d6",
-"U c #b8c4e3",
-"Y c #c4b188",
-"T c #c3b496",
-"R c #c3b69b",
-"E c #cebd96",
-"W c #c9bb99",
-"Q c #c6b9a1",
-"! c #c3bcac",
-"~ c #c8bca6",
-"^ c #c4bfb2",
-"/ c #d2c097",
-"( c #d0c19d",
-") c #cfc2a3",
-"_ c #cfc4af",
-"` c #c7c0b2",
-"' c #ccc5b5",
-"] c #d5c7a5",
-"[ c #d7c9ad",
-"{ c #dbcdae",
-"} c #d7ceba",
-"| c #daceb5",
-" . c #ddd0b3",
-".. c #dbd1ba",
-"X. c #e3d7ba",
-"o. c #e3d8be",
-"O. c #dfd9c8",
-"+. c #cdd4e5",
-"@. c #cfd8ec",
-"#. c #d3defc",
-"$. c #dee2ef",
-"%. c #d7e3ff",
-"&. c #dfe4f3",
-"*. c #dbe7ff",
-"=. c #dde8fe",
-"-. c #e5dbc4",
-";. c #eadec4",
-":. c #e8dfc8",
-">. c #ece3cd",
-",. c #ece4d1",
-"<. c #efe8d5",
-"1. c #e5eaf5",
-"2. c #e3edfe",
-"3. c #e7f1fe",
-"4. c #eef4fe",
-"5. c #f9f3e3",
-"6. c #fbf6e8",
-"7. c #f1f6ff",
-"8. c #f4faff",
-"9. c #fefeff",
-"0. c None",
-/* pixels */
-"0.0.0.0.0.0.* > 7 : . 0.0.0.",
-"0.0.0.0.0.= 3 x ! B 5 . 0.0.",
-"0.0.0.0 q 1 x ! ! ' ' e . 0.",
-"0.0.0.2 &.$.P j h C G ` 4 ",
-"0.0.6 f 9.9.9.4.1.+.I K S < . ",
-"0.t r K 9.4.4.4.4.9.8.8.@.Z ; ",
-"0.n a P 3.2.3.2.*.2.2.2.Z Y ; ",
-"0.M .N D %.2.*.%.*.#.D M E & ",
-"0.v X.-.R V U K A P k l ( E $ ",
-"0.z X.-.<...g F O.! i ) ] E $ ",
-"0.s X.-.,.} ~ 5.6.5.} v W E @ ",
-"0.p X...B ' <.>.:.:.:.| m d + ",
-"0.u .z ~ >.:.o.o.o. .{ T w o ",
-"0.w n Q ;...[ T d t 3 & O X ",
-"0., p s 9 > @ o X ",
-"0. "
-};
+static char * messengerWindow16_xpm[] = {
+"16 16 167 2",
+" c None",
+". c #8CBDD3",
+"+ c #9ECADC",
+"@ c #7DB3CF",
+"# c #5795BD",
+"$ c #266CA6",
+"% c #2E6FA8",
+"& c #284890",
+"* c #5D7AAA",
+"= c #93CADB",
+"- c #71AAC9",
+"; c #4284B4",
+"> c #2F76AB",
+", c #3F84B3",
+"' c #4589B6",
+") c #5798BE",
+"! c #5E9DC2",
+"~ c #3871AA",
+"{ c #5A6FA7",
+"] c #B0CFDF",
+"^ c #5D8CBA",
+"/ c #5181B3",
+"( c #236AA5",
+"_ c #357AAE",
+": c #4185B4",
+"< c #5D9DC2",
+"[ c #66A3C5",
+"} c #4C8EB9",
+"| c #2D74AB",
+"1 c #6FA8C8",
+"2 c #314978",
+"3 c #989FA7",
+"4 c #4B649A",
+"5 c #5F77A1",
+"6 c #18609F",
+"7 c #0D4D95",
+"8 c #0C3884",
+"9 c #1C4C8A",
+"0 c #4486B5",
+"a c #397EB0",
+"b c #367BAF",
+"c c #2369A4",
+"d c #264D95",
+"e c #3B77AA",
+"f c #6F533D",
+"g c #8E9384",
+"h c #536996",
+"i c #476387",
+"j c #59514A",
+"k c #63554F",
+"l c #545364",
+"m c #282447",
+"n c #345E89",
+"o c #2464A2",
+"p c #1A599B",
+"q c #235499",
+"r c #111C71",
+"s c #5F93BB",
+"t c #1D427D",
+"u c #D1B988",
+"v c #ADA99E",
+"w c #878078",
+"x c #AF7F48",
+"y c #C39356",
+"z c #F2C68A",
+"A c #F8C788",
+"B c #D6A764",
+"C c #554A3E",
+"D c #1B5D9E",
+"E c #245093",
+"F c #1D3887",
+"G c #0E247B",
+"H c #185299",
+"I c #172D77",
+"J c #F0E8CC",
+"K c #D9CBAE",
+"L c #DED0B0",
+"M c #CDAF83",
+"N c #F3E3C1",
+"O c #FBE8C0",
+"P c #FAE0B2",
+"Q c #ECC895",
+"R c #9B7A51",
+"S c #3860A2",
+"T c #142873",
+"U c #183789",
+"V c #183285",
+"W c #5478B0",
+"X c #2B408A",
+"Y c #5A6085",
+"Z c #D8DAC9",
+"` c #FEFDE5",
+" . c #D8C7AA",
+".. c #EFE5CB",
+"+. c #FCFAE1",
+"@. c #DACCB3",
+"#. c #CCB28E",
+"$. c #D6B78A",
+"%. c #E2C592",
+"&. c #416BA7",
+"*. c #29488D",
+"=. c #23418D",
+"-. c #1A3C8D",
+";. c #4C6AA4",
+">. c #6A6F93",
+",. c #F7F2D8",
+"'. c #FBF5D8",
+"). c #D5C1A0",
+"!. c #D4BD99",
+"~. c #F4DCB0",
+"{. c #FADEAF",
+"]. c #F9D7A2",
+"^. c #CDC1A5",
+"/. c #556881",
+"(. c #31589A",
+"_. c #264A95",
+":. c #1B3685",
+"<. c #343877",
+"[. c #E2D0A4",
+"}. c #F9EFCE",
+"|. c #FBF1CF",
+"1. c #FAEBC5",
+"2. c #FBE3B8",
+"3. c #FADDAD",
+"4. c #F9D096",
+"5. c #F5C485",
+"6. c #684A2D",
+"7. c #2B4E93",
+"8. c #1E3F8B",
+"9. c #113085",
+"0. c #222B7A",
+"a. c #292650",
+"b. c #614E47",
+"c. c #AD9269",
+"d. c #E5C78E",
+"e. c #F6D6A3",
+"f. c #F8C889",
+"g. c #F4C280",
+"h. c #6B545A",
+"i. c #0E1A5F",
+"j. c #152B75",
+"k. c #182567",
+"l. c #151F6C",
+"m. c #0D073F",
+"n. c #241E4D",
+"o. c #51475C",
+"p. c #9C855F",
+"q. c #B3976A",
+"r. c #E2B978",
+"s. c #F4C381",
+"t. c #E8BA7E",
+"u. c #271F4B",
+"v. c #0D083F",
+"w. c #0A053F",
+"x. c #2A387E",
+"y. c #977D56",
+"z. c #776970",
+"A. c #0D063A",
+"B. c #1A1345",
+"C. c #0C0439",
+"D. c #807E9A",
+"E. c #191244",
+"F. c #2B2553",
+"G. c #261F4E",
+"H. c #7F7D99",
+"I. c #3E3961",
+"J. c #575276",
+" ",
+" . + @ # $ % ",
+" & * = - ; > , ' ) ! ",
+" ~ { ] ^ / ( _ : < [ } | ",
+" 1 2 3 4 5 6 7 8 9 0 a b c d ",
+" e f g h i j k l m n o p q r ",
+"s t u v w x y z A B C D E F G ",
+"H I J K L M N O P Q R S T U V W ",
+"X Y Z ` ...+.@.#.$.%.&.*.=.-.;.",
+" >.,.` '.).!.~.{.].^./.(._.:. ",
+" <.[.}.|.1.2.3.].4.5.6.7.8.9. ",
+" 0.a.b.c.d.e.].4.f.g.h.i.j.k. ",
+" l.m.n.o.p.q.r.s.t.u.v.w. ",
+" x. y.z.A.B.C. ",
+" D.E.F.G. ",
+" H.I.J. "};
=== modified file 'mail/app/icons/os2/messengerWindow.ico'
Binary files mail/app/icons/os2/messengerWindow.ico 2008-05-29 16:56:50 +0000 and mail/app/icons/os2/messengerWindow.ico 2008-05-30 15:15:15 +0000 differ
=== modified file 'mail/app/icons/windows/messengerWindow.ico'
Binary files mail/app/icons/windows/messengerWindow.ico 2008-05-29 16:56:50 +0000 and mail/app/icons/windows/messengerWindow.ico 2008-05-30 15:15:15 +0000 differ
=== modified file 'modules/libpref/Makefile.in'
--- modules/libpref/Makefile.in 2008-05-29 16:56:50 +0000
+++ modules/libpref/Makefile.in 2008-05-30 15:08:27 +0000
@@ -42,6 +42,10 @@
include $(DEPTH)/config/autoconf.mk
+ifdef ENABLE_TESTS
+TOOL_DIRS += test
+endif
+
MODULE = pref
DIRS = public src
=== modified file 'modules/libpref/public/nsIPrefBranch2.idl'
--- modules/libpref/public/nsIPrefBranch2.idl 2008-05-29 16:56:50 +0000
+++ modules/libpref/public/nsIPrefBranch2.idl 2008-05-30 15:08:27 +0000
@@ -86,6 +86,21 @@
* registered. This insures that shorter lived objects (say one tied to an
* open window) will not fall into the cyclical reference trap.
*
+ * @note
+ * The list of registered observers may be changed during the dispatch of
+ * nsPref:changed notification. However, the observers are not guaranteed
+ * to be notified in any particular order, so you can't be sure whether the
+ * added/removed observer will be called during the notification when it
+ * is added/removed.
+ *
+ * @note
+ * It is possible to change preferences during the notification.
+ *
+ * @note
+ * It is not safe to change observers during this callback in Gecko
+ * releases before 1.9. If you want a safe way to remove a pref observer,
+ * please use an nsITimer.
+ *
* @see nsIObserver
* @see removeObserver
*/
=== modified file 'modules/libpref/src/prefapi.cpp'
--- modules/libpref/src/prefapi.cpp 2008-05-29 16:56:50 +0000
+++ modules/libpref/src/prefapi.cpp 2008-05-30 15:08:27 +0000
@@ -122,6 +122,9 @@
static struct CallbackNode* gCallbacks = NULL;
static PRBool gCallbacksEnabled = PR_TRUE;
static PRBool gIsAnyPrefLocked = PR_FALSE;
+// These are only used during the call to pref_DoCallback
+static PRBool gCallbacksInProgress = PR_FALSE;
+static PRBool gShouldCleanupDeadNodes = PR_FALSE;
static PLDHashTableOps pref_HashTableOps = {
@@ -175,6 +178,9 @@
/* -- Privates */
struct CallbackNode {
char* domain;
+ // If someone attempts to remove the node from the callback list while
+ // pref_DoCallback is running, |func| is set to nsnull. Such nodes will
+ // be removed at the end of pref_DoCallback.
PrefChangedFunc func;
void* data;
struct CallbackNode* next;
@@ -206,6 +212,8 @@
/* Frees the callback list. */
void PREF_Cleanup()
{
+ NS_ASSERTION(!gCallbacksInProgress,
+ "PREF_Cleanup was called while gCallbacksInProgress is PR_TRUE!");
struct CallbackNode* node = gCallbacks;
struct CallbackNode* next_node;
@@ -806,6 +814,9 @@
PrefChangedFunc callback,
void * instance_data)
{
+ NS_PRECONDITION(pref_node, "pref_node must not be nsnull");
+ NS_PRECONDITION(callback, "callback must not be nsnull");
+
struct CallbackNode* node = (struct CallbackNode*) malloc(sizeof(struct CallbackNode));
if (node)
{
@@ -818,7 +829,29 @@
return;
}
-/* Deletes a node from the callback list. */
+/* Removes |node| from gCallbacks list.
+ Returns the node after the deleted one. */
+struct CallbackNode*
+pref_RemoveCallbackNode(struct CallbackNode* node,
+ struct CallbackNode* prev_node)
+{
+ NS_PRECONDITION(!prev_node || prev_node->next == node, "invalid params");
+ NS_PRECONDITION(prev_node || gCallbacks == node, "invalid params");
+
+ NS_ASSERTION(!gCallbacksInProgress,
+ "modifying the callback list while gCallbacksInProgress is PR_TRUE");
+
+ struct CallbackNode* next_node = node->next;
+ if (prev_node)
+ prev_node->next = next_node;
+ else
+ gCallbacks = next_node;
+ PR_Free(node->domain);
+ PR_Free(node);
+ return next_node;
+}
+
+/* Deletes a node from the callback list or marks it for deletion. */
nsresult
PREF_UnregisterCallback(const char *pref_node,
PrefChangedFunc callback,
@@ -832,16 +865,21 @@
{
if ( strcmp(node->domain, pref_node) == 0 &&
node->func == callback &&
- node->data == instance_data )
+ node->data == instance_data)
{
- struct CallbackNode* next_node = node->next;
- if (prev_node)
- prev_node->next = next_node;
+ if (gCallbacksInProgress)
+ {
+ // postpone the node removal until after
+ // gCallbacks enumeration is finished.
+ node->func = nsnull;
+ gShouldCleanupDeadNodes = PR_TRUE;
+ prev_node = node;
+ node = node->next;
+ }
else
- gCallbacks = next_node;
- PR_Free(node->domain);
- PR_Free(node);
- node = next_node;
+ {
+ node = pref_RemoveCallbackNode(node, prev_node);
+ }
rv = NS_OK;
}
else
@@ -857,15 +895,49 @@
{
nsresult rv = NS_OK;
struct CallbackNode* node;
+
+ PRBool reentered = gCallbacksInProgress;
+ gCallbacksInProgress = PR_TRUE;
+ // Nodes must not be deleted while gCallbacksInProgress is PR_TRUE.
+ // Nodes that need to be deleted are marked for deletion by nulling
+ // out the |func| pointer. We release them at the end of this function
+ // if we haven't reentered.
+
for (node = gCallbacks; node != NULL; node = node->next)
{
- if ( PL_strncmp(changed_pref, node->domain, PL_strlen(node->domain)) == 0 )
+ if ( node->func &&
+ PL_strncmp(changed_pref,
+ node->domain,
+ PL_strlen(node->domain)) == 0 )
{
nsresult rv2 = (*node->func) (changed_pref, node->data);
if (NS_FAILED(rv2))
rv = rv2;
}
}
+
+ gCallbacksInProgress = reentered;
+
+ if (gShouldCleanupDeadNodes && !gCallbacksInProgress)
+ {
+ struct CallbackNode* prev_node = NULL;
+ node = gCallbacks;
+
+ while (node != NULL)
+ {
+ if (!node->func)
+ {
+ node = pref_RemoveCallbackNode(node, prev_node);
+ }
+ else
+ {
+ prev_node = node;
+ node = node->next;
+ }
+ }
+ gShouldCleanupDeadNodes = PR_FALSE;
+ }
+
return rv;
}
=== added directory 'modules/libpref/test'
=== added file 'modules/libpref/test/Makefile.in'
--- modules/libpref/test/Makefile.in 1970-01-01 00:00:00 +0000
+++ modules/libpref/test/Makefile.in 2008-05-30 15:08:27 +0000
@@ -0,0 +1,50 @@
+#
+# ***** 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):
+# Boris Zbarsky <bzbarsky@mit.edu> (Original author)
+#
+# 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
+
+MODULE = test_libpref
+
+XPCSHELL_TESTS = unit
+
+include $(topsrcdir)/config/rules.mk
=== added directory 'modules/libpref/test/unit'
=== added file 'modules/libpref/test/unit/test_bug345529.js'
--- modules/libpref/test/unit/test_bug345529.js 1970-01-01 00:00:00 +0000
+++ modules/libpref/test/unit/test_bug345529.js 2008-05-30 15:08:27 +0000
@@ -0,0 +1,34 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/ */
+
+// Regression test for bug 345529 - crash removing an observer during an
+// nsPref:changed notification.
+function run_test() {
+ const Cc = Components.classes;
+ const Ci = Components.interfaces;
+ const PREF_NAME = "testPref";
+
+ var prefs = Cc["@mozilla.org/preferences-service;1"]
+ .getService(Ci.nsIPrefBranch2);
+ var observer = {
+ QueryInterface: function QueryInterface(aIID) {
+ if (aIID.equals(Ci.nsIObserver) ||
+ aIID.equals(Ci.nsISupports))
+ return this;
+ throw Components.results.NS_NOINTERFACE;
+ },
+
+ observe: function observe(aSubject, aTopic, aState) {
+ prefs.removeObserver(PREF_NAME, observer);
+ }
+ }
+ prefs.addObserver(PREF_NAME, observer, false);
+
+ prefs.setCharPref(PREF_NAME, "test0")
+ // This second call isn't needed on a clean profile: it makes sure
+ // the observer gets called even if the pref already had the value
+ // "test0" before this test.
+ prefs.setCharPref(PREF_NAME, "test1")
+
+ do_check_true(true);
+}