void TextFinder::updateFindMatchRects() { IntSize currentContentsSize = m_ownerFrame.contentsSize(); if (m_contentsSizeForCurrentFindMatchRects != currentContentsSize) { m_contentsSizeForCurrentFindMatchRects = currentContentsSize; m_findMatchRectsAreValid = false; } size_t deadMatches = 0; for (Vector<FindMatch>::iterator it = m_findMatchesCache.begin(); it != m_findMatchesCache.end(); ++it) { if (!it->m_range->boundaryPointsValid() || !it->m_range->startContainer()->inDocument()) it->m_rect = FloatRect(); else if (!m_findMatchRectsAreValid) it->m_rect = findInPageRectFromRange(it->m_range.get()); if (it->m_rect.isEmpty()) ++deadMatches; } // Remove any invalid matches from the cache. if (deadMatches) { WillBeHeapVector<FindMatch> filteredMatches; filteredMatches.reserveCapacity(m_findMatchesCache.size() - deadMatches); for (Vector<FindMatch>::const_iterator it = m_findMatchesCache.begin(); it != m_findMatchesCache.end(); ++it) { if (!it->m_rect.isEmpty()) filteredMatches.append(*it); } m_findMatchesCache.swap(filteredMatches); } // Invalidate the rects in child frames. Will be updated later during traversal. if (!m_findMatchRectsAreValid) for (WebFrame* child = m_ownerFrame.firstChild(); child; child = child->nextSibling()) toWebLocalFrameImpl(child)->ensureTextFinder().m_findMatchRectsAreValid = false; m_findMatchRectsAreValid = true; }
bool HTMLFormElement::checkInvalidControlsAndCollectUnhandled(WillBeHeapVector<RefPtrWillBeMember<HTMLFormControlElement>>* unhandledInvalidControls, CheckValidityEventBehavior eventBehavior) { RefPtrWillBeRawPtr<HTMLFormElement> protector(this); // Copy associatedElements because event handlers called from // HTMLFormControlElement::checkValidity() might change associatedElements. const FormAssociatedElement::List& associatedElements = this->associatedElements(); WillBeHeapVector<RefPtrWillBeMember<FormAssociatedElement>> elements; elements.reserveCapacity(associatedElements.size()); for (unsigned i = 0; i < associatedElements.size(); ++i) elements.append(associatedElements[i]); int invalidControlsCount = 0; for (unsigned i = 0; i < elements.size(); ++i) { if (elements[i]->form() == this && elements[i]->isFormControlElement()) { HTMLFormControlElement* control = toHTMLFormControlElement(elements[i].get()); if (control->isSubmittableElement() && !control->checkValidity(unhandledInvalidControls, eventBehavior) && control->formOwner() == this) { ++invalidControlsCount; if (!unhandledInvalidControls && eventBehavior == CheckValidityDispatchNoEvent) return true; } } } return invalidControlsCount; }