| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 if (!root) | 279 if (!root) |
| 280 return GroupId(); | 280 return GroupId(); |
| 281 } else { | 281 } else { |
| 282 while (Node* parent = root->parentOrHostNode()) | 282 while (Node* parent = root->parentOrHostNode()) |
| 283 root = parent; | 283 root = parent; |
| 284 } | 284 } |
| 285 | 285 |
| 286 return GroupId(root); | 286 return GroupId(root); |
| 287 } | 287 } |
| 288 | 288 |
| 289 static GroupId calculateGroupId(StyleBase* styleBase) | |
| 290 { | |
| 291 ASSERT(styleBase); | |
| 292 StyleBase* current = styleBase; | |
| 293 StyleSheet* styleSheet = 0; | |
| 294 while (true) { | |
| 295 // Special case: CSSStyleDeclarations might be either inline and in this
case | |
| 296 // we need to group them with their node or regular ones. | |
| 297 if (current->isMutableStyleDeclaration()) { | |
| 298 CSSMutableStyleDeclaration* cssMutableStyleDeclaration = static_cast
<CSSMutableStyleDeclaration*>(current); | |
| 299 if (cssMutableStyleDeclaration->isInlineStyleDeclaration()) | |
| 300 return calculateGroupId(cssMutableStyleDeclaration->node()); | |
| 301 // Either we have no parent, or this parent is a CSSRule. | |
| 302 ASSERT(cssMutableStyleDeclaration->parent() == cssMutableStyleDeclar
ation->parentRule()); | |
| 303 } | |
| 304 | |
| 305 if (current->isStyleSheet()) | |
| 306 styleSheet = static_cast<StyleSheet*>(current); | |
| 307 | |
| 308 StyleBase* parent = current->parent(); | |
| 309 if (!parent) | |
| 310 break; | |
| 311 current = parent; | |
| 312 } | |
| 313 | |
| 314 if (styleSheet) { | |
| 315 if (Node* ownerNode = styleSheet->ownerNode()) | |
| 316 return calculateGroupId(ownerNode); | |
| 317 return GroupId(styleSheet); | |
| 318 } | |
| 319 | |
| 320 return GroupId(current); | |
| 321 } | |
| 322 | |
| 323 class GrouperVisitor : public DOMWrapperMap<Node>::Visitor, public DOMWrapperMap
<void>::Visitor { | 289 class GrouperVisitor : public DOMWrapperMap<Node>::Visitor, public DOMWrapperMap
<void>::Visitor { |
| 324 public: | 290 public: |
| 325 void visitDOMWrapper(DOMDataStore* store, Node* node, v8::Persistent<v8::Obj
ect> wrapper) | 291 void visitDOMWrapper(DOMDataStore* store, Node* node, v8::Persistent<v8::Obj
ect> wrapper) |
| 326 { | 292 { |
| 327 if (node->hasEventListeners()) { | 293 if (node->hasEventListeners()) { |
| 328 Vector<v8::Persistent<v8::Value> > listeners; | 294 Vector<v8::Persistent<v8::Value> > listeners; |
| 329 EventListenerIterator iterator(node); | 295 EventListenerIterator iterator(node); |
| 330 while (EventListener* listener = iterator.nextListener()) { | 296 while (EventListener* listener = iterator.nextListener()) { |
| 331 if (listener->type() != EventListener::JSEventListenerType) | 297 if (listener->type() != EventListener::JSEventListenerType) |
| 332 continue; | 298 continue; |
| 333 V8AbstractEventListener* v8listener = static_cast<V8AbstractEven
tListener*>(listener); | 299 V8AbstractEventListener* v8listener = static_cast<V8AbstractEven
tListener*>(listener); |
| 334 if (!v8listener->hasExistingListenerObject()) | 300 if (!v8listener->hasExistingListenerObject()) |
| 335 continue; | 301 continue; |
| 336 listeners.append(v8listener->existingListenerObjectPersistentHan
dle()); | 302 listeners.append(v8listener->existingListenerObjectPersistentHan
dle()); |
| 337 } | 303 } |
| 338 if (!listeners.isEmpty()) | 304 if (!listeners.isEmpty()) |
| 339 v8::V8::AddImplicitReferences(wrapper, listeners.data(), listene
rs.size()); | 305 v8::V8::AddImplicitReferences(wrapper, listeners.data(), listene
rs.size()); |
| 340 } | 306 } |
| 341 | 307 |
| 342 GroupId groupId = calculateGroupId(node); | 308 GroupId groupId = calculateGroupId(node); |
| 343 if (!groupId) | 309 if (!groupId) |
| 344 return; | 310 return; |
| 345 m_grouper.append(GrouperItem(groupId, wrapper)); | 311 m_grouper.append(GrouperItem(groupId, wrapper)); |
| 346 } | 312 } |
| 347 | 313 |
| 348 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::O
bject> wrapper) | 314 void visitDOMWrapper(DOMDataStore* store, void* object, v8::Persistent<v8::O
bject> wrapper) |
| 349 { | 315 { |
| 350 WrapperTypeInfo* typeInfo = V8DOMWrapper::domWrapperType(wrapper); | |
| 351 | |
| 352 if (typeInfo->isSubclass(&V8StyleSheetList::info)) { | |
| 353 StyleSheetList* styleSheetList = static_cast<StyleSheetList*>(object
); | |
| 354 GroupId groupId(styleSheetList); | |
| 355 if (Document* document = styleSheetList->document()) | |
| 356 groupId = GroupId(document); | |
| 357 m_grouper.append(GrouperItem(groupId, wrapper)); | |
| 358 | |
| 359 } else if (typeInfo->isSubclass(&V8DOMImplementation::info)) { | |
| 360 DOMImplementation* domImplementation = static_cast<DOMImplementation
*>(object); | |
| 361 GroupId groupId(domImplementation); | |
| 362 if (Document* document = domImplementation->document()) | |
| 363 groupId = GroupId(document); | |
| 364 m_grouper.append(GrouperItem(groupId, wrapper)); | |
| 365 | |
| 366 } else if (typeInfo->isSubclass(&V8StyleSheet::info) || typeInfo->isSubc
lass(&V8CSSRule::info)) { | |
| 367 m_grouper.append(GrouperItem(calculateGroupId(static_cast<StyleBase*
>(object)), wrapper)); | |
| 368 | |
| 369 } else if (typeInfo->isSubclass(&V8CSSStyleDeclaration::info)) { | |
| 370 CSSStyleDeclaration* cssStyleDeclaration = static_cast<CSSStyleDecla
ration*>(object); | |
| 371 | |
| 372 GroupId groupId = calculateGroupId(cssStyleDeclaration); | |
| 373 m_grouper.append(GrouperItem(groupId, wrapper)); | |
| 374 | |
| 375 // Keep alive "dirty" primitive values (i.e. the ones that | |
| 376 // have user-added properties) by creating implicit | |
| 377 // references between the style declaration and the values | |
| 378 // in it. | |
| 379 if (cssStyleDeclaration->isMutableStyleDeclaration()) { | |
| 380 CSSMutableStyleDeclaration* cssMutableStyleDeclaration = static_
cast<CSSMutableStyleDeclaration*>(cssStyleDeclaration); | |
| 381 Vector<v8::Persistent<v8::Value> > values; | |
| 382 values.reserveCapacity(cssMutableStyleDeclaration->length()); | |
| 383 CSSMutableStyleDeclaration::const_iterator end = cssMutableStyle
Declaration->end(); | |
| 384 for (CSSMutableStyleDeclaration::const_iterator it = cssMutableS
tyleDeclaration->begin(); it != end; ++it) { | |
| 385 v8::Persistent<v8::Object> value = store->domObjectMap().get
(it->value()); | |
| 386 if (!value.IsEmpty() && value->IsDirty()) | |
| 387 values.append(value); | |
| 388 } | |
| 389 if (!values.isEmpty()) | |
| 390 v8::V8::AddImplicitReferences(wrapper, values.data(), values
.size()); | |
| 391 } | |
| 392 } | |
| 393 } | 316 } |
| 394 | 317 |
| 395 void applyGrouping() | 318 void applyGrouping() |
| 396 { | 319 { |
| 397 // Group by sorting by the group id. | 320 // Group by sorting by the group id. |
| 398 std::sort(m_grouper.begin(), m_grouper.end()); | 321 std::sort(m_grouper.begin(), m_grouper.end()); |
| 399 | 322 |
| 400 for (size_t i = 0; i < m_grouper.size(); ) { | 323 for (size_t i = 0; i < m_grouper.size(); ) { |
| 401 // Seek to the next key (or the end of the list). | 324 // Seek to the next key (or the end of the list). |
| 402 size_t nextKeyIndex = m_grouper.size(); | 325 size_t nextKeyIndex = m_grouper.size(); |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 554 return; | 477 return; |
| 555 #endif | 478 #endif |
| 556 | 479 |
| 557 int memoryUsageMB = getMemoryUsageInMB(); | 480 int memoryUsageMB = getMemoryUsageInMB(); |
| 558 if ((memoryUsageMB > lowUsageMB && memoryUsageMB > 2 * workingSetEstimateMB)
|| (memoryUsageMB > highUsageMB && memoryUsageMB > workingSetEstimateMB + highU
sageDeltaMB)) | 481 if ((memoryUsageMB > lowUsageMB && memoryUsageMB > 2 * workingSetEstimateMB)
|| (memoryUsageMB > highUsageMB && memoryUsageMB > workingSetEstimateMB + highU
sageDeltaMB)) |
| 559 v8::V8::LowMemoryNotification(); | 482 v8::V8::LowMemoryNotification(); |
| 560 } | 483 } |
| 561 | 484 |
| 562 | 485 |
| 563 } // namespace WebCore | 486 } // namespace WebCore |
| OLD | NEW |