Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(85)

Side by Side Diff: Source/core/dom/shadow/ContentDistributor.cpp

Issue 17054002: Element::recalcStyle() overly reattach()-es InsertionPoints. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Neither the name of Google Inc. nor the names of its 10 * * Neither the name of Google Inc. nor the names of its
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 distributeNodeChildrenTo(shadowElement, root->olderShadowRoot()); 258 distributeNodeChildrenTo(shadowElement, root->olderShadowRoot());
259 root->olderShadowRoot()->ensureScopeDistribution()->setInsertionPoin tAssignedTo(shadowElement); 259 root->olderShadowRoot()->ensureScopeDistribution()->setInsertionPoin tAssignedTo(shadowElement);
260 } else { 260 } else {
261 distributeSelectionsTo(shadowElement, pool, distributed); 261 distributeSelectionsTo(shadowElement, pool, distributed);
262 if (ElementShadow* shadow = shadowElement->parentNode()->isElementNo de() ? toElement(shadowElement->parentNode())->shadow() : 0) 262 if (ElementShadow* shadow = shadowElement->parentNode()->isElementNo de() ? toElement(shadowElement->parentNode())->shadow() : 0)
263 shadow->invalidateDistribution(); 263 shadow->invalidateDistribution();
264 } 264 }
265 } 265 }
266 } 266 }
267 267
268 bool ContentDistributor::invalidate(Element* host) 268 bool ContentDistributor::invalidate(Element* host, Vector<RefPtr<Node> >& nodesN eedingReattach)
269 { 269 {
270 ASSERT(needsInvalidation()); 270 ASSERT(needsInvalidation());
271 bool needsReattach = (m_validity == Undetermined) || !m_nodeToInsertionPoint .isEmpty(); 271 bool needsReattach = (m_validity == Undetermined) || !m_nodeToInsertionPoint .isEmpty();
272 272
273 for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->older ShadowRoot()) { 273 for (ShadowRoot* root = host->youngestShadowRoot(); root; root = root->older ShadowRoot()) {
274 if (ScopeContentDistribution* scope = root->scopeDistribution()) { 274 if (ScopeContentDistribution* scope = root->scopeDistribution()) {
275 scope->setInsertionPointAssignedTo(0); 275 scope->setInsertionPointAssignedTo(0);
276 const Vector<RefPtr<InsertionPoint> >& insertionPoints = scope->ensu reInsertionPointList(root); 276 const Vector<RefPtr<InsertionPoint> >& insertionPoints = scope->ensu reInsertionPointList(root);
277 for (size_t i = 0; i < insertionPoints.size(); ++i) { 277 for (size_t i = 0; i < insertionPoints.size(); ++i) {
278 needsReattach = needsReattach || true; 278 needsReattach = true;
279 for (Node* child = insertionPoints[i]->firstChild(); child; chil d = child->nextSibling())
280 nodesNeedingReattach.append(child);
281
279 insertionPoints[i]->clearDistribution(); 282 insertionPoints[i]->clearDistribution();
280 283
281 // After insertionPoint's distribution is invalidated, its repro jection should also be invalidated. 284 // After insertionPoint's distribution is invalidated, its repro jection should also be invalidated.
282 if (!insertionPoints[i]->isActive()) 285 if (!insertionPoints[i]->isActive())
283 continue; 286 continue;
284 287
285 if (Element* parent = insertionPoints[i]->parentElement()) { 288 if (Element* parent = insertionPoints[i]->parentElement()) {
286 if (ElementShadow* shadow = parent->shadow()) 289 if (ElementShadow* shadow = parent->shadow())
287 shadow->invalidateDistribution(); 290 shadow->invalidateDistribution();
288 } 291 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
338 m_nodeToInsertionPoint.add(node, insertionPoint); 341 m_nodeToInsertionPoint.add(node, insertionPoint);
339 } 342 }
340 } 343 }
341 344
342 insertionPoint->setDistribution(distribution); 345 insertionPoint->setDistribution(distribution);
343 } 346 }
344 347
345 void ContentDistributor::ensureDistribution(ShadowRoot* shadowRoot) 348 void ContentDistributor::ensureDistribution(ShadowRoot* shadowRoot)
346 { 349 {
347 ASSERT(shadowRoot); 350 ASSERT(shadowRoot);
351 return ensureDistribution(shadowRoot->host());
352 }
348 353
354 void ContentDistributor::ensureDistribution(ElementShadow* shadow)
esprehn 2013/06/14 08:32:29 I'd prefer if this was just a method of Element it
Hajime Morrita 2013/06/14 09:59:14 makes sense. will do.
355 {
356 ASSERT(shadow);
357 return ensureDistribution(shadow->host());
358 }
359
360 void ContentDistributor::ensureDistribution(Element* host)
361 {
349 Vector<ElementShadow*, 8> elementShadows; 362 Vector<ElementShadow*, 8> elementShadows;
350 for (Element* current = shadowRoot->host(); current; current = current->shad owHost()) { 363 for (Element* current = host; current; current = current->shadowHost()) {
351 ElementShadow* elementShadow = current->shadow(); 364 ElementShadow* elementShadow = current->shadow();
352 if (!elementShadow->distributor().needsDistribution()) 365 if (!elementShadow->distributor().needsDistribution())
353 break; 366 break;
354 367
355 elementShadows.append(elementShadow); 368 elementShadows.append(elementShadow);
356 } 369 }
357 370
358 for (size_t i = elementShadows.size(); i > 0; --i) 371 for (size_t i = elementShadows.size(); i > 0; --i)
359 elementShadows[i - 1]->distributor().distribute(elementShadows[i - 1]->h ost()); 372 elementShadows[i - 1]->distributor().distribute(elementShadows[i - 1]->h ost());
360 } 373 }
361 374
362 375
363 void ContentDistributor::invalidateDistribution(Element* host) 376 void ContentDistributor::invalidateDistribution(Element* host)
364 { 377 {
378 Vector<RefPtr<Node> > nodesNeedingReattach;
esprehn 2013/06/14 08:32:29 These shouldn't need to be RefPtr. I don't think a
Hajime Morrita 2013/06/14 09:59:14 It shouldn't run any script. WIll turn to raw poin
365 bool didNeedInvalidation = needsInvalidation(); 379 bool didNeedInvalidation = needsInvalidation();
366 bool needsReattach = didNeedInvalidation ? invalidate(host) : false; 380 bool needsReattach = didNeedInvalidation ? invalidate(host, nodesNeedingReat tach) : false;
367 381
368 if (needsReattach && host->attached()) { 382 if (needsReattach && host->attached()) {
369 for (Node* n = host->firstChild(); n; n = n->nextSibling()) 383 for (Node* n = host->firstChild(); n; n = n->nextSibling())
370 n->lazyReattach(); 384 n->lazyReattachIfAttached();
385 for (size_t i = 0; i < nodesNeedingReattach.size(); ++i)
386 nodesNeedingReattach[i]->lazyReattachIfAttached();
371 host->setNeedsStyleRecalc(); 387 host->setNeedsStyleRecalc();
372 } 388 }
373 389
374 if (didNeedInvalidation) { 390 if (didNeedInvalidation) {
375 ASSERT(m_validity == Invalidating); 391 ASSERT(m_validity == Invalidating);
376 m_validity = Invalidated; 392 m_validity = Invalidated;
377 } 393 }
378 } 394 }
379 395
380 const SelectRuleFeatureSet& ContentDistributor::ensureSelectFeatureSet(ElementSh adow* shadow) 396 const SelectRuleFeatureSet& ContentDistributor::ensureSelectFeatureSet(ElementSh adow* shadow)
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 { 437 {
422 for (ElementShadow* shadow = host->shadow(); shadow; shadow = shadow->contai ningShadow()) { 438 for (ElementShadow* shadow = host->shadow(); shadow; shadow = shadow->contai ningShadow()) {
423 if (shadow->distributor().needsSelectFeatureSet()) 439 if (shadow->distributor().needsSelectFeatureSet())
424 break; 440 break;
425 shadow->distributor().setNeedsSelectFeatureSet(); 441 shadow->distributor().setNeedsSelectFeatureSet();
426 } 442 }
427 443
428 invalidateDistribution(host); 444 invalidateDistribution(host);
429 } 445 }
430 446
447 void ContentDistributor::setNeedsStyleRecalcIfDistributedTo(Element* host, Inser tionPoint* insertionPoint)
448 {
449 for (NodeInsertionPointMap::iterator i = m_nodeToInsertionPoint.begin(); i ! = m_nodeToInsertionPoint.end(); ++i) {
450 if (i->value == insertionPoint)
451 const_cast<Node*>(i->key)->setNeedsStyleRecalc(SyntheticStyleChange) ;
esprehn 2013/06/14 08:32:29 Can you just remove the const from the key in the
452 }
453 }
454
431 void ContentDistributor::didShadowBoundaryChange(Element* host) 455 void ContentDistributor::didShadowBoundaryChange(Element* host)
432 { 456 {
433 setValidity(Undetermined); 457 setValidity(Undetermined);
434 invalidateDistribution(host); 458 invalidateDistribution(host);
435 } 459 }
436 460
437 } 461 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698