gecko/dom/interfaces/events/nsIDOMEventTarget.idl
Boris Zbarsky 224115946f Bug 742217. Reduce the use of nested namespaces in our binding code. r=peterv,bent
In the new setup, all per-interface DOM binding files are exported into
mozilla/dom.  General files not specific to an interface are also exported into
mozilla/dom.

In terms of namespaces, most things now live in mozilla::dom.  Each interface
Foo that has generated code has a mozilla::dom::FooBinding namespace for said
generated code (and possibly a mozilla::bindings::FooBinding_workers if there's
separate codegen for workers).

IDL enums are a bit weird: since the name of the enum and the names of its
entries all end up in the same namespace, we still generate a C++ namespace
with the name of the IDL enum type with "Values" appended to it, with a
::valuelist inside for the actual C++ enum.  We then typedef
EnumFooValues::valuelist to EnumFoo.  That makes it a bit more difficult to
refer to the values, but means that values from different enums don't collide
with each other.

The enums with the proto and constructor IDs in them now live under the
mozilla::dom::prototypes and mozilla::dom::constructors namespaces respectively.
Again, this lets us deal sanely with the whole "enum value names are flattened
into the namespace the enum is in" deal.

The main benefit of this setup (and the reason "Binding" got appended to the
per-interface namespaces) is that this way "using mozilla::dom" should Just
Work for consumers and still allow C++ code to sanely use the IDL interface
names for concrete classes, which is fairly desirable.

--HG--
rename : dom/bindings/Utils.cpp => dom/bindings/BindingUtils.cpp
rename : dom/bindings/Utils.h => dom/bindings/BindingUtils.h
2012-05-03 00:35:38 -04:00

348 lines
15 KiB
Plaintext

/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 2000
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Tom Pixley <joki@netscape.com> (original author)
* Johnny Stenback <jst@netscape.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either of the GNU General Public License Version 2 or later (the "GPL"),
* or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#include "domstubs.idl"
%{C++
#include "nsEvent.h"
#include "mozilla/dom/Nullable.h"
using mozilla::dom::Nullable;
class nsPresContext;
class nsEventChainPreVisitor;
class nsEventChainPostVisitor;
struct JSContext;
class nsEventListenerManager;
%}
/**
* The nsIDOMEventTarget interface is the interface implemented by all
* event targets in the Document Object Model.
*
* For more information on this interface please see
* http://www.w3.org/TR/DOM-Level-2-Events/
*/
[ref] native nsEventChainPreVisitorRef(nsEventChainPreVisitor);
[ref] native nsEventChainPostVisitorRef(nsEventChainPostVisitor);
[ptr] native nsEventPtr(nsEvent);
[ptr] native nsPresContextPtr(nsPresContext);
[ptr] native nsEventStatusPtr(nsEventStatus);
[ptr] native JSContextPtr(JSContext);
[ptr] native nsEventListenerManagerPtr(nsEventListenerManager);
interface nsIScriptContext;
interface nsIDOMEventListener;
interface nsIDOMEvent;
[scriptable, builtinclass, uuid(8e375931-298d-4d0a-9cb4-5668f0cdc5a8)]
interface nsIDOMEventTarget : nsISupports
{
/**
* This method allows the registration of event listeners on the event target.
* If an EventListener is added to an EventTarget while it is processing an
* event, it will not be triggered by the current actions but may be
* triggered during a later stage of event flow, such as the bubbling phase.
*
* If multiple identical EventListeners are registered on the same
* EventTarget with the same parameters the duplicate instances are
* discarded. They do not cause the EventListener to be called twice
* and since they are discarded they do not need to be removed with the
* removeEventListener method.
*
* @param type The event type for which the user is registering
* @param listener The listener parameter takes an interface
* implemented by the user which contains the methods
* to be called when the event occurs.
* @param useCapture If true, useCapture indicates that the user
* wishes to initiate capture. After initiating
* capture, all events of the specified type will be
* dispatched to the registered EventListener before
* being dispatched to any EventTargets beneath them
* in the tree. Events which are bubbling upward
* through the tree will not trigger an
* EventListener designated to use capture.
* @param wantsUntrusted If false, the listener will not receive any
* untrusted events (see above), if true, the
* listener will receive events whether or not
* they're trusted
*/
[optional_argc] void addEventListener(in DOMString type,
in nsIDOMEventListener listener,
[optional] in boolean useCapture,
[optional] in boolean wantsUntrusted);
/**
* addSystemEventListener() adds an event listener of aType to the system
* group. Typically, core code should use system group for listening to
* content (i.e., non-chrome) element's events. If core code uses
* nsIDOMEventTarget::AddEventListener for a content node, it means
* that the listener cannot listen the event when web content calls
* stopPropagation() of the event.
*
* @param aType An event name you're going to handle.
* @param aListener An event listener.
* @param aUseCapture TRUE if you want to listen the event in capturing
* phase. Otherwise, FALSE.
* @param aWantsUntrusted TRUE if you want to handle untrusted events.
* Otherwise, FALSE.
* @return NS_OK if succeed. Otherwise, NS_ERROR_*.
*/
[noscript, optional_argc] void addSystemEventListener(
in DOMString type,
in nsIDOMEventListener listener,
[optional] in boolean aUseCapture,
[optional] in boolean aWantsUntrusted);
%{C++
// non-virtual so it won't affect the vtable
nsresult AddEventListener(const nsAString& aType,
nsIDOMEventListener* aListener,
bool aUseCapture)
{
return AddEventListener(aType, aListener, aUseCapture, PR_FALSE, 1);
}
// non-virtual so it won't affect the vtable
nsresult AddEventListener(const nsAString& aType,
nsIDOMEventListener* aListener,
bool aUseCapture,
bool aWantsUntrusted)
{
return AddEventListener(aType, aListener, aUseCapture, aWantsUntrusted, 2);
}
// non-virtual so it won't affect the vtable
nsresult AddSystemEventListener(const nsAString& aType,
nsIDOMEventListener* aListener,
bool aUseCapture)
{
return AddSystemEventListener(aType, aListener, aUseCapture, PR_FALSE, 1);
}
// non-virtual so it won't affect the vtable
nsresult AddSystemEventListener(const nsAString& aType,
nsIDOMEventListener* aListener,
bool aUseCapture,
bool aWantsUntrusted)
{
return AddSystemEventListener(aType, aListener, aUseCapture,
aWantsUntrusted, 2);
}
%}
/**
* This method allows the removal of event listeners from the event
* target. If an EventListener is removed from an EventTarget while it
* is processing an event, it will not be triggered by the current actions.
* EventListeners can never be invoked after being removed.
* Calling removeEventListener with arguments which do not identify any
* currently registered EventListener on the EventTarget has no effect.
*
* @param type Specifies the event type of the EventListener being
* removed.
* @param listener The EventListener parameter indicates the
* EventListener to be removed.
* @param useCapture Specifies whether the EventListener being
* removed was registered as a capturing listener or
* not. If a listener was registered twice, one with
* capture and one without, each must be removed
* separately. Removal of a capturing listener does
* not affect a non-capturing version of the same
* listener, and vice versa.
*/
void removeEventListener(in DOMString type,
in nsIDOMEventListener listener,
[optional] in boolean useCapture);
/**
* removeSystemEventListener() should be used if you have used
* addSystemEventListener().
*/
[noscript] void removeSystemEventListener(
in DOMString type,
in nsIDOMEventListener listener,
[optional] in boolean aUseCapture);
/**
* This method allows the dispatch of events into the implementations
* event model. Events dispatched in this manner will have the same
* capturing and bubbling behavior as events dispatched directly by the
* implementation. The target of the event is the EventTarget on which
* dispatchEvent is called.
*
* @param evt Specifies the event type, behavior, and contextual
* information to be used in processing the event.
* @return Indicates whether any of the listeners which handled the
* event called preventDefault. If preventDefault was called
* the value is false, else the value is true.
* @throws INVALID_STATE_ERR: Raised if the Event's type was
* not specified by initializing the event before
* dispatchEvent was called. Specification of the Event's
* type as null or an empty string will also trigger this
* exception.
*/
boolean dispatchEvent(in nsIDOMEvent evt)
raises(DOMException);
/**
* Returns the nsPIDOMEventTarget object which should be used as the target
* of DOMEvents.
* Usually |this| is returned, but for example global object returns
* the outer object.
*/
[notxpcom, nostdcall] nsIDOMEventTarget GetTargetForDOMEvent();
/**
* Returns the nsPIDOMEventTarget object which should be used as the target
* of the event and when constructing event target chain.
* Usually |this| is returned, but for example global object returns
* the inner object.
*/
[notxpcom, nostdcall] nsIDOMEventTarget GetTargetForEventTargetChain();
/**
* Called before the capture phase of the event flow.
* This is used to create the event target chain and implementations
* should set the necessary members of nsEventChainPreVisitor.
* At least aVisitor.mCanHandle must be set,
* usually also aVisitor.mParentTarget if mCanHandle is PR_TRUE.
* First one tells that this object can handle the aVisitor.mEvent event and
* the latter one is the possible parent object for the event target chain.
* @see nsEventDispatcher.h for more documentation about aVisitor.
*
* @param aVisitor the visitor object which is used to create the
* event target chain for event dispatching.
*
* @note Only nsEventDispatcher should call this method.
*/
[noscript, nostdcall]
void PreHandleEvent(in nsEventChainPreVisitorRef aVisitor);
/**
* If nsEventChainPreVisitor.mWantsWillHandleEvent is set PR_TRUE,
* called just before possible event handlers on this object will be called.
*/
[noscript, nostdcall]
void WillHandleEvent(in nsEventChainPostVisitorRef aVisitor);
/**
* Called after the bubble phase of the system event group.
* The default handling of the event should happen here.
* @param aVisitor the visitor object which is used during post handling.
*
* @see nsEventDispatcher.h for documentation about aVisitor.
* @note Only nsEventDispatcher should call this method.
*/
[noscript, nostdcall]
void PostHandleEvent(in nsEventChainPostVisitorRef aVisitor);
/**
* Dispatch an event.
* @param aEvent the event that is being dispatched.
* @param aDOMEvent the event that is being dispatched, use if you want to
* dispatch nsIDOMEvent, not only nsEvent.
* @param aPresContext the current presentation context, can be nsnull.
* @param aEventStatus the status returned from the function, can be nsnull.
*
* @note If both aEvent and aDOMEvent are used, aEvent must be the internal
* event of the aDOMEvent.
*
* If aDOMEvent is not nsnull (in which case aEvent can be nsnull) it is used
* for dispatching, otherwise aEvent is used.
*
* @deprecated This method is here just until all the callers outside Gecko
* have been converted to use nsIDOMEventTarget::dispatchEvent.
*/
[noscript, nostdcall]
void DispatchDOMEvent(in nsEventPtr aEvent,
in nsIDOMEvent aDOMEvent,
in nsPresContextPtr aPresContext,
in nsEventStatusPtr aEventStatus);
/**
* Get the event listener manager, the guy you talk to to register for events
* on this node.
* @param aMayCreate If PR_FALSE, returns a listener manager only if
* one already exists.
*/
[notxpcom, nostdcall]
nsEventListenerManagerPtr GetListenerManager(in boolean aMayCreate);
/**
* Get the script context in which the event handlers should be run.
* May return null.
* @note Caller *must* check the value of aRv.
*/
[notxpcom, nostdcall]
nsIScriptContext GetContextForEventHandlers(out nsresult aRv);
/**
* If the method above returns null, but a success code, this method
* is called.
*/
[notxpcom, nostdcall] JSContextPtr GetJSContextForEventHandlers();
};
%{C++
typedef nsIDOMEventTarget nsPIDOMEventTarget;
#define NS_IMPL_DOMTARGET_DEFAULTS(_class) \
nsPIDOMEventTarget* _class::GetTargetForDOMEvent() { return this; } \
nsPIDOMEventTarget* _class::GetTargetForEventTargetChain() { return this; } \
nsresult _class::WillHandleEvent(nsEventChainPostVisitor& aVisitor) { return NS_OK; } \
JSContext* _class::GetJSContextForEventHandlers() { return nsnull; }
#define NS_IMPL_REMOVE_SYSTEM_EVENT_LISTENER(aClass) \
NS_IMETHODIMP \
aClass::RemoveSystemEventListener(const nsAString& aType, \
nsIDOMEventListener *aListener, \
bool aUseCapture) \
{ \
nsEventListenerManager* listenerManager = GetListenerManager(false); \
if (!listenerManager) { \
return NS_OK; \
} \
PRUint32 flags = NS_EVENT_FLAG_SYSTEM_EVENT; \
flags |= aUseCapture ? NS_EVENT_FLAG_CAPTURE : NS_EVENT_FLAG_BUBBLE; \
listenerManager->RemoveEventListenerByType(aListener, aType, flags); \
return NS_OK; \
}
%}