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::RemoveSystemEventListener(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->GetExistingListenerManager(); if (manager) { EventListenerFlags flags = aUseCapture ? TrustedEventsAtSystemGroupCapture() : TrustedEventsAtSystemGroupBubble(); manager->RemoveEventListenerByType(listener, aType, flags); } 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; }
void EditorEventListener::UninstallFromEditor() { nsCOMPtr<EventTarget> piTarget = mEditorBase->GetDOMEventTarget(); if (!piTarget) { return; } EventListenerManager* elmP = piTarget->GetOrCreateListenerManager(); if (!elmP) { return; } #ifdef HANDLE_NATIVE_TEXT_DIRECTION_SWITCH elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("keydown"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("keyup"), TrustedEventsAtSystemGroupBubble()); #endif elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("keypress"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("dragenter"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("dragover"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("dragexit"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("drop"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("mousedown"), TrustedEventsAtCapture()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("mouseup"), TrustedEventsAtCapture()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("click"), TrustedEventsAtCapture()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("blur"), TrustedEventsAtCapture()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("focus"), TrustedEventsAtCapture()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("text"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("compositionstart"), TrustedEventsAtSystemGroupBubble()); elmP->RemoveEventListenerByType(this, NS_LITERAL_STRING("compositionend"), TrustedEventsAtSystemGroupBubble()); }
nsresult EditorEventListener::InstallToEditor() { NS_PRECONDITION(mEditorBase, "The caller must set mEditorBase"); nsCOMPtr<EventTarget> piTarget = mEditorBase->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; }