blob: b0d4644ecb52c915b5012e06228f275f1d3a30b3 [file] [log] [blame]
// Copyright 2017 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 "core/dom/Document.h"
#include "core/dom/Element.h"
#include "core/dom/events/EventListener.h"
#include "core/html/HTMLElement.h"
#include "core/input/EventHandler.h"
#include "core/input/TouchEventManager.h"
#include "core/testing/sim/SimCompositor.h"
#include "core/testing/sim/SimDisplayItemList.h"
#include "core/testing/sim/SimRequest.h"
#include "core/testing/sim/SimTest.h"
namespace blink {
class TouchEventManagerTest : public SimTest {
protected:
EventHandler& EventHandler() {
return GetDocument().GetFrame()->GetEventHandler();
}
WebPointerEvent CreateTouchPointerEvent(WebInputEvent::Type type) {
WebPointerEvent event(
type,
WebPointerProperties(1, WebPointerProperties::PointerType::kTouch,
WebPointerProperties::Button::kLeft,
WebFloatPoint(100, 100), WebFloatPoint(100, 100)),
1, 1);
event.SetFrameScale(1);
return event;
}
};
class CheckEventListenerCallback final : public EventListener {
public:
static CheckEventListenerCallback* Create() {
return new CheckEventListenerCallback();
}
bool operator==(const EventListener& other) const override {
return this == &other;
}
void handleEvent(ExecutionContext*, Event* event) override {
event_received_ = true;
}
bool HasReceivedEvent() const { return event_received_; }
private:
CheckEventListenerCallback()
: EventListener(EventListener::kCPPEventListenerType) {
event_received_ = false;
}
bool event_received_;
};
TEST_F(TouchEventManagerTest, LostTouchDueToInnerIframeRemove) {
WebView().Resize(WebSize(400, 400));
SimRequest request("https://example.com/test.html", "text/html");
LoadURL("https://example.com/test.html");
request.Complete(R"HTML(
<body style='padding: 0px; width: 400px; height: 400px;'>
<iframe id='target' style='width: 200px; height: 200px;'></iframe>
</body>
)HTML");
CheckEventListenerCallback* callback = CheckEventListenerCallback::Create();
GetDocument().body()->addEventListener(EventTypeNames::touchstart, callback);
EventHandler().HandlePointerEvent(
CreateTouchPointerEvent(WebInputEvent::kPointerDown),
Vector<WebPointerEvent>());
EventHandler().DispatchBufferedTouchEvents();
GetDocument().getElementById("target")->remove();
EventHandler().HandlePointerEvent(
CreateTouchPointerEvent(WebInputEvent::kPointerUp),
Vector<WebPointerEvent>());
EventHandler().DispatchBufferedTouchEvents();
EventHandler().HandlePointerEvent(
CreateTouchPointerEvent(WebInputEvent::kPointerDown),
Vector<WebPointerEvent>());
EventHandler().DispatchBufferedTouchEvents();
ASSERT_TRUE(callback->HasReceivedEvent());
}
} // namespace blink