int PrintContext::pageNumberForElement(Element* element, const FloatSize& pageSizeInPixels) { // Make sure the element is not freed during the layout. RefPtr<Element> elementRef(element); element->document()->updateLayout(); RenderBoxModelObject* box = enclosingBoxModelObject(element->renderer()); if (!box) return -1; Frame* frame = element->document()->frame(); FloatRect pageRect(FloatPoint(0, 0), pageSizeInPixels); PrintContext printContext(frame); printContext.begin(pageRect.width(), pageRect.height()); FloatSize scaledPageSize = pageSizeInPixels; scaledPageSize.scale(frame->view()->contentsSize().width() / pageRect.width()); printContext.computePageRectsWithPageSize(scaledPageSize, false); int top = box->pixelSnappedOffsetTop(); int left = box->pixelSnappedOffsetLeft(); size_t pageNumber = 0; for (; pageNumber < printContext.pageCount(); pageNumber++) { const IntRect& page = printContext.pageRect(pageNumber); if (page.x() <= left && left < page.maxX() && page.y() <= top && top < page.maxY()) return pageNumber; } return -1; }
String markerTextForListItem(Element* element) { // Make sure the element is not freed during the layout. RefPtr<Element> elementRef(element); element->document()->updateLayout(); RenderObject* renderer = element->renderer(); if (!renderer || !renderer->isListItem()) return String(); return toRenderListItem(renderer)->markerText(); }
String counterValueForElement(Element* element) { // Make sure the element is not freed during the layout. RefPtr<Element> elementRef(element); element->document()->updateLayout(); TextStream stream; bool isFirstCounter = true; // The counter renderers should be children of :before or :after pseudo-elements. if (RenderObject* renderer = element->renderer()) { if (RenderObject* pseudoElement = renderer->beforePseudoElementRenderer()) writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter); if (RenderObject* pseudoElement = renderer->afterPseudoElementRenderer()) writeCounterValuesFromChildren(stream, pseudoElement, isFirstCounter); } return stream.release(); }