Commit fd8e8380 authored by Christopher Cameron's avatar Christopher Cameron Committed by Commit Bot

RemoteMacViews: Move tooltip manager to browser side

Move TooltipManager from BridgedNativeWidget (in the app shim side)
to BridgedNativeWidgetHost (in the browser side). Change the one
method in TooltipManagerMac that interacted with Cocoa to go through
mojo instead.

This is necessary to ensure that NativeWidgetMac::GetTooltipManager
works when NativeWidgetMac (in the browser) does not have direct
access to BridgedNativeWidgetImpl (in the app shim).

Bug: 859152
Change-Id: I46ceeeed8e18f3fab35ace5664bb17ceff5da40c
Reviewed-on: https://chromium-review.googlesource.com/1205496Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Reviewed-by: default avatarElly Fong-Jones <ellyjones@chromium.org>
Commit-Queue: ccameron <ccameron@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589260}
parent 1494a08e
......@@ -164,8 +164,6 @@ class VIEWS_EXPORT BridgedNativeWidgetImpl
BridgedNativeWidgetHostHelper* host_helper() { return host_helper_; }
NSWindow* ns_window();
TooltipManager* tooltip_manager() { return tooltip_manager_.get(); }
DragDropClientMac* drag_drop_client() { return drag_drop_client_.get(); }
bool is_translucent_window() const { return is_translucent_window_; }
......@@ -239,6 +237,7 @@ class VIEWS_EXPORT BridgedNativeWidgetImpl
void SetWindowTitle(const base::string16& title) override;
void MakeFirstResponder() override;
void ClearTouchBar() override;
void UpdateTooltip() override;
void AcquireCapture() override;
void ReleaseCapture() override;
......@@ -301,7 +300,6 @@ class VIEWS_EXPORT BridgedNativeWidgetImpl
base::scoped_nsobject<ModalShowAnimationWithLayer> show_animation_;
std::unique_ptr<CocoaMouseCapture> mouse_capture_;
std::unique_ptr<CocoaWindowMoveLoop> window_move_loop_;
std::unique_ptr<TooltipManager> tooltip_manager_;
std::unique_ptr<DragDropClientMac> drag_drop_client_;
ui::ModalType modal_type_ = ui::MODAL_TYPE_NONE;
bool is_translucent_window_ = false;
......
......@@ -15,6 +15,7 @@
#import "base/mac/sdk_forward_declarations.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/sys_string_conversions.h"
#include "ui/base/cocoa/cocoa_base_utils.h"
#import "ui/base/cocoa/constrained_window/constrained_window_animation.h"
#include "ui/base/hit_test.h"
#include "ui/base/layout.h"
......@@ -30,7 +31,6 @@
#import "ui/views/cocoa/cocoa_window_move_loop.h"
#import "ui/views/cocoa/drag_drop_client_mac.h"
#import "ui/views/cocoa/native_widget_mac_nswindow.h"
#include "ui/views/cocoa/tooltip_manager_mac.h"
#import "ui/views/cocoa/views_nswindow_delegate.h"
#import "ui/views/cocoa/widget_owner_nswindow_adapter.h"
#include "ui/views/widget/native_widget_mac.h"
......@@ -339,7 +339,6 @@ void BridgedNativeWidgetImpl::InitWindow(
}
[window_ setHasShadow:params->has_window_server_shadow];
tooltip_manager_.reset(new TooltipManagerMac(this));
}
void BridgedNativeWidgetImpl::SetInitialBounds(
......@@ -1101,6 +1100,14 @@ void BridgedNativeWidgetImpl::ClearTouchBar() {
}
}
void BridgedNativeWidgetImpl::UpdateTooltip() {
NSPoint nspoint =
ui::ConvertPointFromScreenToWindow(window_, [NSEvent mouseLocation]);
// Note: flip in the view's frame, which matches the window's contentRect.
gfx::Point point(nspoint.x, NSHeight([bridged_view_ frame]) - nspoint.y);
[bridged_view_ updateTooltipIfRequiredAt:point];
}
void BridgedNativeWidgetImpl::SetTextInputClient(
ui::TextInputClient* text_input_client) {
[bridged_view_ setTextInputClient:text_input_client];
......
......@@ -56,6 +56,8 @@ class VIEWS_EXPORT BridgedNativeWidgetHostImpl
BridgedNativeWidgetImpl* bridge_impl() const { return bridge_impl_.get(); }
views_bridge_mac::mojom::BridgedNativeWidget* bridge() const;
TooltipManager* tooltip_manager() { return tooltip_manager_.get(); }
void InitWindow(const Widget::InitParams& params);
// Changes the bounds of the window and the hosted layer if present. The
......@@ -222,6 +224,7 @@ class VIEWS_EXPORT BridgedNativeWidgetHostImpl
// instance that may be in another process.
std::unique_ptr<BridgedNativeWidgetImpl> bridge_impl_;
std::unique_ptr<TooltipManager> tooltip_manager_;
std::unique_ptr<ui::InputMethod> input_method_;
FocusManager* focus_manager_ = nullptr; // Weak. Owned by our Widget.
......
......@@ -12,6 +12,7 @@
#include "ui/display/screen.h"
#include "ui/gfx/geometry/dip_util.h"
#include "ui/views/cocoa/bridged_native_widget.h"
#include "ui/views/cocoa/tooltip_manager_mac.h"
#include "ui/views/controls/menu/menu_config.h"
#include "ui/views/controls/menu/menu_controller.h"
#include "ui/views/views_delegate.h"
......@@ -67,6 +68,7 @@ void BridgedNativeWidgetHostImpl::InitWindow(const Widget::InitParams& params) {
// native on Mac, so nothing should ever want one in Widget form.
DCHECK_NE(params.type, Widget::InitParams::TYPE_TOOLTIP);
widget_type_ = params.type;
tooltip_manager_.reset(new TooltipManagerMac(bridge()));
bridge_impl_->SetParent(params.parent);
......
......@@ -8,13 +8,19 @@
#include "base/macros.h"
#include "ui/views/widget/tooltip_manager.h"
namespace views_bridge_mac {
namespace mojom {
class BridgedNativeWidget;
} // namespace mojom
} // namespace views_bridge_mac
namespace views {
class BridgedNativeWidgetImpl;
// Manages native Cocoa tooltips for the given BridgedNativeWidgetImpl.
// Manages native Cocoa tooltips for the given BridgedNativeWidgetHostImpl.
class TooltipManagerMac : public TooltipManager {
public:
explicit TooltipManagerMac(BridgedNativeWidgetImpl* widget);
explicit TooltipManagerMac(
views_bridge_mac::mojom::BridgedNativeWidget* bridge);
~TooltipManagerMac() override;
// TooltipManager:
......@@ -24,7 +30,8 @@ class TooltipManagerMac : public TooltipManager {
void TooltipTextChanged(View* view) override;
private:
BridgedNativeWidgetImpl* widget_; // Weak. Owns this.
views_bridge_mac::mojom::BridgedNativeWidget*
bridge_; // Weak. Owned by the owner of this.
DISALLOW_COPY_AND_ASSIGN(TooltipManagerMac);
};
......
......@@ -19,8 +19,9 @@ const int kTooltipMaxWidthPixels = 250;
namespace views {
TooltipManagerMac::TooltipManagerMac(BridgedNativeWidgetImpl* widget)
: widget_(widget) {}
TooltipManagerMac::TooltipManagerMac(
views_bridge_mac::mojom::BridgedNativeWidget* bridge)
: bridge_(bridge) {}
TooltipManagerMac::~TooltipManagerMac() {
}
......@@ -36,14 +37,7 @@ const gfx::FontList& TooltipManagerMac::GetFontList() const {
}
void TooltipManagerMac::UpdateTooltip() {
NSWindow* window = widget_->ns_window();
BridgedContentView* view = widget_->ns_view();
NSPoint nspoint =
ui::ConvertPointFromScreenToWindow(window, [NSEvent mouseLocation]);
// Note: flip in the view's frame, which matches the window's contentRect.
gfx::Point point(nspoint.x, NSHeight([view frame]) - nspoint.y);
[view updateTooltipIfRequiredAt:point];
bridge_->UpdateTooltip();
}
void TooltipManagerMac::TooltipTextChanged(View* view) {
......
......@@ -244,8 +244,8 @@ void* NativeWidgetMac::GetNativeWindowProperty(const char* name) const {
}
TooltipManager* NativeWidgetMac::GetTooltipManager() const {
if (bridge_impl())
return bridge_impl()->tooltip_manager();
if (bridge_host_)
return bridge_host_->tooltip_manager();
return nullptr;
}
......
......@@ -114,6 +114,9 @@ interface BridgedNativeWidget {
// Clear the touchbar.
ClearTouchBar();
// Update the tooltip text at the current mouse location.
UpdateTooltip();
// Acquiring mouse capture first steals capture from any existing
// CocoaMouseCaptureDelegate, then captures all mouse events until released.
AcquireCapture();
......
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