Commit 1300347b authored by Masayuki Nakano's avatar Masayuki Nakano
Browse files

Bug 128647 [RFE] Handler for WM_COPY/WM_CUT/WM_PASTE/WM_CLEAR r=ere+roc, sr=roc

parent 589bd34d
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
@@ -151,6 +151,8 @@
#ifdef MOZ_XUL
#include "nsTreeBodyFrame.h"
#endif
#include "nsIFocusController.h"
#include "nsIController.h"

#ifdef XP_MACOSX
#include <Carbon/Carbon.h>
@@ -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;
}
@@ -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;
}
+2 −0
Original line number Diff line number Diff line
@@ -326,6 +326,8 @@ protected:
   */
  void FillInEventFromGestureDown(nsMouseEvent* aEvent);

  nsresult DoContentCommandEvent(nsContentCommandEvent* aEvent);

  PRInt32     mLockCursor;

  nsWeakFrame mCurrentTarget;
+2 −8
Original line number Diff line number Diff line
@@ -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;
@@ -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.
+1 −5
Original line number Diff line number Diff line
@@ -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);
+1 −0
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ class nsReconversionEvent;
class nsTooltipEvent;
class nsMenuEvent;
class nsSimpleGestureEvent;
class nsContentCommandEvent;

struct nsTextEventReply;

Loading