Line data Source code
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/. */
6 :
7 : #include "nsIGlobalObject.h"
8 : #include "nsContentUtils.h"
9 : #include "nsThreadUtils.h"
10 : #include "nsHostObjectProtocolHandler.h"
11 :
12 0 : nsIGlobalObject::~nsIGlobalObject()
13 : {
14 0 : UnlinkHostObjectURIs();
15 0 : }
16 :
17 : nsIPrincipal*
18 629 : nsIGlobalObject::PrincipalOrNull()
19 : {
20 629 : JSObject *global = GetGlobalJSObject();
21 629 : if (NS_WARN_IF(!global))
22 0 : return nullptr;
23 :
24 629 : return nsContentUtils::ObjectPrincipal(global);
25 : }
26 :
27 : void
28 0 : nsIGlobalObject::RegisterHostObjectURI(const nsACString& aURI)
29 : {
30 0 : MOZ_ASSERT(!mHostObjectURIs.Contains(aURI));
31 0 : mHostObjectURIs.AppendElement(aURI);
32 0 : }
33 :
34 : void
35 0 : nsIGlobalObject::UnregisterHostObjectURI(const nsACString& aURI)
36 : {
37 0 : mHostObjectURIs.RemoveElement(aURI);
38 0 : }
39 :
40 : namespace {
41 :
42 : class UnlinkHostObjectURIsRunnable final : public mozilla::Runnable
43 : {
44 : public:
45 0 : explicit UnlinkHostObjectURIsRunnable(nsTArray<nsCString>& aURIs)
46 0 : : mozilla::Runnable("UnlinkHostObjectURIsRunnable")
47 : {
48 0 : mURIs.SwapElements(aURIs);
49 0 : }
50 :
51 0 : NS_IMETHOD Run() override
52 : {
53 0 : MOZ_ASSERT(NS_IsMainThread());
54 :
55 0 : for (uint32_t index = 0; index < mURIs.Length(); ++index) {
56 0 : nsHostObjectProtocolHandler::RemoveDataEntry(mURIs[index]);
57 : }
58 :
59 0 : return NS_OK;
60 : }
61 :
62 : private:
63 0 : ~UnlinkHostObjectURIsRunnable() {}
64 :
65 : nsTArray<nsCString> mURIs;
66 : };
67 :
68 : } // namespace
69 :
70 : void
71 3 : nsIGlobalObject::UnlinkHostObjectURIs()
72 : {
73 3 : if (mHostObjectURIs.IsEmpty()) {
74 6 : return;
75 : }
76 :
77 0 : if (NS_IsMainThread()) {
78 0 : for (uint32_t index = 0; index < mHostObjectURIs.Length(); ++index) {
79 0 : nsHostObjectProtocolHandler::RemoveDataEntry(mHostObjectURIs[index]);
80 : }
81 :
82 0 : mHostObjectURIs.Clear();
83 0 : return;
84 : }
85 :
86 : // nsHostObjectProtocolHandler is main-thread only.
87 :
88 : RefPtr<UnlinkHostObjectURIsRunnable> runnable =
89 0 : new UnlinkHostObjectURIsRunnable(mHostObjectURIs);
90 0 : MOZ_ASSERT(mHostObjectURIs.IsEmpty());
91 :
92 0 : nsresult rv = NS_DispatchToMainThread(runnable);
93 0 : if (NS_FAILED(rv)) {
94 0 : NS_WARNING("Failed to dispatch a runnable to the main-thread.");
95 : }
96 : }
97 :
98 : void
99 2 : nsIGlobalObject::TraverseHostObjectURIs(nsCycleCollectionTraversalCallback &aCb)
100 : {
101 2 : if (mHostObjectURIs.IsEmpty()) {
102 2 : return;
103 : }
104 :
105 : // Currently we only store BlobImpl objects off the the main-thread and they
106 : // are not CCed.
107 0 : if (!NS_IsMainThread()) {
108 0 : return;
109 : }
110 :
111 0 : for (uint32_t index = 0; index < mHostObjectURIs.Length(); ++index) {
112 0 : nsHostObjectProtocolHandler::Traverse(mHostObjectURIs[index], aCb);
113 : }
114 : }
|