⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wmlinputelement.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void WMLInputElement::defaultEventHandler(Event* evt){    bool clickDefaultFormButton = false;    if (evt->type() == eventNames().textInputEvent && evt->isTextEvent()) {        TextEvent* textEvent = static_cast<TextEvent*>(evt);        if (textEvent->data() == "\n")            clickDefaultFormButton = true;        else if (renderer() && !isConformedToInputMask(textEvent->data()[0], toRenderTextControl(renderer())->text().length() + 1))            // If the inputed char doesn't conform to the input mask, stop handling             return;    }    if (evt->type() == eventNames().keydownEvent && evt->isKeyboardEvent() && focused() && document()->frame()        && document()->frame()->doTextFieldCommandFromEvent(this, static_cast<KeyboardEvent*>(evt))) {        evt->setDefaultHandled();        return;    }        // Let the key handling done in EventTargetNode take precedence over the event handling here for editable text fields    if (!clickDefaultFormButton) {        WMLElement::defaultEventHandler(evt);        if (evt->defaultHandled())            return;    }    // Use key press event here since sending simulated mouse events    // on key down blocks the proper sending of the key press event.    if (evt->type() == eventNames().keypressEvent && evt->isKeyboardEvent()) {        // Simulate mouse click on the default form button for enter for these types of elements.        if (static_cast<KeyboardEvent*>(evt)->charCode() == '\r')            clickDefaultFormButton = true;    }    if (clickDefaultFormButton) {        // Fire onChange for text fields.        RenderObject* r = renderer();        if (r && r->isEdited()) {            dispatchEventForType(eventNames().changeEvent, true, false);                        // Refetch the renderer since arbitrary JS code run during onchange can do anything, including destroying it.            r = renderer();            if (r)                r->setEdited(false);        }        evt->setDefaultHandled();        return;    }    if (evt->isBeforeTextInsertedEvent())        InputElement::handleBeforeTextInsertedEvent(m_data, document(), evt);    if (renderer() && (evt->isMouseEvent() || evt->isDragEvent() || evt->isWheelEvent() || evt->type() == eventNames().blurEvent || evt->type() == eventNames().focusEvent))        static_cast<RenderTextControlSingleLine*>(renderer())->forwardEvent(evt);}void WMLInputElement::cacheSelection(int start, int end){    m_data.setCachedSelectionStart(start);    m_data.setCachedSelectionEnd(end);}String WMLInputElement::constrainValue(const String& proposedValue) const{    return InputElement::constrainValue(m_data, proposedValue, m_data.maxLength());}void WMLInputElement::documentDidBecomeActive(){    ASSERT(m_isPasswordField);    reset();}bool WMLInputElement::placeholderShouldBeVisible() const{    return m_data.placeholderShouldBeVisible();}void WMLInputElement::willMoveToNewOwnerDocument(){    // Always unregister for cache callbacks when leaving a document, even if we would otherwise like to be registered    if (m_isPasswordField)        document()->unregisterForDocumentActivationCallbacks(this);    WMLElement::willMoveToNewOwnerDocument();}void WMLInputElement::didMoveToNewOwnerDocument(){    if (m_isPasswordField)        document()->registerForDocumentActivationCallbacks(this);    WMLElement::didMoveToNewOwnerDocument();}void WMLInputElement::init(){    String nameVariable = name();    String variableValue;    WMLPageState* pageSate = wmlPageStateForDocument(document());     ASSERT(pageSate);    if (!nameVariable.isEmpty())        variableValue = pageSate->getVariable(nameVariable);    if (variableValue.isEmpty() || !isConformedToInputMask(variableValue)) {        String val = value();        if (isConformedToInputMask(val))            variableValue = val;        else            variableValue = "";         pageSate->storeVariable(nameVariable, variableValue);    }    setValue(variableValue);     if (!hasAttribute(WMLNames::emptyokAttr)) {        if (m_formatMask.isEmpty() ||             // check if the format codes is just "*f"           (m_formatMask.length() == 2 && m_formatMask[0] == '*' && formatCodes().find(m_formatMask[1]) != -1))            m_isEmptyOk = true;    }}String WMLInputElement::validateInputMask(const String& inputMask){    bool isValid = true;    bool hasWildcard = false;    unsigned escapeCharCount = 0;    unsigned maskLength = inputMask.length();    UChar formatCode;     for (unsigned i = 0; i < maskLength; ++i) {        formatCode = inputMask[i];        if (formatCodes().find(formatCode) == -1) {            if (formatCode == '*' || (WTF::isASCIIDigit(formatCode) && formatCode != '0')) {                // validate codes which ends with '*f' or 'nf'                formatCode = inputMask[++i];                if ((i + 1 != maskLength) || formatCodes().find(formatCode) == -1) {                    isValid = false;                    break;                }                hasWildcard = true;            } else if (formatCode == '\\') {                //skip over the next mask character                ++i;                ++escapeCharCount;            } else {                isValid = false;                break;            }        }    }    if (!isValid)        return String();     // calculate the number of characters allowed to be entered by input mask    m_numOfCharsAllowedByMask = maskLength;    if (escapeCharCount)        m_numOfCharsAllowedByMask -= escapeCharCount;    if (hasWildcard) {        formatCode = inputMask[maskLength - 2];        if (formatCode == '*')            m_numOfCharsAllowedByMask = m_data.maxLength();        else {            unsigned leftLen = String(&formatCode).toInt();            m_numOfCharsAllowedByMask = leftLen + m_numOfCharsAllowedByMask - 2;        }    }    return inputMask;}bool WMLInputElement::isConformedToInputMask(const String& inputChars){    for (unsigned i = 0; i < inputChars.length(); ++i)        if (!isConformedToInputMask(inputChars[i], i + 1, false))            return false;    return true;} bool WMLInputElement::isConformedToInputMask(UChar inChar, unsigned inputCharCount, bool isUserInput){    if (m_formatMask.isEmpty())        return true;     if (inputCharCount > m_numOfCharsAllowedByMask)        return false;    unsigned maskIndex = 0;    if (isUserInput) {        unsigned cursorPosition = 0;        if (renderer())            cursorPosition = toRenderTextControl(renderer())->selectionStart();         else            cursorPosition = m_data.cachedSelectionStart();        maskIndex = cursorPositionToMaskIndex(cursorPosition);    } else        maskIndex = cursorPositionToMaskIndex(inputCharCount - 1);    bool ok = true;    UChar mask = m_formatMask[maskIndex];    // match the inputed character with input mask    switch (mask) {    case 'A':        ok = !WTF::isASCIIDigit(inChar) && !WTF::isASCIILower(inChar) && WTF::isASCIIPrintable(inChar);        break;    case 'a':        ok = !WTF::isASCIIDigit(inChar) && !WTF::isASCIIUpper(inChar) && WTF::isASCIIPrintable(inChar);        break;    case 'N':        ok = WTF::isASCIIDigit(inChar);        break;    case 'n':        ok = !WTF::isASCIIAlpha(inChar) && WTF::isASCIIPrintable(inChar);        break;    case 'X':        ok = !WTF::isASCIILower(inChar) && WTF::isASCIIPrintable(inChar);        break;    case 'x':        ok = !WTF::isASCIIUpper(inChar) && WTF::isASCIIPrintable(inChar);        break;    case 'M':        ok = WTF::isASCIIPrintable(inChar);        break;    case 'm':        ok = WTF::isASCIIPrintable(inChar);        break;    default:        ok = (mask == inChar);        break;    }    return ok;}unsigned WMLInputElement::cursorPositionToMaskIndex(unsigned cursorPosition){    UChar mask;    int index = -1;    do {        mask = m_formatMask[++index];        if (mask == '\\')            ++index;        else if (mask == '*' || (WTF::isASCIIDigit(mask) && mask != '0')) {            index = m_formatMask.length() - 1;            break;        }    } while (cursorPosition--);     return index;}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -