Loading content/events/src/nsEventStateManager.cpp +65 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,8 @@ #ifdef MOZ_XUL #include "nsTreeBodyFrame.h" #endif #include "nsIFocusController.h" #include "nsIController.h" #ifdef XP_MACOSX #include <Carbon/Carbon.h> Loading Loading @@ -1195,6 +1197,16 @@ nsEventStateManager::PreHandleEvent(nsPresContext* aPresContext, handler.OnSelectionEvent((nsSelectionEvent*)aEvent); } break; case NS_CONTENT_COMMAND_CUT: case NS_CONTENT_COMMAND_COPY: case NS_CONTENT_COMMAND_PASTE: case NS_CONTENT_COMMAND_DELETE: case NS_CONTENT_COMMAND_UNDO: case NS_CONTENT_COMMAND_REDO: { DoContentCommandEvent(static_cast<nsContentCommandEvent*>(aEvent)); } break; } return NS_OK; } Loading Loading @@ -4205,3 +4217,56 @@ nsEventStateManager::IsShellVisible(nsIDocShell* aShell) return isVisible; } nsresult nsEventStateManager::DoContentCommandEvent(nsContentCommandEvent* aEvent) { EnsureDocument(mPresContext); NS_ENSURE_TRUE(mDocument, NS_ERROR_FAILURE); nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(mDocument->GetWindow())); NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); nsIFocusController* fc = window->GetRootFocusController(); NS_ENSURE_TRUE(fc, NS_ERROR_FAILURE); const char* cmd; switch (aEvent->message) { case NS_CONTENT_COMMAND_CUT: cmd = "cmd_cut"; break; case NS_CONTENT_COMMAND_COPY: cmd = "cmd_copy"; break; case NS_CONTENT_COMMAND_PASTE: cmd = "cmd_paste"; break; case NS_CONTENT_COMMAND_DELETE: cmd = "cmd_delete"; break; case NS_CONTENT_COMMAND_UNDO: cmd = "cmd_undo"; break; case NS_CONTENT_COMMAND_REDO: cmd = "cmd_redo"; break; default: return NS_ERROR_NOT_IMPLEMENTED; } nsCOMPtr<nsIController> controller; nsresult rv = fc->GetControllerForCommand(cmd, getter_AddRefs(controller)); NS_ENSURE_SUCCESS(rv, rv); if (!controller) { // When GetControllerForCommand succeeded but there is no controller, the // command isn't supported. aEvent->mIsEnabled = PR_FALSE; } else { PRBool canDoIt; rv = controller->IsCommandEnabled(cmd, &canDoIt); NS_ENSURE_SUCCESS(rv, rv); aEvent->mIsEnabled = canDoIt; if (canDoIt && !aEvent->mOnlyEnabledCheck) { rv = controller->DoCommand(cmd); NS_ENSURE_SUCCESS(rv, rv); } } aEvent->mSucceeded = PR_TRUE; return NS_OK; } content/events/src/nsEventStateManager.h +2 −0 Original line number Diff line number Diff line Loading @@ -326,6 +326,8 @@ protected: */ void FillInEventFromGestureDown(nsMouseEvent* aEvent); nsresult DoContentCommandEvent(nsContentCommandEvent* aEvent); PRInt32 mLockCursor; nsWeakFrame mCurrentTarget; Loading layout/base/nsPresShell.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -5972,10 +5972,7 @@ PresShell::HandleEvent(nsIView *aView, #endif // key and IME events must be targeted at the presshell for the focused frame if (!sDontRetargetEvents && (NS_IS_KEY_EVENT(aEvent) || NS_IS_IME_EVENT(aEvent) || NS_IS_QUERY_CONTENT_EVENT(aEvent) || NS_IS_SELECTION_EVENT(aEvent) || NS_IS_CONTEXT_MENU_KEY(aEvent))) { if (!sDontRetargetEvents && NS_IsEventTargetedAtFocusedWindow(aEvent)) { nsIFocusManager* fm = nsFocusManager::GetFocusManager(); if (!fm) return NS_ERROR_FAILURE; Loading Loading @@ -6060,10 +6057,7 @@ PresShell::HandleEvent(nsIView *aView, nsIFrame* frame = static_cast<nsIFrame*>(aView->GetClientData()); PRBool dispatchUsingCoordinates = !NS_IS_KEY_EVENT(aEvent) && !NS_IS_IME_EVENT(aEvent) && !NS_IS_CONTEXT_MENU_KEY(aEvent) && !NS_IS_FOCUS_EVENT(aEvent) && !NS_IS_PLUGIN_EVENT(aEvent); PRBool dispatchUsingCoordinates = NS_IsEventUsingCoordinates(aEvent); // if this event has no frame, we need to retarget it at a parent // view that has a frame. Loading view/src/nsViewManager.cpp +1 −5 Original line number Diff line number Diff line Loading @@ -1101,11 +1101,7 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsView* view = baseView; PRBool capturedEvent = PR_FALSE; if (!NS_IS_KEY_EVENT(aEvent) && !NS_IS_IME_EVENT(aEvent) && !NS_IS_CONTEXT_MENU_KEY(aEvent) && !NS_IS_FOCUS_EVENT(aEvent) && !NS_IS_QUERY_CONTENT_EVENT(aEvent) && !NS_IS_PLUGIN_EVENT(aEvent) && !NS_IS_SELECTION_EVENT(aEvent) && aEvent->eventStructType != NS_ACCESSIBLE_EVENT) { if (NS_IsEventUsingCoordinates(aEvent)) { // will dispatch using coordinates. Pretty bogus but it's consistent // with what presshell does. view = GetDisplayRootFor(baseView); Loading widget/public/nsEvent.h +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ class nsReconversionEvent; class nsTooltipEvent; class nsMenuEvent; class nsSimpleGestureEvent; class nsContentCommandEvent; struct nsTextEventReply; Loading Loading
content/events/src/nsEventStateManager.cpp +65 −0 Original line number Diff line number Diff line Loading @@ -151,6 +151,8 @@ #ifdef MOZ_XUL #include "nsTreeBodyFrame.h" #endif #include "nsIFocusController.h" #include "nsIController.h" #ifdef XP_MACOSX #include <Carbon/Carbon.h> Loading Loading @@ -1195,6 +1197,16 @@ nsEventStateManager::PreHandleEvent(nsPresContext* aPresContext, handler.OnSelectionEvent((nsSelectionEvent*)aEvent); } break; case NS_CONTENT_COMMAND_CUT: case NS_CONTENT_COMMAND_COPY: case NS_CONTENT_COMMAND_PASTE: case NS_CONTENT_COMMAND_DELETE: case NS_CONTENT_COMMAND_UNDO: case NS_CONTENT_COMMAND_REDO: { DoContentCommandEvent(static_cast<nsContentCommandEvent*>(aEvent)); } break; } return NS_OK; } Loading Loading @@ -4205,3 +4217,56 @@ nsEventStateManager::IsShellVisible(nsIDocShell* aShell) return isVisible; } nsresult nsEventStateManager::DoContentCommandEvent(nsContentCommandEvent* aEvent) { EnsureDocument(mPresContext); NS_ENSURE_TRUE(mDocument, NS_ERROR_FAILURE); nsCOMPtr<nsPIDOMWindow> window(do_QueryInterface(mDocument->GetWindow())); NS_ENSURE_TRUE(window, NS_ERROR_FAILURE); nsIFocusController* fc = window->GetRootFocusController(); NS_ENSURE_TRUE(fc, NS_ERROR_FAILURE); const char* cmd; switch (aEvent->message) { case NS_CONTENT_COMMAND_CUT: cmd = "cmd_cut"; break; case NS_CONTENT_COMMAND_COPY: cmd = "cmd_copy"; break; case NS_CONTENT_COMMAND_PASTE: cmd = "cmd_paste"; break; case NS_CONTENT_COMMAND_DELETE: cmd = "cmd_delete"; break; case NS_CONTENT_COMMAND_UNDO: cmd = "cmd_undo"; break; case NS_CONTENT_COMMAND_REDO: cmd = "cmd_redo"; break; default: return NS_ERROR_NOT_IMPLEMENTED; } nsCOMPtr<nsIController> controller; nsresult rv = fc->GetControllerForCommand(cmd, getter_AddRefs(controller)); NS_ENSURE_SUCCESS(rv, rv); if (!controller) { // When GetControllerForCommand succeeded but there is no controller, the // command isn't supported. aEvent->mIsEnabled = PR_FALSE; } else { PRBool canDoIt; rv = controller->IsCommandEnabled(cmd, &canDoIt); NS_ENSURE_SUCCESS(rv, rv); aEvent->mIsEnabled = canDoIt; if (canDoIt && !aEvent->mOnlyEnabledCheck) { rv = controller->DoCommand(cmd); NS_ENSURE_SUCCESS(rv, rv); } } aEvent->mSucceeded = PR_TRUE; return NS_OK; }
content/events/src/nsEventStateManager.h +2 −0 Original line number Diff line number Diff line Loading @@ -326,6 +326,8 @@ protected: */ void FillInEventFromGestureDown(nsMouseEvent* aEvent); nsresult DoContentCommandEvent(nsContentCommandEvent* aEvent); PRInt32 mLockCursor; nsWeakFrame mCurrentTarget; Loading
layout/base/nsPresShell.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -5972,10 +5972,7 @@ PresShell::HandleEvent(nsIView *aView, #endif // key and IME events must be targeted at the presshell for the focused frame if (!sDontRetargetEvents && (NS_IS_KEY_EVENT(aEvent) || NS_IS_IME_EVENT(aEvent) || NS_IS_QUERY_CONTENT_EVENT(aEvent) || NS_IS_SELECTION_EVENT(aEvent) || NS_IS_CONTEXT_MENU_KEY(aEvent))) { if (!sDontRetargetEvents && NS_IsEventTargetedAtFocusedWindow(aEvent)) { nsIFocusManager* fm = nsFocusManager::GetFocusManager(); if (!fm) return NS_ERROR_FAILURE; Loading Loading @@ -6060,10 +6057,7 @@ PresShell::HandleEvent(nsIView *aView, nsIFrame* frame = static_cast<nsIFrame*>(aView->GetClientData()); PRBool dispatchUsingCoordinates = !NS_IS_KEY_EVENT(aEvent) && !NS_IS_IME_EVENT(aEvent) && !NS_IS_CONTEXT_MENU_KEY(aEvent) && !NS_IS_FOCUS_EVENT(aEvent) && !NS_IS_PLUGIN_EVENT(aEvent); PRBool dispatchUsingCoordinates = NS_IsEventUsingCoordinates(aEvent); // if this event has no frame, we need to retarget it at a parent // view that has a frame. Loading
view/src/nsViewManager.cpp +1 −5 Original line number Diff line number Diff line Loading @@ -1101,11 +1101,7 @@ NS_IMETHODIMP nsViewManager::DispatchEvent(nsGUIEvent *aEvent, nsView* view = baseView; PRBool capturedEvent = PR_FALSE; if (!NS_IS_KEY_EVENT(aEvent) && !NS_IS_IME_EVENT(aEvent) && !NS_IS_CONTEXT_MENU_KEY(aEvent) && !NS_IS_FOCUS_EVENT(aEvent) && !NS_IS_QUERY_CONTENT_EVENT(aEvent) && !NS_IS_PLUGIN_EVENT(aEvent) && !NS_IS_SELECTION_EVENT(aEvent) && aEvent->eventStructType != NS_ACCESSIBLE_EVENT) { if (NS_IsEventUsingCoordinates(aEvent)) { // will dispatch using coordinates. Pretty bogus but it's consistent // with what presshell does. view = GetDisplayRootFor(baseView); Loading
widget/public/nsEvent.h +1 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ class nsReconversionEvent; class nsTooltipEvent; class nsMenuEvent; class nsSimpleGestureEvent; class nsContentCommandEvent; struct nsTextEventReply; Loading