Home | History | Annotate | Download | only in views
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <set>
      6 
      7 #include "base/basictypes.h"
      8 #include "chrome/browser/ui/views/accelerator_table.h"
      9 #include "testing/gtest/include/gtest/gtest.h"
     10 #include "ui/events/event_constants.h"
     11 
     12 #if defined(USE_ASH)
     13 #include "ash/accelerators/accelerator_table.h"
     14 #endif  // USE_ASH
     15 
     16 namespace chrome {
     17 
     18 namespace {
     19 
     20 struct Cmp {
     21   bool operator()(const AcceleratorMapping& lhs,
     22                   const AcceleratorMapping& rhs) const {
     23     if (lhs.keycode != rhs.keycode)
     24       return lhs.keycode < rhs.keycode;
     25     return lhs.modifiers < rhs.modifiers;
     26     // Do not check |command_id|.
     27   }
     28 };
     29 
     30 }  // namespace
     31 
     32 TEST(AcceleratorTableTest, CheckDuplicatedAccelerators) {
     33   std::set<AcceleratorMapping, Cmp> acclerators;
     34   const std::vector<AcceleratorMapping> accelerator_list(GetAcceleratorList());
     35   for (std::vector<AcceleratorMapping>::const_iterator it =
     36            accelerator_list.begin(); it != accelerator_list.end(); ++it) {
     37     const AcceleratorMapping& entry = *it;
     38     EXPECT_TRUE(acclerators.insert(entry).second)
     39         << "Duplicated accelerator: " << entry.keycode << ", "
     40         << (entry.modifiers & ui::EF_SHIFT_DOWN) << ", "
     41         << (entry.modifiers & ui::EF_CONTROL_DOWN) << ", "
     42         << (entry.modifiers & ui::EF_ALT_DOWN);
     43   }
     44 }
     45 
     46 #if defined(OS_CHROMEOS)
     47 TEST(AcceleratorTableTest, CheckDuplicatedAcceleratorsAsh) {
     48   std::set<AcceleratorMapping, Cmp> acclerators;
     49   const std::vector<AcceleratorMapping> accelerator_list(GetAcceleratorList());
     50   for (std::vector<AcceleratorMapping>::const_iterator it =
     51            accelerator_list.begin(); it != accelerator_list.end(); ++it) {
     52     const AcceleratorMapping& entry = *it;
     53     acclerators.insert(entry);
     54   }
     55   for (size_t i = 0; i < ash::kAcceleratorDataLength; ++i) {
     56     const ash::AcceleratorData& ash_entry = ash::kAcceleratorData[i];
     57     if (!ash_entry.trigger_on_press)
     58       continue;  // kAcceleratorMap does not have any release accelerators.
     59     // The shortcuts to toggle minimized state and to show the task
     60     // manager are defined on browser side as well as ash side by
     61     // design so that web contents can consume these short cuts. (see
     62     // crbug.com/309915, 370019 and CL)
     63     if (ash_entry.action == ash::WINDOW_MINIMIZE ||
     64         ash_entry.action == ash::SHOW_TASK_MANAGER)
     65       continue;
     66     AcceleratorMapping entry;
     67     entry.keycode = ash_entry.keycode;
     68     entry.modifiers = ash_entry.modifiers;
     69     entry.command_id = 0;  // dummy
     70     EXPECT_TRUE(acclerators.insert(entry).second)
     71         << "Duplicated accelerator: " << entry.keycode << ", "
     72         << (entry.modifiers & ui::EF_SHIFT_DOWN) << ", "
     73         << (entry.modifiers & ui::EF_CONTROL_DOWN) << ", "
     74         << (entry.modifiers & ui::EF_ALT_DOWN);
     75   }
     76 }
     77 #endif  // USE_ASH
     78 
     79 }  // namespace chrome
     80