void PseudoElement::didAttachRenderers() { RenderElement* renderer = this->renderer(); if (!renderer || renderer->style().hasFlowFrom()) return; const RenderStyle& style = renderer->style(); ASSERT(style.contentData()); for (const ContentData* content = style.contentData(); content; content = content->next()) { auto child = content->createContentRenderer(document(), style); if (renderer->isChildAllowed(*child, style)) renderer->addChild(child.leakPtr()); } }
static void createTextRenderer(Text& textNode, RenderTreePosition& renderTreePosition) { ASSERT(!textNode.renderer()); auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent().style()); ASSERT(newRenderer); renderTreePosition.computeNextSibling(textNode); if (!renderTreePosition.canInsert(*newRenderer)) return; textNode.setRenderer(newRenderer.get()); renderTreePosition.insert(*newRenderer.leakPtr()); }
static void createTextRenderer(Text& textNode, RenderTreePosition& renderTreePosition) { ASSERT(!textNode.renderer()); auto newRenderer = textNode.createTextRenderer(renderTreePosition.parent().style()); ASSERT(newRenderer); renderTreePosition.computeNextSibling(textNode); if (!renderTreePosition.canInsert(*newRenderer)) return; // Make sure the RenderObject already knows it is going to be added to a RenderFlowThread before we set the style // for the first time. Otherwise code using inRenderFlowThread() in the styleWillChange and styleDidChange will fail. newRenderer->setFlowThreadState(renderTreePosition.parent().flowThreadState()); textNode.setRenderer(newRenderer.get()); renderTreePosition.insert(*newRenderer.leakPtr()); }
RefPtr<API::Data> encodeLegacySessionState(const SessionState& sessionState) { auto sessionHistoryDictionary = encodeSessionHistory(sessionState.backForwardListState); auto provisionalURLString = sessionState.provisionalURL.isNull() ? nullptr : sessionState.provisionalURL.string().createCFString(); RetainPtr<CFDictionaryRef> stateDictionary; if (provisionalURLString) stateDictionary = createDictionary({ { sessionHistoryKey, sessionHistoryDictionary.get() }, { provisionalURLKey, provisionalURLString.get() } }); else stateDictionary = createDictionary({ { sessionHistoryKey, sessionHistoryDictionary.get() } }); auto writeStream = adoptCF(CFWriteStreamCreateWithAllocatedBuffers(kCFAllocatorDefault, nullptr)); if (!writeStream) return nullptr; if (!CFWriteStreamOpen(writeStream.get())) return nullptr; if (!CFPropertyListWrite(stateDictionary.get(), writeStream.get(), kCFPropertyListBinaryFormat_v1_0, 0, nullptr)) return nullptr; auto data = adoptCF(static_cast<CFDataRef>(CFWriteStreamCopyProperty(writeStream.get(), kCFStreamPropertyDataWritten))); CFIndex length = CFDataGetLength(data.get()); size_t bufferSize = length + sizeof(uint32_t); auto buffer = MallocPtr<uint8_t>::malloc(bufferSize); // Put the session state version number at the start of the buffer buffer.get()[0] = (sessionStateDataVersion & 0xff000000) >> 24; buffer.get()[1] = (sessionStateDataVersion & 0x00ff0000) >> 16; buffer.get()[2] = (sessionStateDataVersion & 0x0000ff00) >> 8; buffer.get()[3] = (sessionStateDataVersion & 0x000000ff); // Copy in the actual session state data CFDataGetBytes(data.get(), CFRangeMake(0, length), buffer.get() + sizeof(uint32_t)); return API::Data::createWithoutCopying(buffer.leakPtr(), bufferSize, [] (unsigned char* buffer, const void* context) { fastFree(buffer); }, nullptr); }