1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "URLMainThread.h"
9 #include "mozilla/dom/BindingUtils.h"
10 #include "mozilla/dom/Blob.h"
11 #include "mozilla/dom/BlobURLProtocolHandler.h"
12 #include "mozilla/Unused.h"
13 #include "nsContentUtils.h"
14 #include "nsNetUtil.h"
20 void URLMainThread::CreateObjectURL(const GlobalObject
& aGlobal
, Blob
& aBlob
,
21 nsAString
& aResult
, ErrorResult
& aRv
) {
22 MOZ_ASSERT(NS_IsMainThread());
24 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(aGlobal
.GetAsSupports());
25 if (NS_WARN_IF(!global
)) {
26 aRv
.Throw(NS_ERROR_FAILURE
);
30 nsCOMPtr
<nsIPrincipal
> principal
=
31 nsContentUtils::ObjectPrincipal(aGlobal
.Get());
34 aRv
= BlobURLProtocolHandler::AddDataEntry(aBlob
.Impl(), principal
, url
);
35 if (NS_WARN_IF(aRv
.Failed())) {
39 global
->RegisterHostObjectURI(url
);
40 CopyASCIItoUTF16(url
, aResult
);
44 void URLMainThread::CreateObjectURL(const GlobalObject
& aGlobal
,
45 MediaSource
& aSource
, nsAString
& aResult
,
47 MOZ_ASSERT(NS_IsMainThread());
49 nsCOMPtr
<nsIPrincipal
> principal
=
50 nsContentUtils::ObjectPrincipal(aGlobal
.Get());
53 aRv
= BlobURLProtocolHandler::AddDataEntry(&aSource
, principal
, url
);
54 if (NS_WARN_IF(aRv
.Failed())) {
58 nsCOMPtr
<nsIRunnable
> revocation
= NS_NewRunnableFunction(
59 "dom::URLMainThread::CreateObjectURL",
60 [url
] { BlobURLProtocolHandler::RemoveDataEntry(url
); });
62 nsContentUtils::RunInStableState(revocation
.forget());
64 CopyASCIItoUTF16(url
, aResult
);
68 void URLMainThread::RevokeObjectURL(const GlobalObject
& aGlobal
,
69 const nsAString
& aURL
, ErrorResult
& aRv
) {
70 MOZ_ASSERT(NS_IsMainThread());
71 nsCOMPtr
<nsIGlobalObject
> global
= do_QueryInterface(aGlobal
.GetAsSupports());
73 aRv
.Throw(NS_ERROR_FAILURE
);
77 nsIPrincipal
* principal
= nsContentUtils::ObjectPrincipal(aGlobal
.Get());
79 NS_LossyConvertUTF16toASCII
asciiurl(aURL
);
81 nsIPrincipal
* urlPrincipal
=
82 BlobURLProtocolHandler::GetDataEntryPrincipal(asciiurl
);
84 if (urlPrincipal
&& principal
->Subsumes(urlPrincipal
)) {
85 global
->UnregisterHostObjectURI(asciiurl
);
86 BlobURLProtocolHandler::RemoveDataEntry(asciiurl
);
91 bool URLMainThread::IsValidURL(const GlobalObject
& aGlobal
,
92 const nsAString
& aURL
, ErrorResult
& aRv
) {
93 MOZ_ASSERT(NS_IsMainThread());
94 NS_LossyConvertUTF16toASCII
asciiurl(aURL
);
95 return BlobURLProtocolHandler::HasDataEntry(asciiurl
);
99 } // namespace mozilla