diff options
author | morrita@chromium.org <morrita@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-30 08:20:58 +0000 |
---|---|---|
committer | morrita@chromium.org <morrita@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-08-30 08:20:58 +0000 |
commit | 6647a1813e16c5299c84f1ee80473741460df8a9 (patch) | |
tree | 09e270741e0bb1f76c7a67c78dd19d072465f763 | |
parent | fcf5f89a21c2cc33724a8abc51443bd1aed65d59 (diff) | |
download | chromium_src-6647a1813e16c5299c84f1ee80473741460df8a9.zip chromium_src-6647a1813e16c5299c84f1ee80473741460df8a9.tar.gz chromium_src-6647a1813e16c5299c84f1ee80473741460df8a9.tar.bz2 |
NOTE:
The last goal of this series of patches is not to expose WindowOpenDisposition in ui and base modules.
In the series of these patches,
Browser::ExecuteCommandWithDisposition and these kind of functions will be changed to
Browser::ExecuteCommandWithEventFlags,
which takes platform independent event flags (ui::EventFlags)
The previous patch (http://codereview.chromium.org/6893046/) was so big, I decided them into much small patches.
BUG=93700
TEST=GTKUtilTest
Review URL: http://codereview.chromium.org/7712001
Patch from Shinya Kawanaka <shinyak@google.com>.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@98790 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/event_disposition.cc | 20 | ||||
-rw-r--r-- | chrome/browser/event_disposition.h | 20 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc | 3 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/gtk_util.cc | 27 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/gtk_util.h | 8 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/gtk_util_unittest.cc | 49 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/menu_gtk.cc | 7 | ||||
-rw-r--r-- | chrome/browser/ui/gtk/reload_button_gtk.cc | 2 | ||||
-rw-r--r-- | chrome/browser/ui/views/event_utils.cc | 10 | ||||
-rw-r--r-- | chrome/chrome_browser.gypi | 2 | ||||
-rw-r--r-- | chrome/chrome_tests.gypi | 3 |
11 files changed, 129 insertions, 22 deletions
diff --git a/chrome/browser/event_disposition.cc b/chrome/browser/event_disposition.cc new file mode 100644 index 0000000..618e11b --- /dev/null +++ b/chrome/browser/event_disposition.cc @@ -0,0 +1,20 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/event_disposition.h" +#include "content/browser/disposition_utils.h" +#include "ui/base/events.h" + +namespace browser { + +WindowOpenDisposition DispositionFromEventFlags(int event_flags) { + return disposition_utils::DispositionFromClick( + (event_flags & ui::EF_MIDDLE_BUTTON_DOWN) != 0, + (event_flags & ui::EF_ALT_DOWN) != 0, + (event_flags & ui::EF_CONTROL_DOWN) != 0, + false /* meta_key */, + (event_flags & ui::EF_SHIFT_DOWN) != 0); +} + +} diff --git a/chrome/browser/event_disposition.h b/chrome/browser/event_disposition.h new file mode 100644 index 0000000..19c7ebc --- /dev/null +++ b/chrome/browser/event_disposition.h @@ -0,0 +1,20 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EVENT_DISPOSITION_H__ +#define CHROME_BROWSER_EVENT_DISPOSITION_H__ +#pragma once + +#include "webkit/glue/window_open_disposition.h" + +namespace browser { + +// Translates event flags into what kind of disposition they represents. +// For example, a middle click would mean to open a background tab. +// event_flags are the flags as understood by views::MouseEvent. +WindowOpenDisposition DispositionFromEventFlags(int event_flags); + +} + +#endif // CHROME_BROWSER_EVENT_DISPOSITION_H__ diff --git a/chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc b/chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc index ee302fd8..94de289 100644 --- a/chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc +++ b/chrome/browser/ui/gtk/bookmarks/bookmark_menu_controller_gtk.cc @@ -292,7 +292,8 @@ gboolean BookmarkMenuController::OnButtonReleased( // The menu item is a link node. if (event->button == 1 || event->button == 2) { WindowOpenDisposition disposition = - event_utils::DispositionFromEventFlags(event->state); + event_utils::DispositionFromGdkState(event->state); + NavigateToMenuItem(sender, disposition); // We need to manually dismiss the popup menu because we're overriding diff --git a/chrome/browser/ui/gtk/gtk_util.cc b/chrome/browser/ui/gtk/gtk_util.cc index c116bef..25edfa6 100644 --- a/chrome/browser/ui/gtk/gtk_util.cc +++ b/chrome/browser/ui/gtk/gtk_util.cc @@ -21,6 +21,7 @@ #include "chrome/browser/autocomplete/autocomplete.h" #include "chrome/browser/autocomplete/autocomplete_classifier.h" #include "chrome/browser/autocomplete/autocomplete_match.h" +#include "chrome/browser/event_disposition.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_window.h" @@ -35,6 +36,7 @@ #include "grit/theme_resources_standard.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkColor.h" +#include "ui/base/events.h" #include "ui/base/gtk/gtk_hig_constants.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -196,13 +198,22 @@ GtkWidget* GetBrowserWindowFocusedWidget(BrowserWindow* window) { namespace event_utils { -WindowOpenDisposition DispositionFromEventFlags(guint event_flags) { - return disposition_utils::DispositionFromClick( - event_flags & GDK_BUTTON2_MASK, - event_flags & GDK_MOD1_MASK, - event_flags & GDK_CONTROL_MASK, - event_flags & GDK_META_MASK, - event_flags & GDK_SHIFT_MASK); +// TODO(shinyak) This function will be removed after refactoring. +WindowOpenDisposition DispositionFromGdkState(guint state) { + int event_flags = EventFlagsFromGdkState(state); + return browser::DispositionFromEventFlags(event_flags); +} + +int EventFlagsFromGdkState(guint state) { + int flags = 0; + flags |= (state & GDK_LOCK_MASK) ? ui::EF_CAPS_LOCK_DOWN : 0; + flags |= (state & GDK_CONTROL_MASK) ? ui::EF_CONTROL_DOWN : 0; + flags |= (state & GDK_SHIFT_MASK) ? ui::EF_SHIFT_DOWN : 0; + flags |= (state & GDK_MOD1_MASK) ? ui::EF_ALT_DOWN : 0; + flags |= (state & GDK_BUTTON1_MASK) ? ui::EF_LEFT_BUTTON_DOWN : 0; + flags |= (state & GDK_BUTTON2_MASK) ? ui::EF_MIDDLE_BUTTON_DOWN : 0; + flags |= (state & GDK_BUTTON3_MASK) ? ui::EF_RIGHT_BUTTON_DOWN : 0; + return flags; } } // namespace event_utils @@ -901,7 +912,7 @@ WindowOpenDisposition DispositionForCurrentButtonPressEvent() { guint state = event->button.state; gdk_event_free(event); - return event_utils::DispositionFromEventFlags(state); + return event_utils::DispositionFromGdkState(state); } bool GrabAllInput(GtkWidget* widget) { diff --git a/chrome/browser/ui/gtk/gtk_util.h b/chrome/browser/ui/gtk/gtk_util.h index f12c727..f4e89fd 100644 --- a/chrome/browser/ui/gtk/gtk_util.h +++ b/chrome/browser/ui/gtk/gtk_util.h @@ -29,10 +29,12 @@ struct RendererPreferences; // from common/renderer_preferences.h namespace event_utils { -// Translates event flags into what kind of disposition they represent. +// Translates GdkEvent state into what kind of disposition they represent. // For example, a middle click would mean to open a background tab. -// event_flags are the state in the GdkEvent structure. -WindowOpenDisposition DispositionFromEventFlags(guint state); +WindowOpenDisposition DispositionFromGdkState(guint state); + +// Translates event flags into plaform independent event flags. +int EventFlagsFromGdkState(guint state); } // namespace event_utils diff --git a/chrome/browser/ui/gtk/gtk_util_unittest.cc b/chrome/browser/ui/gtk/gtk_util_unittest.cc new file mode 100644 index 0000000..198f374 --- /dev/null +++ b/chrome/browser/ui/gtk/gtk_util_unittest.cc @@ -0,0 +1,49 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "gtk_util.h" + +#include "base/stringprintf.h" +#include "ui/base/events.h" +#include "testing/gtest/include/gtest/gtest.h" + +static const guint states[] = { + GDK_LOCK_MASK, + GDK_CONTROL_MASK, + GDK_SHIFT_MASK, + GDK_MOD1_MASK, + GDK_BUTTON1_MASK, + GDK_BUTTON2_MASK, + GDK_BUTTON3_MASK +}; + +static const int flags[] = { + ui::EF_CAPS_LOCK_DOWN, + ui::EF_CONTROL_DOWN, + ui::EF_SHIFT_DOWN, + ui::EF_ALT_DOWN, + ui::EF_LEFT_BUTTON_DOWN, + ui::EF_MIDDLE_BUTTON_DOWN, + ui::EF_RIGHT_BUTTON_DOWN +}; + +TEST(GTKUtilTest, TestEventFlagsFromGdkState) { + ASSERT_EQ(arraysize(states), arraysize(flags)); + + const int size = arraysize(states); + for (int i = 0; i < size; ++i) { + SCOPED_TRACE(base::StringPrintf( + "Checking EventFlagsFromGdkState: i = %d", i)); + EXPECT_EQ(flags[i], event_utils::EventFlagsFromGdkState(states[i])); + } + + for (int i = 0; i < size; ++i) { + for (int j = i + 1; j < size; ++j) { + SCOPED_TRACE(base::StringPrintf( + "Checking EventFlagsFromGdkState: i = %d, j = %d", i, j)); + EXPECT_EQ(flags[i] | flags[j], + event_utils::EventFlagsFromGdkState(states[i] | states[j])); + } + } +} diff --git a/chrome/browser/ui/gtk/menu_gtk.cc b/chrome/browser/ui/gtk/menu_gtk.cc index 3918ee6..2ffd764 100644 --- a/chrome/browser/ui/gtk/menu_gtk.cc +++ b/chrome/browser/ui/gtk/menu_gtk.cc @@ -15,6 +15,7 @@ #include "chrome/browser/ui/gtk/gtk_custom_menu.h" #include "chrome/browser/ui/gtk/gtk_custom_menu_item.h" #include "chrome/browser/ui/gtk/gtk_util.h" +#include "chrome/browser/ui/views/event_utils.h" #include "third_party/skia/include/core/SkBitmap.h" #include "ui/base/models/accelerator_gtk.h" #include "ui/base/models/button_menu_item_model.h" @@ -707,8 +708,10 @@ void MenuGtk::ExecuteCommand(ui::MenuModel* model, int id) { GdkEvent* event = gtk_get_current_event(); if (event && event->type == GDK_BUTTON_RELEASE) { - model->ActivatedAtWithDisposition( - id, event_utils::DispositionFromEventFlags(event->button.state)); + WindowOpenDisposition disposition = + event_utils::DispositionFromGdkState(event->button.state); + + model->ActivatedAtWithDisposition(id, disposition); } else { model->ActivatedAt(id); } diff --git a/chrome/browser/ui/gtk/reload_button_gtk.cc b/chrome/browser/ui/gtk/reload_button_gtk.cc index 5daf4de..d6e2501 100644 --- a/chrome/browser/ui/gtk/reload_button_gtk.cc +++ b/chrome/browser/ui/gtk/reload_button_gtk.cc @@ -172,7 +172,7 @@ void ReloadButtonGtk::OnClicked(GtkWidget* /* sender */) { } WindowOpenDisposition disposition = - event_utils::DispositionFromEventFlags(modifier_state_uint); + event_utils::DispositionFromGdkState(modifier_state_uint); if ((disposition == CURRENT_TAB) && location_bar_) { // Forcibly reset the location bar, since otherwise it won't discard any // ongoing user edits, since it doesn't realize this is a user-initiated diff --git a/chrome/browser/ui/views/event_utils.cc b/chrome/browser/ui/views/event_utils.cc index 49d0213..f134f38 100644 --- a/chrome/browser/ui/views/event_utils.cc +++ b/chrome/browser/ui/views/event_utils.cc @@ -3,7 +3,7 @@ // found in the LICENSE file. #include "chrome/browser/ui/views/event_utils.h" - +#include "chrome/browser/event_disposition.h" #include "content/browser/disposition_utils.h" #include "views/events/event.h" @@ -11,13 +11,9 @@ using views::Event; namespace event_utils { +// TODO(shinyak) After refactoring, this function shoulbe removed. WindowOpenDisposition DispositionFromEventFlags(int event_flags) { - return disposition_utils::DispositionFromClick( - (event_flags & ui::EF_MIDDLE_BUTTON_DOWN) != 0, - (event_flags & ui::EF_ALT_DOWN) != 0, - (event_flags & ui::EF_CONTROL_DOWN) != 0, - false /* meta_key */, - (event_flags & ui::EF_SHIFT_DOWN) != 0); + return browser::DispositionFromEventFlags(event_flags); } bool IsPossibleDispositionEvent(const views::MouseEvent& event) { diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index fb6f905..d9150a1 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -875,6 +875,8 @@ 'browser/download/save_package_file_picker.h', 'browser/enumerate_modules_model_win.cc', 'browser/enumerate_modules_model_win.h', + 'browser/event_disposition.cc', + 'browser/event_disposition.h', 'browser/extensions/apps_promo.cc', 'browser/extensions/apps_promo.h', 'browser/extensions/convert_user_script.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 827858f..e6bc5e1 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1405,6 +1405,8 @@ 'browser/download/download_request_limiter_unittest.cc', 'browser/download/download_safe_browsing_client_unittest.cc', 'browser/enumerate_modules_model_unittest_win.cc', + 'browser/event_disposition.cc', + 'browser/event_disposition.h', 'browser/extensions/apps_promo_unittest.cc', 'browser/extensions/convert_user_script_unittest.cc', 'browser/extensions/convert_web_app_unittest.cc', @@ -1863,6 +1865,7 @@ 'browser/ui/gtk/bookmarks/bookmark_utils_gtk_unittest.cc', 'browser/ui/gtk/gtk_chrome_shrinkable_hbox_unittest.cc', 'browser/ui/gtk/gtk_theme_service_unittest.cc', + 'browser/ui/gtk/gtk_util_unittest.cc', 'browser/ui/gtk/omnibox/omnibox_popup_view_gtk_unittest.cc', 'browser/ui/gtk/reload_button_gtk_unittest.cc', 'browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc', |