| 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 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 void addDOMObjectToGroup(DOMDataStore* store, uintptr_t groupId, void* objec
t) | 321 void addDOMObjectToGroup(DOMDataStore* store, uintptr_t groupId, void* objec
t) |
| 322 { | 322 { |
| 323 if (!object) | 323 if (!object) |
| 324 return; | 324 return; |
| 325 v8::Persistent<v8::Object> wrapper = store->domObjectMap().get(object); | 325 v8::Persistent<v8::Object> wrapper = store->domObjectMap().get(object); |
| 326 if (!wrapper.IsEmpty()) | 326 if (!wrapper.IsEmpty()) |
| 327 m_grouper.append(GrouperItem(groupId, wrapper)); | 327 m_grouper.append(GrouperItem(groupId, wrapper)); |
| 328 } | 328 } |
| 329 }; | 329 }; |
| 330 | 330 |
| 331 static uintptr_t calculateGroupId(StyleBase* styleBase) |
| 332 { |
| 333 ASSERT(styleBase); |
| 334 StyleBase* current = styleBase; |
| 335 StyleSheet* styleSheet = 0; |
| 336 while (true) { |
| 337 // Special case: CSSStyleDeclarations should have CSSRule as a parent |
| 338 // to proceed with parent traversal, otherwise they are coming from |
| 339 // inlined style declaration and should be treated as a root. |
| 340 if (current->isMutableStyleDeclaration()) { |
| 341 CSSMutableStyleDeclaration* cssMutableStyleDeclaration = static_cast
<CSSMutableStyleDeclaration*>(current); |
| 342 if (CSSRule* parentRule = cssMutableStyleDeclaration->parentRule()) |
| 343 current = parentRule; |
| 344 else |
| 345 return reinterpret_cast<uintptr_t>(cssMutableStyleDeclaration); |
| 346 } |
| 347 |
| 348 if (current->isStyleSheet()) |
| 349 styleSheet = static_cast<StyleSheet*>(current); |
| 350 |
| 351 StyleBase* parent = current->parent(); |
| 352 if (!parent) |
| 353 break; |
| 354 current = parent; |
| 355 } |
| 356 |
| 357 if (styleSheet) |
| 358 return reinterpret_cast<uintptr_t>(styleSheet); |
| 359 |
| 360 return reinterpret_cast<uintptr_t>(current); |
| 361 } |
| 362 |
| 331 class DOMObjectGrouperVisitor : public DOMWrapperMap<void>::Visitor { | 363 class DOMObjectGrouperVisitor : public DOMWrapperMap<void>::Visitor { |
| 332 public: | 364 public: |
| 333 DOMObjectGrouperVisitor() | 365 DOMObjectGrouperVisitor() |
| 334 { | 366 { |
| 335 } | 367 } |
| 336 | 368 |
| 337 void startMap() | 369 void startMap() |
| 338 { | 370 { |
| 339 m_grouper.shrink(0); | 371 m_grouper.shrink(0); |
| 340 } | 372 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 352 // FIXME: check if there are other StyleBase wrappers we should care of. | 384 // FIXME: check if there are other StyleBase wrappers we should care of. |
| 353 if (V8CSSStyleSheet::info.equals(typeInfo) | 385 if (V8CSSStyleSheet::info.equals(typeInfo) |
| 354 || V8CSSStyleDeclaration::info.equals(typeInfo) | 386 || V8CSSStyleDeclaration::info.equals(typeInfo) |
| 355 || V8CSSCharsetRule::info.equals(typeInfo) | 387 || V8CSSCharsetRule::info.equals(typeInfo) |
| 356 || V8CSSFontFaceRule::info.equals(typeInfo) | 388 || V8CSSFontFaceRule::info.equals(typeInfo) |
| 357 || V8CSSStyleRule::info.equals(typeInfo) | 389 || V8CSSStyleRule::info.equals(typeInfo) |
| 358 || V8CSSImportRule::info.equals(typeInfo) | 390 || V8CSSImportRule::info.equals(typeInfo) |
| 359 || V8CSSMediaRule::info.equals(typeInfo)) { | 391 || V8CSSMediaRule::info.equals(typeInfo)) { |
| 360 StyleBase* styleBase = static_cast<StyleBase*>(object); | 392 StyleBase* styleBase = static_cast<StyleBase*>(object); |
| 361 | 393 |
| 362 // We put the whole tree of style elements into a single object grou
p. | 394 uintptr_t groupId = calculateGroupId(styleBase); |
| 363 // To achieve that we group elements by the roots of their trees. | |
| 364 StyleBase* root = styleBase; | |
| 365 ASSERT(root); | |
| 366 while (true) { | |
| 367 StyleBase* parent = root->parent(); | |
| 368 if (!parent) | |
| 369 break; | |
| 370 root = parent; | |
| 371 } | |
| 372 // Group id is an address of the root. | |
| 373 uintptr_t groupId = reinterpret_cast<uintptr_t>(root); | |
| 374 m_grouper.append(GrouperItem(groupId, wrapper)); | 395 m_grouper.append(GrouperItem(groupId, wrapper)); |
| 375 | 396 |
| 376 if (V8CSSStyleDeclaration::info.equals(typeInfo)) { | 397 if (V8CSSStyleDeclaration::info.equals(typeInfo)) { |
| 377 CSSStyleDeclaration* cssStyleDeclaration = static_cast<CSSStyleD
eclaration*>(styleBase); | 398 CSSStyleDeclaration* cssStyleDeclaration = static_cast<CSSStyleD
eclaration*>(styleBase); |
| 378 if (cssStyleDeclaration->isMutableStyleDeclaration()) { | 399 if (cssStyleDeclaration->isMutableStyleDeclaration()) { |
| 379 CSSMutableStyleDeclaration* cssMutableStyleDeclaration = sta
tic_cast<CSSMutableStyleDeclaration*>(cssStyleDeclaration); | 400 CSSMutableStyleDeclaration* cssMutableStyleDeclaration = sta
tic_cast<CSSMutableStyleDeclaration*>(cssStyleDeclaration); |
| 380 CSSMutableStyleDeclaration::const_iterator end = cssMutableS
tyleDeclaration->end(); | 401 CSSMutableStyleDeclaration::const_iterator end = cssMutableS
tyleDeclaration->end(); |
| 381 for (CSSMutableStyleDeclaration::const_iterator it = cssMuta
bleStyleDeclaration->begin(); it != end; ++it) { | 402 for (CSSMutableStyleDeclaration::const_iterator it = cssMuta
bleStyleDeclaration->begin(); it != end; ++it) { |
| 382 wrapper = store->domObjectMap().get(it->value()); | 403 wrapper = store->domObjectMap().get(it->value()); |
| 383 if (!wrapper.IsEmpty()) | 404 if (!wrapper.IsEmpty()) |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 511 return; | 532 return; |
| 512 #endif | 533 #endif |
| 513 | 534 |
| 514 int memoryUsageMB = getMemoryUsageInMB(); | 535 int memoryUsageMB = getMemoryUsageInMB(); |
| 515 if ((memoryUsageMB > lowUsageMB && memoryUsageMB > 2 * workingSetEstimateMB)
|| (memoryUsageMB > highUsageMB && memoryUsageMB > workingSetEstimateMB + highU
sageDeltaMB)) | 536 if ((memoryUsageMB > lowUsageMB && memoryUsageMB > 2 * workingSetEstimateMB)
|| (memoryUsageMB > highUsageMB && memoryUsageMB > workingSetEstimateMB + highU
sageDeltaMB)) |
| 516 v8::V8::LowMemoryNotification(); | 537 v8::V8::LowMemoryNotification(); |
| 517 } | 538 } |
| 518 | 539 |
| 519 | 540 |
| 520 } // namespace WebCore | 541 } // namespace WebCore |
| OLD | NEW |