blob: 42aa77986ee78b9a7efbe1513a57d9d7412475a0 [file] [log] [blame]
// Copyright 2019 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 "third_party/blink/renderer/core/html/forms/external_date_time_chooser.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/html/forms/date_time_chooser_client.h"
#include "third_party/blink/renderer/core/html/forms/html_input_element.h"
#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
namespace blink {
class ExternalDateTimeChooserTest : public testing::Test {};
class TestDateTimeChooserClient final
: public GarbageCollected<TestDateTimeChooserClient>,
public DateTimeChooserClient {
USING_GARBAGE_COLLECTED_MIXIN(TestDateTimeChooserClient);
public:
explicit TestDateTimeChooserClient(Element* element) : element_(element) {}
~TestDateTimeChooserClient() override {}
void Trace(Visitor* visitor) override {
visitor->Trace(element_);
visitor->Trace(date_time_chooser_);
DateTimeChooserClient::Trace(visitor);
}
void SetDateTimeChooser(DateTimeChooser* date_time_chooser) {
date_time_chooser_ = date_time_chooser;
}
private:
// DateTimeChooserClient functions:
Element& OwnerElement() const override { return *element_; }
void DidChooseValue(const String&) override {}
void DidChooseValue(double value) override {
if (date_time_chooser_)
date_time_chooser_->EndChooser();
}
void DidEndChooser() override {}
Member<Element> element_;
Member<DateTimeChooser> date_time_chooser_;
};
// This is a regression test for crbug.com/974646. EndChooser can cause a crash
// when it's called twice because |client_| was already nullptr.
TEST_F(ExternalDateTimeChooserTest, EndChooserShouldNotCrash) {
ScopedInputMultipleFieldsUIForTest input_multiple_fields_ui(false);
auto* document = MakeGarbageCollected<Document>();
auto* element = document->CreateRawElement(html_names::kInputTag);
auto* client = MakeGarbageCollected<TestDateTimeChooserClient>(element);
auto* external_date_time_chooser = ExternalDateTimeChooser::Create(client);
client->SetDateTimeChooser(external_date_time_chooser);
external_date_time_chooser->ResponseHandler(true, 0);
}
} // namespace blink