Commit 5c42eed8 authored by jianli@chromium.org's avatar jianli@chromium.org

Accelerator support for browserless panels on Windows.

BUG=127323
TEST=New test


Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=150420

Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=150725

Review URL: https://chromiumcodereview.appspot.com/10825210

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@150927 0039d316-1c4b-4281-b951-d872f2087c98
parent 386f3e62
......@@ -549,6 +549,16 @@ void Panel::ExecuteCommandWithDisposition(int id,
panel_host_->StopLoading();
break;
// Window management
case IDC_CLOSE_WINDOW:
content::RecordAction(UserMetricsAction("CloseWindow"));
Close();
break;
case IDC_EXIT:
content::RecordAction(UserMetricsAction("Exit"));
browser::AttemptUserExit();
break;
// Clipboard
case IDC_COPY:
content::RecordAction(UserMetricsAction("Copy"));
......
......@@ -32,6 +32,7 @@
#include "chrome/common/url_constants.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/download_manager.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/url_constants.h"
......@@ -1545,4 +1546,44 @@ IN_PROC_BROWSER_TEST_F(PanelBrowserTest,
panel->Close();
}
#if defined(OS_WIN)
#define MAYBE_Accelerator Accelerator
#else
#define MAYBE_Accelerator DISABLED_Accelerator
#endif
IN_PROC_BROWSER_TEST_F(PanelBrowserTest, MAYBE_Accelerator) {
PanelManager* panel_manager = PanelManager::GetInstance();
// Create a test panel with web contents loaded.
CreatePanelParams params("1", gfx::Rect(), SHOW_AS_ACTIVE);
GURL url(ui_test_utils::GetTestUrl(
FilePath(kTestDir),
FilePath(FILE_PATH_LITERAL("update-preferred-size.html"))));
params.url = url;
Panel* panel = CreatePanelWithParams(params);
EXPECT_EQ(1, panel_manager->num_panels());
// Close the panel by acclerator.
content::WindowedNotificationObserver signal(
chrome::NOTIFICATION_PANEL_CLOSED,
content::Source<Panel>(panel));
#if defined(USE_AURA)
content::NativeWebKeyboardEvent key_event(
ui::ET_KEY_PRESSED,
false,
ui::VKEY_W,
ui::EF_CONTROL_DOWN,
base::Time::Now().ToDoubleT());
#elif defined(OS_WIN)
::MSG key_msg = { NULL, WM_KEYDOWN, ui::VKEY_W, 0 };
content::NativeWebKeyboardEvent key_event(key_msg);
key_event.modifiers = content::NativeWebKeyboardEvent::ControlKey;
#else
content::NativeWebKeyboardEvent key_event;
#endif
panel->HandleKeyboardEvent(key_event);
signal.Wait();
EXPECT_EQ(0, panel_manager->num_panels());
}
#endif // OS_WIN || OS_MACOSX
......@@ -4,7 +4,9 @@
#include "chrome/browser/ui/panels/panel_view.h"
#include <map>
#include "base/logging.h"
#include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/ui/panels/panel.h"
#include "chrome/browser/ui/panels/panel_bounds_animation.h"
#include "chrome/browser/ui/panels/panel_frame_view.h"
......@@ -24,6 +26,46 @@
namespace {
// Supported accelerators.
// Note: We can't use the acclerator table defined in chrome/browser/ui/views
// due to checkdeps violation.
struct AcceleratorMapping {
ui::KeyboardCode keycode;
int modifiers;
int command_id;
};
const AcceleratorMapping kPanelAcceleratorMap[] = {
{ ui::VKEY_W, ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW },
{ ui::VKEY_W, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN, IDC_CLOSE_WINDOW },
{ ui::VKEY_F4, ui::EF_ALT_DOWN, IDC_CLOSE_WINDOW },
{ ui::VKEY_R, ui::EF_CONTROL_DOWN, IDC_RELOAD },
{ ui::VKEY_F5, ui::EF_NONE, IDC_RELOAD },
{ ui::VKEY_R, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN,
IDC_RELOAD_IGNORING_CACHE },
{ ui::VKEY_F5, ui::EF_CONTROL_DOWN, IDC_RELOAD_IGNORING_CACHE },
{ ui::VKEY_F5, ui::EF_SHIFT_DOWN, IDC_RELOAD_IGNORING_CACHE },
{ ui::VKEY_ESCAPE, ui::EF_NONE, IDC_STOP },
{ ui::VKEY_OEM_MINUS, ui::EF_CONTROL_DOWN, IDC_ZOOM_MINUS },
{ ui::VKEY_SUBTRACT, ui::EF_CONTROL_DOWN, IDC_ZOOM_MINUS },
{ ui::VKEY_0, ui::EF_CONTROL_DOWN, IDC_ZOOM_NORMAL },
{ ui::VKEY_NUMPAD0, ui::EF_CONTROL_DOWN, IDC_ZOOM_NORMAL },
{ ui::VKEY_OEM_PLUS, ui::EF_CONTROL_DOWN, IDC_ZOOM_PLUS },
{ ui::VKEY_ADD, ui::EF_CONTROL_DOWN, IDC_ZOOM_PLUS },
};
const std::map<ui::Accelerator, int>& GetAcceleratorTable() {
static std::map<ui::Accelerator, int>* accelerators = NULL;
if (!accelerators) {
accelerators = new std::map<ui::Accelerator, int>();
for (size_t i = 0; i < arraysize(kPanelAcceleratorMap); ++i) {
ui::Accelerator accelerator(kPanelAcceleratorMap[i].keycode,
kPanelAcceleratorMap[i].modifiers);
(*accelerators)[accelerator] = kPanelAcceleratorMap[i].command_id;
}
}
return *accelerators;
}
// NativePanelTesting implementation.
class NativePanelTestingWin : public NativePanelTesting {
public:
......@@ -142,10 +184,16 @@ PanelView::PanelView(Panel* panel, const gfx::Rect& bounds)
OnViewWasResized();
// Register accelarators supported by panels.
views::FocusManager* focus_manager = GetFocusManager();
ui::Accelerator accelerator(ui::VKEY_ESCAPE, ui::EF_NONE);
focus_manager->RegisterAccelerator(
accelerator, ui::AcceleratorManager::kNormalPriority, this);
const std::map<ui::Accelerator, int>& accelerator_table =
GetAcceleratorTable();
for (std::map<ui::Accelerator, int>::const_iterator iter =
accelerator_table.begin();
iter != accelerator_table.end(); ++iter) {
focus_manager->RegisterAccelerator(
iter->first, ui::AcceleratorManager::kNormalPriority, this);
}
}
PanelView::~PanelView() {
......@@ -306,6 +354,16 @@ bool PanelView::PreHandlePanelKeyboardEvent(
void PanelView::HandlePanelKeyboardEvent(
const content::NativeWebKeyboardEvent& event) {
views::FocusManager* focus_manager = GetFocusManager();
if (focus_manager->shortcut_handling_suspended())
return;
ui::Accelerator accelerator(
static_cast<ui::KeyboardCode>(event.windowsKeyCode),
content::GetModifiersFromNativeWebKeyboardEvent(event));
if (event.type == WebKit::WebInputEvent::KeyUp)
accelerator.set_type(ui::ET_KEY_RELEASED);
focus_manager->ProcessAccelerator(accelerator);
}
void PanelView::FullScreenModeChanged(bool is_full_screen) {
......@@ -519,7 +577,12 @@ bool PanelView::AcceleratorPressed(const ui::Accelerator& accelerator) {
if (mouse_dragging_state_ == DRAGGING_STARTED)
return true;
return views::View::AcceleratorPressed(accelerator);
const std::map<ui::Accelerator, int>& accelerator_table =
GetAcceleratorTable();
std::map<ui::Accelerator, int>::const_iterator iter =
accelerator_table.find(accelerator);
DCHECK(iter != accelerator_table.end());
return panel_->ExecuteCommandIfEnabled(iter->second);
}
void PanelView::OnWidgetActivationChanged(views::Widget* widget, bool active) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment