Commit 2b04a0aa authored by rob.buis@samsung.com's avatar rob.buis@samsung.com

Clean up virtual functions in css/

Clean up virtual functions in css/ by:
- Making classes final when possible
- Using 'override' when appropriate
- Making isXXX() virtual functions private on XXX classes

I also added a few nullptr usages.

Based on:
http://trac.webkit.org/changeset/175391

Review URL: https://codereview.chromium.org/719833002

git-svn-id: svn://svn.chromium.org/blink/trunk@185243 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 78594c01
...@@ -66,7 +66,6 @@ class CSSBasicShapeCircle final : public CSSBasicShape { ...@@ -66,7 +66,6 @@ class CSSBasicShapeCircle final : public CSSBasicShape {
public: public:
static PassRefPtrWillBeRawPtr<CSSBasicShapeCircle> create() { return adoptRefWillBeNoop(new CSSBasicShapeCircle); } static PassRefPtrWillBeRawPtr<CSSBasicShapeCircle> create() { return adoptRefWillBeNoop(new CSSBasicShapeCircle); }
virtual Type type() const override { return CSSBasicShapeCircleType; }
virtual String cssText() const override; virtual String cssText() const override;
virtual bool equals(const CSSBasicShape&) const override; virtual bool equals(const CSSBasicShape&) const override;
...@@ -83,6 +82,8 @@ public: ...@@ -83,6 +82,8 @@ public:
private: private:
CSSBasicShapeCircle() { } CSSBasicShapeCircle() { }
virtual Type type() const override { return CSSBasicShapeCircleType; }
RefPtrWillBeMember<CSSPrimitiveValue> m_centerX; RefPtrWillBeMember<CSSPrimitiveValue> m_centerX;
RefPtrWillBeMember<CSSPrimitiveValue> m_centerY; RefPtrWillBeMember<CSSPrimitiveValue> m_centerY;
RefPtrWillBeMember<CSSPrimitiveValue> m_radius; RefPtrWillBeMember<CSSPrimitiveValue> m_radius;
...@@ -92,7 +93,6 @@ class CSSBasicShapeEllipse final : public CSSBasicShape { ...@@ -92,7 +93,6 @@ class CSSBasicShapeEllipse final : public CSSBasicShape {
public: public:
static PassRefPtrWillBeRawPtr<CSSBasicShapeEllipse> create() { return adoptRefWillBeNoop(new CSSBasicShapeEllipse); } static PassRefPtrWillBeRawPtr<CSSBasicShapeEllipse> create() { return adoptRefWillBeNoop(new CSSBasicShapeEllipse); }
virtual Type type() const override { return CSSBasicShapeEllipseType; }
virtual String cssText() const override; virtual String cssText() const override;
virtual bool equals(const CSSBasicShape&) const override; virtual bool equals(const CSSBasicShape&) const override;
...@@ -111,6 +111,8 @@ public: ...@@ -111,6 +111,8 @@ public:
private: private:
CSSBasicShapeEllipse() { } CSSBasicShapeEllipse() { }
virtual Type type() const override { return CSSBasicShapeEllipseType; }
RefPtrWillBeMember<CSSPrimitiveValue> m_centerX; RefPtrWillBeMember<CSSPrimitiveValue> m_centerX;
RefPtrWillBeMember<CSSPrimitiveValue> m_centerY; RefPtrWillBeMember<CSSPrimitiveValue> m_centerY;
RefPtrWillBeMember<CSSPrimitiveValue> m_radiusX; RefPtrWillBeMember<CSSPrimitiveValue> m_radiusX;
...@@ -134,7 +136,6 @@ public: ...@@ -134,7 +136,6 @@ public:
void setWindRule(WindRule w) { m_windRule = w; } void setWindRule(WindRule w) { m_windRule = w; }
WindRule windRule() const { return m_windRule; } WindRule windRule() const { return m_windRule; }
virtual Type type() const override { return CSSBasicShapePolygonType; }
virtual String cssText() const override; virtual String cssText() const override;
virtual bool equals(const CSSBasicShape&) const override; virtual bool equals(const CSSBasicShape&) const override;
...@@ -146,11 +147,13 @@ private: ...@@ -146,11 +147,13 @@ private:
{ {
} }
virtual Type type() const override { return CSSBasicShapePolygonType; }
WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue> > m_values; WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue> > m_values;
WindRule m_windRule; WindRule m_windRule;
}; };
class CSSBasicShapeInset : public CSSBasicShape { class CSSBasicShapeInset final : public CSSBasicShape {
public: public:
static PassRefPtrWillBeRawPtr<CSSBasicShapeInset> create() { return adoptRefWillBeNoop(new CSSBasicShapeInset); } static PassRefPtrWillBeRawPtr<CSSBasicShapeInset> create() { return adoptRefWillBeNoop(new CSSBasicShapeInset); }
...@@ -198,7 +201,6 @@ public: ...@@ -198,7 +201,6 @@ public:
void setBottomRightRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> radius) { m_bottomRightRadius = radius; } void setBottomRightRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> radius) { m_bottomRightRadius = radius; }
void setBottomLeftRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> radius) { m_bottomLeftRadius = radius; } void setBottomLeftRadius(PassRefPtrWillBeRawPtr<CSSPrimitiveValue> radius) { m_bottomLeftRadius = radius; }
virtual Type type() const override { return CSSBasicShapeInsetType; }
virtual String cssText() const override; virtual String cssText() const override;
virtual bool equals(const CSSBasicShape&) const override; virtual bool equals(const CSSBasicShape&) const override;
...@@ -207,6 +209,8 @@ public: ...@@ -207,6 +209,8 @@ public:
private: private:
CSSBasicShapeInset() { } CSSBasicShapeInset() { }
virtual Type type() const override { return CSSBasicShapeInsetType; }
RefPtrWillBeMember<CSSPrimitiveValue> m_top; RefPtrWillBeMember<CSSPrimitiveValue> m_top;
RefPtrWillBeMember<CSSPrimitiveValue> m_right; RefPtrWillBeMember<CSSPrimitiveValue> m_right;
RefPtrWillBeMember<CSSPrimitiveValue> m_bottom; RefPtrWillBeMember<CSSPrimitiveValue> m_bottom;
......
...@@ -41,7 +41,7 @@ public: ...@@ -41,7 +41,7 @@ public:
String customCSSText() const; String customCSSText() const;
Quad* slices() { return m_slices ? m_slices->getQuadValue() : 0; } Quad* slices() { return m_slices ? m_slices->getQuadValue() : nullptr; }
bool equals(const CSSBorderImageSliceValue&) const; bool equals(const CSSBorderImageSliceValue&) const;
......
...@@ -36,7 +36,6 @@ public: ...@@ -36,7 +36,6 @@ public:
virtual ~CSSCharsetRule() { } virtual ~CSSCharsetRule() { }
virtual CSSRule::Type type() const override { return CHARSET_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase* rule) override { ASSERT_UNUSED(rule, !rule); } virtual void reattach(StyleRuleBase* rule) override { ASSERT_UNUSED(rule, !rule); }
...@@ -48,6 +47,8 @@ public: ...@@ -48,6 +47,8 @@ public:
private: private:
CSSCharsetRule(CSSStyleSheet* parent, const String& encoding); CSSCharsetRule(CSSStyleSheet* parent, const String& encoding);
virtual CSSRule::Type type() const override { return CHARSET_RULE; }
String m_encoding; String m_encoding;
}; };
......
...@@ -39,7 +39,7 @@ class ImageResource; ...@@ -39,7 +39,7 @@ class ImageResource;
class CrossfadeSubimageObserverProxy; class CrossfadeSubimageObserverProxy;
class RenderObject; class RenderObject;
class CSSCrossfadeValue : public CSSImageGeneratorValue { class CSSCrossfadeValue final : public CSSImageGeneratorValue {
friend class CrossfadeSubimageObserverProxy; friend class CrossfadeSubimageObserverProxy;
public: public:
static PassRefPtrWillBeRawPtr<CSSCrossfadeValue> create(PassRefPtrWillBeRawPtr<CSSValue> fromValue, PassRefPtrWillBeRawPtr<CSSValue> toValue) static PassRefPtrWillBeRawPtr<CSSCrossfadeValue> create(PassRefPtrWillBeRawPtr<CSSValue> fromValue, PassRefPtrWillBeRawPtr<CSSValue> toValue)
...@@ -84,7 +84,7 @@ private: ...@@ -84,7 +84,7 @@ private:
, m_ready(false) { } , m_ready(false) { }
virtual ~CrossfadeSubimageObserverProxy() { } virtual ~CrossfadeSubimageObserverProxy() { }
virtual void imageChanged(ImageResource*, const IntRect* = 0) override; virtual void imageChanged(ImageResource*, const IntRect* = nullptr) override;
void setReady(bool ready) { m_ready = ready; } void setReady(bool ready) { m_ready = ready; }
private: private:
CSSCrossfadeValue* m_ownerValue; CSSCrossfadeValue* m_ownerValue;
......
...@@ -49,7 +49,6 @@ public: ...@@ -49,7 +49,6 @@ public:
virtual ~CSSFilterRule(); virtual ~CSSFilterRule();
virtual CSSRule::Type type() const override { return WEBKIT_FILTER_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -60,6 +59,8 @@ public: ...@@ -60,6 +59,8 @@ public:
private: private:
CSSFilterRule(StyleRuleFilter*, CSSStyleSheet* parent); CSSFilterRule(StyleRuleFilter*, CSSStyleSheet* parent);
virtual CSSRule::Type type() const override { return WEBKIT_FILTER_RULE; }
RefPtrWillBeMember<StyleRuleFilter> m_filterRule; RefPtrWillBeMember<StyleRuleFilter> m_filterRule;
mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper; mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper;
}; };
......
...@@ -41,7 +41,6 @@ public: ...@@ -41,7 +41,6 @@ public:
virtual ~CSSFontFaceRule(); virtual ~CSSFontFaceRule();
virtual CSSRule::Type type() const override { return FONT_FACE_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -54,6 +53,8 @@ public: ...@@ -54,6 +53,8 @@ public:
private: private:
CSSFontFaceRule(StyleRuleFontFace*, CSSStyleSheet* parent); CSSFontFaceRule(StyleRuleFontFace*, CSSStyleSheet* parent);
virtual CSSRule::Type type() const override { return FONT_FACE_RULE; }
RefPtrWillBeMember<StyleRuleFontFace> m_fontFaceRule; RefPtrWillBeMember<StyleRuleFontFace> m_fontFaceRule;
mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper; mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper;
}; };
......
...@@ -45,7 +45,7 @@ public: ...@@ -45,7 +45,7 @@ public:
virtual bool isLoaded() const { return true; } virtual bool isLoaded() const { return true; }
virtual bool isValid() const { return true; } virtual bool isValid() const { return true; }
virtual FontResource* resource() { return 0; } virtual FontResource* resource() { return nullptr; }
void setFontFace(CSSFontFace* face) { m_face = face; } void setFontFace(CSSFontFace* face) { m_face = face; }
PassRefPtr<SimpleFontData> getFontData(const FontDescription&); PassRefPtr<SimpleFontData> getFontData(const FontDescription&);
......
...@@ -76,7 +76,7 @@ public: ...@@ -76,7 +76,7 @@ public:
const GenericFontFamilySettings& genericFontFamilySettings() const { return m_genericFontFamilySettings; } const GenericFontFamilySettings& genericFontFamilySettings() const { return m_genericFontFamilySettings; }
void updateGenericFontFamilySettings(Document&); void updateGenericFontFamilySettings(Document&);
virtual void trace(Visitor*); virtual void trace(Visitor*) override;
private: private:
explicit CSSFontSelector(Document*); explicit CSSFontSelector(Document*);
......
...@@ -40,7 +40,6 @@ public: ...@@ -40,7 +40,6 @@ public:
virtual ~CSSImportRule(); virtual ~CSSImportRule();
virtual CSSRule::Type type() const override { return IMPORT_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -53,6 +52,8 @@ public: ...@@ -53,6 +52,8 @@ public:
private: private:
CSSImportRule(StyleRuleImport*, CSSStyleSheet*); CSSImportRule(StyleRuleImport*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return IMPORT_RULE; }
RefPtrWillBeMember<StyleRuleImport> m_importRule; RefPtrWillBeMember<StyleRuleImport> m_importRule;
mutable RefPtrWillBeMember<MediaList> m_mediaCSSOMWrapper; mutable RefPtrWillBeMember<MediaList> m_mediaCSSOMWrapper;
mutable RefPtrWillBeMember<CSSStyleSheet> m_styleSheetCSSOMWrapper; mutable RefPtrWillBeMember<CSSStyleSheet> m_styleSheetCSSOMWrapper;
......
...@@ -79,7 +79,6 @@ class CSSKeyframeRule final : public CSSRule { ...@@ -79,7 +79,6 @@ class CSSKeyframeRule final : public CSSRule {
public: public:
virtual ~CSSKeyframeRule(); virtual ~CSSKeyframeRule();
virtual CSSRule::Type type() const override { return KEYFRAME_RULE; }
virtual String cssText() const override { return m_keyframe->cssText(); } virtual String cssText() const override { return m_keyframe->cssText(); }
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -93,6 +92,8 @@ public: ...@@ -93,6 +92,8 @@ public:
private: private:
CSSKeyframeRule(StyleKeyframe*, CSSKeyframesRule* parent); CSSKeyframeRule(StyleKeyframe*, CSSKeyframesRule* parent);
virtual CSSRule::Type type() const override { return KEYFRAME_RULE; }
RefPtrWillBeMember<StyleKeyframe> m_keyframe; RefPtrWillBeMember<StyleKeyframe> m_keyframe;
mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper; mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper;
......
...@@ -82,7 +82,6 @@ public: ...@@ -82,7 +82,6 @@ public:
virtual ~CSSKeyframesRule(); virtual ~CSSKeyframesRule();
virtual CSSRule::Type type() const override { return KEYFRAMES_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -107,6 +106,8 @@ public: ...@@ -107,6 +106,8 @@ public:
private: private:
CSSKeyframesRule(StyleRuleKeyframes*, CSSStyleSheet* parent); CSSKeyframesRule(StyleRuleKeyframes*, CSSStyleSheet* parent);
virtual CSSRule::Type type() const override { return KEYFRAMES_RULE; }
RefPtrWillBeMember<StyleRuleKeyframes> m_keyframesRule; RefPtrWillBeMember<StyleRuleKeyframes> m_keyframesRule;
mutable WillBeHeapVector<RefPtrWillBeMember<CSSKeyframeRule> > m_childRuleCSSOMWrappers; mutable WillBeHeapVector<RefPtrWillBeMember<CSSKeyframeRule> > m_childRuleCSSOMWrappers;
mutable OwnPtrWillBeMember<CSSRuleList> m_ruleListCSSOMWrapper; mutable OwnPtrWillBeMember<CSSRuleList> m_ruleListCSSOMWrapper;
......
...@@ -40,7 +40,6 @@ public: ...@@ -40,7 +40,6 @@ public:
virtual ~CSSMediaRule(); virtual ~CSSMediaRule();
virtual CSSRule::Type type() const override { return MEDIA_RULE; }
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
virtual String cssText() const override; virtual String cssText() const override;
...@@ -51,6 +50,8 @@ public: ...@@ -51,6 +50,8 @@ public:
private: private:
CSSMediaRule(StyleRuleMedia*, CSSStyleSheet*); CSSMediaRule(StyleRuleMedia*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return MEDIA_RULE; }
MediaQuerySet* mediaQueries() const; MediaQuerySet* mediaQueries() const;
mutable RefPtrWillBeMember<MediaList> m_mediaCSSOMWrapper; mutable RefPtrWillBeMember<MediaList> m_mediaCSSOMWrapper;
......
...@@ -42,7 +42,6 @@ public: ...@@ -42,7 +42,6 @@ public:
virtual ~CSSPageRule(); virtual ~CSSPageRule();
virtual CSSRule::Type type() const override { return PAGE_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -56,6 +55,8 @@ public: ...@@ -56,6 +55,8 @@ public:
private: private:
CSSPageRule(StyleRulePage*, CSSStyleSheet*); CSSPageRule(StyleRulePage*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return PAGE_RULE; }
RefPtrWillBeMember<StyleRulePage> m_pageRule; RefPtrWillBeMember<StyleRulePage> m_pageRule;
mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper; mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper;
}; };
......
...@@ -41,7 +41,6 @@ public: ...@@ -41,7 +41,6 @@ public:
virtual ~CSSStyleRule(); virtual ~CSSStyleRule();
virtual CSSRule::Type type() const override { return STYLE_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -58,6 +57,8 @@ public: ...@@ -58,6 +57,8 @@ public:
private: private:
CSSStyleRule(StyleRule*, CSSStyleSheet*); CSSStyleRule(StyleRule*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return STYLE_RULE; }
String generateSelectorText() const; String generateSelectorText() const;
RefPtrWillBeMember<StyleRule> m_styleRule; RefPtrWillBeMember<StyleRule> m_styleRule;
......
...@@ -45,7 +45,6 @@ public: ...@@ -45,7 +45,6 @@ public:
virtual ~CSSSupportsRule() { } virtual ~CSSSupportsRule() { }
virtual CSSRule::Type type() const override { return SUPPORTS_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
String conditionText() const; String conditionText() const;
...@@ -54,6 +53,8 @@ public: ...@@ -54,6 +53,8 @@ public:
private: private:
CSSSupportsRule(StyleRuleSupports*, CSSStyleSheet*); CSSSupportsRule(StyleRuleSupports*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return SUPPORTS_RULE; }
}; };
DEFINE_CSS_RULE_TYPE_CASTS(CSSSupportsRule, SUPPORTS_RULE); DEFINE_CSS_RULE_TYPE_CASTS(CSSSupportsRule, SUPPORTS_RULE);
......
...@@ -32,10 +32,12 @@ public: ...@@ -32,10 +32,12 @@ public:
CSSUnknownRule() : CSSRule(0) { } CSSUnknownRule() : CSSRule(0) { }
virtual ~CSSUnknownRule() { } virtual ~CSSUnknownRule() { }
virtual CSSRule::Type type() const override { return UNKNOWN_RULE; }
virtual String cssText() const override { return String(); } virtual String cssText() const override { return String(); }
virtual void reattach(StyleRuleBase*) override { } virtual void reattach(StyleRuleBase*) override { }
virtual void trace(Visitor* visitor) override { CSSRule::trace(visitor); } virtual void trace(Visitor* visitor) override { CSSRule::trace(visitor); }
private:
virtual CSSRule::Type type() const override { return UNKNOWN_RULE; }
}; };
} // namespace blink } // namespace blink
......
...@@ -49,7 +49,6 @@ public: ...@@ -49,7 +49,6 @@ public:
} }
virtual ~CSSViewportRule(); virtual ~CSSViewportRule();
virtual CSSRule::Type type() const override { return VIEWPORT_RULE; }
virtual String cssText() const override; virtual String cssText() const override;
virtual void reattach(StyleRuleBase*) override; virtual void reattach(StyleRuleBase*) override;
...@@ -60,6 +59,8 @@ public: ...@@ -60,6 +59,8 @@ public:
private: private:
CSSViewportRule(StyleRuleViewport*, CSSStyleSheet*); CSSViewportRule(StyleRuleViewport*, CSSStyleSheet*);
virtual CSSRule::Type type() const override { return VIEWPORT_RULE; }
RefPtrWillBeMember<StyleRuleViewport> m_viewportRule; RefPtrWillBeMember<StyleRuleViewport> m_viewportRule;
mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper; mutable RefPtrWillBeMember<StyleRuleCSSStyleDeclaration> m_propertiesCSSOMWrapper;
}; };
......
...@@ -10,10 +10,10 @@ ...@@ -10,10 +10,10 @@
namespace blink { namespace blink {
class LocalFontFaceSource : public CSSFontFaceSource { class LocalFontFaceSource final : public CSSFontFaceSource {
public: public:
LocalFontFaceSource(const String& fontName) : m_fontName(fontName) { } LocalFontFaceSource(const String& fontName) : m_fontName(fontName) { }
virtual bool isLocal() const { return true; } virtual bool isLocal() const override { return true; }
virtual bool isLocalFontAvailable(const FontDescription&) override; virtual bool isLocalFontAvailable(const FontDescription&) override;
private: private:
......
...@@ -13,7 +13,7 @@ namespace blink { ...@@ -13,7 +13,7 @@ namespace blink {
class FontLoader; class FontLoader;
class RemoteFontFaceSource : public CSSFontFaceSource, public FontResourceClient { class RemoteFontFaceSource final : public CSSFontFaceSource, public FontResourceClient {
public: public:
explicit RemoteFontFaceSource(FontResource*, PassRefPtrWillBeRawPtr<FontLoader>); explicit RemoteFontFaceSource(FontResource*, PassRefPtrWillBeRawPtr<FontLoader>);
virtual ~RemoteFontFaceSource(); virtual ~RemoteFontFaceSource();
......
...@@ -37,7 +37,7 @@ namespace blink { ...@@ -37,7 +37,7 @@ namespace blink {
class LocalFrame; class LocalFrame;
class StyleMedia : public RefCountedWillBeGarbageCollected<StyleMedia>, public DOMWindowProperty, public ScriptWrappable { class StyleMedia final : public RefCountedWillBeGarbageCollected<StyleMedia>, public DOMWindowProperty, public ScriptWrappable {
DEFINE_WRAPPERTYPEINFO(); DEFINE_WRAPPERTYPEINFO();
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(StyleMedia); WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(StyleMedia);
public: public:
......
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