RemoteWorkerDebuggerParent.cpp (7012B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 #include "RemoteWorkerDebuggerParent.h" 6 7 #include "mozilla/dom/WorkerDebuggerManager.h" 8 #include "mozilla/dom/WorkerPrivate.h" 9 10 namespace mozilla::dom { 11 12 RemoteWorkerDebuggerParent::RemoteWorkerDebuggerParent( 13 const RemoteWorkerDebuggerInfo& aWorkerDebuggerInfo, 14 Endpoint<PRemoteWorkerDebuggerParent>&& aParentEp) 15 : mWorkerDebuggerInfo(std::move(aWorkerDebuggerInfo)) { 16 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 17 MOZ_ASSERT_DEBUG_OR_FUZZING(aParentEp.IsValid()); 18 aParentEp.Bind(this); 19 if (mWorkerDebuggerInfo.type() == WorkerKindDedicated) { 20 mWindowIDs.AppendElement(mWorkerDebuggerInfo.windowID()); 21 } 22 } 23 24 RemoteWorkerDebuggerParent::~RemoteWorkerDebuggerParent() { 25 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 26 } 27 28 // PRemoteWorkerDebugger IPC interface 29 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvUnregister() { 30 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 31 32 RefPtr<WorkerDebuggerManager> manager = WorkerDebuggerManager::Get(); 33 34 MOZ_ASSERT_DEBUG_OR_FUZZING(manager); 35 manager->UnregisterDebugger(this); 36 for (const auto& listener : mListeners.Clone()) { 37 listener->OnClose(); 38 } 39 40 if (CanSend()) { 41 (void)SendUnregisterDone(); 42 } 43 44 return IPC_OK(); 45 } 46 47 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvReportErrorToDebugger( 48 const RemoteWorkerDebuggerErrorInfo& aErrorInfo) { 49 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 50 51 for (const auto& listener : mListeners.Clone()) { 52 listener->OnError(aErrorInfo.fileName(), aErrorInfo.lineNo(), 53 aErrorInfo.message()); 54 } 55 return IPC_OK(); 56 } 57 58 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvPostMessageToDebugger( 59 const nsString& aMessage) { 60 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 61 for (const auto& listener : mListeners.Clone()) { 62 listener->OnMessage(aMessage); 63 } 64 return IPC_OK(); 65 } 66 67 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvSetAsInitialized() { 68 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 69 mIsInitialized = true; 70 return IPC_OK(); 71 } 72 73 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvSetAsClosed() { 74 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 75 mIsClosed = true; 76 return IPC_OK(); 77 } 78 79 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvAddWindowID( 80 const uint64_t& aWindowID) { 81 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 82 mWindowIDs.AppendElement(aWindowID); 83 return IPC_OK(); 84 } 85 86 mozilla::ipc::IPCResult RemoteWorkerDebuggerParent::RecvRemoveWindowID( 87 const uint64_t& aWindowID) { 88 MOZ_ASSERT_DEBUG_OR_FUZZING(XRE_IsParentProcess() && NS_IsMainThread()); 89 mWindowIDs.RemoveElement(aWindowID); 90 return IPC_OK(); 91 } 92 93 // nsIWorkerDebugger interface 94 NS_IMPL_ISUPPORTS(RemoteWorkerDebuggerParent, nsIWorkerDebugger) 95 96 NS_IMETHODIMP 97 RemoteWorkerDebuggerParent::GetIsClosed(bool* aResult) { 98 AssertIsOnMainThread(); 99 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 100 101 *aResult = mIsClosed; 102 return NS_OK; 103 } 104 105 NS_IMETHODIMP 106 RemoteWorkerDebuggerParent::GetIsChrome(bool* aResult) { 107 AssertIsOnMainThread(); 108 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 109 110 *aResult = mWorkerDebuggerInfo.isChrome(); 111 return NS_OK; 112 } 113 114 NS_IMETHODIMP 115 RemoteWorkerDebuggerParent::GetIsRemote(bool* aResult) { 116 AssertIsOnMainThread(); 117 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 118 119 *aResult = true; 120 return NS_OK; 121 } 122 123 NS_IMETHODIMP 124 RemoteWorkerDebuggerParent::GetIsInitialized(bool* aResult) { 125 AssertIsOnMainThread(); 126 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 127 128 *aResult = mIsInitialized; 129 return NS_OK; 130 } 131 132 NS_IMETHODIMP 133 RemoteWorkerDebuggerParent::GetParent(nsIWorkerDebugger** aResult) { 134 AssertIsOnMainThread(); 135 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 136 137 nsCOMPtr<nsIWorkerDebugger> parent; 138 if (!mWorkerDebuggerInfo.parentId().IsEmpty()) { 139 RefPtr<WorkerDebuggerManager> manager = WorkerDebuggerManager::Get(); 140 MOZ_ASSERT_DEBUG_OR_FUZZING(manager); 141 142 parent = manager->GetDebuggerById(mWorkerDebuggerInfo.parentId()); 143 } 144 parent.forget(aResult); 145 return NS_OK; 146 } 147 148 NS_IMETHODIMP 149 RemoteWorkerDebuggerParent::GetType(uint32_t* aResult) { 150 AssertIsOnMainThread(); 151 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 152 153 *aResult = mWorkerDebuggerInfo.type(); 154 return NS_OK; 155 } 156 157 NS_IMETHODIMP 158 RemoteWorkerDebuggerParent::GetUrl(nsAString& aResult) { 159 AssertIsOnMainThread(); 160 161 aResult = mWorkerDebuggerInfo.url(); 162 return NS_OK; 163 } 164 165 NS_IMETHODIMP 166 RemoteWorkerDebuggerParent::GetWindow(mozIDOMWindow** aResult) { 167 AssertIsOnMainThread(); 168 return NS_ERROR_NOT_IMPLEMENTED; 169 } 170 171 NS_IMETHODIMP 172 RemoteWorkerDebuggerParent::GetWindowIDs(nsTArray<uint64_t>& aResult) { 173 AssertIsOnMainThread(); 174 175 aResult = mWindowIDs.Clone(); 176 return NS_OK; 177 } 178 179 NS_IMETHODIMP 180 RemoteWorkerDebuggerParent::GetPrincipal(nsIPrincipal** aResult) { 181 AssertIsOnMainThread(); 182 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 183 184 nsCOMPtr<nsIPrincipal> principal = mWorkerDebuggerInfo.principal(); 185 principal.forget(aResult); 186 187 return NS_OK; 188 } 189 190 NS_IMETHODIMP 191 RemoteWorkerDebuggerParent::GetServiceWorkerID(uint32_t* aResult) { 192 AssertIsOnMainThread(); 193 MOZ_ASSERT_DEBUG_OR_FUZZING(aResult); 194 195 *aResult = mWorkerDebuggerInfo.serviceWorkerID(); 196 return NS_OK; 197 } 198 199 NS_IMETHODIMP 200 RemoteWorkerDebuggerParent::GetId(nsAString& aResult) { 201 AssertIsOnMainThread(); 202 203 aResult = mWorkerDebuggerInfo.Id(); 204 return NS_OK; 205 } 206 207 NS_IMETHODIMP 208 RemoteWorkerDebuggerParent::GetName(nsAString& aResult) { 209 AssertIsOnMainThread(); 210 211 aResult = mWorkerDebuggerInfo.name(); 212 return NS_OK; 213 } 214 215 NS_IMETHODIMP 216 RemoteWorkerDebuggerParent::Initialize(const nsAString& aURL) { 217 AssertIsOnMainThread(); 218 if (CanSend()) { 219 nsAutoString url(aURL); 220 (void)SendInitialize(url); 221 } 222 return NS_OK; 223 } 224 225 NS_IMETHODIMP 226 RemoteWorkerDebuggerParent::PostMessageMoz(const nsAString& aMessage) { 227 AssertIsOnMainThread(); 228 if (CanSend()) { 229 nsAutoString message(aMessage); 230 (void)SendPostMessage(message); 231 } 232 return NS_OK; 233 } 234 235 NS_IMETHODIMP 236 RemoteWorkerDebuggerParent::AddListener(nsIWorkerDebuggerListener* aListener) { 237 AssertIsOnMainThread(); 238 239 if (mListeners.Contains(aListener)) { 240 return NS_ERROR_INVALID_ARG; 241 } 242 mListeners.AppendElement(aListener); 243 return NS_OK; 244 } 245 246 NS_IMETHODIMP 247 RemoteWorkerDebuggerParent::RemoveListener( 248 nsIWorkerDebuggerListener* aListener) { 249 AssertIsOnMainThread(); 250 251 if (!mListeners.Contains(aListener)) { 252 return NS_ERROR_INVALID_ARG; 253 } 254 mListeners.RemoveElement(aListener); 255 return NS_OK; 256 } 257 258 NS_IMETHODIMP 259 RemoteWorkerDebuggerParent::SetDebuggerReady(bool aReady) { 260 AssertIsOnMainThread(); 261 if (CanSend()) { 262 (void)SendSetDebuggerReady(aReady); 263 } 264 return NS_OK; 265 } 266 267 } // namespace mozilla::dom