From 38b1afff17ef69d28b7dbba09b834f8078454079 Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Wed, 19 Nov 2008 16:21:08 +1300 Subject: [PATCH] Backed out changeset ab6c0cda36b2 to fix test failures --- content/base/public/nsContentPolicyUtils.h | 1 - content/base/public/nsIContentPolicy.idl | 7 +- .../html/content/public/nsHTMLMediaElement.h | 4 - .../html/content/src/nsHTMLMediaElement.cpp | 42 +---- content/media/video/public/nsMediaDecoder.h | 4 - content/media/video/public/nsMediaStream.h | 1 - .../video/src/nsChannelToPipeListener.cpp | 15 -- content/media/video/src/nsMediaDecoder.cpp | 5 - content/media/video/src/nsMediaStream.cpp | 158 ++++++------------ content/media/video/src/nsOggDecoder.cpp | 1 + .../media/video/test/320x240.allow-origin.ogg | Bin 28942 -> 0 bytes .../test/320x240.allow-origin.ogg^headers^ | 1 - content/media/video/test/Makefile.in | 7 +- .../video/test/file_access_controls.html | 134 --------------- content/media/video/test/redirect.sjs | 5 - .../media/video/test/test_access_control.html | 36 ---- modules/libpref/src/init/all.js | 4 - 17 files changed, 54 insertions(+), 371 deletions(-) delete mode 100644 content/media/video/test/320x240.allow-origin.ogg delete mode 100644 content/media/video/test/320x240.allow-origin.ogg^headers^ delete mode 100644 content/media/video/test/file_access_controls.html delete mode 100644 content/media/video/test/redirect.sjs delete mode 100644 content/media/video/test/test_access_control.html diff --git a/content/base/public/nsContentPolicyUtils.h b/content/base/public/nsContentPolicyUtils.h index 15b15150346..a57ac60c1bf 100644 --- a/content/base/public/nsContentPolicyUtils.h +++ b/content/base/public/nsContentPolicyUtils.h @@ -141,7 +141,6 @@ NS_CP_ContentTypeName(PRUint32 contentType) CASE_RETURN( TYPE_OBJECT_SUBREQUEST ); CASE_RETURN( TYPE_DTD ); CASE_RETURN( TYPE_FONT ); - CASE_RETURN( TYPE_MEDIA ); default: return ""; } diff --git a/content/base/public/nsIContentPolicy.idl b/content/base/public/nsIContentPolicy.idl index 47016388bfc..d9ed73815b7 100644 --- a/content/base/public/nsIContentPolicy.idl +++ b/content/base/public/nsIContentPolicy.idl @@ -51,7 +51,7 @@ interface nsIDOMNode; * by launching a dialog to prompt the user for something). */ -[scriptable,uuid(344f9cb0-9a17-44c5-ab96-ee707884266c)] +[scriptable,uuid(58cf9dca-40b3-6211-a508-7351f437a53e)] interface nsIContentPolicy : nsISupports { const unsigned long TYPE_OTHER = 1; @@ -131,11 +131,6 @@ interface nsIContentPolicy : nsISupports */ const unsigned long TYPE_FONT = 14; - /** - * Indicates a video or audio load. - */ - const unsigned long TYPE_MEDIA = 15; - ////////////////////////////////////////////////////////////////////// /** diff --git a/content/html/content/public/nsHTMLMediaElement.h b/content/html/content/public/nsHTMLMediaElement.h index a8b8e89bfda..578a2201e55 100644 --- a/content/html/content/public/nsHTMLMediaElement.h +++ b/content/html/content/public/nsHTMLMediaElement.h @@ -138,10 +138,6 @@ public: // events can be fired. void ChangeReadyState(nsMediaReadyState aState); - // Gets the pref browser.media.enforce_same_site_origin, which determines - // if we should check Access Controls, or allow cross domain loads. - PRBool ShouldCheckAllowOrigin(); - // Is the media element actively playing as defined by the HTML 5 specification. // http://www.whatwg.org/specs/web-apps/current-work/#actively PRBool IsActivelyPlaying() const; diff --git a/content/html/content/src/nsHTMLMediaElement.cpp b/content/html/content/src/nsHTMLMediaElement.cpp index dd32d106000..9357ee50c6a 100644 --- a/content/html/content/src/nsHTMLMediaElement.cpp +++ b/content/html/content/src/nsHTMLMediaElement.cpp @@ -69,10 +69,6 @@ #include "nsHTMLMediaError.h" #include "nsICategoryManager.h" -#include "nsIContentPolicy.h" -#include "nsContentPolicyUtils.h" -#include "nsContentErrors.h" - #ifdef MOZ_OGG #include "nsOggDecoder.h" #endif @@ -173,7 +169,7 @@ nsresult nsHTMLMediaElement::LoadWithChannel(nsIChannel *aChannel, if (mBegun) { mBegun = PR_FALSE; - mError = new nsHTMLMediaError(nsIDOMHTMLMediaError::MEDIA_ERR_ABORTED); + mError = new nsHTMLMediaError(nsHTMLMediaError::MEDIA_ERR_ABORTED); DispatchProgressEvent(NS_LITERAL_STRING("abort")); return NS_OK; } @@ -666,23 +662,6 @@ nsresult nsHTMLMediaElement::InitializeDecoder(const nsAString& aURISpec) baseURL); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr elementPrincipal = NodePrincipal(); - NS_ENSURE_TRUE(elementPrincipal, NS_ERROR_FAILURE); - - PRInt16 shouldLoad = nsIContentPolicy::ACCEPT; - rv = NS_CheckContentLoadPolicy(nsIContentPolicy::TYPE_MEDIA, - uri, - elementPrincipal, - this, - EmptyCString(), // mime type - nsnull, // extra - &shouldLoad, - nsContentUtils::GetContentPolicy(), - nsContentUtils::GetSecurityManager()); - if (NS_FAILED(rv) || NS_CP_REJECTED(shouldLoad)) { - return NS_ERROR_CONTENT_BLOCKED; - } - if (mDecoder) { mDecoder->ElementAvailable(this); rv = mDecoder->Load(uri, nsnull, nsnull); @@ -723,7 +702,7 @@ void nsHTMLMediaElement::ResourceLoaded() void nsHTMLMediaElement::NetworkError() { - mError = new nsHTMLMediaError(nsIDOMHTMLMediaError::MEDIA_ERR_NETWORK); + mError = new nsHTMLMediaError(nsHTMLMediaError::MEDIA_ERR_NETWORK); mBegun = PR_FALSE; DispatchProgressEvent(NS_LITERAL_STRING("error")); mNetworkState = nsIDOMHTMLMediaElement::EMPTY; @@ -754,23 +733,6 @@ void nsHTMLMediaElement::SeekCompleted() DispatchAsyncSimpleEvent(NS_LITERAL_STRING("seeked")); } -PRBool nsHTMLMediaElement::ShouldCheckAllowOrigin() -{ - nsCOMPtr prefs = do_GetService("@mozilla.org/preferences-service;1"); - PRBool checkOrigin = PR_TRUE; - if (prefs) { - nsCOMPtr prefBranch; - prefs->GetBranch(nsnull, getter_AddRefs(prefBranch)); - if (prefBranch) { - nsresult res = prefBranch->GetBoolPref("browser.media.enforce_same_site_origin", - &checkOrigin); - if (NS_FAILED(res)) - return PR_TRUE; - } - } - return checkOrigin; -} - void nsHTMLMediaElement::ChangeReadyState(nsMediaReadyState aState) { // Handle raising of "waiting" event during seek (see 4.7.10.8) diff --git a/content/media/video/public/nsMediaDecoder.h b/content/media/video/public/nsMediaDecoder.h index 168c97c3800..ab9c96ca625 100644 --- a/content/media/video/public/nsMediaDecoder.h +++ b/content/media/video/public/nsMediaDecoder.h @@ -170,10 +170,6 @@ class nsMediaDecoder : public nsIObserver // thread by the owning object before that object disposes of this object. virtual void Shutdown(); - // Returns a weak reference to the media element we're decoding for, - // if it's available. - nsHTMLMediaElement* GetMediaElement(); - protected: // Start timer to update download progress information. diff --git a/content/media/video/public/nsMediaStream.h b/content/media/video/public/nsMediaStream.h index 935f29ba2a8..568216fdc34 100644 --- a/content/media/video/public/nsMediaStream.h +++ b/content/media/video/public/nsMediaStream.h @@ -42,7 +42,6 @@ #include "nsIChannel.h" #include "nsIPrincipal.h" #include "nsIURI.h" -#include "nsIStreamListener.h" #include "prlock.h" class nsMediaDecoder; diff --git a/content/media/video/src/nsChannelToPipeListener.cpp b/content/media/video/src/nsChannelToPipeListener.cpp index afbb6fa28dd..4eb2afaeca2 100644 --- a/content/media/video/src/nsChannelToPipeListener.cpp +++ b/content/media/video/src/nsChannelToPipeListener.cpp @@ -41,8 +41,6 @@ #include "nsIScriptSecurityManager.h" #include "nsChannelToPipeListener.h" #include "nsICachingChannel.h" -#include "nsDOMError.h" -#include "nsHTMLMediaElement.h" #define HTTP_OK_CODE 200 #define HTTP_PARTIAL_RESPONSE_CODE 206 @@ -98,19 +96,6 @@ nsresult nsChannelToPipeListener::GetInputStream(nsIInputStream** aStream) nsresult nsChannelToPipeListener::OnStartRequest(nsIRequest* aRequest, nsISupports* aContext) { - nsHTMLMediaElement* element = mDecoder->GetMediaElement(); - NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); - if (element->ShouldCheckAllowOrigin()) { - // If the request was cancelled by nsCrossSiteListenerProxy due to failing - // the Access Control check, send an error through to the media element. - nsresult status; - nsresult rv = aRequest->GetStatus(&status); - if (NS_FAILED(rv) || status == NS_ERROR_DOM_BAD_URI) { - mDecoder->NetworkError(); - return NS_ERROR_DOM_BAD_URI; - } - } - mIntervalStart = PR_IntervalNow(); mIntervalEnd = mIntervalStart; mTotalBytes = 0; diff --git a/content/media/video/src/nsMediaDecoder.cpp b/content/media/video/src/nsMediaDecoder.cpp index c8b833acb9c..7e188e92222 100644 --- a/content/media/video/src/nsMediaDecoder.cpp +++ b/content/media/video/src/nsMediaDecoder.cpp @@ -51,7 +51,6 @@ #include "gfxImageSurface.h" #include "nsPresContext.h" #include "nsMediaDecoder.h" -#include "nsDOMError.h" #ifdef PR_LOGGING // Logging object for decoder @@ -236,7 +235,3 @@ void nsMediaDecoder::ElementUnavailable() mElement = nsnull; } -nsHTMLMediaElement* nsMediaDecoder::GetMediaElement() -{ - return mElement; -} diff --git a/content/media/video/src/nsMediaStream.cpp b/content/media/video/src/nsMediaStream.cpp index c9c476e15eb..af56d251b17 100644 --- a/content/media/video/src/nsMediaStream.cpp +++ b/content/media/video/src/nsMediaStream.cpp @@ -51,9 +51,6 @@ #include "nsIStreamListener.h" #include "nsIScriptSecurityManager.h" #include "nsChannelToPipeListener.h" -#include "nsCrossSiteListenerProxy.h" -#include "nsHTMLMediaElement.h" -#include "nsIDocument.h" // For HTTP seeking, if number of bytes needing to be // seeked forward is less than this value then a read is @@ -109,36 +106,11 @@ nsresult nsDefaultStreamStrategy::Open(nsIStreamListener** aStreamListener) nsresult rv = mListener->Init(); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr listener = do_QueryInterface(mListener); - if (aStreamListener) { *aStreamListener = mListener; NS_ADDREF(mListener); } else { - // Ensure that if we're loading cross domain, that the server is sending - // an authorizing Access-Control header. - nsHTMLMediaElement* element = mDecoder->GetMediaElement(); - NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); - nsIPrincipal* elementPrincipal = element->NodePrincipal(); - NS_ENSURE_TRUE(elementPrincipal, NS_ERROR_FAILURE); - if (element->ShouldCheckAllowOrigin()) { - listener = new nsCrossSiteListenerProxy(mListener, - elementPrincipal, - mChannel, - PR_FALSE, - &rv); - NS_ENSURE_TRUE(listener, NS_ERROR_OUT_OF_MEMORY); - NS_ENSURE_SUCCESS(rv, rv); - } else { - // Ensure that we never load a local file from some page on a - // web server. - rv = nsContentUtils::GetSecurityManager()-> - CheckLoadURIWithPrincipal(elementPrincipal, - mURI, - nsIScriptSecurityManager::STANDARD); - NS_ENSURE_SUCCESS(rv, rv); - } - rv = mChannel->AsyncOpen(listener, nsnull); + rv = mChannel->AsyncOpen(mListener, nsnull); NS_ENSURE_SUCCESS(rv, rv); } @@ -279,24 +251,6 @@ nsresult nsFileStreamStrategy::Open(nsIStreamListener** aStreamListener) rv = NS_NewLocalFileInputStream(getter_AddRefs(mInput), file); } else { - // Ensure that we never load a local file from some page on a - // web server. - nsHTMLMediaElement* element = mDecoder->GetMediaElement(); - NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); - - nsCOMPtr uri; - rv = mChannel->GetURI(getter_AddRefs(uri)); - NS_ENSURE_SUCCESS(rv, rv); - - nsIPrincipal* elementPrincipal = element->NodePrincipal(); - NS_ENSURE_TRUE(elementPrincipal, NS_ERROR_FAILURE); - - rv = nsContentUtils::GetSecurityManager()-> - CheckLoadURIWithPrincipal(elementPrincipal, - mURI, - nsIScriptSecurityManager::STANDARD); - NS_ENSURE_SUCCESS(rv, rv); - rv = mChannel->Open(getter_AddRefs(mInput)); } NS_ENSURE_SUCCESS(rv, rv); @@ -407,7 +361,7 @@ public: } // These methods have the same thread calling requirements - // as those with the same name in nsMediaStream. + // as those with the same name in nsMediaStream virtual nsresult Open(nsIStreamListener** aListener); virtual nsresult Close(); virtual nsresult Read(char* aBuffer, PRUint32 aCount, PRUint32* aBytes); @@ -421,14 +375,13 @@ public: // Return PR_TRUE if the stream has been cancelled. PRBool IsCancelled() const; - // This must be called on the main thread only, and at a time when the - // strategy is not reading from the current channel/stream. It's primary - // purpose is to be called from a Seek to reset to the new byte range - // request HTTP channel. - nsresult OpenInternal(nsIChannel* aChannel, PRInt64 aOffset); - - // Opens the HTTP channel, using a byte range request to start at aOffset. - nsresult OpenInternal(nsIStreamListener **aStreamListener, PRInt64 aOffset); + // This must be called on the main thread only, and at a + // time when the strategy is not reading from the current + // channel/stream. It's primary purpose is to be called from + // a Seek to reset to the new byte range request http channel. + void Reset(nsIChannel* aChannel, + nsChannelToPipeListener* aListener, + nsIInputStream* aStream); private: // Listener attached to channel to constantly download the @@ -458,25 +411,18 @@ private: PRPackedBool mCancelled; }; +void nsHttpStreamStrategy::Reset(nsIChannel* aChannel, + nsChannelToPipeListener* aListener, + nsIInputStream* aStream) +{ + nsAutoLock lock(mLock); + mChannel = aChannel; + mListener = aListener; + mPipeInput = aStream; +} + nsresult nsHttpStreamStrategy::Open(nsIStreamListener **aStreamListener) { - return OpenInternal(aStreamListener, 0); -} - -nsresult nsHttpStreamStrategy::OpenInternal(nsIChannel* aChannel, - PRInt64 aOffset) -{ - nsAutoLock lock(mLock); - mChannel = aChannel; - return OpenInternal(static_cast(nsnull), aOffset); -} - -nsresult nsHttpStreamStrategy::OpenInternal(nsIStreamListener **aStreamListener, - PRInt64 aOffset) -{ - NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); - NS_ENSURE_TRUE(mChannel, NS_ERROR_NULL_POINTER); - if (aStreamListener) { *aStreamListener = nsnull; } @@ -487,61 +433,34 @@ nsresult nsHttpStreamStrategy::OpenInternal(nsIStreamListener **aStreamListener, nsresult rv = mListener->Init(); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr listener = do_QueryInterface(mListener); - if (aStreamListener) { *aStreamListener = mListener; NS_ADDREF(*aStreamListener); } else { - // Ensure that if we're loading cross domain, that the server is sending - // an authorizing Access-Control header. - nsHTMLMediaElement* element = mDecoder->GetMediaElement(); - NS_ENSURE_TRUE(element, NS_ERROR_FAILURE); - nsIPrincipal* elementPrincipal = element->NodePrincipal(); - NS_ENSURE_TRUE(elementPrincipal, NS_ERROR_FAILURE); - if (element->ShouldCheckAllowOrigin()) { - listener = new nsCrossSiteListenerProxy(mListener, - elementPrincipal, - mChannel, - PR_FALSE, - &rv); - NS_ENSURE_TRUE(listener, NS_ERROR_OUT_OF_MEMORY); - NS_ENSURE_SUCCESS(rv, rv); - } else { - rv = nsContentUtils::GetSecurityManager()-> - CheckLoadURIWithPrincipal(elementPrincipal, - mURI, - nsIScriptSecurityManager::STANDARD); - NS_ENSURE_SUCCESS(rv, rv); - - } // Use a byte range request from the start of the resource. // This enables us to detect if the stream supports byte range // requests, and therefore seeking, early. nsCOMPtr hc = do_QueryInterface(mChannel); if (hc) { - nsCAutoString rangeString("bytes="); - rangeString.AppendInt(aOffset); - rangeString.Append("-"); - hc->SetRequestHeader(NS_LITERAL_CSTRING("Range"), rangeString, PR_FALSE); + hc->SetRequestHeader(NS_LITERAL_CSTRING("Range"), + NS_LITERAL_CSTRING("bytes=0-"), + PR_FALSE); } - rv = mChannel->AsyncOpen(listener, nsnull); + rv = mChannel->AsyncOpen(mListener, nsnull); NS_ENSURE_SUCCESS(rv, rv); } rv = mListener->GetInputStream(getter_AddRefs(mPipeInput)); NS_ENSURE_SUCCESS(rv, rv); - mPosition = aOffset; + mPosition = 0; return NS_OK; } - nsresult nsHttpStreamStrategy::Close() { - NS_ASSERTION(NS_IsMainThread(), "Only call on main thread"); nsAutoLock lock(mLock); if (mChannel) { mChannel->Cancel(NS_BINDING_ABORTED); @@ -577,9 +496,11 @@ class nsByteRangeEvent : public nsRunnable { public: nsByteRangeEvent(nsHttpStreamStrategy* aStrategy, + nsMediaDecoder* aDecoder, nsIURI* aURI, PRInt64 aOffset) : mStrategy(aStrategy), + mDecoder(aDecoder), mURI(aURI), mOffset(aOffset), mResult(NS_OK) @@ -609,16 +530,35 @@ public: return NS_OK; } - nsCOMPtr channel; mStrategy->Close(); - mResult = NS_NewChannel(getter_AddRefs(channel), + mResult = NS_NewChannel(getter_AddRefs(mChannel), mURI, nsnull, nsnull, nsnull, nsIRequest::LOAD_NORMAL); NS_ENSURE_SUCCESS(mResult, mResult); - mResult = mStrategy->OpenInternal(channel, mOffset); + nsCOMPtr hc = do_QueryInterface(mChannel); + if (hc) { + nsCAutoString rangeString("bytes="); + rangeString.AppendInt(mOffset); + rangeString.Append("-"); + hc->SetRequestHeader(NS_LITERAL_CSTRING("Range"), rangeString, PR_FALSE); + } + + mListener = new nsChannelToPipeListener(mDecoder, PR_TRUE); + NS_ENSURE_TRUE(mListener, NS_ERROR_OUT_OF_MEMORY); + + mResult = mListener->Init(); + NS_ENSURE_SUCCESS(mResult, mResult); + + mResult = mChannel->AsyncOpen(mListener, nsnull); + NS_ENSURE_SUCCESS(mResult, mResult); + + mResult = mListener->GetInputStream(getter_AddRefs(mStream)); + NS_ENSURE_SUCCESS(mResult, mResult); + + mStrategy->Reset(mChannel, mListener, mStream); return NS_OK; } @@ -723,7 +663,7 @@ nsresult nsHttpStreamStrategy::Seek(PRInt32 aWhence, PRInt64 aOffset) // Don't acquire mLock in this scope as we do a synchronous call to the main thread // which would deadlock if that thread is calling Close(). - nsCOMPtr event = new nsByteRangeEvent(this, mURI, aOffset); + nsCOMPtr event = new nsByteRangeEvent(this, mDecoder, mURI, aOffset); NS_DispatchToMainThread(event, NS_DISPATCH_SYNC); // If the sync request fails, or a call to Cancel() is made during the request, diff --git a/content/media/video/src/nsOggDecoder.cpp b/content/media/video/src/nsOggDecoder.cpp index ee97fe907d6..a26c2ff7da9 100644 --- a/content/media/video/src/nsOggDecoder.cpp +++ b/content/media/video/src/nsOggDecoder.cpp @@ -1213,6 +1213,7 @@ private: nsRefPtr mDecoder; }; + void nsOggDecoder::Shutdown() { ChangeState(PLAY_STATE_SHUTDOWN); diff --git a/content/media/video/test/320x240.allow-origin.ogg b/content/media/video/test/320x240.allow-origin.ogg deleted file mode 100644 index 093158432ac64090f3572fa7167da8e102b94515..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28942 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

`$(;pO9QR{7@PpRkt(B`2NB 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 diff --git a/content/media/video/test/320x240.allow-origin.ogg^headers^ b/content/media/video/test/320x240.allow-origin.ogg^headers^ deleted file mode 100644 index cb762eff806..00000000000 --- a/content/media/video/test/320x240.allow-origin.ogg^headers^ +++ /dev/null @@ -1 +0,0 @@ -Access-Control-Allow-Origin: * diff --git a/content/media/video/test/Makefile.in b/content/media/video/test/Makefile.in index e7d113f3d9f..483a183e081 100644 --- a/content/media/video/test/Makefile.in +++ b/content/media/video/test/Makefile.in @@ -43,9 +43,7 @@ relativesrcdir = content/media/video/test include $(DEPTH)/config/autoconf.mk include $(topsrcdir)/config/rules.mk -_TEST_FILES = test_access_control.html \ - file_access_controls.html \ - test_autoplay.html \ +_TEST_FILES = test_autoplay.html \ test_bug461281.html \ test_constants.html \ test_controls.html \ @@ -72,13 +70,10 @@ _TEST_FILES = test_access_control.html \ test_wav_8bit.html \ test_wav_ended1.html \ 320x240.ogg \ - 320x240.allow-origin.ogg \ - 320x240.allow-origin.ogg^headers^ \ bug461281.ogg \ seek.ogg \ r11025_s16_c1.wav \ r11025_u8_c1.wav \ - redirect.sjs \ # test_bug448534.html \ $(NULL) diff --git a/content/media/video/test/file_access_controls.html b/content/media/video/test/file_access_controls.html deleted file mode 100644 index ef32489e395..00000000000 --- a/content/media/video/test/file_access_controls.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - - - - - - - diff --git a/content/media/video/test/redirect.sjs b/content/media/video/test/redirect.sjs deleted file mode 100644 index da419fc2fae..00000000000 --- a/content/media/video/test/redirect.sjs +++ /dev/null @@ -1,5 +0,0 @@ -function handleRequest(request, response) -{ - response.setStatusLine(request.httpVersion, 301, "Moved Permanently"); - response.setHeader("Location", request.queryString, false); -} diff --git a/content/media/video/test/test_access_control.html b/content/media/video/test/test_access_control.html deleted file mode 100644 index a39a3f22820..00000000000 --- a/content/media/video/test/test_access_control.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - Test for Bug 451958 - - - - - -Mozilla Bug 451958 -

- -
-
-
- - diff --git a/modules/libpref/src/init/all.js b/modules/libpref/src/init/all.js index 7b9e75184ed..12dd37c161d 100644 --- a/modules/libpref/src/init/all.js +++ b/modules/libpref/src/init/all.js @@ -131,10 +131,6 @@ pref("browser.chrome.image_icons.max_size", 1024); pref("browser.triple_click_selects_paragraph", true); -// When loading