Changeset 19013

Show
Ignore:
Timestamp:
2007-01-21 12:51:34 (2 years ago)
Author:
weinig
Message:

LayoutTests:

Reviewed by Darin.

Test for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig

  • fast/dom/gc-10-expected.txt: Added.
  • fast/dom/gc-10.html: Added.
  • fast/dom/resources/gc-10-frame.html: Added.

WebCore:

Reviewed by Darin.

Fix for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig

JSDocuments are now responsible for marking the DOM wrappers associated with them, when they get marked.
This fixes a JS object leak when a DOM wrapper has a reference to a JSDocument that is otherwise not reachable.

Test: fast/dom/gc-10.html

  • WebCore.vcproj/WebCore/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSDocumentCustom.cpp: Added.
    (WebCore::JSDocument::mark):
  • bindings/js/kjs_binding.cpp:
    (KJS::ScriptInterpreter::markDOMNodesForDocument):
    (KJS::ScriptInterpreter::mark):
  • bindings/js/kjs_binding.h:
  • dom/Document.idl:

WebKitTools:

Reviewed by Darin.

Test support for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig

This adds a getJSObjectCount test-accessible function to allow test scripts to track JSObject usage.

  • DumpRenderTree/GCController.h:
  • DumpRenderTree/GCController.mm:
    (+[GCController isSelectorExcludedFromWebScript:]):
    (-[GCController getJSObjectCount]):
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/LayoutTests/ChangeLog

    r19012 r19013  
     12007-01-21  Sanjay Madhav  <sanjay12@gmail.com> 
     2 
     3        Reviewed by Darin. 
     4 
     5        Test for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig 
     6 
     7        * fast/dom/gc-10-expected.txt: Added. 
     8        * fast/dom/gc-10.html: Added. 
     9        * fast/dom/resources/gc-10-frame.html: Added. 
     10 
    1112007-01-21  Mitz Pettel  <mitz@webkit.org> 
    212 
  • trunk/WebCore/ChangeLog

    r19012 r19013  
     12007-01-21  Sanjay Madhav  <sanjay12@gmail.com> 
     2 
     3        Reviewed by Darin. 
     4 
     5        Fix for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig 
     6 
     7        JSDocuments are now responsible for marking the DOM wrappers associated with them, when they get marked. 
     8        This fixes a JS object leak when a DOM wrapper has a reference to a JSDocument that is otherwise not reachable. 
     9 
     10        Test: fast/dom/gc-10.html 
     11 
     12        * WebCore.vcproj/WebCore/WebCore.vcproj: 
     13        * WebCore.xcodeproj/project.pbxproj: 
     14        * bindings/js/JSDocumentCustom.cpp: Added. 
     15        (WebCore::JSDocument::mark): 
     16        * bindings/js/kjs_binding.cpp: 
     17        (KJS::ScriptInterpreter::markDOMNodesForDocument): 
     18        (KJS::ScriptInterpreter::mark): 
     19        * bindings/js/kjs_binding.h: 
     20        * dom/Document.idl: 
     21 
    1222007-01-21  Mitz Pettel  <mitz@webkit.org> 
    223 
  • trunk/WebCore/WebCore.vcproj/WebCore/WebCore.vcproj

    r18966 r19013  
    54235423                                </File> 
    54245424                                <File 
     5425                                        RelativePath="..\..\bindings\js\JSDocumentCustom.cpp" 
     5426                                        > 
     5427                                </File> 
     5428                                <File 
    54255429                                        RelativePath="..\..\bindings\js\JSHTMLElementWrapperFactory.cpp" 
    54265430                                        > 
  • trunk/WebCore/WebCore.xcodeproj/project.pbxproj

    r18994 r19013  
    13471347                85FF315A0AAFBFCB00374F38 /* DOMKeyboardEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 85FF31580AAFBFCB00374F38 /* DOMKeyboardEvent.h */; }; 
    13481348                85FF315B0AAFBFCB00374F38 /* DOMKeyboardEvent.mm in Sources */ = {isa = PBXBuildFile; fileRef = 85FF31590AAFBFCB00374F38 /* DOMKeyboardEvent.mm */; }; 
     1349                929264770B61FC7200B41D34 /* JSDocumentCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 929264760B61FC7200B41D34 /* JSDocumentCustom.cpp */; }; 
    13491350                9305B24D098F1B6B00C28855 /* Timer.h in Headers */ = {isa = PBXBuildFile; fileRef = 9305B24C098F1B6B00C28855 /* Timer.h */; settings = {ATTRIBUTES = (Private, ); }; }; 
    13501351                9307056C09E0AF8F00B17FE4 /* csshelper.h in Headers */ = {isa = PBXBuildFile; fileRef = BCEA4786097CAAC80094C9E4 /* csshelper.h */; settings = {ATTRIBUTES = (Private, ); }; }; 
     
    43704371                85FF31580AAFBFCB00374F38 /* DOMKeyboardEvent.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOMKeyboardEvent.h; sourceTree = "<group>"; }; 
    43714372                85FF31590AAFBFCB00374F38 /* DOMKeyboardEvent.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMKeyboardEvent.mm; sourceTree = "<group>"; }; 
     4373                929264760B61FC7200B41D34 /* JSDocumentCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSDocumentCustom.cpp; sourceTree = "<group>"; }; 
    43724374                9305B24C098F1B6B00C28855 /* Timer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Timer.h; sourceTree = "<group>"; }; 
    43734375                9307059009E0C75800B17FE4 /* CSSPrimitiveValue.idl */ = {isa = PBXFileReference; explicitFileType = sourcecode; fileEncoding = 4; path = CSSPrimitiveValue.idl; sourceTree = "<group>"; }; 
     
    87818783                                93F8B3060A300FEA00F61AB8 /* CodeGeneratorJS.pm */, 
    87828784                                1A9EF4560A1B957D00332B63 /* JSCanvasRenderingContext2DCustom.cpp */, 
     8785                                929264760B61FC7200B41D34 /* JSDocumentCustom.cpp */, 
    87838786                                938E65F609F0985D008A48EC /* JSHTMLElementWrapperFactory.cpp */, 
    87848787                                938E65F009F09840008A48EC /* JSHTMLElementWrapperFactory.h */, 
     
    1234412347                                1A2A68230B5BEDE70002A480 /* ProgressTracker.cpp in Sources */, 
    1234512348                                A80CEBAD0B60FC49007637C1 /* SVGMPathElement.cpp in Sources */, 
     12349                                929264770B61FC7200B41D34 /* JSDocumentCustom.cpp in Sources */, 
    1234612350                        ); 
    1234712351                        runOnlyForDeploymentPostprocessing = 0; 
  • trunk/WebCore/bindings/js/kjs_binding.cpp

    r18863 r19013  
    198198} 
    199199 
    200 void ScriptInterpreter::mark(bool currentThreadIsMainThread
    201 { 
    202     NodePerDocMap::iterator dictEnd = domNodesPerDocument().end(); 
    203     for (NodePerDocMap::iterator dictIt = domNodesPerDocument().begin(); dictIt != dictEnd; ++dictIt) { 
     200void ScriptInterpreter::markDOMNodesForDocument(Document* doc
     201{ 
     202    NodePerDocMap::iterator dictIt = domNodesPerDocument().find(doc); 
     203    if (dictIt != domNodesPerDocument().end()) { 
    204204        NodeMap* nodeDict = dictIt->second; 
    205205        NodeMap::iterator nodeEnd = nodeDict->end(); 
     
    213213        } 
    214214    } 
    215  
     215
     216 
     217void ScriptInterpreter::mark(bool currentThreadIsMainThread) 
     218
    216219    if (!currentThreadIsMainThread) { 
    217220        // On alternate threads, DOMObjects remain in the cache because they're not collected. 
  • trunk/WebCore/bindings/js/kjs_binding.h

    r18874 r19013  
    7777        static void forgetAllDOMNodesForDocument(WebCore::Document*); 
    7878        static void updateDOMNodeDocument(WebCore::Node*, WebCore::Document* oldDoc, WebCore::Document* newDoc); 
     79        static void markDOMNodesForDocument(WebCore::Document*); 
    7980 
    8081        WebCore::Frame* frame() const { return m_frame; } 
  • trunk/WebCore/dom/Document.idl

    r17859 r19013  
    2121module core { 
    2222 
    23     interface [LegacyParent=KJS::DOMEventTargetNode, GenerateConstructor] Document : EventTargetNode { 
     23    interface [LegacyParent=KJS::DOMEventTargetNode, GenerateConstructor, CustomMarkFunction] Document : EventTargetNode { 
    2424 
    2525        // DOM Level 1 Core 
  • trunk/WebKitTools/ChangeLog

    r19000 r19013  
     12007-01-21  Sanjay Madhav  <sanjay12@gmail.com> 
     2 
     3        Reviewed by Darin. 
     4 
     5        Test support for: <rdar://problem/4928583> Memory usage grows when reloading google.com/ig 
     6 
     7        This adds a getJSObjectCount test-accessible function to allow test scripts to track JSObject usage. 
     8 
     9        * DumpRenderTree/GCController.h: 
     10        * DumpRenderTree/GCController.mm: 
     11        (+[GCController isSelectorExcludedFromWebScript:]): 
     12        (-[GCController getJSObjectCount]): 
     13 
    1142007-01-20  Mark Rowe  <mrowe@apple.com> 
    215 
  • trunk/WebKitTools/DumpRenderTree/GCController.h

    r14569 r19013  
    3535- (void)collect; 
    3636- (void)collectOnAlternateThread:(BOOL)waitUntilDone; 
     37- (size_t)getJSObjectCount; 
    3738@end 
  • trunk/WebKitTools/DumpRenderTree/GCController.mm

    r14569 r19013  
    3838    if (aSelector == @selector(collectOnAlternateThread:)) 
    3939        return NO; 
     40    if (aSelector == @selector(getJSObjectCount)) 
     41        return NO; 
     42     
    4043    return YES; 
    4144} 
     
    5861    [WebCoreStatistics garbageCollectJavaScriptObjectsOnAlternateThread:waitUntilDone]; 
    5962} 
     63 
     64- (size_t)getJSObjectCount 
     65{ 
     66    return [WebCoreStatistics javaScriptObjectsCount]; 
     67} 
    6068@end