gecko-dev/dom/worklet/Worklet.h
Karl Tomlinson bf17f21d5d Bug 1539039 finish worklet before destination stream is destroyed r=padenot
AudioDestinationNode, AudioContext, and Worklet are part of the same cycle.
Any of these may be unlinked before another.
The unlink process for this cycle is the notification that the worklet will no
longer be used, but the worklet uses the destination stream to send a message
to release graph thread objects and so must do this before the stream is
destroyed.

Differential Revision: https://phabricator.services.mozilla.com/D25351

--HG--
extra : moz-landing-system : lando
2019-03-29 16:12:08 +00:00

73 lines
2.1 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#ifndef mozilla_dom_Worklet_h
#define mozilla_dom_Worklet_h
#include "mozilla/Attributes.h"
#include "mozilla/ErrorResult.h"
#include "nsRefPtrHashtable.h"
#include "nsWrapperCache.h"
#include "nsCOMPtr.h"
class nsPIDOMWindowInner;
namespace mozilla {
class WorkletImpl;
namespace dom {
class Promise;
class WorkletFetchHandler;
struct WorkletOptions;
enum class CallerType : uint32_t;
class Worklet final : public nsISupports, public nsWrapperCache {
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Worklet)
// |aOwnedObject| may be provided by the WorkletImpl as a parent thread
// object to keep alive and traverse for CC as long as the Worklet has
// references remaining.
Worklet(nsPIDOMWindowInner* aWindow, RefPtr<WorkletImpl> aImpl,
nsISupports* aOwnedObject = nullptr);
nsPIDOMWindowInner* GetParentObject() const { return mWindow; }
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
already_AddRefed<Promise> AddModule(const nsAString& aModuleURL,
const WorkletOptions& aOptions,
CallerType aCallerType, ErrorResult& aRv);
WorkletImpl* Impl() const { return mImpl; }
private:
~Worklet();
WorkletFetchHandler* GetImportFetchHandler(const nsACString& aURI);
void AddImportFetchHandler(const nsACString& aURI,
WorkletFetchHandler* aHandler);
nsCOMPtr<nsPIDOMWindowInner> mWindow;
nsCOMPtr<nsISupports> mOwnedObject;
nsRefPtrHashtable<nsCStringHashKey, WorkletFetchHandler> mImportHandlers;
const RefPtr<WorkletImpl> mImpl;
friend class WorkletFetchHandler;
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_Worklet_h