Fix scroll conflict

This commit is contained in:
Anthony Tseng 2016-08-01 18:01:21 +08:00
parent 5eeadb0ad4
commit 1aedccaeeb
2 changed files with 55 additions and 7 deletions

View file

@ -12,6 +12,7 @@
#include "base/mac/scoped_nsobject.h"
#include "atom/browser/native_window.h"
#include "content/public/browser/render_widget_host.h"
@class AtomNSWindow;
@class AtomNSWindowDelegate;
@ -19,7 +20,8 @@
namespace atom {
class NativeWindowMac : public NativeWindow {
class NativeWindowMac : public NativeWindow,
public content::RenderWidgetHost::InputEventObserver {
public:
NativeWindowMac(brightray::InspectableWebContents* inspectable_web_contents,
const mate::Dictionary& options,
@ -90,6 +92,8 @@ class NativeWindowMac : public NativeWindow {
void SetVisibleOnAllWorkspaces(bool visible) override;
bool IsVisibleOnAllWorkspaces() override;
void OnInputEvent(const blink::WebInputEvent& event) override;
// Refresh the DraggableRegion views.
void UpdateDraggableRegionViews() {
UpdateDraggableRegionViews(draggable_regions_);
@ -126,6 +130,11 @@ class NativeWindowMac : public NativeWindow {
// whehter we can drag.
void UpdateDraggableRegionViews(const std::vector<DraggableRegion>& regions);
void RegisterInputEventObserver(content::RenderViewHost* host);
void UnregisterInputEventObserver(content::RenderViewHost* host);
void RenderViewHostChanged(content::RenderViewHost* old_host,
content::RenderViewHost* new_host);
base::scoped_nsobject<AtomNSWindow> window_;
base::scoped_nsobject<AtomNSWindowDelegate> window_delegate_;
@ -147,6 +156,8 @@ class NativeWindowMac : public NativeWindow {
// The "titleBarStyle" option.
TitleBarStyle title_bar_style_;
bool is_edge_;
DISALLOW_COPY_AND_ASSIGN(NativeWindowMac);
};

View file

@ -429,13 +429,14 @@ struct Converter<atom::NativeWindowMac::TitleBarStyle> {
namespace atom {
NativeWindowMac::NativeWindowMac(
brightray::InspectableWebContents* web_contents,
brightray::InspectableWebContents* iWeb_contents,
const mate::Dictionary& options,
NativeWindow* parent)
: NativeWindow(web_contents, options, parent),
: NativeWindow(iWeb_contents, options, parent),
is_kiosk_(false),
attention_request_id_(0),
title_bar_style_(NORMAL) {
title_bar_style_(NORMAL),
is_edge_(false) {
int width = 800, height = 600;
options.Get(options::kWidth, &width);
options.Get(options::kHeight, &height);
@ -574,17 +575,19 @@ NativeWindowMac::NativeWindowMac(
if ([[event window] windowNumber] != [window_ windowNumber])
return event;
if (!web_contents)
if (!iWeb_contents)
return event;
if (!began && (([event phase] == NSEventPhaseMayBegin) ||
([event phase] == NSEventPhaseBegan))) {
if (!began && is_edge_ && (([event phase] == NSEventPhaseMayBegin) ||
([event phase] == NSEventPhaseBegan))) {
this->NotifyWindowScrollTouchBegin();
began = YES;
is_edge_ = false;
} else if (began && (([event phase] == NSEventPhaseEnded) ||
([event phase] == NSEventPhaseCancelled))) {
this->NotifyWindowScrollTouchEnd();
began = NO;
is_edge_ = false;
}
return event;
}];
@ -594,6 +597,26 @@ NativeWindowMac::NativeWindowMac(
// Set maximizable state last to ensure zoom button does not get reset
// by calls to other APIs.
SetMaximizable(maximizable);
RegisterInputEventObserver(web_contents()->GetRenderViewHost());
}
void NativeWindowMac::RegisterInputEventObserver(
content::RenderViewHost* host) {
if (host != nullptr)
host->GetWidget()->AddInputEventObserver(this);
}
void NativeWindowMac::UnregisterInputEventObserver(
content::RenderViewHost* host) {
if (host != nullptr)
host->GetWidget()->RemoveInputEventObserver(this);
}
void NativeWindowMac::RenderViewHostChanged(
content::RenderViewHost* old_host,
content::RenderViewHost* new_host) {
UnregisterInputEventObserver(old_host);
RegisterInputEventObserver(new_host);
}
NativeWindowMac::~NativeWindowMac() {
@ -1197,6 +1220,20 @@ void NativeWindowMac::SetCollectionBehavior(bool on, NSUInteger flag) {
SetMaximizable(was_maximizable);
}
void NativeWindowMac::OnInputEvent(const blink::WebInputEvent& event) {
switch (event.type) {
case blink::WebInputEvent::GestureScrollBegin:
case blink::WebInputEvent::GestureScrollUpdate:
case blink::WebInputEvent::GestureScrollEnd:
{
is_edge_ = true;
break;
}
default:
break;
}
}
// static
NativeWindow* NativeWindow::Create(
brightray::InspectableWebContents* inspectable_web_contents,