本文整理汇总了C++中CounterNode::parent方法的典型用法代码示例。如果您正苦于以下问题:C++ CounterNode::parent方法的具体用法?C++ CounterNode::parent怎么用?C++ CounterNode::parent使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CounterNode
的用法示例。
在下文中一共展示了CounterNode::parent方法的10个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: findPlaceForCounter
static bool findPlaceForCounter(RenderObject* object, const AtomicString& counterName,
bool isReset, CounterNode*& parent, CounterNode*& previousSibling)
{
// Find the appropriate previous sibling for insertion into the parent node
// by searching in render tree order for a child of the counter.
parent = 0;
previousSibling = 0;
RenderObject* resetCandidate = isReset ? object->parent() : previousSiblingOrParent(object);
RenderObject* prevCounterCandidate = object;
CounterNode* candidateCounter = 0;
// When a reset counter is chosen as candidateCounter, we'll
// decide the new node should be a child of the reset node or a
// sibling or the reset node. This flag controls it.
bool createChildForReset = true;
while ((prevCounterCandidate = prevCounterCandidate->previousInPreOrder())) {
CounterNode* c = counter(prevCounterCandidate, counterName, false);
if (prevCounterCandidate == resetCandidate) {
if (!candidateCounter) {
candidateCounter = c;
createChildForReset = true;
}
if (candidateCounter) {
if (createChildForReset && candidateCounter->isReset()) {
parent = candidateCounter;
previousSibling = 0;
} else {
parent = candidateCounter->parent();
previousSibling = candidateCounter;
}
return true;
}
resetCandidate = previousSiblingOrParent(resetCandidate);
} else if (c) {
if (c->isReset()) {
if (c->parent()) {
// The new node may be the next sibling of this reset node.
createChildForReset = false;
candidateCounter = c;
} else {
createChildForReset = true;
candidateCounter = 0;
}
} else if (!candidateCounter) {
createChildForReset = true;
candidateCounter = c;
}
}
}
return false;
}
示例2: makeCounterNode
static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& identifier, bool alwaysCreateCounter)
{
ASSERT(object);
// Real text nodes don't have their own style so they can't have counters.
// We can't even look at their styles or we'll see extra resets and increments!
if (object->isText())
return nullptr;
RenderElement* element = toRenderElement(object);
if (element->hasCounterNodeMap()) {
if (CounterMap* nodeMap = counterMaps().get(element)) {
if (CounterNode* node = nodeMap->get(identifier))
return node;
}
}
bool isReset = false;
int value = 0;
if (!planCounter(element, identifier, isReset, value) && !alwaysCreateCounter)
return nullptr;
RefPtr<CounterNode> newParent = 0;
RefPtr<CounterNode> newPreviousSibling = 0;
RefPtr<CounterNode> newNode = CounterNode::create(element, isReset, value);
if (findPlaceForCounter(element, identifier, isReset, newParent, newPreviousSibling))
newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifier);
CounterMap* nodeMap;
if (element->hasCounterNodeMap())
nodeMap = counterMaps().get(element);
else {
nodeMap = new CounterMap;
counterMaps().set(element, adoptPtr(nodeMap));
element->setHasCounterNodeMap(true);
}
nodeMap->set(identifier, newNode);
if (newNode->parent())
return newNode.get();
// Checking if some nodes that were previously counter tree root nodes
// should become children of this node now.
CounterMaps& maps = counterMaps();
Element* stayWithin = parentOrPseudoHostElement(element);
bool skipDescendants;
for (RenderElement* currentRenderer = nextInPreOrder(element, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(currentRenderer, stayWithin, skipDescendants)) {
skipDescendants = false;
if (!currentRenderer->hasCounterNodeMap())
continue;
CounterNode* currentCounter = maps.get(currentRenderer)->get(identifier);
if (!currentCounter)
continue;
skipDescendants = true;
if (currentCounter->parent())
continue;
if (stayWithin == parentOrPseudoHostElement(currentRenderer) && currentCounter->hasResetType())
break;
newNode->insertAfter(currentCounter, newNode->lastChild(), identifier);
}
return newNode.get();
}
示例3: updateCounters
static void updateCounters(RenderObject* renderer)
{
ASSERT(renderer->style());
const CounterDirectiveMap* directiveMap = renderer->style()->counterDirectives();
if (!directiveMap)
return;
CounterDirectiveMap::const_iterator end = directiveMap->end();
if (!renderer->m_hasCounterNodeMap) {
for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it)
makeCounterNode(renderer, AtomicString(it->first.get()), false);
return;
}
CounterMap* counterMap = counterMaps().get(renderer);
ASSERT(counterMap);
for (CounterDirectiveMap::const_iterator it = directiveMap->begin(); it != end; ++it) {
CounterNode* node = counterMap->get(it->first.get());
if (!node) {
makeCounterNode(renderer, AtomicString(it->first.get()), false);
continue;
}
CounterNode* newParent = 0;
CounterNode* newPreviousSibling;
findPlaceForCounter(renderer, AtomicString(it->first.get()), node->hasResetType(), newParent, newPreviousSibling);
CounterNode* parent = node->parent();
if (newParent == parent && newPreviousSibling == node->previousSibling())
continue;
if (parent)
parent->removeChild(node, it->first.get());
if (newParent)
newParent->insertAfter(node, newPreviousSibling, it->first.get());
}
}
示例4: makeCounterNode
static CounterNode* makeCounterNode(RenderObject* object, const AtomicString& identifier, bool alwaysCreateCounter)
{
ASSERT(object);
if (object->m_hasCounterNodeMap) {
if (CounterMap* nodeMap = counterMaps().get(object)) {
if (CounterNode* node = nodeMap->get(identifier.impl()).get())
return node;
}
}
bool isReset = false;
int value = 0;
if (!planCounter(object, identifier, isReset, value) && !alwaysCreateCounter)
return 0;
CounterNode* newParent = 0;
CounterNode* newPreviousSibling = 0;
RefPtr<CounterNode> newNode = CounterNode::create(object, isReset, value);
if (findPlaceForCounter(object, identifier, isReset, newParent, newPreviousSibling))
newParent->insertAfter(newNode.get(), newPreviousSibling, identifier);
CounterMap* nodeMap;
if (object->m_hasCounterNodeMap)
nodeMap = counterMaps().get(object);
else {
nodeMap = new CounterMap;
counterMaps().set(object, nodeMap);
object->m_hasCounterNodeMap = true;
}
nodeMap->set(identifier.impl(), newNode);
if (newNode->parent())
return newNode.get();
// Checking if some nodes that were previously counter tree root nodes
// should become children of this node now.
CounterMaps& maps = counterMaps();
Element* stayWithin = parentElement(object);
bool skipDescendants;
for (RenderObject* currentRenderer = nextInPreOrder(object, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(currentRenderer, stayWithin, skipDescendants)) {
skipDescendants = false;
if (!currentRenderer->m_hasCounterNodeMap)
continue;
CounterNode* currentCounter = maps.get(currentRenderer)->get(identifier.impl()).get();
if (!currentCounter)
continue;
skipDescendants = true;
if (currentCounter->parent()) {
ASSERT(newNode->firstChild());
continue;
}
if (stayWithin == parentElement(currentRenderer) && currentCounter->hasResetType())
break;
newNode->insertAfter(currentCounter, newNode->lastChild(), identifier);
}
return newNode.get();
}
示例5: nextInPreOrderAfterChildren
static const CounterNode* nextInPreOrderAfterChildren(const CounterNode* node)
{
CounterNode* next = node->nextSibling();
if (!next) {
next = node->parent();
while (next && !next->nextSibling())
next = next->parent();
if (next)
next = next->nextSibling();
}
return next;
}
示例6: makeCounterNode
static CounterNode* makeCounterNode(RenderElement& renderer, const AtomicString& identifier, bool alwaysCreateCounter)
{
if (renderer.hasCounterNodeMap()) {
if (CounterMap* nodeMap = counterMaps().get(&renderer)) {
if (CounterNode* node = nodeMap->get(identifier))
return node;
}
}
bool isReset = false;
int value = 0;
if (!planCounter(renderer, identifier, isReset, value) && !alwaysCreateCounter)
return nullptr;
RefPtr<CounterNode> newParent = 0;
RefPtr<CounterNode> newPreviousSibling = 0;
RefPtr<CounterNode> newNode = CounterNode::create(renderer, isReset, value);
if (findPlaceForCounter(renderer, identifier, isReset, newParent, newPreviousSibling))
newParent->insertAfter(newNode.get(), newPreviousSibling.get(), identifier);
CounterMap* nodeMap;
if (renderer.hasCounterNodeMap())
nodeMap = counterMaps().get(&renderer);
else {
nodeMap = new CounterMap;
counterMaps().set(&renderer, std::unique_ptr<CounterMap>(nodeMap));
renderer.setHasCounterNodeMap(true);
}
nodeMap->set(identifier, newNode);
if (newNode->parent())
return newNode.get();
// Checking if some nodes that were previously counter tree root nodes
// should become children of this node now.
CounterMaps& maps = counterMaps();
Element* stayWithin = parentOrPseudoHostElement(renderer);
bool skipDescendants;
for (RenderElement* currentRenderer = nextInPreOrder(renderer, stayWithin); currentRenderer; currentRenderer = nextInPreOrder(*currentRenderer, stayWithin, skipDescendants)) {
skipDescendants = false;
if (!currentRenderer->hasCounterNodeMap())
continue;
CounterNode* currentCounter = maps.get(currentRenderer)->get(identifier);
if (!currentCounter)
continue;
skipDescendants = true;
if (currentCounter->parent())
continue;
if (stayWithin == parentOrPseudoHostElement(*currentRenderer) && currentCounter->hasResetType())
break;
newNode->insertAfter(currentCounter, newNode->lastChild(), identifier);
}
return newNode.get();
}
示例7: destroyCounterNodeChildren
static void destroyCounterNodeChildren(AtomicStringImpl* identifier, CounterNode* node)
{
CounterNode* previous;
for (CounterNode* child = lastDescendant(node); child && child != node; child = previous) {
previous = previousInPreOrder(child);
child->parent()->removeChild(child);
ASSERT(counterMaps().get(child->renderer())->get(identifier) == child);
counterMaps().get(child->renderer())->remove(identifier);
if (!child->renderer()->documentBeingDestroyed()) {
RenderObjectChildList* children = child->renderer()->virtualChildren();
if (children)
children->invalidateCounters(child->renderer());
}
delete child;
}
}
示例8: destroyCounterNodes
void RenderCounter::destroyCounterNodes(RenderObject* object)
{
CounterMaps& maps = counterMaps();
CounterMap* map = maps.get(object);
if (!map)
return;
maps.remove(object);
CounterMap::const_iterator end = map->end();
for (CounterMap::const_iterator it = map->begin(); it != end; ++it) {
CounterNode* node = it->second;
destroyCounterNodeChildren(it->first.get(), node);
if (CounterNode* parent = node->parent())
parent->removeChild(node);
delete node;
}
delete map;
}
示例9: destroyCounterNodeWithoutMapRemoval
static void destroyCounterNodeWithoutMapRemoval(const AtomicString& identifier, CounterNode* node)
{
CounterNode* previous;
for (CounterNode* child = node->lastDescendant(); child && child != node; child = previous) {
previous = child->previousInPreOrder();
child->parent()->removeChild(child, identifier);
ASSERT(counterMaps().get(child->renderer())->get(identifier.impl()) == child);
counterMaps().get(child->renderer())->remove(identifier.impl());
if (!child->renderer()->documentBeingDestroyed()) {
RenderObjectChildList* children = child->renderer()->virtualChildren();
if (children)
children->invalidateCounters(child->renderer(), identifier);
}
delete child;
}
RenderObject* renderer = node->renderer();
if (!renderer->documentBeingDestroyed()) {
if (RenderObjectChildList* children = renderer->virtualChildren())
children->invalidateCounters(renderer, identifier);
}
if (CounterNode* parent = node->parent())
parent->removeChild(node, identifier);
delete node;
}
示例10: findPlaceForCounter
static bool findPlaceForCounter(RenderObject* counterOwner, const AtomicString& identifier, bool isReset, RefPtr<CounterNode>& parent, RefPtr<CounterNode>& previousSibling)
{
// We cannot stop searching for counters with the same identifier before we also
// check this renderer, because it may affect the positioning in the tree of our counter.
RenderObject* searchEndRenderer = previousSiblingOrParent(counterOwner);
// We check renderers in preOrder from the renderer that our counter is attached to
// towards the begining of the document for counters with the same identifier as the one
// we are trying to find a place for. This is the next renderer to be checked.
RenderObject* currentRenderer = previousInPreOrder(counterOwner);
previousSibling = 0;
RefPtr<CounterNode> previousSiblingProtector = 0;
while (currentRenderer) {
CounterNode* currentCounter = makeCounterNode(currentRenderer, identifier, false);
if (searchEndRenderer == currentRenderer) {
// We may be at the end of our search.
if (currentCounter) {
// We have a suitable counter on the EndSearchRenderer.
if (previousSiblingProtector) { // But we already found another counter that we come after.
if (currentCounter->actsAsReset()) {
// We found a reset counter that is on a renderer that is a sibling of ours or a parent.
if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
// We are also a reset counter and the previous reset was on a sibling renderer
// hence we are the next sibling of that counter if that reset is not a root or
// we are a root node if that reset is a root.
parent = currentCounter->parent();
previousSibling = parent ? currentCounter : 0;
return parent;
}
// We are not a reset node or the previous reset must be on an ancestor of our owner renderer
// hence we must be a child of that reset counter.
parent = currentCounter;
// In some cases renders can be reparented (ex. nodes inside a table but not in a column or row).
// In these cases the identified previousSibling will be invalid as its parent is different from
// our identified parent.
if (previousSiblingProtector->parent() != currentCounter)
previousSiblingProtector = 0;
previousSibling = previousSiblingProtector.get();
return true;
}
// CurrentCounter, the counter at the EndSearchRenderer, is not reset.
if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
// If the node we are placing is not reset or we have found a counter that is attached
// to an ancestor of the placed counter's owner renderer we know we are a sibling of that node.
if (currentCounter->parent() != previousSiblingProtector->parent())
return false;
parent = currentCounter->parent();
previousSibling = previousSiblingProtector.get();
return true;
}
} else {
// We are at the potential end of the search, but we had no previous sibling candidate
// In this case we follow pretty much the same logic as above but no ASSERTs about
// previousSibling, and when we are a sibling of the end counter we must set previousSibling
// to currentCounter.
if (currentCounter->actsAsReset()) {
if (isReset && areRenderersElementsSiblings(currentRenderer, counterOwner)) {
parent = currentCounter->parent();
previousSibling = currentCounter;
return parent;
}
parent = currentCounter;
previousSibling = previousSiblingProtector.get();
return true;
}
if (!isReset || !areRenderersElementsSiblings(currentRenderer, counterOwner)) {
parent = currentCounter->parent();
previousSibling = currentCounter;
return true;
}
previousSiblingProtector = currentCounter;
}
}
// We come here if the previous sibling or parent of our owner renderer had no
// good counter, or we are a reset node and the counter on the previous sibling
// of our owner renderer was not a reset counter.
// Set a new goal for the end of the search.
searchEndRenderer = previousSiblingOrParent(currentRenderer);
} else {
// We are searching descendants of a previous sibling of the renderer that the
// counter being placed is attached to.
if (currentCounter) {
// We found a suitable counter.
if (previousSiblingProtector) {
// Since we had a suitable previous counter before, we should only consider this one as our
// previousSibling if it is a reset counter and hence the current previousSibling is its child.
if (currentCounter->actsAsReset()) {
previousSiblingProtector = currentCounter;
// We are no longer interested in previous siblings of the currentRenderer or their children
// as counters they may have attached cannot be the previous sibling of the counter we are placing.
currentRenderer = parentElement(currentRenderer)->renderer();
continue;
}
} else
previousSiblingProtector = currentCounter;
currentRenderer = previousSiblingOrParent(currentRenderer);
continue;
}
//.........这里部分代码省略.........