diff options
Diffstat (limited to 'Source/WebCore/html/HTMLKeygenElement.cpp')
-rw-r--r-- | Source/WebCore/html/HTMLKeygenElement.cpp | 62 |
1 files changed, 48 insertions, 14 deletions
diff --git a/Source/WebCore/html/HTMLKeygenElement.cpp b/Source/WebCore/html/HTMLKeygenElement.cpp index 881a0a8..b90335e 100644 --- a/Source/WebCore/html/HTMLKeygenElement.cpp +++ b/Source/WebCore/html/HTMLKeygenElement.cpp @@ -29,6 +29,7 @@ #include "Document.h" #include "FormDataList.h" #include "HTMLNames.h" +#include "HTMLSelectElement.h" #include "HTMLOptionElement.h" #include "SSLKeyGenerator.h" #include "Text.h" @@ -40,20 +41,41 @@ namespace WebCore { using namespace HTMLNames; +class KeygenSelectElement : public HTMLSelectElement { +public: + static PassRefPtr<KeygenSelectElement> create(Document* document) + { + return adoptRef(new KeygenSelectElement(document)); + } + + virtual const AtomicString& shadowPseudoId() const + { + DEFINE_STATIC_LOCAL(AtomicString, pseudoId, ("-webkit-keygen-select")); + return pseudoId; + } + +protected: + KeygenSelectElement(Document* document) + : HTMLSelectElement(selectTag, document, 0) + { + } +}; + inline HTMLKeygenElement::HTMLKeygenElement(const QualifiedName& tagName, Document* document, HTMLFormElement* form) - : HTMLSelectElement(tagName, document, form) + : HTMLFormControlElementWithState(tagName, document, form) { ASSERT(hasTagName(keygenTag)); - // FIXME: This markup should go in the shadow tree. - // Add one option element for each key size. + // Create a select element with one option element for each key size. + RefPtr<HTMLSelectElement> select = KeygenSelectElement::create(document); Vector<String> keys; getSupportedKeySizes(keys); for (size_t i = 0; i < keys.size(); ++i) { RefPtr<HTMLOptionElement> option = HTMLOptionElement::create(document, this->form()); - parserAddChild(option); + select->parserAddChild(option); option->parserAddChild(Text::create(document, keys[i])); } + setShadowRoot(select); } PassRefPtr<HTMLKeygenElement> HTMLKeygenElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form) @@ -61,22 +83,18 @@ PassRefPtr<HTMLKeygenElement> HTMLKeygenElement::create(const QualifiedName& tag return adoptRef(new HTMLKeygenElement(tagName, document, form)); } -const AtomicString& HTMLKeygenElement::formControlType() const -{ - DEFINE_STATIC_LOCAL(const AtomicString, keygen, ("keygen")); - return keygen; -} - void HTMLKeygenElement::parseMappedAttribute(Attribute* attr) { + // Reflect disabled attribute on the shadow select element + if (attr->name() == disabledAttr) + selectShadow()->setAttribute(attr->name(), attr->value()); + if (attr->name() == challengeAttr) m_challenge = attr->value(); else if (attr->name() == keytypeAttr) m_keyType = attr->value(); - else { - // Skip HTMLSelectElement parsing. + else HTMLFormControlElement::parseMappedAttribute(attr); - } } bool HTMLKeygenElement::appendFormData(FormDataList& encoded_values, bool) @@ -84,11 +102,27 @@ bool HTMLKeygenElement::appendFormData(FormDataList& encoded_values, bool) // Only RSA is supported at this time. if (!m_keyType.isNull() && !equalIgnoringCase(m_keyType, "rsa")) return false; - String value = signedPublicKeyAndChallengeString(selectedIndex(), m_challenge, document()->baseURL()); + String value = signedPublicKeyAndChallengeString(selectShadow()->selectedIndex(), m_challenge, document()->baseURL()); if (value.isNull()) return false; encoded_values.appendData(name(), value.utf8()); return true; } +const AtomicString& HTMLKeygenElement::formControlType() const +{ + DEFINE_STATIC_LOCAL(const AtomicString, keygen, ("keygen")); + return keygen; +} + +void HTMLKeygenElement::reset() +{ + static_cast<HTMLFormControlElement*>(selectShadow())->reset(); +} + +HTMLSelectElement* HTMLKeygenElement::selectShadow() +{ + return static_cast<HTMLSelectElement*>(shadowRoot()); +} + } // namespace |