Home | History | Annotate | Download | only in html
      1 /*
      2  * Copyright (C) 2010 Google Inc. All rights reserved.
      3  * Copyright (C) 2011 Apple Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are
      7  * met:
      8  *
      9  *     * Redistributions of source code must retain the above copyright
     10  * notice, this list of conditions and the following disclaimer.
     11  *     * Redistributions in binary form must reproduce the above
     12  * copyright notice, this list of conditions and the following disclaimer
     13  * in the documentation and/or other materials provided with the
     14  * distribution.
     15  *     * Neither the name of Google Inc. nor the names of its
     16  * contributors may be used to endorse or promote products derived from
     17  * this software without specific prior written permission.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     22  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     23  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     24  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     25  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     29  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     30  */
     31 
     32 #include "config.h"
     33 #include "core/html/PasswordInputType.h"
     34 
     35 #include "core/html/FormController.h"
     36 #include "core/html/HTMLInputElement.h"
     37 #include "core/html/InputTypeNames.h"
     38 #include "core/page/Chrome.h"
     39 #include "core/page/ChromeClient.h"
     40 #include "core/page/Page.h"
     41 #include "wtf/Assertions.h"
     42 #include "wtf/PassOwnPtr.h"
     43 
     44 namespace WebCore {
     45 
     46 PassOwnPtr<InputType> PasswordInputType::create(HTMLInputElement* element)
     47 {
     48     return adoptPtr(new PasswordInputType(element));
     49 }
     50 
     51 HTMLElement* PasswordInputType::passwordGeneratorButtonElement() const
     52 {
     53     return m_generatorButton.get();
     54 }
     55 
     56 bool PasswordInputType::isPasswordGenerationEnabled() const
     57 {
     58     Document* document = element()->document();
     59     ChromeClient* chromeClient = document->page() ? document->page()->chrome().client() : 0;
     60     return chromeClient && chromeClient->isPasswordGenerationEnabled();
     61 }
     62 
     63 bool PasswordInputType::needsContainer() const
     64 {
     65     return BaseTextInputType::needsContainer() || isPasswordGenerationEnabled();
     66 }
     67 
     68 void PasswordInputType::createShadowSubtree()
     69 {
     70     BaseTextInputType::createShadowSubtree();
     71     if (isPasswordGenerationEnabled()) {
     72         m_generatorButton = PasswordGeneratorButtonElement::create(element()->document());
     73         m_generatorButton->decorate(element());
     74     }
     75 }
     76 
     77 void PasswordInputType::destroyShadowSubtree()
     78 {
     79     BaseTextInputType::destroyShadowSubtree();
     80     m_generatorButton = 0;
     81 }
     82 
     83 const AtomicString& PasswordInputType::formControlType() const
     84 {
     85     return InputTypeNames::password();
     86 }
     87 
     88 bool PasswordInputType::shouldSaveAndRestoreFormControlState() const
     89 {
     90     return false;
     91 }
     92 
     93 FormControlState PasswordInputType::saveFormControlState() const
     94 {
     95     // Should never save/restore password fields.
     96     ASSERT_NOT_REACHED();
     97     return FormControlState();
     98 }
     99 
    100 void PasswordInputType::restoreFormControlState(const FormControlState&)
    101 {
    102     // Should never save/restore password fields.
    103     ASSERT_NOT_REACHED();
    104 }
    105 
    106 bool PasswordInputType::shouldUseInputMethod() const
    107 {
    108     // Input methods are disabled for the password field because otherwise
    109     // anyone can access the underlying password and display it in clear text.
    110     return false;
    111 }
    112 
    113 bool PasswordInputType::shouldResetOnDocumentActivation()
    114 {
    115     return true;
    116 }
    117 
    118 bool PasswordInputType::shouldRespectListAttribute()
    119 {
    120     return false;
    121 }
    122 
    123 bool PasswordInputType::shouldRespectSpeechAttribute()
    124 {
    125     return true;
    126 }
    127 
    128 bool PasswordInputType::isPasswordField() const
    129 {
    130     return true;
    131 }
    132 
    133 void PasswordInputType::handleFocusEvent(Element* oldFocusedElement, FocusDirection direction)
    134 {
    135     BaseTextInputType::handleFocusEvent(oldFocusedElement, direction);
    136     if (element()->document()->frame())
    137         element()->document()->setUseSecureKeyboardEntryWhenActive(true);
    138 }
    139 
    140 void PasswordInputType::handleBlurEvent()
    141 {
    142     if (element()->document()->frame())
    143         element()->document()->setUseSecureKeyboardEntryWhenActive(false);
    144     BaseTextInputType::handleBlurEvent();
    145 }
    146 
    147 } // namespace WebCore
    148