📄 html_formimpl.cpp
字号:
void HTMLInputElementImpl::reset(){ setValue(getAttribute(ATTR_VALUE)); setChecked(getAttribute(ATTR_CHECKED) != 0);}void HTMLInputElementImpl::setChecked(bool _checked){ if (m_form && m_type == RADIO && _checked && !name().isEmpty()) m_form->radioClicked(this); if (m_checked == _checked) return; m_checked = _checked; setChanged();}DOMString HTMLInputElementImpl::value() const{ if (m_type == CHECKBOX || m_type == RADIO) { const DOMString val = getAttribute(ATTR_VALUE); // If no attribute exists, then just use "on" or "" based off the checked() state // of the control. if (val.isNull()) { if (checked()) return DOMString("on"); else return DOMString(""); } return val; } DOMString val = m_value; // It's important *not* to fall back to the value attribute for file inputs, // because that would allow a malicious web page to upload files by setting the // value attribute in markup. if (val.isNull() && m_type != FILE) val = getAttribute(ATTR_VALUE); return val.isNull() ? DOMString("") : val;}void HTMLInputElementImpl::setValue(DOMString val){ if (m_type == FILE) return; m_value = (val.isNull() ? DOMString("") : val); setChanged();}void HTMLInputElementImpl::blur(){ if(getDocument()->focusNode() == this) getDocument()->setFocusNode(0);}void HTMLInputElementImpl::focus(){ getDocument()->setFocusNode(this);}void HTMLInputElementImpl::defaultEventHandler(EventImpl *evt){ if ( !m_disabled ) { if (evt->isMouseEvent()) { MouseEventImpl* const me = static_cast<MouseEventImpl*>(evt); if ((m_type == RADIO || m_type == CHECKBOX) && me->id() == EventImpl::MOUSEUP_EVENT && me->detail() > 0) { // click will follow setChecked(m_type == RADIO ? true : !checked()); } if (evt->id() == EventImpl::CLICK_EVENT && m_type == IMAGE && m_render) { // record the mouse position for when we get the DOMActivate event int offsetX, offsetY; m_render->absolutePosition(offsetX,offsetY); xPos = me->clientX()-offsetX; yPos = me->clientY()-offsetY; KHTMLView* v = getDocument()->view(); if ( v ) { xPos += v->contentsX(); yPos += v->contentsY(); } } } if (m_type == RADIO || m_type == CHECKBOX || m_type == SUBMIT || m_type == RESET || m_type == BUTTON ) { bool check = false; if (active() && ( evt->id() == EventImpl::KEYUP_EVENT || evt->id() == EventImpl::KEYPRESS_EVENT ) ) { TextEventImpl* const te = static_cast<TextEventImpl *>(evt); if (te->keyVal() == ' ') check = true; else if (te->keyVal() == '\r' && (m_type == BUTTON || m_type == RESET || m_type == SUBMIT)) check = true; } if (check) { if (evt->id() == EventImpl::KEYUP_EVENT) click(); // Tell the parent that we handle this key (keyup and keydown), even though only keyup activates (#70478) evt->setDefaultHandled(); } } // DOMActivate events cause the input to be "activated" - in the case of image and submit inputs, this means // actually submitting the form. For reset inputs, the form is reset. These events are sent when the user clicks // on the element, or presses enter while it is the active element. Javascript code wishing to activate the element // must dispatch a DOMActivate event - a click event will not do the job. if (m_type == IMAGE || m_type == SUBMIT || m_type == RESET) { bool act = (evt->id() == EventImpl::DOMACTIVATE_EVENT); if (!act && evt->id() == EventImpl::KEYUP_EVENT) { QKeyEvent* const ke = static_cast<TextEventImpl *>(evt)->qKeyEvent(); if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Space)) act = true; } if (act) activate(); } } HTMLGenericFormElementImpl::defaultEventHandler(evt);}void HTMLInputElementImpl::activate(){ if (!m_form) return; m_clicked = true; if (m_type == RESET) { m_form->reset(); } else { m_activeSubmit = true; if (!m_form->prepareSubmit()) { xPos = 0; yPos = 0; } m_activeSubmit = false; }}bool HTMLInputElementImpl::isEditable(){ return ((m_type == TEXT) || (m_type == PASSWORD) || (m_type == ISINDEX) || (m_type == FILE));}// -------------------------------------------------------------------------HTMLLabelElementImpl::HTMLLabelElementImpl(DocumentPtr *doc) : HTMLGenericFormElementImpl(doc){}HTMLLabelElementImpl::~HTMLLabelElementImpl(){}NodeImpl::Id HTMLLabelElementImpl::id() const{ return ID_LABEL;}void HTMLLabelElementImpl::attach(){ // skip the generic handler HTMLElementImpl::attach();}NodeImpl* HTMLLabelElementImpl::getFormElement(){ const DOMString formElementId = getAttribute(ATTR_FOR); NodeImpl *newNode=0L; if (!formElementId.isEmpty()) newNode=getDocument()->getElementById(formElementId); if (!newNode){ const uint children=childNodeCount(); if (children>1) for (unsigned int i=0;i<children;++i){ const uint nodeId=childNode(i)->id(); if (nodeId==ID_INPUT || nodeId==ID_SELECT || nodeId==ID_TEXTAREA){ newNode=childNode(i); break; } } }return newNode;}void HTMLLabelElementImpl::defaultEventHandler(EventImpl *evt){ if ( !m_disabled ) { bool act = false; if ( evt->id() == EventImpl::CLICK_EVENT ) { act = true; } else if ( evt->id() == EventImpl::KEYUP_EVENT || evt->id() == EventImpl::KEYPRESS_EVENT ) { QKeyEvent* const ke = static_cast<TextEventImpl *>(evt)->qKeyEvent(); if (ke && active() && (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter || ke->key() == Qt::Key_Space)) act = true; } if (act) { NodeImpl* const formNode=getFormElement(); if (formNode) { getDocument()->setFocusNode(formNode); if (formNode->id()==ID_INPUT) static_cast<DOM::HTMLInputElementImpl*>(formNode)->click(); } evt->setDefaultHandled(); } } HTMLGenericFormElementImpl::defaultEventHandler(evt);}// -------------------------------------------------------------------------HTMLLegendElementImpl::HTMLLegendElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f) : HTMLGenericFormElementImpl(doc, f){}HTMLLegendElementImpl::~HTMLLegendElementImpl(){}NodeImpl::Id HTMLLegendElementImpl::id() const{ return ID_LEGEND;}void HTMLLegendElementImpl::attach(){ assert(!attached()); assert(!m_render); assert(parentNode()); RenderStyle* const _style = getDocument()->styleSelector()->styleForElement(this); _style->ref(); if (parentNode()->renderer() && _style->display() != NONE) { m_render = new (getDocument()->renderArena()) RenderLegend(this); m_render->setStyle(_style); } HTMLGenericFormElementImpl::attach(); _style->deref();}void HTMLLegendElementImpl::parseAttribute(AttributeImpl *attr){ switch(attr->id()) { case ATTR_ACCESSKEY: break; default: HTMLElementImpl::parseAttribute(attr); }}// -------------------------------------------------------------------------HTMLSelectElementImpl::HTMLSelectElementImpl(DocumentPtr *doc, HTMLFormElementImpl *f) : HTMLGenericFormElementImpl(doc, f){ m_multiple = false; m_recalcListItems = false; // 0 means invalid (i.e. not set) m_size = 0; m_minwidth = 0; m_length = 0;}HTMLSelectElementImpl::~HTMLSelectElementImpl(){ if (getDocument()) getDocument()->deregisterMaintainsState(this);}NodeImpl::Id HTMLSelectElementImpl::id() const{ return ID_SELECT;}DOMString HTMLSelectElementImpl::type() const{ return (m_multiple ? "select-multiple" : "select-one");}long HTMLSelectElementImpl::selectedIndex() const{ // return the number of the first option selected uint o = 0; QMemArray<HTMLGenericFormElementImpl*> items = listItems(); const unsigned int itemsSize = items.size(); for (unsigned int i = 0; i < itemsSize; ++i) { if (items[i]->id() == ID_OPTION) { if (static_cast<HTMLOptionElementImpl*>(items[i])->selected()) return o; o++; } } Q_ASSERT(m_multiple || items.isEmpty()); return -1;}void HTMLSelectElementImpl::setSelectedIndex( long index ){ // deselect all other options and select only the new one QMemArray<HTMLGenericFormElementImpl*> items = listItems(); int listIndex; const int itemsSize = int(items.size()); for (listIndex = 0; listIndex < itemsSize; ++listIndex) { if (items[listIndex]->id() == ID_OPTION) static_cast<HTMLOptionElementImpl*>(items[listIndex])->setSelected(false); } listIndex = optionToListIndex(index); if (listIndex >= 0) static_cast<HTMLOptionElementImpl*>(items[listIndex])->setSelected(true); setChanged(true);}long HTMLSelectElementImpl::length() const{ if (m_recalcListItems) recalcListItems(); return m_length;}void HTMLSelectElementImpl::add( const HTMLElement &element, const HTMLElement &before, int& exceptioncode ){ if(element.isNull() || element.handle()->id() != ID_OPTION) return; HTMLOptionElementImpl* option = static_cast<HTMLOptionElementImpl*>(element.handle());; //Fast path for appending an item. Can't be done if it is selected and //we're single-select, since we may need to drop an implicitly-selected item bool fastAppendLast = false; if (before.handle() == 0 && (m_multiple || !option->selected()) && !m_recalcListItems) fastAppendLast = true; insertBefore(option, before.handle(), exceptioncode ); if (fastAppendLast) { m_listItems.resize(m_listItems.size() + 1); m_listItems[m_listItems.size() - 1] = option; ++m_length; m_recalcListItems = false; } else if (!exceptioncode) setRecalcListItems();}void HTMLSelectElementImpl::remove( long index ){ int exceptioncode = 0; const int listIndex = optionToListIndex(index); QMemArray<HTMLGenericFormElementImpl*> items = listItems(); if(listIndex < 0 || index >= int(items.size())) return; // ### what should we do ? remove the last item? //Fast path for last element, for e.g. clearing the box //Note that if this is a single-select, we may have to recompute //anyway if the item was selected, since we may want to set //a different one bool fastRemoveLast = false; if ((listIndex == items.size() - 1) && !m_recalcListItems && (m_multiple || !static_cast<HTMLOptionElementImpl*>(items[listIndex])->selected())) fastRemoveLast = true; removeChild(items[listIndex], exceptioncode); if (fastRemoveLast) { m_listItems.resize(m_listItems.size() - 1); --m_length; m_recalcListItems = false; } else if( !exceptioncode) setRecalcListItems();}void HTMLSelectElementImpl::blur(){ if(getDocument()->focusNode() == this) getDocument()->setFocusNode(0);}void HTMLSelectElementImpl::focus(){ getDocument()->setFocusNode(this);}DOMString HTMLInputElementImpl::valueWithDefault() const{ DOMString v = value(); if (v.isEmpty()) { switch (m_type) { case RESET:#ifdef APPLE_CHANGES v = resetButtonDefaultLabel();#else v = i18n("Reset");#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -