summaryrefslogtreecommitdiff
path: root/chromium/ui
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-08 12:34:02 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-11-08 11:36:33 +0000
commitd702e4b6a64574e97fc7df8fe3238cde70242080 (patch)
tree3297e13ad4560b4c4a0d23dcd32724ff6ac2e3fe /chromium/ui
parente6430e577f105ad8813c92e75c54660c4985026e (diff)
downloadqtwebengine-chromium-d702e4b6a64574e97fc7df8fe3238cde70242080.tar.gz
BASELINE: Update Chromium to 61.0.3163.140
Change-Id: I646c933139007f1fdc42e7a4073652f8e6e55b5a Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'chromium/ui')
-rw-r--r--chromium/ui/events/ozone/evdev/event_device_test_util.cc39
-rw-r--r--chromium/ui/events/ozone/evdev/event_device_test_util.h1
-rw-r--r--chromium/ui/events/ozone/evdev/touch_event_converter_evdev.cc14
-rw-r--r--chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h7
-rw-r--r--chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc122
-rw-r--r--chromium/ui/message_center/fake_message_center_tray_delegate.cc2
-rw-r--r--chromium/ui/message_center/fake_message_center_tray_delegate.h2
-rw-r--r--chromium/ui/message_center/message_center_tray.cc4
-rw-r--r--chromium/ui/message_center/message_center_tray.h5
-rw-r--r--chromium/ui/message_center/message_center_tray_delegate.h6
-rw-r--r--chromium/ui/message_center/message_center_tray_unittest.cc22
-rw-r--r--chromium/ui/views/bubble/tray_bubble_view.cc7
-rw-r--r--chromium/ui/views/bubble/tray_bubble_view.h2
13 files changed, 211 insertions, 22 deletions
diff --git a/chromium/ui/events/ozone/evdev/event_device_test_util.cc b/chromium/ui/events/ozone/evdev/event_device_test_util.cc
index 5f032d9d38a..c84115eb8a4 100644
--- a/chromium/ui/events/ozone/evdev/event_device_test_util.cc
+++ b/chromium/ui/events/ozone/evdev/event_device_test_util.cc
@@ -230,6 +230,45 @@ const DeviceCapabilities kLinkTouchscreen = {
arraysize(kLinkTouchscreenAbsAxes),
};
+// Fake Atmel touchscreen based on real device from Chromebook Pixel,
+// with the addition of ABS_MT_TOOL_TYPE capability.
+const DeviceAbsoluteAxis kLinkWithToolTypeTouchscreenAbsAxes[] = {
+ {ABS_X, {0, 0, 2559, 0, 0, 20}},
+ {ABS_Y, {0, 0, 1699, 0, 0, 20}},
+ {ABS_PRESSURE, {0, 0, 255, 0, 0, 0}},
+ {ABS_MT_SLOT, {0, 0, 15, 0, 0, 0}},
+ {ABS_MT_TOUCH_MAJOR, {0, 0, 938, 0, 0, 0}},
+ {ABS_MT_ORIENTATION, {0, -3, 4, 0, 0, 0}},
+ {ABS_MT_POSITION_X, {0, 0, 2559, 0, 0, 20}},
+ {ABS_MT_POSITION_Y, {0, 0, 1699, 0, 0, 20}},
+ {ABS_MT_TOOL_TYPE, {0, 0, 0, 0, 0, 0}},
+ {ABS_MT_TRACKING_ID, {0, 0, 65535, 0, 0, 0}},
+ {ABS_MT_PRESSURE, {0, 0, 255, 0, 0, 0}},
+};
+const DeviceCapabilities kLinkWithToolTypeTouchscreen = {
+ /* path */
+ "/sys/devices/pci0000:00/0000:00:02.0/i2c-2/2-004a/"
+ "input/input7/event7",
+ /* name */ "Atmel maXTouch Touchscreen",
+ /* phys */ "i2c-2-004a/input0",
+ /* uniq */ "",
+ /* bustype */ "0018",
+ /* vendor */ "0000",
+ /* product */ "0000",
+ /* version */ "0000",
+ /* prop */ "0",
+ /* ev */ "b",
+ /* key */ "400 0 0 0 0 0",
+ /* rel */ "0",
+ /* abs */ "673800001000003",
+ /* msc */ "0",
+ /* sw */ "0",
+ /* led */ "0",
+ /* ff */ "0",
+ kLinkWithToolTypeTouchscreenAbsAxes,
+ arraysize(kLinkWithToolTypeTouchscreenAbsAxes),
+};
+
// Captured from Chromebook Pixel.
const DeviceAbsoluteAxis kLinkTouchpadAbsAxes[] = {
{ABS_X, {0, 0, 2040, 0, 0, 20}},
diff --git a/chromium/ui/events/ozone/evdev/event_device_test_util.h b/chromium/ui/events/ozone/evdev/event_device_test_util.h
index 145ca4b9568..bd77560ccce 100644
--- a/chromium/ui/events/ozone/evdev/event_device_test_util.h
+++ b/chromium/ui/events/ozone/evdev/event_device_test_util.h
@@ -64,6 +64,7 @@ extern const DeviceCapabilities kHJCGamepad;
extern const DeviceCapabilities kiBuffaloGamepad;
extern const DeviceCapabilities kLinkKeyboard;
extern const DeviceCapabilities kLinkTouchscreen;
+extern const DeviceCapabilities kLinkWithToolTypeTouchscreen;
extern const DeviceCapabilities kLinkTouchpad;
extern const DeviceCapabilities kHpUsbKeyboard;
extern const DeviceCapabilities kHpUsbKeyboard_Extra;
diff --git a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.cc b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.cc
index ca5a9a05654..7cdda3a0827 100644
--- a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.cc
+++ b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.cc
@@ -196,7 +196,10 @@ void TouchEventConverterEvdev::Initialize(const EventDeviceInfo& info) {
info.GetAbsMtSlotValueWithDefault(ABS_MT_TOUCH_MINOR, i, 0) / 2.0f;
events_[i].pressure = ScalePressure(
info.GetAbsMtSlotValueWithDefault(ABS_MT_PRESSURE, i, 0));
- events_[i].cancelled = major_max_ > 0 && touch_major == major_max_;
+ int tool_type = info.GetAbsMtSlotValueWithDefault(ABS_MT_TOOL_TYPE, i,
+ MT_TOOL_FINGER);
+ events_[i].cancelled = (tool_type == MT_TOOL_PALM) ||
+ (major_max_ > 0 && touch_major == major_max_);
if (events_[i].cancelled)
cancelled_state = true;
}
@@ -391,8 +394,9 @@ void TouchEventConverterEvdev::ProcessAbs(const input_event& input) {
// neither minor nor orientation, so this is all we can do.
events_[current_slot_].radius_x = input.value / 2.0f;
- // The MT protocol cannot communicate cancelled touches, so some kernel
- // drivers will identify palms by setting touch major to max.
+ // The MT protocol communicates that there is palm on the surface
+ // by either sending ABS_MT_TOOL_TYPE/MT_TOOL_PALM, or by setting
+ // touch major to max.
if (major_max_ > 0 && input.value == major_max_)
events_[current_slot_].cancelled = true;
break;
@@ -405,6 +409,10 @@ void TouchEventConverterEvdev::ProcessAbs(const input_event& input) {
case ABS_MT_POSITION_Y:
events_[current_slot_].y = input.value;
break;
+ case ABS_MT_TOOL_TYPE:
+ if (input.value == MT_TOOL_PALM)
+ events_[current_slot_].cancelled = true;
+ break;
case ABS_MT_TRACKING_ID:
UpdateTrackingId(current_slot_, input.value);
break;
diff --git a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
index 3ad2a364902..c3ef9d2e485 100644
--- a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
+++ b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev.h
@@ -11,6 +11,13 @@
#include <bitset>
#include <memory>
+#include <linux/input.h>
+// See if we compile against new enough headers and add missing definition
+// if the headers are too old.
+#ifndef MT_TOOL_PALM
+#define MT_TOOL_PALM 2
+#endif
+
#include "base/compiler_specific.h"
#include "base/files/file_path.h"
#include "base/macros.h"
diff --git a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
index e52c540d06e..7b4e229e785 100644
--- a/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
+++ b/chromium/ui/events/ozone/evdev/touch_event_converter_evdev_unittest.cc
@@ -679,6 +679,128 @@ TEST_F(TouchEventConverterEvdevTest, ShouldRemoveContactsWhenDisabled) {
EXPECT_EQ(2u, size());
}
+TEST_F(TouchEventConverterEvdevTest, PalmShouldCancelTouch) {
+ ui::MockTouchEventConverterEvdev* dev = device();
+
+ EventDeviceInfo devinfo;
+ EXPECT_TRUE(CapabilitiesToDeviceInfo(kLinkWithToolTypeTouchscreen, &devinfo));
+
+ timeval time;
+ time = {1429651083, 686882};
+ int major_max = devinfo.GetAbsMaximum(ABS_MT_TOUCH_MAJOR);
+ struct input_event mock_kernel_queue_max_major[] = {
+ {time, EV_ABS, ABS_MT_SLOT, 0},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, 0},
+ {time, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER},
+ {time, EV_ABS, ABS_MT_POSITION_X, 1003},
+ {time, EV_ABS, ABS_MT_POSITION_Y, 749},
+ {time, EV_ABS, ABS_MT_PRESSURE, 50},
+ {time, EV_ABS, ABS_MT_TOUCH_MAJOR, 116},
+ {time, EV_ABS, ABS_MT_SLOT, 1},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, 1},
+ {time, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER},
+ {time, EV_ABS, ABS_MT_POSITION_X, 1103},
+ {time, EV_ABS, ABS_MT_POSITION_Y, 649},
+ {time, EV_ABS, ABS_MT_PRESSURE, 50},
+ {time, EV_ABS, ABS_MT_TOUCH_MAJOR, 116},
+ {time, EV_KEY, BTN_TOUCH, 1},
+ {time, EV_ABS, ABS_X, 1003},
+ {time, EV_ABS, ABS_Y, 749},
+ {time, EV_ABS, ABS_PRESSURE, 50},
+ {time, EV_SYN, SYN_REPORT, 0},
+ {time, EV_ABS, ABS_MT_SLOT, 0},
+ {time, EV_ABS, ABS_MT_TOUCH_MAJOR, major_max},
+ {time, EV_SYN, SYN_REPORT, 0},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, -1},
+ {time, EV_ABS, ABS_MT_SLOT, 1},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, -1},
+ {time, EV_SYN, SYN_REPORT, 0},
+ };
+ struct input_event mock_kernel_queue_tool_palm[] = {
+ {time, EV_ABS, ABS_MT_SLOT, 0},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, 2},
+ {time, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER},
+ {time, EV_ABS, ABS_MT_POSITION_X, 1003},
+ {time, EV_ABS, ABS_MT_POSITION_Y, 749},
+ {time, EV_ABS, ABS_MT_PRESSURE, 50},
+ {time, EV_ABS, ABS_MT_TOUCH_MAJOR, 116},
+ {time, EV_ABS, ABS_MT_SLOT, 1},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, 3},
+ {time, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_FINGER},
+ {time, EV_ABS, ABS_MT_POSITION_X, 1103},
+ {time, EV_ABS, ABS_MT_POSITION_Y, 649},
+ {time, EV_ABS, ABS_MT_PRESSURE, 50},
+ {time, EV_ABS, ABS_MT_TOUCH_MAJOR, 116},
+ {time, EV_KEY, BTN_TOUCH, 1},
+ {time, EV_ABS, ABS_X, 1003},
+ {time, EV_ABS, ABS_Y, 749},
+ {time, EV_ABS, ABS_PRESSURE, 50},
+ {time, EV_SYN, SYN_REPORT, 0},
+ {time, EV_ABS, ABS_MT_SLOT, 0},
+ {time, EV_ABS, ABS_MT_TOOL_TYPE, MT_TOOL_PALM},
+ {time, EV_SYN, SYN_REPORT, 0},
+ {time, EV_ABS, ABS_MT_TRACKING_ID, -1},
+ {time, EV_SYN, SYN_REPORT, 0},
+ };
+
+ // Initialize the device.
+ dev->Initialize(devinfo);
+
+ dev->ConfigureReadMock(mock_kernel_queue_max_major,
+ arraysize(mock_kernel_queue_max_major), 0);
+ dev->ReadNow();
+ EXPECT_EQ(4u, size());
+
+ ui::TouchEventParams ev1_1 = dispatched_touch_event(0);
+ EXPECT_EQ(ET_TOUCH_PRESSED, ev1_1.type);
+ EXPECT_EQ(0, ev1_1.slot);
+ EXPECT_EQ(1003, ev1_1.location.x());
+ EXPECT_EQ(749, ev1_1.location.y());
+
+ ui::TouchEventParams ev1_2 = dispatched_touch_event(1);
+ EXPECT_EQ(ET_TOUCH_PRESSED, ev1_2.type);
+ EXPECT_EQ(1, ev1_2.slot);
+ EXPECT_EQ(1103, ev1_2.location.x());
+ EXPECT_EQ(649, ev1_2.location.y());
+
+ ui::TouchEventParams ev1_3 = dispatched_touch_event(2);
+ EXPECT_EQ(ET_TOUCH_CANCELLED, ev1_3.type);
+ EXPECT_EQ(0, ev1_3.slot);
+
+ // We expect both touches to be cancelled even though
+ // just one reported major at max value.
+ ui::TouchEventParams ev1_4 = dispatched_touch_event(3);
+ EXPECT_EQ(ET_TOUCH_CANCELLED, ev1_4.type);
+ EXPECT_EQ(1, ev1_4.slot);
+
+ dev->ConfigureReadMock(mock_kernel_queue_tool_palm,
+ arraysize(mock_kernel_queue_tool_palm), 0);
+ dev->ReadNow();
+ EXPECT_EQ(8u, size());
+
+ ui::TouchEventParams ev2_1 = dispatched_touch_event(4);
+ EXPECT_EQ(ET_TOUCH_PRESSED, ev2_1.type);
+ EXPECT_EQ(0, ev2_1.slot);
+ EXPECT_EQ(1003, ev2_1.location.x());
+ EXPECT_EQ(749, ev2_1.location.y());
+
+ ui::TouchEventParams ev2_2 = dispatched_touch_event(5);
+ EXPECT_EQ(ET_TOUCH_PRESSED, ev2_2.type);
+ EXPECT_EQ(1, ev2_2.slot);
+ EXPECT_EQ(1103, ev2_2.location.x());
+ EXPECT_EQ(649, ev2_2.location.y());
+
+ ui::TouchEventParams ev2_3 = dispatched_touch_event(6);
+ EXPECT_EQ(ET_TOUCH_CANCELLED, ev2_3.type);
+ EXPECT_EQ(0, ev2_3.slot);
+
+ // We expect both touches to be cancelled even though
+ // just one reported MT_TOOL_PALM.
+ ui::TouchEventParams ev2_4 = dispatched_touch_event(7);
+ EXPECT_EQ(ET_TOUCH_CANCELLED, ev2_4.type);
+ EXPECT_EQ(1, ev2_4.slot);
+}
+
// crbug.com/477695
TEST_F(TouchEventConverterEvdevTest, ShouldUseLeftButtonIfNoTouchButton) {
ui::MockTouchEventConverterEvdev* dev = device();
diff --git a/chromium/ui/message_center/fake_message_center_tray_delegate.cc b/chromium/ui/message_center/fake_message_center_tray_delegate.cc
index ae4903484bb..ebeb752c015 100644
--- a/chromium/ui/message_center/fake_message_center_tray_delegate.cc
+++ b/chromium/ui/message_center/fake_message_center_tray_delegate.cc
@@ -26,7 +26,7 @@ bool FakeMessageCenterTrayDelegate::ShowPopups() {
void FakeMessageCenterTrayDelegate::HidePopups() {
}
-bool FakeMessageCenterTrayDelegate::ShowMessageCenter() {
+bool FakeMessageCenterTrayDelegate::ShowMessageCenter(bool show_by_click) {
return false;
}
diff --git a/chromium/ui/message_center/fake_message_center_tray_delegate.h b/chromium/ui/message_center/fake_message_center_tray_delegate.h
index 2e52daa8898..fd0e7daab1b 100644
--- a/chromium/ui/message_center/fake_message_center_tray_delegate.h
+++ b/chromium/ui/message_center/fake_message_center_tray_delegate.h
@@ -26,7 +26,7 @@ class FakeMessageCenterTrayDelegate : public MessageCenterTrayDelegate {
void OnMessageCenterTrayChanged() override;
bool ShowPopups() override;
void HidePopups() override;
- bool ShowMessageCenter() override;
+ bool ShowMessageCenter(bool show_by_click) override;
void HideMessageCenter() override;
bool ShowNotifierSettings() override;
bool IsContextMenuEnabled() const override;
diff --git a/chromium/ui/message_center/message_center_tray.cc b/chromium/ui/message_center/message_center_tray.cc
index 9d368b0d430..302c24306a9 100644
--- a/chromium/ui/message_center/message_center_tray.cc
+++ b/chromium/ui/message_center/message_center_tray.cc
@@ -110,13 +110,13 @@ MessageCenterTray::~MessageCenterTray() {
message_center_->RemoveObserver(this);
}
-bool MessageCenterTray::ShowMessageCenterBubble() {
+bool MessageCenterTray::ShowMessageCenterBubble(bool show_by_click) {
if (message_center_visible_)
return true;
HidePopupBubbleInternal();
- message_center_visible_ = delegate_->ShowMessageCenter();
+ message_center_visible_ = delegate_->ShowMessageCenter(show_by_click);
if (message_center_visible_) {
message_center_->SetVisibility(message_center::VISIBILITY_MESSAGE_CENTER);
NotifyMessageCenterTrayChanged();
diff --git a/chromium/ui/message_center/message_center_tray.h b/chromium/ui/message_center/message_center_tray.h
index 86d35f745be..339654d5d90 100644
--- a/chromium/ui/message_center/message_center_tray.h
+++ b/chromium/ui/message_center/message_center_tray.h
@@ -34,10 +34,11 @@ class MESSAGE_CENTER_EXPORT MessageCenterTray : public MessageCenterObserver {
message_center::MessageCenter* message_center);
~MessageCenterTray() override;
- // Shows or updates the message center bubble and hides the popup bubble.
+ // Shows or updates the message center bubble and hides the popup bubble. Set
+ // |show_by_click| to true if bubble is shown by mouse or gesture click.
// Returns whether the message center is visible after the call, whether or
// not it was visible before.
- bool ShowMessageCenterBubble();
+ bool ShowMessageCenterBubble(bool show_by_click);
// Hides the message center if visible and returns whether the message center
// was visible before.
diff --git a/chromium/ui/message_center/message_center_tray_delegate.h b/chromium/ui/message_center/message_center_tray_delegate.h
index d1d31ac23f0..7084b46820c 100644
--- a/chromium/ui/message_center/message_center_tray_delegate.h
+++ b/chromium/ui/message_center/message_center_tray_delegate.h
@@ -28,8 +28,10 @@ class MESSAGE_CENTER_EXPORT MessageCenterTrayDelegate {
virtual void HidePopups() = 0;
// Display the message center containing all undismissed notifications to the
- // user. Returns true if the center was actually displayed to the user.
- virtual bool ShowMessageCenter() = 0;
+ // user. Set |show_by_click| to true if message center is shown by mouse or
+ // gesture click. Returns true if the center was actually displayed to the
+ // user.
+ virtual bool ShowMessageCenter(bool show_by_click) = 0;
// Remove the message center from the UI.
virtual void HideMessageCenter() = 0;
diff --git a/chromium/ui/message_center/message_center_tray_unittest.cc b/chromium/ui/message_center/message_center_tray_unittest.cc
index 6c4212d81cc..0af1d19e541 100644
--- a/chromium/ui/message_center/message_center_tray_unittest.cc
+++ b/chromium/ui/message_center/message_center_tray_unittest.cc
@@ -29,7 +29,9 @@ class MockDelegate : public MessageCenterTrayDelegate {
void OnMessageCenterTrayChanged() override {}
bool ShowPopups() override { return show_message_center_success_; }
void HidePopups() override {}
- bool ShowMessageCenter() override { return show_popups_success_; }
+ bool ShowMessageCenter(bool show_by_click) override {
+ return show_popups_success_;
+ }
void HideMessageCenter() override {}
bool ShowNotifierSettings() override { return true; }
bool IsContextMenuEnabled() const override { return enable_context_menu_; }
@@ -100,7 +102,8 @@ TEST_F(MessageCenterTrayTest, BasicMessageCenter) {
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- bool shown = message_center_tray_->ShowMessageCenterBubble();
+ bool shown =
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
EXPECT_TRUE(shown);
ASSERT_FALSE(message_center_tray_->popups_visible());
@@ -111,7 +114,7 @@ TEST_F(MessageCenterTrayTest, BasicMessageCenter) {
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- message_center_tray_->ShowMessageCenterBubble();
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_TRUE(message_center_tray_->message_center_visible());
@@ -153,7 +156,8 @@ TEST_F(MessageCenterTrayTest, MessageCenterClosesPopups) {
ASSERT_TRUE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- bool shown = message_center_tray_->ShowMessageCenterBubble();
+ bool shown =
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
EXPECT_TRUE(shown);
ASSERT_FALSE(message_center_tray_->popups_visible());
@@ -173,7 +177,7 @@ TEST_F(MessageCenterTrayTest, MessageCenterClosesPopups) {
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- message_center_tray_->ShowMessageCenterBubble();
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
message_center_tray_->HideMessageCenterBubble();
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
@@ -234,7 +238,8 @@ TEST_F(MessageCenterTrayTest, MessageCenterReopenPopupsForSystemPriority) {
ASSERT_TRUE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- bool shown = message_center_tray_->ShowMessageCenterBubble();
+ bool shown =
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
EXPECT_TRUE(shown);
ASSERT_FALSE(message_center_tray_->popups_visible());
@@ -261,7 +266,8 @@ TEST_F(MessageCenterTrayTest, ShowBubbleFails) {
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- bool shown = message_center_tray_->ShowMessageCenterBubble();
+ bool shown =
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
EXPECT_FALSE(shown);
ASSERT_FALSE(message_center_tray_->popups_visible());
@@ -272,7 +278,7 @@ TEST_F(MessageCenterTrayTest, ShowBubbleFails) {
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
- message_center_tray_->ShowMessageCenterBubble();
+ message_center_tray_->ShowMessageCenterBubble(false /* show_by_click */);
ASSERT_FALSE(message_center_tray_->popups_visible());
ASSERT_FALSE(message_center_tray_->message_center_visible());
diff --git a/chromium/ui/views/bubble/tray_bubble_view.cc b/chromium/ui/views/bubble/tray_bubble_view.cc
index 7b4c4f3872b..165a07eb45d 100644
--- a/chromium/ui/views/bubble/tray_bubble_view.cc
+++ b/chromium/ui/views/bubble/tray_bubble_view.cc
@@ -297,9 +297,10 @@ void TrayBubbleView::InitializeAndShowBubble() {
++g_current_tray_bubble_showing_count_;
- // If TrayBubbleView cannot be activated, register pre target event handler to
- // reroute key events to the widget for activating the view or closing it.
- if (!CanActivate()) {
+ // If TrayBubbleView cannot be activated and is shown by clicking on the
+ // corresponding tray view, register pre target event handler to reroute key
+ // events to the widget for activating the view or closing it.
+ if (!CanActivate() && params_.show_by_click) {
reroute_event_handler_ = base::MakeUnique<RerouteEventHandler>(this);
}
}
diff --git a/chromium/ui/views/bubble/tray_bubble_view.h b/chromium/ui/views/bubble/tray_bubble_view.h
index c308f57a9c6..51928ad75ce 100644
--- a/chromium/ui/views/bubble/tray_bubble_view.h
+++ b/chromium/ui/views/bubble/tray_bubble_view.h
@@ -91,6 +91,8 @@ class VIEWS_EXPORT TrayBubbleView : public BubbleDialogDelegateView,
int max_width = 0;
int max_height = 0;
bool close_on_deactivate = true;
+ // Indicates whether tray bubble view is shown by click on the tray view.
+ bool show_by_click = false;
// If not provided, the bg color will be derived from the NativeTheme.
base::Optional<SkColor> bg_color;
};