diff -r 000000000000 -r 6474c204b198 caps/src/nsJSPrincipals.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/caps/src/nsJSPrincipals.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,73 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "xpcprivate.h" +#include "nsString.h" +#include "nsIObjectOutputStream.h" +#include "nsIObjectInputStream.h" +#include "nsJSPrincipals.h" +#include "plstr.h" +#include "nsXPIDLString.h" +#include "nsCOMPtr.h" +#include "nsIJSRuntimeService.h" +#include "nsIServiceManager.h" +#include "nsMemory.h" +#include "nsStringBuffer.h" + +// for mozilla::dom::workers::kJSPrincipalsDebugToken +#include "mozilla/dom/workers/Workers.h" + +/* static */ bool +nsJSPrincipals::Subsume(JSPrincipals *jsprin, JSPrincipals *other) +{ + bool result; + nsresult rv = nsJSPrincipals::get(jsprin)->Subsumes(nsJSPrincipals::get(other), &result); + return NS_SUCCEEDED(rv) && result; +} + +/* static */ void +nsJSPrincipals::Destroy(JSPrincipals *jsprin) +{ + // The JS runtime can call this method during the last GC when + // nsScriptSecurityManager is destroyed. So we must not assume here that + // the security manager still exists. + + nsJSPrincipals *nsjsprin = nsJSPrincipals::get(jsprin); + + // We need to destroy the nsIPrincipal. We'll do this by adding + // to the refcount and calling release + +#ifdef NS_BUILD_REFCNT_LOGGING + // The refcount logging considers AddRef-to-1 to indicate creation, + // so trick it into thinking it's otherwise, but balance the + // Release() we do below. + nsjsprin->refcount++; + nsjsprin->AddRef(); + nsjsprin->refcount--; +#else + nsjsprin->refcount++; +#endif + nsjsprin->Release(); +} + +#ifdef DEBUG + +// Defined here so one can do principals->dump() in the debugger +JS_EXPORT_API(void) +JSPrincipals::dump() +{ + if (debugToken == nsJSPrincipals::DEBUG_TOKEN) { + static_cast(this)->dumpImpl(); + } else if (debugToken == mozilla::dom::workers::kJSPrincipalsDebugToken) { + fprintf(stderr, "Web Worker principal singleton (%p)\n", this); + } else { + fprintf(stderr, + "!!! JSPrincipals (%p) is not nsJSPrincipals instance - bad token: " + "actual=0x%x expected=0x%x\n", + this, unsigned(debugToken), unsigned(nsJSPrincipals::DEBUG_TOKEN)); + } +} + +#endif