Commit e389ece6 authored by Shanmuga Pandi M's avatar Shanmuga Pandi M Committed by Commit Bot

Unify test classes to use PageTestBase

Bug: 771800
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2
Change-Id: I710238913e0400c1eabb24351116ab445c79739a
Reviewed-on: https://chromium-review.googlesource.com/821812Reviewed-by: default avatarKoji Ishii <kojii@chromium.org>
Commit-Queue: Shanmuga Pandi <shanmuga.m@samsung.com>
Cr-Commit-Position: refs/heads/master@{#523405}
parent 8f3a96b9
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "core/dom/ShadowRoot.h" #include "core/dom/ShadowRoot.h"
#include "core/frame/LocalFrameView.h" #include "core/frame/LocalFrameView.h"
#include "core/html/HTMLElement.h" #include "core/html/HTMLElement.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "platform/geometry/IntSize.h" #include "platform/geometry/IntSize.h"
#include "platform/wtf/Compiler.h" #include "platform/wtf/Compiler.h"
#include "platform/wtf/StdLibExtras.h" #include "platform/wtf/StdLibExtras.h"
...@@ -22,10 +22,8 @@ ...@@ -22,10 +22,8 @@
namespace blink { namespace blink {
class FlatTreeTraversalTest : public ::testing::Test { class FlatTreeTraversalTest : public PageTestBase {
protected: protected:
Document& GetDocument() const;
// Sets |mainHTML| to BODY element with |innerHTML| property and attaches // Sets |mainHTML| to BODY element with |innerHTML| property and attaches
// shadow root to child with |shadowHTML|, then update distribution for // shadow root to child with |shadowHTML|, then update distribution for
// calling member functions in |FlatTreeTraversal|. // calling member functions in |FlatTreeTraversal|.
...@@ -38,24 +36,8 @@ class FlatTreeTraversalTest : public ::testing::Test { ...@@ -38,24 +36,8 @@ class FlatTreeTraversalTest : public ::testing::Test {
void AttachV0ShadowRoot(Element& shadow_host, const char* shadow_inner_html); void AttachV0ShadowRoot(Element& shadow_host, const char* shadow_inner_html);
void AttachOpenShadowRoot(Element& shadow_host, void AttachOpenShadowRoot(Element& shadow_host,
const char* shadow_inner_html); const char* shadow_inner_html);
private:
void SetUp() override;
Persistent<Document> document_;
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
}; };
void FlatTreeTraversalTest::SetUp() {
dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
document_ = &dummy_page_holder_->GetDocument();
DCHECK(document_);
}
Document& FlatTreeTraversalTest::GetDocument() const {
return *document_;
}
void FlatTreeTraversalTest::SetupSampleHTML(const char* main_html, void FlatTreeTraversalTest::SetupSampleHTML(const char* main_html,
const char* shadow_html, const char* shadow_html,
unsigned index) { unsigned index) {
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
#include "core/dom/ShadowRoot.h" #include "core/dom/ShadowRoot.h"
#include "core/frame/LocalFrameView.h" #include "core/frame/LocalFrameView.h"
#include "core/html/HTMLElement.h" #include "core/html/HTMLElement.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "platform/geometry/IntSize.h" #include "platform/geometry/IntSize.h"
#include "platform/runtime_enabled_features.h" #include "platform/runtime_enabled_features.h"
#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
...@@ -26,14 +26,12 @@ namespace blink { ...@@ -26,14 +26,12 @@ namespace blink {
// To avoid symbol collisions in jumbo builds. // To avoid symbol collisions in jumbo builds.
namespace flat_tree_traversal_ng_test { namespace flat_tree_traversal_ng_test {
class FlatTreeTraversalNgTest : public ::testing::Test, class FlatTreeTraversalNgTest : public PageTestBase,
private ScopedIncrementalShadowDOMForTest { private ScopedIncrementalShadowDOMForTest {
public: public:
FlatTreeTraversalNgTest() : ScopedIncrementalShadowDOMForTest(true) {} FlatTreeTraversalNgTest() : ScopedIncrementalShadowDOMForTest(true) {}
protected: protected:
Document& GetDocument() const;
// Sets |mainHTML| to BODY element with |innerHTML| property and attaches // Sets |mainHTML| to BODY element with |innerHTML| property and attaches
// shadow root to child with |shadowHTML|, then update distribution for // shadow root to child with |shadowHTML|, then update distribution for
// calling member functions in |FlatTreeTraversalNg|. // calling member functions in |FlatTreeTraversalNg|.
...@@ -46,24 +44,8 @@ class FlatTreeTraversalNgTest : public ::testing::Test, ...@@ -46,24 +44,8 @@ class FlatTreeTraversalNgTest : public ::testing::Test,
void AttachV0ShadowRoot(Element& shadow_host, const char* shadow_inner_html); void AttachV0ShadowRoot(Element& shadow_host, const char* shadow_inner_html);
void AttachOpenShadowRoot(Element& shadow_host, void AttachOpenShadowRoot(Element& shadow_host,
const char* shadow_inner_html); const char* shadow_inner_html);
private:
void SetUp() override;
Persistent<Document> document_;
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
}; };
void FlatTreeTraversalNgTest::SetUp() {
dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
document_ = &dummy_page_holder_->GetDocument();
DCHECK(document_);
}
Document& FlatTreeTraversalNgTest::GetDocument() const {
return *document_;
}
void FlatTreeTraversalNgTest::SetupSampleHTML(const char* main_html, void FlatTreeTraversalNgTest::SetupSampleHTML(const char* main_html,
const char* shadow_html, const char* shadow_html,
unsigned index) { unsigned index) {
......
...@@ -5,16 +5,16 @@ ...@@ -5,16 +5,16 @@
#include "core/frame/Frame.h" #include "core/frame/Frame.h"
#include "core/dom/UserGestureIndicator.h" #include "core/dom/UserGestureIndicator.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "platform/testing/UnitTestHelpers.h" #include "platform/testing/UnitTestHelpers.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace blink { namespace blink {
class FrameTest : public ::testing::Test { class FrameTest : public PageTestBase {
public: public:
void SetUp() override { void SetUp() override {
dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600)); PageTestBase::SetUp();
Navigate("https://example.com/"); Navigate("https://example.com/");
ASSERT_FALSE(GetDocument().GetFrame()->HasBeenActivated()); ASSERT_FALSE(GetDocument().GetFrame()->HasBeenActivated());
...@@ -22,8 +22,6 @@ class FrameTest : public ::testing::Test { ...@@ -22,8 +22,6 @@ class FrameTest : public ::testing::Test {
GetDocument().GetFrame()->HasReceivedUserGestureBeforeNavigation()); GetDocument().GetFrame()->HasReceivedUserGestureBeforeNavigation());
} }
Document& GetDocument() const { return dummy_page_holder_->GetDocument(); }
void Navigate(const String& destinationUrl) { void Navigate(const String& destinationUrl) {
const KURL& url = KURL(NullURL(), destinationUrl); const KURL& url = KURL(NullURL(), destinationUrl);
FrameLoadRequest request(nullptr, ResourceRequest(url), FrameLoadRequest request(nullptr, ResourceRequest(url),
...@@ -38,9 +36,6 @@ class FrameTest : public ::testing::Test { ...@@ -38,9 +36,6 @@ class FrameTest : public ::testing::Test {
} }
void NavigateDifferentDomain() { Navigate("https://example.org/"); } void NavigateDifferentDomain() { Navigate("https://example.org/"); }
private:
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
}; };
TEST_F(FrameTest, NoGesture) { TEST_F(FrameTest, NoGesture) {
......
...@@ -9,36 +9,12 @@ ...@@ -9,36 +9,12 @@
#include "core/frame/LocalFrameView.h" #include "core/frame/LocalFrameView.h"
#include "core/html/HTMLObjectElement.h" #include "core/html/HTMLObjectElement.h"
#include "core/style/ComputedStyle.h" #include "core/style/ComputedStyle.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace blink { namespace blink {
class HTMLEmbedElementTest : public ::testing::Test { class HTMLEmbedElementTest : public PageTestBase {};
protected:
HTMLEmbedElementTest() {}
void SetUp() override;
Document& GetDocument() const { return *document_; }
void SetHtmlInnerHTML(const char* html_content);
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
Persistent<Document> document_;
};
void HTMLEmbedElementTest::SetUp() {
dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600));
document_ = &dummy_page_holder_->GetDocument();
DCHECK(document_);
}
void HTMLEmbedElementTest::SetHtmlInnerHTML(const char* html_content) {
GetDocument().documentElement()->SetInnerHTMLFromString(
String::FromUTF8(html_content));
GetDocument().View()->UpdateAllLifecyclePhases();
}
TEST_F(HTMLEmbedElementTest, FallbackState) { TEST_F(HTMLEmbedElementTest, FallbackState) {
// Load <object> element with a <embed> child. // Load <object> element with a <embed> child.
...@@ -55,7 +31,7 @@ TEST_F(HTMLEmbedElementTest, FallbackState) { ...@@ -55,7 +31,7 @@ TEST_F(HTMLEmbedElementTest, FallbackState) {
</object></div> </object></div>
)HTML"); )HTML");
auto* object_element = GetDocument().getElementById("fco"); auto* object_element = GetElementById("fco");
ASSERT_TRUE(object_element); ASSERT_TRUE(object_element);
HTMLObjectElement* object = ToHTMLObjectElement(object_element); HTMLObjectElement* object = ToHTMLObjectElement(object_element);
...@@ -66,11 +42,11 @@ TEST_F(HTMLEmbedElementTest, FallbackState) { ...@@ -66,11 +42,11 @@ TEST_F(HTMLEmbedElementTest, FallbackState) {
EXPECT_FALSE(object->UseFallbackContent()); EXPECT_FALSE(object->UseFallbackContent());
EXPECT_TRUE(object->WillUseFallbackContentAtLayout()); EXPECT_TRUE(object->WillUseFallbackContentAtLayout());
auto* embed_element = GetDocument().getElementById("fce"); auto* embed_element = GetElementById("fce");
ASSERT_TRUE(embed_element); ASSERT_TRUE(embed_element);
HTMLEmbedElement* embed = ToHTMLEmbedElement(embed_element); HTMLEmbedElement* embed = ToHTMLEmbedElement(embed_element);
GetDocument().View()->UpdateAllLifecyclePhases(); UpdateAllLifecyclePhases();
// We should get |true| as a result and don't trigger a DCHECK. // We should get |true| as a result and don't trigger a DCHECK.
EXPECT_TRUE(static_cast<Element*>(embed)->LayoutObjectIsNeeded( EXPECT_TRUE(static_cast<Element*>(embed)->LayoutObjectIsNeeded(
...@@ -83,7 +59,7 @@ TEST_F(HTMLEmbedElementTest, FallbackState) { ...@@ -83,7 +59,7 @@ TEST_F(HTMLEmbedElementTest, FallbackState) {
EXPECT_TRUE(object->UseFallbackContent()); EXPECT_TRUE(object->UseFallbackContent());
EXPECT_TRUE(object->WillUseFallbackContentAtLayout()); EXPECT_TRUE(object->WillUseFallbackContentAtLayout());
GetDocument().View()->UpdateAllLifecyclePhases(); UpdateAllLifecyclePhases();
EXPECT_TRUE(static_cast<Element*>(embed)->LayoutObjectIsNeeded( EXPECT_TRUE(static_cast<Element*>(embed)->LayoutObjectIsNeeded(
ComputedStyle::InitialStyle())); ComputedStyle::InitialStyle()));
} }
......
...@@ -4,13 +4,13 @@ ...@@ -4,13 +4,13 @@
#include "core/html/parser/HTMLDocumentParser.h" #include "core/html/parser/HTMLDocumentParser.h"
#include <memory>
#include "core/html/HTMLDocument.h" #include "core/html/HTMLDocument.h"
#include "core/html/parser/TextResourceDecoder.h" #include "core/html/parser/TextResourceDecoder.h"
#include "core/loader/PrerendererClient.h" #include "core/loader/PrerendererClient.h"
#include "core/loader/TextResourceDecoderBuilder.h" #include "core/loader/TextResourceDecoderBuilder.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include <memory>
namespace blink { namespace blink {
...@@ -28,10 +28,11 @@ class TestPrerendererClient : public PrerendererClient { ...@@ -28,10 +28,11 @@ class TestPrerendererClient : public PrerendererClient {
bool is_prefetch_only_; bool is_prefetch_only_;
}; };
class HTMLDocumentParserTest : public ::testing::Test { class HTMLDocumentParserTest : public PageTestBase {
protected: protected:
HTMLDocumentParserTest() : dummy_page_holder_(DummyPageHolder::Create()) { void SetUp() override {
dummy_page_holder_->GetDocument().SetURL(KURL("https://example.test")); PageTestBase::SetUp();
GetDocument().SetURL(KURL("https://example.test"));
} }
HTMLDocumentParser* CreateParser(HTMLDocument& document) { HTMLDocumentParser* CreateParser(HTMLDocument& document) {
...@@ -42,14 +43,12 @@ class HTMLDocumentParserTest : public ::testing::Test { ...@@ -42,14 +43,12 @@ class HTMLDocumentParserTest : public ::testing::Test {
parser->SetDecoder(std::move(decoder)); parser->SetDecoder(std::move(decoder));
return parser; return parser;
} }
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
}; };
} // namespace } // namespace
TEST_F(HTMLDocumentParserTest, AppendPrefetch) { TEST_F(HTMLDocumentParserTest, AppendPrefetch) {
HTMLDocument& document = ToHTMLDocument(dummy_page_holder_->GetDocument()); HTMLDocument& document = ToHTMLDocument(GetDocument());
ProvidePrerendererClientTo( ProvidePrerendererClientTo(
*document.GetPage(), *document.GetPage(),
new TestPrerendererClient(*document.GetPage(), true)); new TestPrerendererClient(*document.GetPage(), true));
...@@ -66,7 +65,7 @@ TEST_F(HTMLDocumentParserTest, AppendPrefetch) { ...@@ -66,7 +65,7 @@ TEST_F(HTMLDocumentParserTest, AppendPrefetch) {
} }
TEST_F(HTMLDocumentParserTest, AppendNoPrefetch) { TEST_F(HTMLDocumentParserTest, AppendNoPrefetch) {
HTMLDocument& document = ToHTMLDocument(dummy_page_holder_->GetDocument()); HTMLDocument& document = ToHTMLDocument(GetDocument());
EXPECT_FALSE(document.IsPrefetchOnly()); EXPECT_FALSE(document.IsPrefetchOnly());
// Use ForceSynchronousParsing to allow calling append(). // Use ForceSynchronousParsing to allow calling append().
HTMLDocumentParser* parser = CreateParser(document); HTMLDocumentParser* parser = CreateParser(document);
......
...@@ -8,23 +8,14 @@ ...@@ -8,23 +8,14 @@
#include "bindings/core/v8/V8BindingForCore.h" #include "bindings/core/v8/V8BindingForCore.h"
#include "core/dom/ShadowRootInit.h" #include "core/dom/ShadowRootInit.h"
#include "core/html/HTMLElement.h" #include "core/html/HTMLElement.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
namespace blink { namespace blink {
class FocusControllerTest : public ::testing::Test { class FocusControllerTest : public PageTestBase {
public:
Document& GetDocument() const { return page_holder_->GetDocument(); }
FocusController& GetFocusController() const {
return GetDocument().GetPage()->GetFocusController();
}
DummyPageHolder* PageHolder() const { return page_holder_.get(); }
private: private:
void SetUp() override { page_holder_ = DummyPageHolder::Create(); } void SetUp() override { PageTestBase::SetUp(IntSize()); }
std::unique_ptr<DummyPageHolder> page_holder_;
}; };
TEST_F(FocusControllerTest, SetInitialFocus) { TEST_F(FocusControllerTest, SetInitialFocus) {
...@@ -91,7 +82,7 @@ TEST_F(FocusControllerTest, SetActiveOnInactiveDocument) { ...@@ -91,7 +82,7 @@ TEST_F(FocusControllerTest, SetActiveOnInactiveDocument) {
// Document::shutdown() detaches document from its frame, and thus // Document::shutdown() detaches document from its frame, and thus
// document().page() becomes nullptr. // document().page() becomes nullptr.
// Use DummyPageHolder's page to retrieve FocusController. // Use DummyPageHolder's page to retrieve FocusController.
PageHolder()->GetPage().GetFocusController().SetActive(true); GetPage().GetFocusController().SetActive(true);
} }
// This test is for crbug.com/733218 // This test is for crbug.com/733218
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
#include "core/paint/PaintEvent.h" #include "core/paint/PaintEvent.h"
#include "core/paint/PaintTiming.h" #include "core/paint/PaintTiming.h"
#include "core/testing/DummyPageHolder.h" #include "core/testing/PageTestBase.h"
#include "platform/testing/TestingPlatformSupportWithMockScheduler.h" #include "platform/testing/TestingPlatformSupportWithMockScheduler.h"
#include "platform/wtf/text/StringBuilder.h" #include "platform/wtf/text/StringBuilder.h"
#include "public/platform/WebLayerTreeView.h" #include "public/platform/WebLayerTreeView.h"
...@@ -14,11 +14,11 @@ ...@@ -14,11 +14,11 @@
namespace blink { namespace blink {
class FirstMeaningfulPaintDetectorTest : public ::testing::Test { class FirstMeaningfulPaintDetectorTest : public PageTestBase {
protected: protected:
void SetUp() override { void SetUp() override {
platform_->AdvanceClockSeconds(1); platform_->AdvanceClockSeconds(1);
dummy_page_holder_ = DummyPageHolder::Create(IntSize(800, 600)); PageTestBase::SetUp();
} }
double AdvanceClockAndGetTime() { double AdvanceClockAndGetTime() {
...@@ -26,7 +26,6 @@ class FirstMeaningfulPaintDetectorTest : public ::testing::Test { ...@@ -26,7 +26,6 @@ class FirstMeaningfulPaintDetectorTest : public ::testing::Test {
return MonotonicallyIncreasingTime(); return MonotonicallyIncreasingTime();
} }
Document& GetDocument() { return dummy_page_holder_->GetDocument(); }
PaintTiming& GetPaintTiming() { return PaintTiming::From(GetDocument()); } PaintTiming& GetPaintTiming() { return PaintTiming::From(GetDocument()); }
FirstMeaningfulPaintDetector& Detector() { FirstMeaningfulPaintDetector& Detector() {
return GetPaintTiming().GetFirstMeaningfulPaintDetector(); return GetPaintTiming().GetFirstMeaningfulPaintDetector();
...@@ -123,9 +122,6 @@ class FirstMeaningfulPaintDetectorTest : public ::testing::Test { ...@@ -123,9 +122,6 @@ class FirstMeaningfulPaintDetectorTest : public ::testing::Test {
FirstMeaningfulPaintDetector::kNetwork0QuietWindowSeconds; FirstMeaningfulPaintDetector::kNetwork0QuietWindowSeconds;
static constexpr double kNetwork2QuietWindowSeconds = static constexpr double kNetwork2QuietWindowSeconds =
FirstMeaningfulPaintDetector::kNetwork2QuietWindowSeconds; FirstMeaningfulPaintDetector::kNetwork2QuietWindowSeconds;
private:
std::unique_ptr<DummyPageHolder> dummy_page_holder_;
}; };
TEST_F(FirstMeaningfulPaintDetectorTest, NoFirstPaint) { TEST_F(FirstMeaningfulPaintDetectorTest, NoFirstPaint) {
......
...@@ -79,8 +79,8 @@ void PageTestBase::LoadAhem(LocalFrame& frame) { ...@@ -79,8 +79,8 @@ void PageTestBase::LoadAhem(LocalFrame& frame) {
} }
// Both sets the inner html and runs the document lifecycle. // Both sets the inner html and runs the document lifecycle.
void PageTestBase::SetBodyInnerHTML(const String& html_content) { void PageTestBase::SetBodyInnerHTML(const String& body_content) {
GetDocument().body()->SetInnerHTMLFromString(html_content, GetDocument().body()->SetInnerHTMLFromString(body_content,
ASSERT_NO_EXCEPTION); ASSERT_NO_EXCEPTION);
UpdateAllLifecyclePhases(); UpdateAllLifecyclePhases();
} }
...@@ -89,6 +89,12 @@ void PageTestBase::SetBodyContent(const std::string& body_content) { ...@@ -89,6 +89,12 @@ void PageTestBase::SetBodyContent(const std::string& body_content) {
SetBodyInnerHTML(String::FromUTF8(body_content.c_str())); SetBodyInnerHTML(String::FromUTF8(body_content.c_str()));
} }
void PageTestBase::SetHtmlInnerHTML(const std::string& html_content) {
GetDocument().documentElement()->SetInnerHTMLFromString(
String::FromUTF8(html_content.c_str()));
GetDocument().View()->UpdateAllLifecyclePhases();
}
void PageTestBase::UpdateAllLifecyclePhases() { void PageTestBase::UpdateAllLifecyclePhases() {
GetDocument().View()->UpdateAllLifecyclePhases(); GetDocument().View()->UpdateAllLifecyclePhases();
} }
...@@ -109,4 +115,8 @@ PendingAnimations& PageTestBase::GetPendingAnimations() { ...@@ -109,4 +115,8 @@ PendingAnimations& PageTestBase::GetPendingAnimations() {
return GetDocument().GetPendingAnimations(); return GetDocument().GetPendingAnimations();
} }
FocusController& PageTestBase::GetFocusController() const {
return GetDocument().GetPage()->GetFocusController();
}
} // namespace blink } // namespace blink
...@@ -30,6 +30,7 @@ class PageTestBase : public ::testing::Test { ...@@ -30,6 +30,7 @@ class PageTestBase : public ::testing::Test {
// TODO(shanmuga.m@samsung.com): These two function to be unified. // TODO(shanmuga.m@samsung.com): These two function to be unified.
void SetBodyContent(const std::string&); void SetBodyContent(const std::string&);
void SetBodyInnerHTML(const String&); void SetBodyInnerHTML(const String&);
void SetHtmlInnerHTML(const std::string&);
Document& GetDocument() const; Document& GetDocument() const;
Page& GetPage() const; Page& GetPage() const;
...@@ -40,6 +41,7 @@ class PageTestBase : public ::testing::Test { ...@@ -40,6 +41,7 @@ class PageTestBase : public ::testing::Test {
Element* GetElementById(const char* id) const; Element* GetElementById(const char* id) const;
AnimationClock& GetAnimationClock(); AnimationClock& GetAnimationClock();
PendingAnimations& GetPendingAnimations(); PendingAnimations& GetPendingAnimations();
FocusController& GetFocusController() const;
void UpdateAllLifecyclePhases(); void UpdateAllLifecyclePhases();
......
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