SmartClipData SmartClip::dataForRect(const IntRect& cropRect) { IntRect resizedCropRect = applyScaleWithoutCollapsingToZero(cropRect, 1 / pageScaleFactor()); Node* bestNode = findBestOverlappingNode(m_frame->document(), resizedCropRect); if (!bestNode) return SmartClipData(); if (Node* nodeFromFrame = nodeInsideFrame(bestNode)) { // FIXME: This code only hit-tests a single iframe. It seems like we ought support nested frames. if (Node* bestNodeInFrame = findBestOverlappingNode(nodeFromFrame, resizedCropRect)) bestNode = bestNodeInFrame; } WillBeHeapVector<RawPtrWillBeMember<Node> > hitNodes; collectOverlappingChildNodes(bestNode, resizedCropRect, hitNodes); if (hitNodes.isEmpty() || hitNodes.size() == bestNode->countChildren()) { hitNodes.clear(); hitNodes.append(bestNode); } // Unite won't work with the empty rect, so we initialize to the first rect. IntRect unitedRects = hitNodes[0]->pixelSnappedBoundingBox(); StringBuilder collectedText; for (size_t i = 0; i < hitNodes.size(); ++i) { collectedText.append(extractTextFromNode(hitNodes[i])); unitedRects.unite(hitNodes[i]->pixelSnappedBoundingBox()); } return SmartClipData(bestNode, convertRectToWindow(unitedRects), collectedText.toString()); }
void HTMLFormElement::collectImageElements(Node& root, WillBeHeapVector<RawPtrWillBeMember<HTMLImageElement>>& elements) { elements.clear(); for (HTMLImageElement& image : Traversal<HTMLImageElement>::startsAfter(root)) { if (image.formOwner() == this) elements.append(&image); } }
WillBeHeapVector<RefPtrWillBeMember<ArchiveResource>> MHTMLParser::parseArchive() { RefPtrWillBeRawPtr<MIMEHeader> header = MIMEHeader::parseHeader(&m_lineReader); WillBeHeapVector<RefPtrWillBeMember<ArchiveResource>> resources; if (!parseArchiveWithHeader(header.get(), resources)) resources.clear(); return resources; }
void RTCDataChannel::scheduledEventTimerFired(Timer<RTCDataChannel>*) { WillBeHeapVector<RefPtrWillBeMember<Event>> events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event>>::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); events.clear(); }
static PassRefPtrWillBeRawPtr<ImmutableStylePropertySet> createStylePropertySet(WillBeHeapVector<CSSProperty, 256>& parsedProperties, CSSParserMode mode) { BitArray<numCSSProperties> seenProperties; size_t unusedEntries = parsedProperties.size(); WillBeHeapVector<CSSProperty, 256> results(unusedEntries); filterProperties(true, parsedProperties, results, unusedEntries, seenProperties); filterProperties(false, parsedProperties, results, unusedEntries, seenProperties); RefPtrWillBeRawPtr<ImmutableStylePropertySet> result = ImmutableStylePropertySet::create(results.data() + unusedEntries, results.size() - unusedEntries, mode); parsedProperties.clear(); return result.release(); }
void RTCPeerConnection::dispatchScheduledEvent() { if (m_stopped) return; WillBeHeapVector<RefPtrWillBeMember<Event> > events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event> >::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); events.clear(); }
void MediaStream::scheduledEventTimerFired(Timer<MediaStream>*) { if (m_stopped) return; WillBeHeapVector<RefPtrWillBeMember<Event>> events; events.swap(m_scheduledEvents); WillBeHeapVector<RefPtrWillBeMember<Event>>::iterator it = events.begin(); for (; it != events.end(); ++it) dispatchEvent((*it).release()); events.clear(); }
void PageAnimator::serviceScriptedAnimations(double monotonicAnimationStartTime) { RefPtrWillBeRawPtr<PageAnimator> protector(this); m_animationFramePending = false; TemporaryChange<bool> servicing(m_servicingAnimations, true); WillBeHeapVector<RefPtrWillBeMember<Document>> documents; for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traverseNext()) { if (frame->isLocalFrame()) documents.append(toLocalFrame(frame)->document()); } for (size_t i = 0; i < documents.size(); ++i) { if (documents[i]->frame()) { documents[i]->view()->serviceScrollAnimations(monotonicAnimationStartTime); if (const FrameView::ScrollableAreaSet* animatingScrollableAreas = documents[i]->view()->animatingScrollableAreas()) { // Iterate over a copy, since ScrollableAreas may deregister // themselves during the iteration. Vector<ScrollableArea*> animatingScrollableAreasCopy; copyToVector(*animatingScrollableAreas, animatingScrollableAreasCopy); for (ScrollableArea* scrollableArea : animatingScrollableAreasCopy) scrollableArea->serviceScrollAnimations(monotonicAnimationStartTime); } } } for (size_t i = 0; i < documents.size(); ++i) { DocumentAnimations::updateAnimationTimingForAnimationFrame(*documents[i], monotonicAnimationStartTime); SVGDocumentExtensions::serviceOnAnimationFrame(*documents[i], monotonicAnimationStartTime); } for (size_t i = 0; i < documents.size(); ++i) documents[i]->serviceScriptedAnimations(monotonicAnimationStartTime); #if ENABLE(OILPAN) documents.clear(); #endif }
inline void DistributionPool::clear() { detachNonDistributedNodes(); m_nodes.clear(); m_distributed.clear(); }