| Index: ash/sticky_keys/sticky_keys_controller.cc
 | 
| diff --git a/ash/sticky_keys/sticky_keys_controller.cc b/ash/sticky_keys/sticky_keys_controller.cc
 | 
| index abbcaf443bd72cc5aa6cb43547077f1e0f2acce7..d3257a8adbe291f4094708eaea93a86d27b6e030 100644
 | 
| --- a/ash/sticky_keys/sticky_keys_controller.cc
 | 
| +++ b/ash/sticky_keys/sticky_keys_controller.cc
 | 
| @@ -25,18 +25,20 @@ bool ShouldModifyMouseEvent(const ui::MouseEvent& event) {
 | 
|  }
 | 
|  
 | 
|  // Handle the common tail of event rewriting.
 | 
| -ui::EventRewriteStatus RewriteUpdate(bool consumed,
 | 
| -                                     bool released,
 | 
| -                                     int mod_down_flags,
 | 
| -                                     int* flags) {
 | 
| -  int changed_down_flags = mod_down_flags & ~*flags;
 | 
| -  *flags |= mod_down_flags;
 | 
| +ui::EventRewriteStatus RewriteUpdate(
 | 
| +    bool consumed,
 | 
| +    bool released,
 | 
| +    int mod_down_flags,
 | 
| +    const ui::Event& event,
 | 
| +    std::unique_ptr<ui::Event>* rewritten_event) {
 | 
|    if (consumed)
 | 
|      return ui::EVENT_REWRITE_DISCARD;
 | 
| -  if (released)
 | 
| -    return ui::EVENT_REWRITE_DISPATCH_ANOTHER;
 | 
| -  if (changed_down_flags)
 | 
| -    return ui::EVENT_REWRITE_REWRITTEN;
 | 
| +  if (mod_down_flags & ~event.flags()) {
 | 
| +    *rewritten_event = ui::Event::Clone(event);
 | 
| +    (*rewritten_event)->set_flags(event.flags() | mod_down_flags);
 | 
| +    return released ? ui::EVENT_REWRITE_DISPATCH_ANOTHER
 | 
| +                    : ui::EVENT_REWRITE_REWRITTEN;
 | 
| +  }
 | 
|    return ui::EVENT_REWRITE_CONTINUE;
 | 
|  }
 | 
|  
 | 
| @@ -82,84 +84,32 @@ void StickyKeysController::SetModifiersEnabled(bool mod3_enabled,
 | 
|    }
 | 
|  }
 | 
|  
 | 
| -bool StickyKeysController::HandleKeyEvent(const ui::KeyEvent& event,
 | 
| -                                          ui::KeyboardCode key_code,
 | 
| -                                          int* mod_down_flags,
 | 
| -                                          bool* released) {
 | 
| -  return shift_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                           released) ||
 | 
| -         alt_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                         released) ||
 | 
| -         altgr_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                           released) ||
 | 
| -         ctrl_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                          released) ||
 | 
| -         mod3_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                          released) ||
 | 
| -         search_sticky_key_->HandleKeyEvent(event, key_code, mod_down_flags,
 | 
| -                                            released);
 | 
| -}
 | 
| -
 | 
| -bool StickyKeysController::HandleMouseEvent(const ui::MouseEvent& event,
 | 
| -                                            int* mod_down_flags,
 | 
| -                                            bool* released) {
 | 
| -  return shift_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) ||
 | 
| -         alt_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) ||
 | 
| -         altgr_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) ||
 | 
| -         ctrl_sticky_key_->HandleMouseEvent(event, mod_down_flags, released) ||
 | 
| -         mod3_sticky_key_->HandleMouseEvent(event, mod_down_flags, released);
 | 
| -}
 | 
| -
 | 
| -bool StickyKeysController::HandleScrollEvent(const ui::ScrollEvent& event,
 | 
| -                                             int* mod_down_flags,
 | 
| -                                             bool* released) {
 | 
| -  return shift_sticky_key_->HandleScrollEvent(event, mod_down_flags,
 | 
| -                                              released) ||
 | 
| -         alt_sticky_key_->HandleScrollEvent(event, mod_down_flags, released) ||
 | 
| -         altgr_sticky_key_->HandleScrollEvent(event, mod_down_flags,
 | 
| -                                              released) ||
 | 
| -         ctrl_sticky_key_->HandleScrollEvent(event, mod_down_flags, released) ||
 | 
| -         mod3_sticky_key_->HandleScrollEvent(event, mod_down_flags, released);
 | 
| +StickyKeysOverlay* StickyKeysController::GetOverlayForTest() {
 | 
| +  return overlay_.get();
 | 
|  }
 | 
|  
 | 
| -ui::EventRewriteStatus StickyKeysController::RewriteKeyEvent(
 | 
| -    const ui::KeyEvent& event,
 | 
| -    ui::KeyboardCode key_code,
 | 
| -    int* flags) {
 | 
| +ui::EventRewriteStatus StickyKeysController::RewriteEvent(
 | 
| +    const ui::Event& event,
 | 
| +    std::unique_ptr<ui::Event>* rewritten_event) {
 | 
| +  DCHECK(rewritten_event);
 | 
|    if (!enabled_)
 | 
|      return ui::EVENT_REWRITE_CONTINUE;
 | 
| -  int mod_down_flags = 0;
 | 
| -  bool released = false;
 | 
| -  bool consumed = HandleKeyEvent(event, key_code, &mod_down_flags, &released);
 | 
| -  UpdateOverlay();
 | 
| -  return RewriteUpdate(consumed, released, mod_down_flags, flags);
 | 
| -}
 | 
|  
 | 
| -ui::EventRewriteStatus StickyKeysController::RewriteMouseEvent(
 | 
| -    const ui::MouseEvent& event,
 | 
| -    int* flags) {
 | 
| -  if (!enabled_)
 | 
| -    return ui::EVENT_REWRITE_CONTINUE;
 | 
| -  int mod_down_flags = 0;
 | 
| -  bool released = false;
 | 
| -  bool consumed = HandleMouseEvent(event, &mod_down_flags, &released);
 | 
| -  UpdateOverlay();
 | 
| -  return RewriteUpdate(consumed, released, mod_down_flags, flags);
 | 
| -}
 | 
| +  if (event.IsKeyEvent())
 | 
| +    return RewriteKeyEvent(*event.AsKeyEvent(), rewritten_event);
 | 
|  
 | 
| -ui::EventRewriteStatus StickyKeysController::RewriteScrollEvent(
 | 
| -    const ui::ScrollEvent& event,
 | 
| -    int* flags) {
 | 
| -  if (!enabled_)
 | 
| -    return ui::EVENT_REWRITE_CONTINUE;
 | 
| -  int mod_down_flags = 0;
 | 
| -  bool released = false;
 | 
| -  bool consumed = HandleScrollEvent(event, &mod_down_flags, &released);
 | 
| -  UpdateOverlay();
 | 
| -  return RewriteUpdate(consumed, released, mod_down_flags, flags);
 | 
| +  if (event.IsMouseEvent())
 | 
| +    return RewriteMouseEvent(*event.AsMouseEvent(), rewritten_event);
 | 
| +
 | 
| +  if (event.IsScrollEvent())
 | 
| +    return RewriteScrollEvent(*event.AsScrollEvent(), rewritten_event);
 | 
| +
 | 
| +  NOTREACHED();
 | 
| +  return ui::EVENT_REWRITE_CONTINUE;
 | 
|  }
 | 
|  
 | 
|  ui::EventRewriteStatus StickyKeysController::NextDispatchEvent(
 | 
| +    const ui::Event& last_event,
 | 
|      std::unique_ptr<ui::Event>* new_event) {
 | 
|    DCHECK(new_event);
 | 
|    new_event->reset();
 | 
| @@ -176,6 +126,56 @@ ui::EventRewriteStatus StickyKeysController::NextDispatchEvent(
 | 
|    return ui::EVENT_REWRITE_REWRITTEN;
 | 
|  }
 | 
|  
 | 
| +ui::EventRewriteStatus StickyKeysController::RewriteKeyEvent(
 | 
| +    const ui::KeyEvent& event,
 | 
| +    std::unique_ptr<ui::Event>* rewritten_event) {
 | 
| +  DCHECK(enabled_);
 | 
| +  int mod_down_flags = 0;
 | 
| +  bool released = false;
 | 
| +  bool consumed =
 | 
| +      shift_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
 | 
| +      alt_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
 | 
| +      altgr_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
 | 
| +      ctrl_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
 | 
| +      mod3_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released) ||
 | 
| +      search_sticky_key_->HandleKeyEvent(event, &mod_down_flags, &released);
 | 
| +  UpdateOverlay();
 | 
| +  return RewriteUpdate(consumed, released, mod_down_flags, event,
 | 
| +                       rewritten_event);
 | 
| +}
 | 
| +
 | 
| +ui::EventRewriteStatus StickyKeysController::RewriteMouseEvent(
 | 
| +    const ui::MouseEvent& event,
 | 
| +    std::unique_ptr<ui::Event>* rewritten_event) {
 | 
| +  DCHECK(enabled_);
 | 
| +  int mod_down_flags = 0;
 | 
| +  bool released = false;
 | 
| +  bool consumed =
 | 
| +      shift_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
 | 
| +      alt_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
 | 
| +      altgr_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
 | 
| +      ctrl_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released) ||
 | 
| +      mod3_sticky_key_->HandleMouseEvent(event, &mod_down_flags, &released);
 | 
| +  return RewriteUpdate(consumed, released, mod_down_flags, event,
 | 
| +                       rewritten_event);
 | 
| +}
 | 
| +
 | 
| +ui::EventRewriteStatus StickyKeysController::RewriteScrollEvent(
 | 
| +    const ui::ScrollEvent& event,
 | 
| +    std::unique_ptr<ui::Event>* rewritten_event) {
 | 
| +  DCHECK(enabled_);
 | 
| +  int mod_down_flags = 0;
 | 
| +  bool released = false;
 | 
| +  bool consumed =
 | 
| +      shift_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
 | 
| +      alt_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
 | 
| +      altgr_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
 | 
| +      ctrl_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released) ||
 | 
| +      mod3_sticky_key_->HandleScrollEvent(event, &mod_down_flags, &released);
 | 
| +  return RewriteUpdate(consumed, released, mod_down_flags, event,
 | 
| +                       rewritten_event);
 | 
| +}
 | 
| +
 | 
|  void StickyKeysController::UpdateOverlay() {
 | 
|    overlay_->SetModifierKeyState(ui::EF_SHIFT_DOWN,
 | 
|                                  shift_sticky_key_->current_state());
 | 
| @@ -201,10 +201,6 @@ void StickyKeysController::UpdateOverlay() {
 | 
|    overlay_->Show(enabled_ && key_in_use);
 | 
|  }
 | 
|  
 | 
| -StickyKeysOverlay* StickyKeysController::GetOverlayForTest() {
 | 
| -  return overlay_.get();
 | 
| -}
 | 
| -
 | 
|  ///////////////////////////////////////////////////////////////////////////////
 | 
|  //  StickyKeysHandler
 | 
|  StickyKeysHandler::StickyKeysHandler(ui::EventFlags modifier_flag)
 | 
| @@ -216,16 +212,15 @@ StickyKeysHandler::StickyKeysHandler(ui::EventFlags modifier_flag)
 | 
|  StickyKeysHandler::~StickyKeysHandler() {}
 | 
|  
 | 
|  bool StickyKeysHandler::HandleKeyEvent(const ui::KeyEvent& event,
 | 
| -                                       ui::KeyboardCode key_code,
 | 
|                                         int* mod_down_flags,
 | 
|                                         bool* released) {
 | 
|    switch (current_state_) {
 | 
|      case STICKY_KEY_STATE_DISABLED:
 | 
| -      return HandleDisabledState(event, key_code);
 | 
| +      return HandleDisabledState(event);
 | 
|      case STICKY_KEY_STATE_ENABLED:
 | 
| -      return HandleEnabledState(event, key_code, mod_down_flags, released);
 | 
| +      return HandleEnabledState(event, mod_down_flags, released);
 | 
|      case STICKY_KEY_STATE_LOCKED:
 | 
| -      return HandleLockedState(event, key_code, mod_down_flags, released);
 | 
| +      return HandleLockedState(event, mod_down_flags, released);
 | 
|    }
 | 
|    NOTREACHED();
 | 
|    return false;
 | 
| @@ -334,9 +329,8 @@ StickyKeysHandler::KeyEventType StickyKeysHandler::TranslateKeyEvent(
 | 
|    return type == ui::ET_KEY_PRESSED ? OTHER_MODIFIER_DOWN : OTHER_MODIFIER_UP;
 | 
|  }
 | 
|  
 | 
| -bool StickyKeysHandler::HandleDisabledState(const ui::KeyEvent& event,
 | 
| -                                            ui::KeyboardCode key_code) {
 | 
| -  switch (TranslateKeyEvent(event.type(), key_code)) {
 | 
| +bool StickyKeysHandler::HandleDisabledState(const ui::KeyEvent& event) {
 | 
| +  switch (TranslateKeyEvent(event.type(), event.key_code())) {
 | 
|      case TARGET_MODIFIER_UP:
 | 
|        if (preparing_to_enable_) {
 | 
|          preparing_to_enable_ = false;
 | 
| @@ -362,10 +356,9 @@ bool StickyKeysHandler::HandleDisabledState(const ui::KeyEvent& event,
 | 
|  }
 | 
|  
 | 
|  bool StickyKeysHandler::HandleEnabledState(const ui::KeyEvent& event,
 | 
| -                                           ui::KeyboardCode key_code,
 | 
|                                             int* mod_down_flags,
 | 
|                                             bool* released) {
 | 
| -  switch (TranslateKeyEvent(event.type(), key_code)) {
 | 
| +  switch (TranslateKeyEvent(event.type(), event.key_code())) {
 | 
|      case NORMAL_KEY_UP:
 | 
|      case TARGET_MODIFIER_DOWN:
 | 
|        return false;
 | 
| @@ -388,10 +381,9 @@ bool StickyKeysHandler::HandleEnabledState(const ui::KeyEvent& event,
 | 
|  }
 | 
|  
 | 
|  bool StickyKeysHandler::HandleLockedState(const ui::KeyEvent& event,
 | 
| -                                          ui::KeyboardCode key_code,
 | 
|                                            int* mod_down_flags,
 | 
|                                            bool* released) {
 | 
| -  switch (TranslateKeyEvent(event.type(), key_code)) {
 | 
| +  switch (TranslateKeyEvent(event.type(), event.key_code())) {
 | 
|      case TARGET_MODIFIER_DOWN:
 | 
|        return true;
 | 
|      case TARGET_MODIFIER_UP:
 | 
| 
 |