Reviewed by Geoff.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Jun 2006 20:04:14 +0000 (20:04 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 23 Jun 2006 20:04:14 +0000 (20:04 +0000)
        script debugger should only attach to JavaScriptCore when there are listeners
        http://bugzilla.opendarwin.org/show_bug.cgi?id=9552

        Attaches the debugger to all WebFrames when the first listener
        is added. Detaches when the last listener is removed.
        Also detach when the script debug delegate is set to nil.

        * DefaultDelegates/WebScriptDebugServer.m:
        (+[WebScriptDebugServer listenerCount]):
        (-[WebScriptDebugServer dealloc]):
        (-[WebScriptDebugServer attachScriptDebuggerToAllWebViews]):
        (-[WebScriptDebugServer detachScriptDebuggerFromAllWebViews]):
        (-[WebScriptDebugServer listenerConnectionDidDie:]):
        (-[WebScriptDebugServer addListener:]):
        (-[WebScriptDebugServer removeListener:]):
        * DefaultDelegates/WebScriptDebugServerPrivate.h:
        * WebCoreSupport/WebFrameBridge.m:
        (-[WebFrameBridge windowObjectCleared]):
        * WebView/WebFrame.m:
        (-[WebFrame _attachScriptDebugger]):
        (-[WebFrame _detachScriptDebugger]):
        * WebView/WebFramePrivate.h:
        * WebView/WebScriptDebugDelegate.m:
        (-[WebScriptCallFrame parsedSource:fromURL:sourceId:]):
        (-[WebScriptCallFrame enteredFrame:sourceId:line:]):
        (-[WebScriptCallFrame hitStatement:sourceId:line:]):
        (-[WebScriptCallFrame leavingFrame:sourceId:line:]):
        * WebView/WebView.m:
        (-[WebView _attachScriptDebuggerToAllFrames]):
        (-[WebView _detachScriptDebuggerFromAllFrames]):
        (-[WebView setScriptDebugDelegate:]):
        * WebView/WebViewPrivate.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@14990 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebKit/ChangeLog
WebKit/DefaultDelegates/WebScriptDebugServer.m
WebKit/DefaultDelegates/WebScriptDebugServerPrivate.h
WebKit/WebCoreSupport/WebFrameBridge.m
WebKit/WebView/WebFrame.m
WebKit/WebView/WebFramePrivate.h
WebKit/WebView/WebScriptDebugDelegate.m
WebKit/WebView/WebView.m
WebKit/WebView/WebViewPrivate.h

index c598cc4..4a6fced 100644 (file)
@@ -1,3 +1,40 @@
+2006-06-23  Timothy Hatcher  <timothy@apple.com>
+
+        Reviewed by Geoff.
+
+        script debugger should only attach to JavaScriptCore when there are listeners
+        http://bugzilla.opendarwin.org/show_bug.cgi?id=9552
+
+        Attaches the debugger to all WebFrames when the first listener
+        is added. Detaches when the last listener is removed.
+        Also detach when the script debug delegate is set to nil.
+
+        * DefaultDelegates/WebScriptDebugServer.m:
+        (+[WebScriptDebugServer listenerCount]):
+        (-[WebScriptDebugServer dealloc]):
+        (-[WebScriptDebugServer attachScriptDebuggerToAllWebViews]):
+        (-[WebScriptDebugServer detachScriptDebuggerFromAllWebViews]):
+        (-[WebScriptDebugServer listenerConnectionDidDie:]):
+        (-[WebScriptDebugServer addListener:]):
+        (-[WebScriptDebugServer removeListener:]):
+        * DefaultDelegates/WebScriptDebugServerPrivate.h:
+        * WebCoreSupport/WebFrameBridge.m:
+        (-[WebFrameBridge windowObjectCleared]):
+        * WebView/WebFrame.m:
+        (-[WebFrame _attachScriptDebugger]):
+        (-[WebFrame _detachScriptDebugger]):
+        * WebView/WebFramePrivate.h:
+        * WebView/WebScriptDebugDelegate.m:
+        (-[WebScriptCallFrame parsedSource:fromURL:sourceId:]):
+        (-[WebScriptCallFrame enteredFrame:sourceId:line:]):
+        (-[WebScriptCallFrame hitStatement:sourceId:line:]):
+        (-[WebScriptCallFrame leavingFrame:sourceId:line:]):
+        * WebView/WebView.m:
+        (-[WebView _attachScriptDebuggerToAllFrames]):
+        (-[WebView _detachScriptDebuggerFromAllFrames]):
+        (-[WebView setScriptDebugDelegate:]):
+        * WebView/WebViewPrivate.h:
+
 2006-06-22  John Sullivan  <sullivan@apple.com>
 
         Reviewed by Tim Omernick
index 941ce84..581f439 100644 (file)
@@ -28,6 +28,9 @@
 
 #import "WebScriptDebugServer.h"
 #import "WebScriptDebugServerPrivate.h"
+#import "WebViewInternal.h"
+
+#import <JavaScriptCore/Assertions.h>
 
 NSString *WebScriptDebugServerProcessNameKey = @"WebScriptDebugServerProcessNameKey";
 NSString *WebScriptDebugServerProcessBundleIdentifierKey = @"WebScriptDebugServerProcessBundleIdentifierKey";
@@ -42,6 +45,7 @@ NSString *WebScriptDebugServerWillUnloadNotification = @"WebScriptDebugServerWil
 @implementation WebScriptDebugServer
 
 static WebScriptDebugServer *sharedServer = nil;
+static unsigned listenerCount = 0;
 
 + (WebScriptDebugServer *)sharedScriptDebugServer
 {
@@ -50,6 +54,11 @@ static WebScriptDebugServer *sharedServer = nil;
     return sharedServer;
 }
 
++ (unsigned)listenerCount
+{
+    return listenerCount;
+}
+
 - (id)init
 {
     self = [super init];
@@ -79,6 +88,10 @@ static WebScriptDebugServer *sharedServer = nil;
 
 - (void)dealloc
 {
+    ASSERT(listenerCount >= [listeners count]);
+    listenerCount -= [listeners count];
+    if (!listenerCount)
+        [self detachScriptDebuggerFromAllWebViews];
     [[NSDistributedNotificationCenter defaultCenter] removeObserver:self name:WebScriptDebugServerQueryNotification object:nil];
     [[NSDistributedNotificationCenter defaultCenter] postNotificationName:WebScriptDebugServerWillUnloadNotification object:serverName];
     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSConnectionDidDieNotification object:nil];
@@ -89,6 +102,16 @@ static WebScriptDebugServer *sharedServer = nil;
     [super dealloc];
 }
 
+- (void)attachScriptDebuggerToAllWebViews
+{
+    [WebView _makeAllWebViewsPerformSelector:@selector(_attachScriptDebuggerToAllFrames)];
+}
+
+- (void)detachScriptDebuggerFromAllWebViews
+{
+    [WebView _makeAllWebViewsPerformSelector:@selector(_detachScriptDebuggerFromAllFrames)];
+}
+
 - (void)serverQuery:(NSNotification *)notification
 {
     NSProcessInfo *processInfo = [NSProcessInfo processInfo];
@@ -112,8 +135,13 @@ static WebScriptDebugServer *sharedServer = nil;
         if ([[listener connectionForProxy] isEqualTo:connection])
             [listenersToRemove addObject:listener];
 
+    ASSERT(listenerCount >= [listenersToRemove count]);
+    listenerCount -= [listenersToRemove count];
     [listeners minusSet:listenersToRemove];
     [listenersToRemove release];
+
+    if (!listenerCount)
+        [self detachScriptDebuggerFromAllWebViews];
 }
 
 - (oneway void)addListener:(id<WebScriptDebugListener>)listener
@@ -121,14 +149,21 @@ static WebScriptDebugServer *sharedServer = nil;
     // can't use isKindOfClass: here because that will send over the wire and not check the proxy object
     if ([listener class] != [NSDistantObject class] || ![listener conformsToProtocol:@protocol(WebScriptDebugListener)])
         return;
+    listenerCount++;
     [listeners addObject:listener];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(listenerConnectionDidDie:) name:NSConnectionDidDieNotification object:[(NSDistantObject *)listener connectionForProxy]];
+    if (listenerCount == 1)
+        [self attachScriptDebuggerToAllWebViews];
 }
 
 - (oneway void)removeListener:(id<WebScriptDebugListener>)listener
 {
+    ASSERT(listenerCount >= 1);
+    listenerCount--;
     [[NSNotificationCenter defaultCenter] removeObserver:self name:NSConnectionDidDieNotification object:[(NSDistantObject *)listener connectionForProxy]];
     [listeners removeObject:listener];
+    if (!listenerCount)
+        [self detachScriptDebuggerFromAllWebViews];
 }
 
 - (oneway void)step
index a168d6e..faa8bc9 100644 (file)
     BOOL step;
 }
 + (WebScriptDebugServer *)sharedScriptDebugServer;
++ (unsigned)listenerCount;
+
+- (void)attachScriptDebuggerToAllWebViews;
+- (void)detachScriptDebuggerFromAllWebViews;
 
 - (void)webView:(WebView *)webView       didParseSource:(NSString *)source
                                                 fromURL:(NSString *)url
index 5ce716e..db47376 100644 (file)
@@ -67,6 +67,7 @@
 #import "WebPluginViewFactoryPrivate.h"
 #import "WebPreferencesPrivate.h"
 #import "WebResourcePrivate.h"
+#import "WebScriptDebugServerPrivate.h"
 #import "WebSubresourceLoader.h"
 #import "WebUIDelegatePrivate.h"
 #import "WebViewInternal.h"
@@ -1490,7 +1491,7 @@ static id <WebFormDelegate> formDelegate(WebFrameBridge *self)
 {
     WebView *wv = [self webView];
     [[wv _frameLoadDelegateForwarder] webView:wv windowScriptObjectAvailable:[self windowScriptObject]];
-    if ([wv scriptDebugDelegate] || [WebView _scriptDebuggerEnabled])
+    if ([wv scriptDebugDelegate] || [WebScriptDebugServer listenerCount])
         [_frame _attachScriptDebugger];
 }
 
index b2ae283..915915a 100644 (file)
@@ -2442,8 +2442,16 @@ static CFAbsoluteTime _timeOfLastCompletedLoad;
 
 - (void)_attachScriptDebugger
 {
-    if (!_private->scriptDebugger) {
+    if (!_private->scriptDebugger)
         _private->scriptDebugger = [[WebScriptDebugger alloc] initWithWebFrame:self];
+}
+
+- (void)_detachScriptDebugger
+{
+    if (_private->scriptDebugger) {
+        id old = _private->scriptDebugger;
+        _private->scriptDebugger = nil;
+        [old release];
     }
 }
 
index 2fd2fed..c29753c 100644 (file)
@@ -160,6 +160,7 @@ extern NSString *WebPageCacheDocumentViewKey;
 - (BOOL)_isFrameSet;
 
 - (void)_attachScriptDebugger;
+- (void)_detachScriptDebugger;
 
 - (void)_recursive_pauseNullEventsForAllNetscapePlugins;
 - (void)_recursive_resumeNullEventsForAllNetscapePlugins;
index d60c10b..f5592c7 100644 (file)
 - (void)parsedSource:(NSString *)source fromURL:(NSString *)url sourceId:(int)sid
 {
     [[_webView _scriptDebugDelegateForwarder] webView:_webView didParseSource:source fromURL:url sourceId:sid forWebFrame:_webFrame];
-    if ([WebView _scriptDebuggerEnabled])
+    if ([WebScriptDebugServer listenerCount])
         [[WebScriptDebugServer sharedScriptDebugServer] webView:_webView didParseSource:source fromURL:url sourceId:sid forWebFrame:_webFrame];
 }
 
 - (void)enteredFrame:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
 {
     [[_webView _scriptDebugDelegateForwarder] webView:_webView didEnterCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
-    if ([WebView _scriptDebuggerEnabled])
+    if ([WebScriptDebugServer listenerCount])
         [[WebScriptDebugServer sharedScriptDebugServer] webView:_webView didEnterCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
 }
 
 - (void)hitStatement:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
 {
     [[_webView _scriptDebugDelegateForwarder] webView:_webView willExecuteStatement:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
-    if ([WebView _scriptDebuggerEnabled])
+    if ([WebScriptDebugServer listenerCount])
         [[WebScriptDebugServer sharedScriptDebugServer] webView:_webView willExecuteStatement:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
 }
 
 - (void)leavingFrame:(WebCoreScriptCallFrame *)frame sourceId:(int)sid line:(int)lineno
 {
     [[_webView _scriptDebugDelegateForwarder] webView:_webView willLeaveCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
-    if ([WebView _scriptDebuggerEnabled])
+    if ([WebScriptDebugServer listenerCount])
         [[WebScriptDebugServer sharedScriptDebugServer] webView:_webView willLeaveCallFrame:[frame wrapper] sourceId:sid line:lineno forWebFrame:_webFrame];
 }
 
index e5b385c..3849596 100644 (file)
@@ -1466,6 +1466,24 @@ static bool debugWidget = true;
     [_private->pluginDatabase refresh];
 }
 
+- (void)_attachScriptDebuggerToAllFrames
+{
+    WebFrame *frame = [self mainFrame];
+    do {
+        [frame _attachScriptDebugger];
+        frame = [frame _nextFrameWithWrap:NO];
+    } while (frame);
+}
+
+- (void)_detachScriptDebuggerFromAllFrames
+{
+    WebFrame *frame = [self mainFrame];
+    do {
+        [frame _detachScriptDebugger];
+        frame = [frame _nextFrameWithWrap:NO];
+    } while (frame);
+}
+
 @end
 
 
@@ -2724,6 +2742,10 @@ static WebFrame *incrementFrame(WebFrame *curr, BOOL forward, BOOL wrapFlag)
     _private->scriptDebugDelegate = delegate;
     [_private->scriptDebugDelegateForwarder release];
     _private->scriptDebugDelegateForwarder = nil;
+    if (delegate)
+        [self _attachScriptDebuggerToAllFrames];
+    else
+        [self _detachScriptDebuggerFromAllFrames];
 }
 
 - scriptDebugDelegate
index 94b9e70..3a9cb42 100644 (file)
@@ -87,7 +87,7 @@ typedef enum {
 
 - (IBAction)toggleContinuousSpellChecking:(id)sender;
 
-- (void)toggleSmartInsertDelete:(id)sender;
+- (IBAction)toggleSmartInsertDelete:(id)sender;
 
 - (BOOL)canMakeTextStandardSize;
 - (IBAction)makeTextStandardSize:(id)sender;
@@ -137,11 +137,11 @@ typedef enum {
 
 @interface WebView (WebViewEditingPendingPublic)
 
-- (void)moveToBeginningOfSentence:(id)sender;
-- (void)moveToBeginningOfSentenceAndModifySelection:(id)sender;
-- (void)moveToEndOfSentence:(id)sender;
-- (void)moveToEndOfSentenceAndModifySelection:(id)sender;
-- (void)selectSentence:(id)sender;
+- (IBAction)moveToBeginningOfSentence:(id)sender;
+- (IBAction)moveToBeginningOfSentenceAndModifySelection:(id)sender;
+- (IBAction)moveToEndOfSentence:(id)sender;
+- (IBAction)moveToEndOfSentenceAndModifySelection:(id)sender;
+- (IBAction)selectSentence:(id)sender;
 
 @end
 
@@ -258,6 +258,18 @@ Could be worth adding to the API.
  */
 - (void)_setAdditionalWebPlugInPaths:(NSArray *)newPaths;
 
+/*!
+    @method _attachScriptDebuggerToAllFrames
+    @abstract Attaches a script debugger to all frames belonging to the receiver.
+ */
+- (void)_attachScriptDebuggerToAllFrames;
+
+/*!
+    @method _detachScriptDebuggerFromAllFrames
+    @abstract Detaches any script debuggers from all frames belonging to the receiver.
+ */
+- (void)_detachScriptDebuggerFromAllFrames;
+
 @end
 
 @interface WebView (WebViewPrintingPrivate)