// Hook up things to the chrome like context menus and tooltips, if the chrome // has implemented the right interfaces. NS_IMETHODIMP nsDocShellTreeOwner::AddChromeListeners() { nsresult rv = NS_OK; nsCOMPtr<nsIWebBrowserChrome> webBrowserChrome = GetWebBrowserChrome(); if (!webBrowserChrome) { return NS_ERROR_FAILURE; } // install tooltips if (!mChromeTooltipListener) { nsCOMPtr<nsITooltipListener> tooltipListener( do_QueryInterface(webBrowserChrome)); if (tooltipListener) { mChromeTooltipListener = new ChromeTooltipListener(mWebBrowser, webBrowserChrome); rv = mChromeTooltipListener->AddChromeListeners(); } } // install context menus if (!mChromeContextMenuListener) { nsCOMPtr<nsIContextMenuListener2> contextListener2( do_QueryInterface(webBrowserChrome)); nsCOMPtr<nsIContextMenuListener> contextListener( do_QueryInterface(webBrowserChrome)); if (contextListener2 || contextListener) { mChromeContextMenuListener = new ChromeContextMenuListener(mWebBrowser, webBrowserChrome); rv = mChromeContextMenuListener->AddChromeListeners(); } } // register dragover and drop event listeners with the listener manager nsCOMPtr<EventTarget> target; GetDOMEventTarget(mWebBrowser, getter_AddRefs(target)); EventListenerManager* elmP = target->GetOrCreateListenerManager(); if (elmP) { elmP->AddEventListenerByType(this, NS_LITERAL_STRING("dragover"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("drop"), TrustedEventsAtSystemGroupBubble()); } return rv; }
void nsSMILTimeValueSpec::RegisterEventListener(Element* aTarget) { MOZ_ASSERT(IsEventBased(), "Attempting to register event-listener for unexpected " "nsSMILTimeValueSpec type"); MOZ_ASSERT(mParams.mEventSymbol, "Attempting to register event-listener but there is no event " "name"); if (!aTarget) return; // When script is disabled, only allow registration for whitelisted events. if (!aTarget->GetOwnerDocument()->IsScriptEnabled() && !IsWhitelistedEvent()) { return; } if (!mEventListener) { mEventListener = new EventListener(this); } EventListenerManager* elm = aTarget->GetOrCreateListenerManager(); if (!elm) { return; } elm->AddEventListenerByType(mEventListener, nsDependentAtomString(mParams.mEventSymbol), AllEventsAtSystemGroupBubble()); }
NS_IMETHODIMP ImportLoader::OnStopRequest(nsIRequest* aRequest, nsISupports* aContext, nsresult aStatus) { // OnStartRequest throws a special error code to let us know that we // shouldn't do anything else. if (aStatus == NS_ERROR_DOM_ABORT_ERR) { // We failed in OnStartRequest, nothing more to do (we've already // dispatched an error event) just return here. MOZ_ASSERT(mStopped); return NS_OK; } if (mParserStreamListener) { mParserStreamListener->OnStopRequest(aRequest, aContext, aStatus); } if (!mDocument) { // If at this point we don't have a document, then the error was // already reported. return NS_ERROR_DOM_ABORT_ERR; } nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(mDocument); EventListenerManager* manager = eventTarget->GetOrCreateListenerManager(); manager->AddEventListenerByType(this, NS_LITERAL_STRING("DOMContentLoaded"), TrustedEventsAtSystemGroupBubble()); return NS_OK; }
NS_IMETHODIMP EventListenerService::AddSystemEventListener(EventTarget *aTarget, const nsAString& aType, JS::Handle<JS::Value> aListener, bool aUseCapture, JSContext* aCx) { MOZ_ASSERT(aTarget, "Missing target"); NS_ENSURE_TRUE(aTarget, NS_ERROR_UNEXPECTED); RefPtr<EventListener> listener = ToEventListener(aCx, aListener); if (!listener) { return NS_ERROR_UNEXPECTED; } EventListenerManager* manager = aTarget->GetOrCreateListenerManager(); NS_ENSURE_STATE(manager); EventListenerFlags flags = aUseCapture ? TrustedEventsAtSystemGroupCapture() : TrustedEventsAtSystemGroupBubble(); manager->AddEventListenerByType(listener, aType, flags); return NS_OK; }
bool HTMLEditor::CreateGrabberInternal(nsIContent& aParentContent) { if (NS_WARN_IF(mGrabber)) { return false; } mGrabber = CreateAnonymousElement(nsGkAtoms::span, aParentContent, NS_LITERAL_STRING("mozGrabber"), false); // mGrabber may be destroyed during creation due to there may be // mutation event listener. if (NS_WARN_IF(!mGrabber)) { return false; } EventListenerManager* eventListenerManager = mGrabber->GetOrCreateListenerManager(); eventListenerManager->AddEventListenerByType( mEventListener, NS_LITERAL_STRING("mousedown"), TrustedEventsAtSystemGroupBubble()); MOZ_ASSERT(mGrabber); return true; }
void DocManager::AddListeners(nsIDocument* aDocument, bool aAddDOMContentLoadedListener) { nsPIDOMWindow* window = aDocument->GetWindow(); EventTarget* target = window->GetChromeEventHandler(); EventListenerManager* elm = target->GetOrCreateListenerManager(); elm->AddEventListenerByType(this, NS_LITERAL_STRING("pagehide"), TrustedEventsAtCapture()); #ifdef A11Y_LOG if (logging::IsEnabled(logging::eDocCreate)) logging::Text("added 'pagehide' listener"); #endif if (aAddDOMContentLoadedListener) { elm->AddEventListenerByType(this, NS_LITERAL_STRING("DOMContentLoaded"), TrustedEventsAtCapture()); #ifdef A11Y_LOG if (logging::IsEnabled(logging::eDocCreate)) logging::Text("added 'DOMContentLoaded' listener"); #endif } }
// // AttachGlobalKeyHandler // // Creates a new key handler and prepares to listen to key events on the given // event receiver (either a document or an content node). If the receiver is content, // then extra work needs to be done to hook it up to the document (XXX WHY??) // nsresult nsXBLService::AttachGlobalKeyHandler(EventTarget* aTarget) { // check if the receiver is a content node (not a document), and hook // it to the document if that is the case. nsCOMPtr<EventTarget> piTarget = aTarget; nsCOMPtr<nsIContent> contentNode(do_QueryInterface(aTarget)); if (contentNode) { // Only attach if we're really in a document nsCOMPtr<nsIDocument> doc = contentNode->GetCurrentDoc(); if (doc) piTarget = doc; // We're a XUL keyset. Attach to our document. } EventListenerManager* manager = piTarget->GetOrCreateListenerManager(); if (!piTarget || !manager) return NS_ERROR_FAILURE; // the listener already exists, so skip this if (contentNode && contentNode->GetProperty(nsGkAtoms::listener)) return NS_OK; nsCOMPtr<nsIDOMElement> elt(do_QueryInterface(contentNode)); // Create the key handler RefPtr<nsXBLWindowKeyHandler> handler = NS_NewXBLWindowKeyHandler(elt, piTarget); // listen to these events manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keydown"), TrustedEventsAtSystemGroupBubble()); manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keyup"), TrustedEventsAtSystemGroupBubble()); manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keypress"), TrustedEventsAtSystemGroupBubble()); // The capturing listener is only used for XUL keysets to properly handle // shortcut keys in a multi-process environment. manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keydown"), TrustedEventsAtSystemGroupCapture()); manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keyup"), TrustedEventsAtSystemGroupCapture()); manager->AddEventListenerByType(handler, NS_LITERAL_STRING("keypress"), TrustedEventsAtSystemGroupCapture()); if (contentNode) return contentNode->SetProperty(nsGkAtoms::listener, handler.forget().take(), nsPropertyTable::SupportsDtorFunc, true); // The reference to the handler will be maintained by the event target, // and, if there is a content node, the property. return NS_OK; }
NS_IMETHODIMP EventListenerService::AddSystemEventListener(nsIDOMEventTarget *aTarget, const nsAString& aType, nsIDOMEventListener* aListener, bool aUseCapture) { NS_PRECONDITION(aTarget, "Missing target"); NS_PRECONDITION(aListener, "Missing listener"); nsCOMPtr<EventTarget> eventTarget = do_QueryInterface(aTarget); NS_ENSURE_TRUE(eventTarget, NS_ERROR_NO_INTERFACE); EventListenerManager* manager = eventTarget->GetOrCreateListenerManager(); NS_ENSURE_STATE(manager); EventListenerFlags flags = aUseCapture ? TrustedEventsAtSystemGroupCapture() : TrustedEventsAtSystemGroupBubble(); manager->AddEventListenerByType(aListener, aType, flags); return NS_OK; }
nsresult HTMLEditor::GrabberClicked() { // add a mouse move listener to the editor nsresult rv = NS_OK; if (!mMouseMotionListenerP) { EventTarget* eventTarget = GetDOMEventTarget(); if (NS_WARN_IF(!eventTarget)) { return NS_ERROR_FAILURE; } mMouseMotionListenerP = new ResizerMouseMotionListener(*this); EventListenerManager* eventListenerManager = eventTarget->GetOrCreateListenerManager(); eventListenerManager->AddEventListenerByType( mMouseMotionListenerP, NS_LITERAL_STRING("mousemove"), TrustedEventsAtSystemGroupBubble()); } mGrabberClicked = true; return rv; }
nsresult EventTarget::AddSystemEventListener(const nsAString& aType, nsIDOMEventListener* aListener, bool aUseCapture, const Nullable<bool>& aWantsUntrusted) { ErrorResult rv; bool wantsUntrusted = ComputeWantsUntrusted(aWantsUntrusted, rv); if (rv.Failed()) { return rv.StealNSResult(); } EventListenerManager* elm = GetOrCreateListenerManager(); NS_ENSURE_STATE(elm); EventListenerFlags flags; flags.mInSystemGroup = true; flags.mCapture = aUseCapture; flags.mAllowUntrustedEvents = wantsUntrusted; elm->AddEventListenerByType(aListener, aType, flags); return NS_OK; }
nsresult nsEditorEventListener::InstallToEditor() { NS_PRECONDITION(mEditor, "The caller must set mEditor"); nsCOMPtr<EventTarget> piTarget = mEditor->GetDOMEventTarget(); NS_ENSURE_TRUE(piTarget, NS_ERROR_FAILURE); // register the event listeners with the listener manager EventListenerManager* elmP = piTarget->GetOrCreateListenerManager(); NS_ENSURE_STATE(elmP); #ifdef HANDLE_NATIVE_TEXT_DIRECTION_SWITCH elmP->AddEventListenerByType(this, NS_LITERAL_STRING("keydown"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("keyup"), TrustedEventsAtSystemGroupBubble()); #endif elmP->AddEventListenerByType(this, NS_LITERAL_STRING("keypress"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("dragenter"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("dragover"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("dragexit"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("drop"), TrustedEventsAtSystemGroupBubble()); // XXX We should add the mouse event listeners as system event group. // E.g., web applications cannot prevent middle mouse paste by // preventDefault() of click event at bubble phase. // However, if we do so, all click handlers in any frames and frontend // code need to check if it's editable. It makes easier create new bugs. elmP->AddEventListenerByType(this, NS_LITERAL_STRING("mousedown"), TrustedEventsAtCapture()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("mouseup"), TrustedEventsAtCapture()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("click"), TrustedEventsAtCapture()); // Focus event doesn't bubble so adding the listener to capturing phase. // Make sure this works after bug 235441 gets fixed. elmP->AddEventListenerByType(this, NS_LITERAL_STRING("blur"), TrustedEventsAtCapture()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("focus"), TrustedEventsAtCapture()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("text"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("compositionstart"), TrustedEventsAtSystemGroupBubble()); elmP->AddEventListenerByType(this, NS_LITERAL_STRING("compositionend"), TrustedEventsAtSystemGroupBubble()); return NS_OK; }