2015-05-03 19:32:37 +00:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
2012-05-21 11:12:37 +00:00
|
|
|
/* 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/. */
|
2009-06-15 08:27:29 +00:00
|
|
|
|
|
|
|
#include "nsContentUtils.h"
|
|
|
|
#include "nsIDocument.h"
|
2016-02-17 19:23:39 +00:00
|
|
|
#include "mozilla/Snprintf.h"
|
2012-03-13 00:56:07 +00:00
|
|
|
#include "nsGlobalWindow.h"
|
2013-12-12 01:51:58 +00:00
|
|
|
#include "ScriptSettings.h"
|
2014-04-01 06:13:50 +00:00
|
|
|
#include "mozilla/DOMEventTargetHelper.h"
|
2014-03-18 04:48:21 +00:00
|
|
|
#include "mozilla/EventDispatcher.h"
|
2014-03-17 06:56:53 +00:00
|
|
|
#include "mozilla/EventListenerManager.h"
|
2012-10-26 13:32:10 +00:00
|
|
|
#include "mozilla/Likely.h"
|
2009-06-15 08:27:29 +00:00
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
namespace mozilla {
|
2012-11-09 16:00:25 +00:00
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
using namespace dom;
|
2013-08-02 01:29:05 +00:00
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CLASS(DOMEventTargetHelper)
|
|
|
|
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(DOMEventTargetHelper)
|
2012-02-08 02:53:33 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(DOMEventTargetHelper)
|
2012-10-26 13:32:10 +00:00
|
|
|
if (MOZ_UNLIKELY(cb.WantDebugInfo())) {
|
2012-02-12 13:09:18 +00:00
|
|
|
char name[512];
|
|
|
|
nsAutoString uri;
|
2013-04-24 04:22:37 +00:00
|
|
|
if (tmp->mOwnerWindow && tmp->mOwnerWindow->GetExtantDoc()) {
|
|
|
|
tmp->mOwnerWindow->GetExtantDoc()->GetDocumentURI(uri);
|
2012-02-12 13:09:18 +00:00
|
|
|
}
|
2016-05-12 17:54:34 +00:00
|
|
|
|
|
|
|
nsXPCOMCycleCollectionParticipant* participant = nullptr;
|
|
|
|
CallQueryInterface(tmp, &participant);
|
|
|
|
|
2016-08-15 06:44:00 +00:00
|
|
|
SprintfLiteral(name, "%s %s",
|
|
|
|
participant->ClassName(),
|
|
|
|
NS_ConvertUTF16toUTF8(uri).get());
|
2012-08-27 17:41:04 +00:00
|
|
|
cb.DescribeRefCountedNode(tmp->mRefCnt.get(), name);
|
2012-02-12 13:09:18 +00:00
|
|
|
} else {
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_DESCRIBE(DOMEventTargetHelper, tmp->mRefCnt.get())
|
2012-02-12 13:09:18 +00:00
|
|
|
}
|
|
|
|
|
2012-02-08 02:53:33 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
|
2012-11-15 07:32:40 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mListenerManager)
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(DOMEventTargetHelper)
|
2012-02-08 02:53:33 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
|
2012-11-15 07:32:40 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK(mListenerManager)
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(DOMEventTargetHelper)
|
2015-06-29 16:42:41 +00:00
|
|
|
if (tmp->IsBlack() || tmp->IsCertainlyAliveForCC()) {
|
2012-09-24 11:05:30 +00:00
|
|
|
if (tmp->mListenerManager) {
|
2012-10-17 01:22:02 +00:00
|
|
|
tmp->mListenerManager->MarkForCC();
|
2012-09-24 11:05:30 +00:00
|
|
|
}
|
2015-06-29 16:42:41 +00:00
|
|
|
if (!tmp->IsBlack() && tmp->PreservingWrapper()) {
|
|
|
|
// This marks the wrapper black.
|
|
|
|
tmp->GetWrapper();
|
|
|
|
}
|
2012-09-24 11:05:30 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_BEGIN(DOMEventTargetHelper)
|
2012-09-28 22:29:37 +00:00
|
|
|
return tmp->IsBlackAndDoesNotNeedTracing(tmp);
|
2012-09-24 11:05:30 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_IN_CC_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_BEGIN(DOMEventTargetHelper)
|
2012-09-24 11:05:30 +00:00
|
|
|
return tmp->IsBlack();
|
|
|
|
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_THIS_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMEventTargetHelper)
|
2012-02-08 02:53:33 +00:00
|
|
|
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
2011-06-24 02:18:01 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMEventTarget)
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_INTERFACE_MAP_ENTRY(dom::EventTarget)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(DOMEventTargetHelper)
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_INTERFACE_MAP_END
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_CYCLE_COLLECTING_ADDREF(DOMEventTargetHelper)
|
|
|
|
NS_IMPL_CYCLE_COLLECTING_RELEASE_WITH_LAST_RELEASE(DOMEventTargetHelper,
|
2013-07-09 17:30:58 +00:00
|
|
|
LastRelease())
|
2009-06-15 08:27:29 +00:00
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_DOMTARGET_DEFAULTS(DOMEventTargetHelper)
|
2009-06-15 08:27:29 +00:00
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::~DOMEventTargetHelper()
|
2011-12-08 08:31:14 +00:00
|
|
|
{
|
2016-01-30 17:05:36 +00:00
|
|
|
if (nsPIDOMWindowInner* owner = GetOwner()) {
|
|
|
|
nsGlobalWindow::Cast(owner)->RemoveEventTargetObject(this);
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
2011-12-08 08:31:14 +00:00
|
|
|
if (mListenerManager) {
|
|
|
|
mListenerManager->Disconnect();
|
|
|
|
}
|
2013-08-02 07:04:01 +00:00
|
|
|
ReleaseWrapper(this);
|
2011-12-08 08:31:14 +00:00
|
|
|
}
|
|
|
|
|
2012-03-13 00:56:07 +00:00
|
|
|
void
|
2016-01-30 17:05:36 +00:00
|
|
|
DOMEventTargetHelper::BindToOwner(nsPIDOMWindowInner* aOwner)
|
2012-03-13 00:56:07 +00:00
|
|
|
{
|
2013-04-04 09:30:36 +00:00
|
|
|
nsCOMPtr<nsIGlobalObject> glob = do_QueryInterface(aOwner);
|
|
|
|
BindToOwner(glob);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::BindToOwner(nsIGlobalObject* aOwner)
|
2013-04-04 09:30:36 +00:00
|
|
|
{
|
2015-01-18 03:17:06 +00:00
|
|
|
nsCOMPtr<nsIGlobalObject> parentObject = do_QueryReferent(mParentObject);
|
|
|
|
if (parentObject) {
|
2013-04-04 09:30:36 +00:00
|
|
|
if (mOwnerWindow) {
|
2016-01-30 17:05:36 +00:00
|
|
|
nsGlobalWindow::Cast(mOwnerWindow)->RemoveEventTargetObject(this);
|
2013-04-04 09:30:36 +00:00
|
|
|
mOwnerWindow = nullptr;
|
|
|
|
}
|
|
|
|
mParentObject = nullptr;
|
|
|
|
mHasOrHasHadOwnerWindow = false;
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
|
|
|
if (aOwner) {
|
2015-01-18 03:17:06 +00:00
|
|
|
mParentObject = do_GetWeakReference(aOwner);
|
|
|
|
MOZ_ASSERT(mParentObject, "All nsIGlobalObjects must support nsISupportsWeakReference");
|
2013-04-04 09:30:36 +00:00
|
|
|
// Let's cache the result of this QI for fast access and off main thread usage
|
2016-01-30 17:05:36 +00:00
|
|
|
mOwnerWindow = nsCOMPtr<nsPIDOMWindowInner>(do_QueryInterface(aOwner)).get();
|
2013-04-04 09:30:36 +00:00
|
|
|
if (mOwnerWindow) {
|
|
|
|
mHasOrHasHadOwnerWindow = true;
|
2016-01-30 17:05:36 +00:00
|
|
|
nsGlobalWindow::Cast(mOwnerWindow)->AddEventTargetObject(this);
|
2013-04-04 09:30:36 +00:00
|
|
|
}
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::BindToOwner(DOMEventTargetHelper* aOther)
|
2012-03-13 00:56:07 +00:00
|
|
|
{
|
2013-04-04 09:30:36 +00:00
|
|
|
if (mOwnerWindow) {
|
2016-01-30 17:05:36 +00:00
|
|
|
nsGlobalWindow::Cast(mOwnerWindow)->RemoveEventTargetObject(this);
|
2013-04-04 09:30:36 +00:00
|
|
|
mOwnerWindow = nullptr;
|
|
|
|
mParentObject = nullptr;
|
|
|
|
mHasOrHasHadOwnerWindow = false;
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
|
|
|
if (aOther) {
|
2013-04-04 09:30:36 +00:00
|
|
|
mHasOrHasHadOwnerWindow = aOther->HasOrHasHadOwner();
|
|
|
|
if (aOther->GetParentObject()) {
|
2015-01-18 03:17:06 +00:00
|
|
|
mParentObject = do_GetWeakReference(aOther->GetParentObject());
|
|
|
|
MOZ_ASSERT(mParentObject, "All nsIGlobalObjects must support nsISupportsWeakReference");
|
2013-04-04 09:30:36 +00:00
|
|
|
// Let's cache the result of this QI for fast access and off main thread usage
|
2016-01-30 17:05:36 +00:00
|
|
|
mOwnerWindow = nsCOMPtr<nsPIDOMWindowInner>(do_QueryInterface(aOther->GetParentObject())).get();
|
2013-04-04 09:30:36 +00:00
|
|
|
if (mOwnerWindow) {
|
|
|
|
mHasOrHasHadOwnerWindow = true;
|
2016-01-30 17:05:36 +00:00
|
|
|
nsGlobalWindow::Cast(mOwnerWindow)->AddEventTargetObject(this);
|
2013-04-04 09:30:36 +00:00
|
|
|
}
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::DisconnectFromOwner()
|
2012-03-13 00:56:07 +00:00
|
|
|
{
|
2013-04-04 09:30:36 +00:00
|
|
|
mOwnerWindow = nullptr;
|
|
|
|
mParentObject = nullptr;
|
2012-03-13 00:56:07 +00:00
|
|
|
// Event listeners can't be handled anymore, so we can release them here.
|
|
|
|
if (mListenerManager) {
|
|
|
|
mListenerManager->Disconnect();
|
2012-07-30 14:20:58 +00:00
|
|
|
mListenerManager = nullptr;
|
2012-03-13 00:56:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-20 22:04:29 +00:00
|
|
|
nsPIDOMWindowInner*
|
|
|
|
DOMEventTargetHelper::GetWindowIfCurrent() const
|
|
|
|
{
|
|
|
|
if (NS_FAILED(CheckInnerWindowCorrectness())) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return GetOwner();
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIDocument*
|
|
|
|
DOMEventTargetHelper::GetDocumentIfCurrent() const
|
|
|
|
{
|
|
|
|
nsPIDOMWindowInner* win = GetWindowIfCurrent();
|
|
|
|
if (!win) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return win->GetDoc();
|
|
|
|
}
|
|
|
|
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_IMETHODIMP
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::RemoveEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener* aListener,
|
|
|
|
bool aUseCapture)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2014-03-17 06:56:53 +00:00
|
|
|
EventListenerManager* elm = GetExistingListenerManager();
|
2009-06-15 08:27:29 +00:00
|
|
|
if (elm) {
|
2011-06-24 02:18:02 +00:00
|
|
|
elm->RemoveEventListener(aType, aListener, aUseCapture);
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2014-04-01 06:13:50 +00:00
|
|
|
NS_IMPL_REMOVE_SYSTEM_EVENT_LISTENER(DOMEventTargetHelper)
|
2011-11-25 01:09:58 +00:00
|
|
|
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_IMETHODIMP
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::AddEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener* aListener,
|
|
|
|
bool aUseCapture,
|
|
|
|
bool aWantsUntrusted,
|
|
|
|
uint8_t aOptionalArgc)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2011-06-24 02:17:59 +00:00
|
|
|
NS_ASSERTION(!aWantsUntrusted || aOptionalArgc > 1,
|
2010-01-13 13:50:01 +00:00
|
|
|
"Won't check if this is chrome, you want to set "
|
2011-10-17 14:59:28 +00:00
|
|
|
"aWantsUntrusted to false or make the aWantsUntrusted "
|
2011-06-24 02:17:59 +00:00
|
|
|
"explicit by making aOptionalArgc non-zero.");
|
2010-01-13 13:50:01 +00:00
|
|
|
|
2011-06-24 02:17:59 +00:00
|
|
|
if (aOptionalArgc < 2) {
|
2013-09-05 21:08:24 +00:00
|
|
|
nsresult rv = WantsUntrusted(&aWantsUntrusted);
|
2010-01-13 13:50:01 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
2014-03-17 06:56:53 +00:00
|
|
|
EventListenerManager* elm = GetOrCreateListenerManager();
|
2011-06-24 02:18:02 +00:00
|
|
|
NS_ENSURE_STATE(elm);
|
2011-08-18 09:45:00 +00:00
|
|
|
elm->AddEventListener(aType, aListener, aUseCapture, aWantsUntrusted);
|
|
|
|
return NS_OK;
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2013-04-16 21:16:08 +00:00
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::AddEventListener(const nsAString& aType,
|
|
|
|
EventListener* aListener,
|
2016-04-26 08:23:17 +00:00
|
|
|
const AddEventListenerOptionsOrBoolean& aOptions,
|
2014-04-01 06:13:50 +00:00
|
|
|
const Nullable<bool>& aWantsUntrusted,
|
|
|
|
ErrorResult& aRv)
|
2013-04-16 21:16:08 +00:00
|
|
|
{
|
|
|
|
bool wantsUntrusted;
|
|
|
|
if (aWantsUntrusted.IsNull()) {
|
2013-09-05 21:08:24 +00:00
|
|
|
nsresult rv = WantsUntrusted(&wantsUntrusted);
|
2013-04-16 21:16:08 +00:00
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
aRv.Throw(rv);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
wantsUntrusted = aWantsUntrusted.Value();
|
|
|
|
}
|
|
|
|
|
2014-03-17 06:56:53 +00:00
|
|
|
EventListenerManager* elm = GetOrCreateListenerManager();
|
2013-04-16 21:16:08 +00:00
|
|
|
if (!elm) {
|
|
|
|
aRv.Throw(NS_ERROR_UNEXPECTED);
|
|
|
|
return;
|
|
|
|
}
|
2016-04-26 08:23:17 +00:00
|
|
|
|
|
|
|
elm->AddEventListener(aType, aListener, aOptions, wantsUntrusted);
|
2013-04-16 21:16:08 +00:00
|
|
|
}
|
|
|
|
|
2011-11-25 01:09:58 +00:00
|
|
|
NS_IMETHODIMP
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::AddSystemEventListener(const nsAString& aType,
|
|
|
|
nsIDOMEventListener* aListener,
|
|
|
|
bool aUseCapture,
|
|
|
|
bool aWantsUntrusted,
|
|
|
|
uint8_t aOptionalArgc)
|
2011-11-25 01:09:58 +00:00
|
|
|
{
|
|
|
|
NS_ASSERTION(!aWantsUntrusted || aOptionalArgc > 1,
|
|
|
|
"Won't check if this is chrome, you want to set "
|
|
|
|
"aWantsUntrusted to false or make the aWantsUntrusted "
|
|
|
|
"explicit by making aOptionalArgc non-zero.");
|
|
|
|
|
|
|
|
if (aOptionalArgc < 2) {
|
2013-09-05 21:08:24 +00:00
|
|
|
nsresult rv = WantsUntrusted(&aWantsUntrusted);
|
2011-11-25 01:09:58 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_AddSystemEventListener(this, aType, aListener, aUseCapture,
|
|
|
|
aWantsUntrusted);
|
|
|
|
}
|
|
|
|
|
2009-06-15 08:27:29 +00:00
|
|
|
NS_IMETHODIMP
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::DispatchEvent(nsIDOMEvent* aEvent, bool* aRetVal)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
|
|
|
nsresult rv =
|
2014-03-18 04:48:21 +00:00
|
|
|
EventDispatcher::DispatchDOMEvent(this, nullptr, aEvent, nullptr, &status);
|
2009-06-15 08:27:29 +00:00
|
|
|
|
|
|
|
*aRetVal = (status != nsEventStatus_eConsumeNoDefault);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2012-09-27 20:11:31 +00:00
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::DispatchTrustedEvent(const nsAString& aEventName)
|
2012-09-27 20:11:31 +00:00
|
|
|
{
|
2015-10-18 05:24:48 +00:00
|
|
|
RefPtr<Event> event = NS_NewDOMEvent(this, nullptr, nullptr);
|
2015-11-13 00:09:42 +00:00
|
|
|
event->InitEvent(aEventName, false, false);
|
2012-09-27 20:11:31 +00:00
|
|
|
|
|
|
|
return DispatchTrustedEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::DispatchTrustedEvent(nsIDOMEvent* event)
|
2012-09-27 20:11:31 +00:00
|
|
|
{
|
2012-12-22 08:18:08 +00:00
|
|
|
event->SetTrusted(true);
|
2012-09-27 20:11:31 +00:00
|
|
|
|
|
|
|
bool dummy;
|
|
|
|
return DispatchEvent(event, &dummy);
|
|
|
|
}
|
|
|
|
|
2009-06-15 08:27:29 +00:00
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::SetEventHandler(nsIAtom* aType,
|
|
|
|
JSContext* aCx,
|
|
|
|
const JS::Value& aValue)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2015-10-18 05:24:48 +00:00
|
|
|
RefPtr<EventHandlerNonNull> handler;
|
2013-12-12 01:51:58 +00:00
|
|
|
JS::Rooted<JSObject*> callable(aCx);
|
2014-09-25 11:13:28 +00:00
|
|
|
if (aValue.isObject() && JS::IsCallable(callable = &aValue.toObject())) {
|
2015-07-24 11:00:00 +00:00
|
|
|
handler = new EventHandlerNonNull(aCx, callable, dom::GetIncumbentGlobal());
|
2012-11-09 16:00:25 +00:00
|
|
|
}
|
2013-09-17 11:01:28 +00:00
|
|
|
SetEventHandler(aType, EmptyString(), handler);
|
|
|
|
return NS_OK;
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2012-08-31 03:45:16 +00:00
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::GetEventHandler(nsIAtom* aType,
|
|
|
|
JSContext* aCx,
|
|
|
|
JS::Value* aValue)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2013-08-16 10:06:24 +00:00
|
|
|
EventHandlerNonNull* handler = GetEventHandler(aType, EmptyString());
|
2012-11-09 16:00:25 +00:00
|
|
|
if (handler) {
|
|
|
|
*aValue = JS::ObjectValue(*handler->Callable());
|
|
|
|
} else {
|
|
|
|
*aValue = JS::NullValue();
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::PreHandleEvent(EventChainPreVisitor& aVisitor)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2011-10-17 14:59:28 +00:00
|
|
|
aVisitor.mCanHandle = true;
|
2012-07-30 14:20:58 +00:00
|
|
|
aVisitor.mParentTarget = nullptr;
|
2009-06-15 08:27:29 +00:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::PostHandleEvent(EventChainPostVisitor& aVisitor)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::DispatchDOMEvent(WidgetEvent* aEvent,
|
|
|
|
nsIDOMEvent* aDOMEvent,
|
|
|
|
nsPresContext* aPresContext,
|
|
|
|
nsEventStatus* aEventStatus)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2014-03-18 04:48:21 +00:00
|
|
|
return EventDispatcher::DispatchDOMEvent(this, aEvent, aDOMEvent,
|
|
|
|
aPresContext, aEventStatus);
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2014-03-17 06:56:53 +00:00
|
|
|
EventListenerManager*
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::GetOrCreateListenerManager()
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
2013-10-22 23:32:04 +00:00
|
|
|
if (!mListenerManager) {
|
2014-03-17 06:56:53 +00:00
|
|
|
mListenerManager = new EventListenerManager(this);
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2009-06-23 11:23:52 +00:00
|
|
|
return mListenerManager;
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2014-03-17 06:56:53 +00:00
|
|
|
EventListenerManager*
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::GetExistingListenerManager() const
|
2013-10-22 23:32:04 +00:00
|
|
|
{
|
|
|
|
return mListenerManager;
|
|
|
|
}
|
|
|
|
|
2009-06-15 08:27:29 +00:00
|
|
|
nsIScriptContext*
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::GetContextForEventHandlers(nsresult* aRv)
|
2009-06-15 08:27:29 +00:00
|
|
|
{
|
|
|
|
*aRv = CheckInnerWindowCorrectness();
|
|
|
|
if (NS_FAILED(*aRv)) {
|
2012-07-30 14:20:58 +00:00
|
|
|
return nullptr;
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
2016-01-30 17:05:36 +00:00
|
|
|
nsPIDOMWindowInner* owner = GetOwner();
|
|
|
|
return owner ? nsGlobalWindow::Cast(owner)->GetContextInternal()
|
2013-04-04 09:30:36 +00:00
|
|
|
: nullptr;
|
2009-06-15 08:27:29 +00:00
|
|
|
}
|
|
|
|
|
2013-09-05 21:08:24 +00:00
|
|
|
nsresult
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::WantsUntrusted(bool* aRetVal)
|
2013-09-05 21:08:24 +00:00
|
|
|
{
|
2016-04-20 22:04:36 +00:00
|
|
|
nsresult rv = CheckInnerWindowCorrectness();
|
2013-09-05 21:08:24 +00:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2016-04-20 22:04:36 +00:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc = GetDocumentIfCurrent();
|
2013-09-05 21:08:24 +00:00
|
|
|
// We can let listeners on workers to always handle all the events.
|
|
|
|
*aRetVal = (doc && !nsContentUtils::IsChromeDoc(doc)) || !NS_IsMainThread();
|
|
|
|
return rv;
|
|
|
|
}
|
2013-11-27 15:22:16 +00:00
|
|
|
|
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::EventListenerAdded(nsIAtom* aType)
|
2013-11-27 15:22:16 +00:00
|
|
|
{
|
2014-04-01 06:13:50 +00:00
|
|
|
ErrorResult rv;
|
2013-11-27 15:22:16 +00:00
|
|
|
EventListenerWasAdded(Substring(nsDependentAtomString(aType), 2), rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2014-04-01 06:13:50 +00:00
|
|
|
DOMEventTargetHelper::EventListenerRemoved(nsIAtom* aType)
|
2013-11-27 15:22:16 +00:00
|
|
|
{
|
2014-04-01 06:13:50 +00:00
|
|
|
ErrorResult rv;
|
2013-11-27 15:22:16 +00:00
|
|
|
EventListenerWasRemoved(Substring(nsDependentAtomString(aType), 2), rv);
|
|
|
|
}
|
2014-04-01 06:13:50 +00:00
|
|
|
|
|
|
|
} // namespace mozilla
|