Commit 5555d7ab authored by Mason Freed's avatar Mason Freed Committed by Commit Bot

Fix valueMissing() for immutable text-mode inputs

Prior to this commit, valueMissing() incorrectly returned true for
text-mode inputs that were readonly or disabled. With this CL, this
situation is fixed.

Fixed: 1039149
Change-Id: I0f3d9b5c00e7c4e9e8fa0a9767119a2ab5d6b01f
Bug: 1039149
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2003637
Commit-Queue: Mason Freed <masonfreed@chromium.org>
Commit-Queue: Kent Tamura <tkent@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Auto-Submit: Mason Freed <masonfreed@chromium.org>
Cr-Commit-Position: refs/heads/master@{#732686}
parent 95ac37de
...@@ -200,7 +200,11 @@ bool BaseTemporalInputType::ShouldRespectListAttribute() { ...@@ -200,7 +200,11 @@ bool BaseTemporalInputType::ShouldRespectListAttribute() {
} }
bool BaseTemporalInputType::ValueMissing(const String& value) const { bool BaseTemporalInputType::ValueMissing(const String& value) const {
return GetElement().IsRequired() && value.IsEmpty(); // For text-mode input elements (including dates), the value is missing only
// if it is mutable.
// https://html.spec.whatwg.org/multipage/input.html#the-required-attribute
return GetElement().IsRequired() && value.IsEmpty() &&
!GetElement().IsDisabledOrReadOnly();
} }
bool BaseTemporalInputType::MayTriggerVirtualKeyboard() const { bool BaseTemporalInputType::MayTriggerVirtualKeyboard() const {
......
...@@ -511,7 +511,10 @@ bool HTMLTextAreaElement::ValueMissing() const { ...@@ -511,7 +511,10 @@ bool HTMLTextAreaElement::ValueMissing() const {
} }
bool HTMLTextAreaElement::ValueMissing(const String* value) const { bool HTMLTextAreaElement::ValueMissing(const String* value) const {
return IsRequiredFormControl() && (value ? *value : this->value()).IsEmpty(); // For textarea elements, the value is missing only if it is mutable.
// https://html.spec.whatwg.org/multipage/form-elements.html#attr-textarea-required
return IsRequiredFormControl() && !IsDisabledOrReadOnly() &&
(value ? *value : this->value()).IsEmpty();
} }
bool HTMLTextAreaElement::TooLong() const { bool HTMLTextAreaElement::TooLong() const {
......
...@@ -134,7 +134,10 @@ bool TextFieldInputType::IsTextField() const { ...@@ -134,7 +134,10 @@ bool TextFieldInputType::IsTextField() const {
} }
bool TextFieldInputType::ValueMissing(const String& value) const { bool TextFieldInputType::ValueMissing(const String& value) const {
return GetElement().IsRequired() && value.IsEmpty(); // For text-mode input elements, the value is missing only if it is mutable.
// https://html.spec.whatwg.org/multipage/input.html#the-required-attribute
return GetElement().IsRequired() && value.IsEmpty() &&
!GetElement().IsDisabledOrReadOnly();
} }
bool TextFieldInputType::CanSetSuggestedValue() { bool TextFieldInputType::CanSetSuggestedValue() {
......
This is a testharness.js-based test.
PASS [INPUT in TEXT status] validity.valid must be false if validity.patternMismatch is true
FAIL [INPUT in TEXT status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in SEARCH status] validity.valid must be false if validity.patternMismatch is true
FAIL [INPUT in SEARCH status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in TEL status] validity.valid must be false if validity.patternMismatch is true
FAIL [INPUT in TEL status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in PASSWORD status] validity.valid must be false if validity.patternMismatch is true
FAIL [INPUT in PASSWORD status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in URL status] validity.valid must be false if validity.patternMismatch is true
PASS [INPUT in URL status] validity.valid must be false if validity.typeMismatch is true
FAIL [INPUT in URL status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in EMAIL status] validity.valid must be false if validity.patternMismatch is true
PASS [INPUT in EMAIL status] validity.valid must be false if validity.typeMismatch is true
FAIL [INPUT in EMAIL status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in DATETIME-LOCAL status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in DATETIME-LOCAL status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in DATETIME-LOCAL status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in DATETIME-LOCAL status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in DATE status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in DATE status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in DATE status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in DATE status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in MONTH status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in MONTH status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in MONTH status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in MONTH status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in WEEK status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in WEEK status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in WEEK status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in WEEK status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in TIME status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in TIME status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in TIME status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in TIME status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in NUMBER status] validity.valid must be false if validity.rangeOverflow is true
PASS [INPUT in NUMBER status] validity.valid must be false if validity.rangeUnderflow is true
PASS [INPUT in NUMBER status] validity.valid must be false if validity.stepMismatch is true
FAIL [INPUT in NUMBER status] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
PASS [INPUT in CHECKBOX status] validity.valid must be false if validity.valueMissing is true
PASS [INPUT in RADIO status] validity.valid must be false if validity.valueMissing is true
PASS [INPUT in FILE status] validity.valid must be false if validity.valueMissing is true
PASS [select] validity.valid must be false if validity.valueMissing is true
FAIL [textarea] validity.valid must be false if validity.valueMissing is true assert_true: The validity.valid should be true, when control is disabled. expected true got false
Harness: the test ran to completion.
This is a testharness.js-based test. This is a testharness.js-based test.
Found 95 tests; 50 PASS, 45 FAIL, 0 TIMEOUT, 0 NOTRUN. Found 95 tests; 93 PASS, 2 FAIL, 0 TIMEOUT, 0 NOTRUN.
PASS [INPUT in TEXT status] The required attribute is not set PASS [INPUT in TEXT status] The required attribute is not set
PASS [INPUT in TEXT status] The value is not empty and required is true PASS [INPUT in TEXT status] The value is not empty and required is true
FAIL [INPUT in TEXT status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TEXT status] The value is empty and required is true
PASS [INPUT in SEARCH status] The required attribute is not set PASS [INPUT in SEARCH status] The required attribute is not set
PASS [INPUT in SEARCH status] The value is not empty and required is true PASS [INPUT in SEARCH status] The value is not empty and required is true
FAIL [INPUT in SEARCH status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in SEARCH status] The value is empty and required is true
PASS [INPUT in TEL status] The required attribute is not set PASS [INPUT in TEL status] The required attribute is not set
PASS [INPUT in TEL status] The value is not empty and required is true PASS [INPUT in TEL status] The value is not empty and required is true
FAIL [INPUT in TEL status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TEL status] The value is empty and required is true
PASS [INPUT in URL status] The required attribute is not set PASS [INPUT in URL status] The required attribute is not set
PASS [INPUT in URL status] The value is not empty and required is true PASS [INPUT in URL status] The value is not empty and required is true
FAIL [INPUT in URL status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in URL status] The value is empty and required is true
PASS [INPUT in EMAIL status] The required attribute is not set PASS [INPUT in EMAIL status] The required attribute is not set
PASS [INPUT in EMAIL status] The value is not empty and required is true PASS [INPUT in EMAIL status] The value is not empty and required is true
FAIL [INPUT in EMAIL status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in EMAIL status] The value is empty and required is true
PASS [INPUT in PASSWORD status] The required attribute is not set PASS [INPUT in PASSWORD status] The required attribute is not set
PASS [INPUT in PASSWORD status] The value is not empty and required is true PASS [INPUT in PASSWORD status] The value is not empty and required is true
FAIL [INPUT in PASSWORD status] The value is empty and required is true assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in PASSWORD status] The value is empty and required is true
PASS [INPUT in DATETIME-LOCAL status] The required attribute is not set PASS [INPUT in DATETIME-LOCAL status] The required attribute is not set
PASS [INPUT in DATETIME-LOCAL status] Valid local date and time string(2000-12-10T12:00:00) PASS [INPUT in DATETIME-LOCAL status] Valid local date and time string(2000-12-10T12:00:00)
FAIL [INPUT in DATETIME-LOCAL status] Valid local date and time string(2000-12-10 12:00) assert_false: The validity.valueMissing should be false. expected false got true FAIL [INPUT in DATETIME-LOCAL status] Valid local date and time string(2000-12-10 12:00) assert_false: The validity.valueMissing should be false. expected false got true
PASS [INPUT in DATETIME-LOCAL status] Valid local date and time string(1979-10-14T12:00:00.001) PASS [INPUT in DATETIME-LOCAL status] Valid local date and time string(1979-10-14T12:00:00.001)
FAIL [INPUT in DATETIME-LOCAL status] The value attribute is a number(1234567) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] The value attribute is a number(1234567)
FAIL [INPUT in DATETIME-LOCAL status] The value attribute is a Date object assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] The value attribute is a Date object
FAIL [INPUT in DATETIME-LOCAL status] Invalid local date and time string(1979-10-99 99:99) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] Invalid local date and time string(1979-10-99 99:99)
FAIL [INPUT in DATETIME-LOCAL status] Valid local date and time string(1979-10-14 12:00:00) assert_false: The validity.valueMissing should be false. expected false got true FAIL [INPUT in DATETIME-LOCAL status] Valid local date and time string(1979-10-14 12:00:00) assert_false: The validity.valueMissing should be false. expected false got true
FAIL [INPUT in DATETIME-LOCAL status] Invalid local date and time string(2001-12-21 12:00)-two white space assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] Invalid local date and time string(2001-12-21 12:00)-two white space
FAIL [INPUT in DATETIME-LOCAL status] the value attribute is a string(abc) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] the value attribute is a string(abc)
FAIL [INPUT in DATETIME-LOCAL status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATETIME-LOCAL status] The value attribute is empty string
PASS [INPUT in DATE status] The required attribute is not set PASS [INPUT in DATE status] The required attribute is not set
PASS [INPUT in DATE status] Valid date string(2000-12-10) PASS [INPUT in DATE status] Valid date string(2000-12-10)
PASS [INPUT in DATE status] Valid date string(9999-01-01) PASS [INPUT in DATE status] Valid date string(9999-01-01)
FAIL [INPUT in DATE status] The value attribute is a number(1234567) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] The value attribute is a number(1234567)
FAIL [INPUT in DATE status] The value attribute is a Date object assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] The value attribute is a Date object
FAIL [INPUT in DATE status] Invalid date string(9999-99-99) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] Invalid date string(9999-99-99)
FAIL [INPUT in DATE status] Invalid date string(37-01-01) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] Invalid date string(37-01-01)
FAIL [INPUT in DATE status] Invalid date string(2000/01/01) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] Invalid date string(2000/01/01)
FAIL [INPUT in DATE status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in DATE status] The value attribute is empty string
PASS [INPUT in MONTH status] The required attribute is not set PASS [INPUT in MONTH status] The required attribute is not set
PASS [INPUT in MONTH status] Valid month string(2000-12) PASS [INPUT in MONTH status] Valid month string(2000-12)
PASS [INPUT in MONTH status] Valid month string(9999-01) PASS [INPUT in MONTH status] Valid month string(9999-01)
FAIL [INPUT in MONTH status] The value attribute is a number(1234567) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] The value attribute is a number(1234567)
FAIL [INPUT in MONTH status] The value attribute is a Date object assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] The value attribute is a Date object
FAIL [INPUT in MONTH status] Invalid month string(2000-99) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] Invalid month string(2000-99)
FAIL [INPUT in MONTH status] Invalid month string(37-01) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] Invalid month string(37-01)
FAIL [INPUT in MONTH status] Invalid month string(2000/01) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] Invalid month string(2000/01)
FAIL [INPUT in MONTH status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in MONTH status] The value attribute is empty string
PASS [INPUT in WEEK status] The required attribute is not set PASS [INPUT in WEEK status] The required attribute is not set
PASS [INPUT in WEEK status] Valid week string(2000-W12) PASS [INPUT in WEEK status] Valid week string(2000-W12)
PASS [INPUT in WEEK status] Valid week string(9999-W01) PASS [INPUT in WEEK status] Valid week string(9999-W01)
FAIL [INPUT in WEEK status] The value attribute is a number(1234567) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] The value attribute is a number(1234567)
FAIL [INPUT in WEEK status] The value attribute is a Date object assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] The value attribute is a Date object
FAIL [INPUT in WEEK status] Invalid week string(2000-W99) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] Invalid week string(2000-W99)
FAIL [INPUT in WEEK status] invalid week string(2000-W00) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] invalid week string(2000-W00)
FAIL [INPUT in WEEK status] invalid week string(2000-w01) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] invalid week string(2000-w01)
FAIL [INPUT in WEEK status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in WEEK status] The value attribute is empty string
PASS [INPUT in TIME status] The required attribute is not set PASS [INPUT in TIME status] The required attribute is not set
PASS [INPUT in TIME status] Validtime string(12:00:00) PASS [INPUT in TIME status] Validtime string(12:00:00)
PASS [INPUT in TIME status] Validtime string(12:00) PASS [INPUT in TIME status] Validtime string(12:00)
PASS [INPUT in TIME status] Valid time string(12:00:60.001) PASS [INPUT in TIME status] Valid time string(12:00:60.001)
PASS [INPUT in TIME status] Valid time string(12:00:60.01) PASS [INPUT in TIME status] Valid time string(12:00:60.01)
PASS [INPUT in TIME status] Valid time string(12:00:60.1) PASS [INPUT in TIME status] Valid time string(12:00:60.1)
FAIL [INPUT in TIME status] The value attribute is a number(1234567) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] The value attribute is a number(1234567)
FAIL [INPUT in TIME status] The value attribute is a time object assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] The value attribute is a time object
FAIL [INPUT in TIME status] Invalid time string(25:00:00) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] Invalid time string(25:00:00)
FAIL [INPUT in TIME status] Invalid time string(12:60:00) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] Invalid time string(12:60:00)
FAIL [INPUT in TIME status] Invalid time string(12:00:60) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] Invalid time string(12:00:60)
FAIL [INPUT in TIME status] Invalid time string(12:00:00:001) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] Invalid time string(12:00:00:001)
FAIL [INPUT in TIME status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in TIME status] The value attribute is empty string
PASS [INPUT in NUMBER status] The required attribute is not set PASS [INPUT in NUMBER status] The required attribute is not set
PASS [INPUT in NUMBER status] Value is an integer with a leading symbol '+' PASS [INPUT in NUMBER status] Value is an integer with a leading symbol '+'
PASS [INPUT in NUMBER status] Value is a number with a '-' symbol PASS [INPUT in NUMBER status] Value is a number with a '-' symbol
PASS [INPUT in NUMBER status] Value is a number in scientific notation form(e is in lowercase) PASS [INPUT in NUMBER status] Value is a number in scientific notation form(e is in lowercase)
PASS [INPUT in NUMBER status] Value is a number in scientific notation form(E is in uppercase) PASS [INPUT in NUMBER status] Value is a number in scientific notation form(E is in uppercase)
PASS [INPUT in NUMBER status] Value is -0 PASS [INPUT in NUMBER status] Value is -0
FAIL [INPUT in NUMBER status] Value is a number with some white spaces assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in NUMBER status] Value is a number with some white spaces
FAIL [INPUT in NUMBER status] Value is Math.pow(2, 1024) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in NUMBER status] Value is Math.pow(2, 1024)
FAIL [INPUT in NUMBER status] Value is Math.pow(-2, 1024) assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in NUMBER status] Value is Math.pow(-2, 1024)
FAIL [INPUT in NUMBER status] Value is a string that cannot be converted to a number assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in NUMBER status] Value is a string that cannot be converted to a number
FAIL [INPUT in NUMBER status] The value attribute is empty string assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [INPUT in NUMBER status] The value attribute is empty string
PASS [INPUT in CHECKBOX status] The required attribute is not set PASS [INPUT in CHECKBOX status] The required attribute is not set
PASS [INPUT in CHECKBOX status] The checked attribute is true PASS [INPUT in CHECKBOX status] The checked attribute is true
PASS [INPUT in CHECKBOX status] The checked attribute is false PASS [INPUT in CHECKBOX status] The checked attribute is false
...@@ -94,6 +94,6 @@ PASS [select] Selected the option with value equals to 1 ...@@ -94,6 +94,6 @@ PASS [select] Selected the option with value equals to 1
PASS [select] Selected the option with value equals to empty PASS [select] Selected the option with value equals to empty
PASS [textarea] The required attribute is not set PASS [textarea] The required attribute is not set
PASS [textarea] The value is not empty PASS [textarea] The value is not empty
FAIL [textarea] The value is empty assert_false: The validity.valueMissing should be false, when control is disabled. expected false got true PASS [textarea] The value is empty
Harness: the test ran to completion. Harness: the test ran to completion.
...@@ -23,6 +23,10 @@ ...@@ -23,6 +23,10 @@
tag: "input", tag: "input",
types: ["datetime-local"], types: ["datetime-local"],
testData: [ testData: [
// Note that several of these datetime strings use a ' ' separator, which
// is questionably spec-compliant. See:
// - crbug.com/521871
// - https://github.com/whatwg/html/issues/2276
{conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"}, {conditions: {required: false, value: ""}, expected: false, name: "[target] The required attribute is not set"},
{conditions: {required: true, value: "2000-12-10T12:00:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10T12:00:00)"}, {conditions: {required: true, value: "2000-12-10T12:00:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10T12:00:00)"},
{conditions: {required: true, value: "2000-12-10 12:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10 12:00)"}, {conditions: {required: true, value: "2000-12-10 12:00"}, expected: false, name: "[target] Valid local date and time string(2000-12-10 12:00)"},
......
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