WebCore:
authorkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2007 21:43:31 +0000 (21:43 +0000)
committerkmccullo <kmccullo@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 8 Nov 2007 21:43:31 +0000 (21:43 +0000)
        Reviewed by Sam.

        - windowObjectCleared() is no longer const.  It needs to setup the
        script debugger and cannot be const to do so.

        * loader/FrameLoaderClient.h:
        * platform/graphics/svg/SVGImageEmptyClients.h:
        (WebCore::SVGEmptyFrameLoaderClient::windowObjectCleared):

WebKit/gtk:

        Reviewed by Sam.

        - windowObjectCleared() is no longer const.  It needs to setup the
        script debugger and cannot be const to do so.

        * WebCoreSupport/FrameLoaderClientGtk.cpp:
        (WebKit::FrameLoaderClient::windowObjectCleared):
        * WebCoreSupport/FrameLoaderClientGtk.h:

WebKit/qt:

        Reviewed by Sam.

        - windowObjectCleared() is no longer const.  It needs to setup the
        script debugger and cannot be const to do so.

        * WebCoreSupport/FrameLoaderClientQt.cpp:
        (WebCore::FrameLoaderClientQt::windowObjectCleared):
        * WebCoreSupport/FrameLoaderClientQt.h:

WebKit/win:

        Reviewed by Sam.

        - With this change Drosera can now get the source of a website and the
        listings of the sources it gets.  This also lays the foundation for
        letting Drosera show the scope chain of the JavaScript stack.

        * Interfaces/IWebFrame.idl: Changed the signature of the local function,
        globalContext(), because COM was unable to marshal this object with the
        other signature.
        * Interfaces/IWebScriptDebugServer.idl: Of course adding and removing
        a listener cannot be done in a const function.
        * WebChromeClient.h: Added accessor to the WebView for the new added
        kit() function in WebFrame.
        (WebChromeClient::webView):
        * WebFrame.cpp: Added a script debugger object and the necessary
        functions to attach and communicate with it. Also needed to change the
        local function, globalContext(), because of a COM issue.
        (kit):
        (WebFrame::WebFrame):
        (WebFrame::globalContext):
        (WebFrame::loadData):
        (WebFrame::attachScriptDebugger):
        (WebFrame::detachScriptDebugger):
        (WebFrame::dispatchDidLoadMainResource):
        (WebFrame::windowObjectCleared):
        * WebFrame.h: Ditto.
        * WebHTMLRepresentation.cpp: Implemented documentSource so Drosera has
        some source code to display.
        (WebHTMLRepresentation::WebHTMLRepresentation):
        (WebHTMLRepresentation::documentSource):
        * WebKit.vcproj/WebKit.vcproj: Added the new WebScriptDebugger class.
        * WebScriptCallFrame.cpp: Implemented much of this class' functionality.
        (EnumScopes::EnumScopes): Made an EnumScopes class to create an
        IEnumVARIANT to wrap a ScopeChain for Drosera.
        (EnumScopes::QueryInterface):
        (EnumScopes::AddRef):
        (EnumScopes::Release):
        (EnumScopes::Next):
        (EnumScopes::Skip):
        (EnumScopes::Reset):
        (EnumScopes::Clone):
        (WebScriptCallFrame::caller):
        (WebScriptCallFrame::scopeChain):
        (WebScriptCallFrame::functionName):
        (WebScriptCallFrame::stringByEvaluatingJavaScriptFromString):
        * WebScriptCallFrame.h: Added member data needed for the above functions
        * WebScriptDebugServer.cpp: Began implementing.
        (WebScriptDebugServer::listenerCount):
        (EnumViews::QueryInterface):
        (EnumViews::AddRef):
        (EnumViews::Release):
        (EnumViews::Next):
        (EnumViews::Skip):
        (EnumViews::Reset):
        (EnumViews::Clone):
        (WebScriptDebugServer::WebScriptDebugServer):
        (WebScriptDebugServer::createInstance):
        (WebScriptDebugServer::sharedWebScriptDebugServer):
        (WebScriptDebugServer::AddRef):
        (WebScriptDebugServer::Release):
        (WebScriptDebugServer::addListener):
        (WebScriptDebugServer::removeListener):
        (WebScriptDebugServer::step):
        (WebScriptDebugServer::pause):
        (WebScriptDebugServer::resume):
        (WebScriptDebugServer::isPaused):
        (WebScriptDebugServer::suspendProcessIfPaused):
        (WebScriptDebugServer::didLoadMainResourceForDataSource):
        (WebScriptDebugServer::didParseSource):
        (WebScriptDebugServer::failedToParseSource):
        (WebScriptDebugServer::didEnterCallFrame):
        (WebScriptDebugServer::willExecuteStatement):
        (WebScriptDebugServer::willLeaveCallFrame):
        (WebScriptDebugServer::exceptionWasRaised):
        * WebScriptDebugServer.h: Began implementing.
        * WebScriptDebugger.cpp: Added.
        (WebScriptDebugger::WebScriptDebugger):
        (WebScriptDebugger::sourceParsed):
        * WebScriptDebugger.h: Added.
        * WebScriptScope.cpp: Make this class use createInstance which is more
        in line with our guidelines.
        (WebScriptScope::WebScriptScope):
        (WebScriptScope::createInstance):
        * WebScriptScope.h:

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

26 files changed:
WebCore/ChangeLog
WebCore/loader/FrameLoaderClient.h
WebCore/platform/graphics/svg/SVGImageEmptyClients.h
WebKit/gtk/ChangeLog
WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp
WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.h
WebKit/qt/ChangeLog
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.cpp
WebKit/qt/WebCoreSupport/FrameLoaderClientQt.h
WebKit/win/ChangeLog
WebKit/win/Interfaces/IWebFrame.idl
WebKit/win/Interfaces/IWebScriptDebugServer.idl
WebKit/win/WebChromeClient.h
WebKit/win/WebFrame.cpp
WebKit/win/WebFrame.h
WebKit/win/WebHTMLRepresentation.cpp
WebKit/win/WebHTMLRepresentation.h
WebKit/win/WebKit.vcproj/WebKit.vcproj
WebKit/win/WebScriptCallFrame.cpp
WebKit/win/WebScriptCallFrame.h
WebKit/win/WebScriptDebugServer.cpp
WebKit/win/WebScriptDebugServer.h
WebKit/win/WebScriptDebugger.cpp [new file with mode: 0644]
WebKit/win/WebScriptDebugger.h [new file with mode: 0644]
WebKit/win/WebScriptScope.cpp
WebKit/win/WebScriptScope.h

index fc2ba8c1cf6845702e73c1fd325024116d9eaf4d..b67ece1b68e7422d62f44b88b6bb54613779f49e 100644 (file)
@@ -1,3 +1,14 @@
+2007-11-08  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - windowObjectCleared() is no longer const.  It needs to setup the
+        script debugger and cannot be const to do so.
+
+        * loader/FrameLoaderClient.h:
+        * platform/graphics/svg/SVGImageEmptyClients.h:
+        (WebCore::SVGEmptyFrameLoaderClient::windowObjectCleared):
+
 2007-11-08  Adam Roben  <aroben@apple.com>
 
         Hopeful Windows build fix
index f54507b6bea23e62be693c109c48cea85b24c2e1..02a6650a3d4304d8f6e1904a7c39399c94cf6972 100644 (file)
@@ -206,7 +206,7 @@ namespace WebCore {
         virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType) = 0;
         virtual String overrideMediaType() const = 0;
 
-        virtual void windowObjectCleared() const = 0;
+        virtual void windowObjectCleared() = 0;
         virtual void didPerformFirstNavigation() const = 0; // "Navigation" here means a transition from one page to another that ends up in the back/forward list.
         
         virtual void registerForIconNotification(bool listen = true) = 0;
index c6c07c32c516ad17c84364ffafc1b6cac836970a..0f090b5a2a362b29e5c907faa4c8494bd27fc794 100644 (file)
@@ -264,7 +264,7 @@ public:
     virtual String overrideMediaType() const { return String(); }
 
     virtual void redirectDataToPlugin(WebCore::Widget*) {}
-    virtual void windowObjectCleared() const {}
+    virtual void windowObjectCleared() {}
     virtual void didPerformFirstNavigation() const {}
 
     virtual void registerForIconNotification(bool listen) {}
index ee711df6034b20a1dcfa40184a91bddace34be0b..c46089a7fc3015079648c4d2155deb8432a0155c 100644 (file)
@@ -1,3 +1,14 @@
+2007-11-08  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - windowObjectCleared() is no longer const.  It needs to setup the
+        script debugger and cannot be const to do so.
+
+        * WebCoreSupport/FrameLoaderClientGtk.cpp:
+        (WebKit::FrameLoaderClient::windowObjectCleared):
+        * WebCoreSupport/FrameLoaderClientGtk.h:
+
 2007-11-06  Rodney Dawes  <dobey@wayofthemonkey.com>
 
         Fix http://bugs.webkit.org/attachment.cgi?id=17043&action=view
index e21c7d81eb8533153c42531980b478a1d746f7e0..2ecc383574aeae46ba870de866a7a8aea0ce4f5c 100644 (file)
@@ -322,7 +322,7 @@ String FrameLoaderClient::overrideMediaType() const
     return String();
 }
 
-void FrameLoaderClient::windowObjectCleared() const
+void FrameLoaderClient::windowObjectCleared()
 {
     g_signal_emit_by_name(m_frame, "cleared");
 }
index f3b6716fc3fc6ceb61936c012a5a2a884d72a92e..e1b497cefd83c944a4a1ff89a8ab6fa47e7318f7 100644 (file)
@@ -118,7 +118,7 @@ namespace WebKit {
         virtual void redirectDataToPlugin(WebCore::Widget* pluginWidget);
         virtual WebCore::Widget* createJavaAppletWidget(const WebCore::IntSize&, WebCore::Element*, const WebCore::KURL& baseURL, const WTF::Vector<WebCore::String>& paramNames, const WTF::Vector<WebCore::String>& paramValues);
         virtual WebCore::String overrideMediaType() const;
-        virtual void windowObjectCleared() const;
+        virtual void windowObjectCleared();
         virtual void didPerformFirstNavigation() const;
 
         virtual void registerForIconNotification(bool); 
index 74651c7501717139d014f8aae3944107b6546546..be90240ecc25143051f1642bd1ede4d0a66c612d 100644 (file)
@@ -1,3 +1,14 @@
+2007-11-08  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - windowObjectCleared() is no longer const.  It needs to setup the
+        script debugger and cannot be const to do so.
+
+        * WebCoreSupport/FrameLoaderClientQt.cpp:
+        (WebCore::FrameLoaderClientQt::windowObjectCleared):
+        * WebCoreSupport/FrameLoaderClientQt.h:
+
 2007-11-08  Simon Hausmann  <hausmann@kde.org>
 
         Reviewed by nobody (well, Holger knows about it), build fix for Qt 4.3.
index 933ae7bb5f7b35504086120399491022b3490ed9..989eca326cebad521c0588156aa8b76ee29077e5 100644 (file)
@@ -577,7 +577,7 @@ bool FrameLoaderClientQt::canHandleRequest(const WebCore::ResourceRequest&) cons
     return true;
 }
 
-void FrameLoaderClientQt::windowObjectCleared() const
+void FrameLoaderClientQt::windowObjectCleared()
 {
     if (m_webFrame)
         emit m_webFrame->cleared();
index 739cddb30d9aa38544eedafe90e389299d441828..80aae382a5f01be772e2ec21d4942f280fc0fb82 100644 (file)
@@ -210,7 +210,7 @@ namespace WebCore {
         virtual ObjectContentType objectContentType(const KURL& url, const String& mimeType);
         virtual String overrideMediaType() const;
         
-        virtual void windowObjectCleared() const;
+        virtual void windowObjectCleared();
         virtual void didPerformFirstNavigation() const;
         
         virtual void registerForIconNotification(bool);
index 037e9c68cb01a7183ccf0120415264e76e3c7c6b..d13319301a06af00e131a4fb285413366a8afa1a 100644 (file)
@@ -1,3 +1,91 @@
+2007-11-08  Kevin McCullough  <kmccullough@apple.com>
+
+        Reviewed by Sam.
+
+        - With this change Drosera can now get the source of a website and the
+        listings of the sources it gets.  This also lays the foundation for
+        letting Drosera show the scope chain of the JavaScript stack.
+
+        * Interfaces/IWebFrame.idl: Changed the signature of the local function,
+        globalContext(), because COM was unable to marshal this object with the
+        other signature.
+        * Interfaces/IWebScriptDebugServer.idl: Of course adding and removing
+        a listener cannot be done in a const function.
+        * WebChromeClient.h: Added accessor to the WebView for the new added
+        kit() function in WebFrame.
+        (WebChromeClient::webView):
+        * WebFrame.cpp: Added a script debugger object and the necessary
+        functions to attach and communicate with it. Also needed to change the
+        local function, globalContext(), because of a COM issue.
+        (kit):
+        (WebFrame::WebFrame):
+        (WebFrame::globalContext):
+        (WebFrame::loadData):
+        (WebFrame::attachScriptDebugger):
+        (WebFrame::detachScriptDebugger):
+        (WebFrame::dispatchDidLoadMainResource):
+        (WebFrame::windowObjectCleared):
+        * WebFrame.h: Ditto.
+        * WebHTMLRepresentation.cpp: Implemented documentSource so Drosera has
+        some source code to display.
+        (WebHTMLRepresentation::WebHTMLRepresentation):
+        (WebHTMLRepresentation::documentSource):
+        * WebKit.vcproj/WebKit.vcproj: Added the new WebScriptDebugger class.
+        * WebScriptCallFrame.cpp: Implemented much of this class' functionality.
+        (EnumScopes::EnumScopes): Made an EnumScopes class to create an
+        IEnumVARIANT to wrap a ScopeChain for Drosera.
+        (EnumScopes::QueryInterface):
+        (EnumScopes::AddRef):
+        (EnumScopes::Release):
+        (EnumScopes::Next):
+        (EnumScopes::Skip):
+        (EnumScopes::Reset):
+        (EnumScopes::Clone):
+        (WebScriptCallFrame::caller):
+        (WebScriptCallFrame::scopeChain):
+        (WebScriptCallFrame::functionName):
+        (WebScriptCallFrame::stringByEvaluatingJavaScriptFromString):
+        * WebScriptCallFrame.h: Added member data needed for the above functions
+        * WebScriptDebugServer.cpp: Began implementing. 
+        (WebScriptDebugServer::listenerCount):
+        (EnumViews::QueryInterface):
+        (EnumViews::AddRef):
+        (EnumViews::Release):
+        (EnumViews::Next):
+        (EnumViews::Skip):
+        (EnumViews::Reset):
+        (EnumViews::Clone):
+        (WebScriptDebugServer::WebScriptDebugServer):
+        (WebScriptDebugServer::createInstance):
+        (WebScriptDebugServer::sharedWebScriptDebugServer):
+        (WebScriptDebugServer::AddRef):
+        (WebScriptDebugServer::Release):
+        (WebScriptDebugServer::addListener):
+        (WebScriptDebugServer::removeListener):
+        (WebScriptDebugServer::step):
+        (WebScriptDebugServer::pause):
+        (WebScriptDebugServer::resume):
+        (WebScriptDebugServer::isPaused):
+        (WebScriptDebugServer::suspendProcessIfPaused):
+        (WebScriptDebugServer::didLoadMainResourceForDataSource):
+        (WebScriptDebugServer::didParseSource):
+        (WebScriptDebugServer::failedToParseSource):
+        (WebScriptDebugServer::didEnterCallFrame):
+        (WebScriptDebugServer::willExecuteStatement):
+        (WebScriptDebugServer::willLeaveCallFrame):
+        (WebScriptDebugServer::exceptionWasRaised):
+        * WebScriptDebugServer.h: Began implementing.
+        * WebScriptDebugger.cpp: Added.
+        (WebScriptDebugger::WebScriptDebugger):
+        (WebScriptDebugger::sourceParsed):
+        * WebScriptDebugger.h: Added.
+        * WebScriptScope.cpp: Make this class use createInstance which is more
+        in line with our guidelines.
+        (WebScriptScope::WebScriptScope):
+        (WebScriptScope::createInstance):
+        * WebScriptScope.h:
+
+
 2007-11-07  Darin Adler  <darin@apple.com>
 
         Reviewed by Steve.
index 0d5fc5fafcf9fe9533556b7f8d79b3c810a0f95a..cc8e1bbe21ba8b671fb6e87533b98167f20e4fa0 100644 (file)
@@ -261,5 +261,5 @@ interface IWebFrame : IUnknown
         @result The frame's global JavaScript execution context.  Use this method to
         bridge between the WebKit and JavaScriptCore APIs.
     */
-   [local] HRESULT globalContext([out, retval] JSGlobalContextRef* context);
+   [local] JSGlobalContextRef globalContext();
 }
index fdc99896d8bfb8186473c48ca3c07f2d3f30e7ee..d7768d4673698ef28bb0523beba28dedd9fe26ad 100644 (file)
@@ -69,8 +69,9 @@ interface IWebScriptDebugListener;
 ]
 interface IWebScriptDebugServer : IUnknown
 {
-    HRESULT addListener([in] const IWebScriptDebugListener*);
-    HRESULT removeListener([in] const IWebScriptDebugListener*);
+    HRESULT sharedWebScriptDebugServer([out, retval] IWebScriptDebugServer**);
+    HRESULT addListener([in] IWebScriptDebugListener*);
+    HRESULT removeListener([in] IWebScriptDebugListener*);
     HRESULT step();
     HRESULT pause();
     HRESULT resume();
index b434bcc38ee7513c2ddd5e9290ebc4f46797fef8..01a49e72e42e3e5614b270f9ef78d49b082a2940 100644 (file)
@@ -100,6 +100,8 @@ public:
 
     virtual bool runDatabaseSizeLimitPrompt(WebCore::Frame*, const WebCore::String& origin);
 
+    virtual WebView* webView() const { return m_webView; }
+
 private:
     COMPtr<IWebUIDelegate> uiDelegate();
     COMPtr<IWebUIDelegate2> uiDelegate2();
index 8ca5f80cb4738df298f0f7a52f2be7824aa34325..d17fcd69c269c2ac6daf2f8e02e453baa885be90 100644 (file)
@@ -40,6 +40,7 @@
 #include "IWebUIDelegatePrivate.h"
 #include "MarshallingHelpers.h"
 #include "WebActionPropertyBag.h"
+#include "WebChromeClient.h"
 #include "WebDocumentLoader.h"
 #include "WebDownload.h"
 #include "WebError.h"
@@ -53,6 +54,8 @@
 #include "WebView.h"
 #include "WebDataSource.h"
 #include "WebHistoryItem.h"
+#include "WebScriptDebugger.h"
+#include "WebScriptDebugServer.h"
 #include "WebURLAuthenticationChallenge.h"
 #include "WebURLResponse.h"
 #pragma warning( push, 0 )
@@ -161,6 +164,11 @@ Frame* core(const WebFrame* webFrame)
     return const_cast<WebFrame*>(webFrame)->impl();
 }
 
+WebView* kit(Page* page)
+{
+    return page ? static_cast<WebChromeClient*>(page->chrome()->client())->webView() : 0;
+}
+
 //-----------------------------------------------------------------------------
 
 class FormValuesPropertyBag : public IPropertyBag, public IPropertyBag2
@@ -433,11 +441,12 @@ public:
 // WebFrame ----------------------------------------------------------------
 
 WebFrame::WebFrame()
-: m_refCount(0)
-, d(new WebFrame::WebFramePrivate)
-, m_quickRedirectComing(false)
-, m_inPrintingMode(false)
-, m_pageHeight(0)
+    : m_refCount(0)
+    , d(new WebFrame::WebFramePrivate)
+    , m_quickRedirectComing(false)
+    , m_inPrintingMode(false)
+    , m_pageHeight(0)
+    , m_scriptDebugger(0)
 {
     WebFrameCount++;
     gClassCount++;
@@ -594,20 +603,13 @@ HRESULT STDMETHODCALLTYPE WebFrame::currentForm(
     return *currentForm ? S_OK : E_FAIL;
 }
 
-HRESULT STDMETHODCALLTYPE WebFrame::globalContext(
-    /* [retval][out] */ JSGlobalContextRef* context)
+JSGlobalContextRef STDMETHODCALLTYPE WebFrame::globalContext()
 {
-    if (!context)
-        return E_POINTER;
-
-    *context = 0;
-
     Frame* coreFrame = core(this);
     if (!coreFrame)
-        return E_FAIL;
+        return 0;
 
-    *context = toGlobalRef(coreFrame->scriptProxy()->interpreter()->globalExec());
-    return S_OK;
+    return toGlobalRef(coreFrame->scriptProxy()->interpreter()->globalExec());
 }
 
 HRESULT STDMETHODCALLTYPE WebFrame::loadRequest( 
@@ -661,8 +663,8 @@ HRESULT STDMETHODCALLTYPE WebFrame::loadData(
             ULONG read;
             // FIXME: this does a needless copy, would be better to read right into the SharedBuffer
             // or adopt the Vector or something.
-            if (SUCCEEDED(data->Read(dataBuffer.data(), (ULONG)dataBuffer.size(), &read)))
-                sharedBuffer->append(dataBuffer.data(), (int)dataBuffer.size());
+            if (SUCCEEDED(data->Read(dataBuffer.data(), static_cast<ULONG>(dataBuffer.size()), &read)))
+                sharedBuffer->append(dataBuffer.data(), static_cast<int>(dataBuffer.size()));
         }
     }
 
@@ -763,6 +765,17 @@ KURL WebFrame::url() const
     return coreFrame->loader()->URL();
 }
 
+void WebFrame::attachScriptDebugger()
+{
+    if (!m_scriptDebugger && core(this)->scriptProxy()->haveInterpreter())
+        m_scriptDebugger.set(new WebScriptDebugger(this));
+}
+
+void WebFrame::detachScriptDebugger()
+{
+    m_scriptDebugger.clear();
+}
+
 HRESULT STDMETHODCALLTYPE WebFrame::stopLoading( void)
 {
     if (Frame* coreFrame = core(this))
@@ -1669,9 +1682,17 @@ void WebFrame::dispatchWillSubmitForm(FramePolicyFunction function, PassRefPtr<F
     (coreFrame->loader()->*function)(PolicyUse);
 }
 
-void WebFrame::dispatchDidLoadMainResource(DocumentLoader*)
+void WebFrame::dispatchDidLoadMainResource(DocumentLoader* loader)
 {
-    notImplemented();
+    if (WebScriptDebugServer::listenerCount() > 0) {
+        Frame* coreFrame = core(this);
+        if (!coreFrame)
+            return;
+
+        WebScriptDebugServer::sharedWebScriptDebugServer()->didLoadMainResourceForDataSource(
+            kit(coreFrame->page()),
+            loader ? static_cast<WebDocumentLoader*>(loader)->dataSource() : 0);
+    }
 }
 
 void WebFrame::revertToProvisionalState(DocumentLoader*)
@@ -2429,7 +2450,7 @@ String WebFrame::overrideMediaType() const
     return String();
 }
 
-void WebFrame::windowObjectCleared() const
+void WebFrame::windowObjectCleared()
 {
     Frame* coreFrame = core(this);
     ASSERT(coreFrame);
@@ -2446,6 +2467,11 @@ void WebFrame::windowObjectCleared() const
 
         frameLoadDelegate->windowScriptObjectAvailable(d->webView, context, windowObject);
     }
+
+    if (WebScriptDebugServer::listenerCount() > 0) {
+        detachScriptDebugger();
+        attachScriptDebugger();
+    }
 }
 
 void WebFrame::didPerformFirstNavigation() const
index 4656c0d3ff3e5d93aa1609ca4214c7f1e6502f3d..9565129af9382d403dd5987f8e0014f260b6d7b7 100644 (file)
@@ -42,6 +42,7 @@
 
 #include <WTF/RefPtr.h>
 #include <WTF/HashMap.h>
+#include <WTF/OwnPtr.h>
 
 namespace WebCore {
     class AuthenticationChallenge;
@@ -61,6 +62,7 @@ typedef struct OpaqueJSValue* JSObjectRef;
 class WebFrame;
 class WebFramePolicyListener;
 class WebHistory;
+class WebScriptDebugger;
 class WebView;
 
 interface IWebHistoryItemPrivate;
@@ -145,8 +147,7 @@ public:
     virtual HRESULT STDMETHODCALLTYPE currentForm( 
         /* [retval][out] */ IDOMElement **formElement);
 
-    virtual HRESULT STDMETHODCALLTYPE globalContext( 
-        /* [retval][out] */ JSGlobalContextRef* context);
+    virtual /* [local] */ JSGlobalContextRef STDMETHODCALLTYPE globalContext();
 
     // IWebFramePrivate
     virtual HRESULT STDMETHODCALLTYPE renderTreeAsExternalRepresentation(
@@ -332,9 +333,9 @@ public:
     virtual WebCore::ObjectContentType objectContentType(const WebCore::KURL& url, const WebCore::String& mimeType);
     virtual WebCore::String overrideMediaType() const;
 
-    virtual void windowObjectCleared() const;
+    virtual void windowObjectCleared();
     virtual void didPerformFirstNavigation() const;
-    
+
     virtual void registerForIconNotification(bool listen);
 
     // WebFrame
@@ -363,6 +364,10 @@ public:
     void receivedPolicyDecision(WebCore::PolicyAction);
 
     WebCore::KURL url() const;
+
+    virtual void attachScriptDebugger();
+    virtual void detachScriptDebugger();
+
 protected:
     void loadHTMLString(BSTR string, BSTR baseURL, BSTR unreachableURL);
     void loadData(PassRefPtr<WebCore::SharedBuffer>, BSTR mimeType, BSTR textEncodingName, BSTR baseURL, BSTR failingURL);
@@ -381,6 +386,9 @@ protected:
     bool                m_inPrintingMode;
     Vector<WebCore::IntRect> m_pageRects;
     int m_pageHeight;   // height of the page adjusted by margins
+
+private:
+    OwnPtr<WebScriptDebugger> m_scriptDebugger;
 };
 
 #endif
index ac7f493e5de4c08a3b269dd2feca3ec437e1d185..106afd352cb98786df3a6222410e7559de874c75 100644 (file)
@@ -31,7 +31,9 @@
 #include "WebFrame.h"
 #include "WebKitStatisticsPrivate.h"
 #pragma warning(push, 0)
+#include <WebCore/BString.h>
 #include <WebCore/HTMLInputElement.h>
+#include <WebCore/TextResourceDecoder.h>
 #pragma warning(pop)
 
 using namespace WebCore;
@@ -39,8 +41,8 @@ using namespace WebCore;
 // WebHTMLRepresentation ------------------------------------------------------
 
 WebHTMLRepresentation::WebHTMLRepresentation()
-: m_refCount(0)
-, m_frame(0)
+    : m_refCount(0)
+    , m_frame(0)
 {
     WebHTMLRepresentationCount++;
     gClassCount++;
@@ -84,12 +86,12 @@ HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::QueryInterface(REFIID riid, voi
     return S_OK;
 }
 
-ULONG STDMETHODCALLTYPE WebHTMLRepresentation::AddRef(void)
+ULONG STDMETHODCALLTYPE WebHTMLRepresentation::AddRef()
 {
     return ++m_refCount;
 }
 
-ULONG STDMETHODCALLTYPE WebHTMLRepresentation::Release(void)
+ULONG STDMETHODCALLTYPE WebHTMLRepresentation::Release()
 {
     ULONG newRef = --m_refCount;
     if (!newRef)
@@ -253,10 +255,54 @@ HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::canProvideDocumentSource(
 }
     
 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::documentSource( 
-        /* [retval][out] */ BSTR* /*source*/)
+        /* [retval][out] */ BSTR* source)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!source)
+        return E_FAIL;
+
+    *source = 0;
+
+    HRESULT hr = S_OK;
+
+    COMPtr<IWebDataSource> dataSource;
+    hr = m_frame->dataSource(&dataSource);
+    if (FAILED(hr))
+        return hr;
+
+    COMPtr<IStream> data;
+    hr = dataSource->data(&data);
+    if (FAILED(hr))
+        return hr;
+
+    STATSTG stat;
+    hr = data->Stat(&stat, STATFLAG_NONAME);
+    if (FAILED(hr))
+        return hr;
+
+    if (stat.cbSize.HighPart || !stat.cbSize.LowPart)
+        return E_FAIL;
+
+    Vector<char> dataBuffer(stat.cbSize.LowPart);
+    ULONG read;
+    
+    hr = data->Read(dataBuffer.data(), static_cast<ULONG>(dataBuffer.size()), &read);
+    if (FAILED(hr))
+        return hr;
+
+    WebCore::Frame* frame = core(m_frame);
+    if (!frame)
+        return E_FAIL;
+
+    WebCore::Document* doc = frame->document();
+    if (!doc)
+        return E_FAIL;
+
+    WebCore::TextResourceDecoder* decoder = doc->decoder();
+    if (!decoder)
+        return E_FAIL;
+
+    *source = WebCore::BString(decoder->encoding().decode(dataBuffer.data(), dataBuffer.size())).release();
+    return S_OK;
 }
     
 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::title( 
index 9b7a86b333598c3d45bc93c6cf0b685569bae2ef..f03c42f9f18bcc9b091ca08ed0b913b852f5c5e0 100644 (file)
@@ -42,8 +42,8 @@ public:
 
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
-    virtual ULONG STDMETHODCALLTYPE AddRef(void);
-    virtual ULONG STDMETHODCALLTYPE Release(void);
+    virtual ULONG STDMETHODCALLTYPE AddRef();
+    virtual ULONG STDMETHODCALLTYPE Release();
 
     // IWebHTMLRepresentation
     virtual HRESULT STDMETHODCALLTYPE supportedMIMETypes( 
index 4ae877a96d0d5bb084d688ec23fd20e53aa5d227..16b0367cb4a1ac764dc14bc577bcea56bfb542e1 100644 (file)
                                RelativePath="..\WebScriptCallFrame.h"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\WebScriptDebugger.h"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\WebScriptDebugServer.h"\r
                                >\r
                                RelativePath="..\WebScriptCallFrame.cpp"\r
                                >\r
                        </File>\r
+                       <File\r
+                               RelativePath="..\WebScriptDebugger.cpp"\r
+                               >\r
+                       </File>\r
                        <File\r
                                RelativePath="..\WebScriptDebugServer.cpp"\r
                                >\r
index caed86772d666fb5825c8f7f0ef21bec4e1b6775..ca037d569cf4e60869bd0a7674f6184997cf58ee 100644 (file)
 #include "WebKitDLL.h"
 #include "WebScriptCallFrame.h"
 
+#include "Identifier.h"
+#include "IWebScriptScope.h"
+#include "Function.h"
+#include "WebScriptScope.h"
+
+#include <JavaScriptCore/JSGlobalObject.h>
+#include <JavaScriptCore/JSStringRefBSTR.h>
+#include <JavaScriptCore/JSValueRef.h>
+
+#pragma warning(push, 0)
+#include <WebCore/BString.h>
+#include <WebCore/PlatformString.h>
+#pragma warning(pop)
+
 #include <wtf/Assertions.h>
 
-// WebScriptCallFrame ------------------------------------------------------------
+using namespace KJS;
+
+// EnumScopes -----------------------------------------------------------------
+
+class EnumScopes : public IEnumVARIANT {
+public:
+    static EnumScopes* createInstance(ScopeChain chain);
+
+private:
+    EnumScopes(ScopeChain chain)
+        : m_refCount(0)
+        , m_chain(chain)
+        , m_current(chain.begin())
+    {
+    }
+
+public:
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+    virtual ULONG STDMETHODCALLTYPE AddRef();
+    virtual ULONG STDMETHODCALLTYPE Release();
+    virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT* rgVar, ULONG* pCeltFetched);
+    virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
+    virtual HRESULT STDMETHODCALLTYPE Reset(void);
+    virtual HRESULT STDMETHODCALLTYPE Clone(IEnumVARIANT**);
+
+private:
+    ULONG m_refCount;
+    ScopeChain m_chain;
+    ScopeChainIterator m_current;
+};
+
+EnumScopes* EnumScopes::createInstance(ScopeChain chain)
+{
+    EnumScopes* instance = new EnumScopes(chain);
+    instance->AddRef();
+    return instance;
+}
+
+HRESULT STDMETHODCALLTYPE EnumScopes::QueryInterface(REFIID riid, void** ppvObject)
+{
+    *ppvObject = 0;
+    if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IEnumVARIANT))
+        *ppvObject = this;
+    else
+        return E_NOINTERFACE;
+
+    AddRef();
+    return S_OK;
+}
+
+ULONG STDMETHODCALLTYPE EnumScopes::AddRef()
+{
+    return ++m_refCount;
+}
+
+ULONG STDMETHODCALLTYPE EnumScopes::Release()
+{
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete(this);
+    return newRef;
+}
+
+HRESULT STDMETHODCALLTYPE EnumScopes::Next(ULONG celt, VARIANT* rgVar, ULONG* pCeltFetched)
+{
+    if (pCeltFetched)
+        *pCeltFetched = 0;
+    if (!rgVar)
+        return E_POINTER;
+    VariantInit(rgVar);
+    if (!celt || celt > 1)
+        return S_FALSE;
+    if (m_current == m_chain.end())
+        return S_FALSE;
+
+    // Create a WebScriptScope from the m_current then put it in an IUnknown.
+    COMPtr<IWebScriptScope> scope = WebScriptScope::createInstance(*m_current);
+    COMPtr<IUnknown> unknown = static_cast<IUnknown*>(scope.get());
+    ++m_current;
+    if (!unknown)
+        return E_FAIL;
+
+    V_VT(rgVar) = VT_UNKNOWN;
+    V_UNKNOWN(rgVar) = unknown.get();
+
+    if (pCeltFetched)
+        *pCeltFetched = 1;
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE EnumScopes::Skip(ULONG celt)
+{
+    for (ULONG i = 0; i < celt; ++i)
+        ++m_current;
+    return (m_current != m_chain.end()) ? S_OK : S_FALSE;
+}
+
+HRESULT STDMETHODCALLTYPE EnumScopes::Reset(void)
+{
+    m_current = m_chain.begin();
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE EnumScopes::Clone(IEnumVARIANT**)
+{
+    return E_NOTIMPL;
+}
+// WebScriptCallFrame -----------------------------------------------------------
+
+
 
 WebScriptCallFrame::WebScriptCallFrame()
     : m_refCount(0)
@@ -52,7 +175,7 @@ WebScriptCallFrame* WebScriptCallFrame::createInstance()
     return instance;
 }
 
-// IUnknown -------------------------------------------------------------------
+// IUnknown ------------------------------------------------------------------
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::QueryInterface(REFIID riid, void** ppvObject)
 {
@@ -68,12 +191,12 @@ HRESULT STDMETHODCALLTYPE WebScriptCallFrame::QueryInterface(REFIID riid, void**
     return S_OK;
 }
 
-ULONG STDMETHODCALLTYPE WebScriptCallFrame::AddRef(void)
+ULONG STDMETHODCALLTYPE WebScriptCallFrame::AddRef()
 {
     return ++m_refCount;
 }
 
-ULONG STDMETHODCALLTYPE WebScriptCallFrame::Release(void)
+ULONG STDMETHODCALLTYPE WebScriptCallFrame::Release()
 {
     ULONG newRef = --m_refCount;
     if (!newRef)
@@ -85,30 +208,98 @@ ULONG STDMETHODCALLTYPE WebScriptCallFrame::Release(void)
 // IWebScriptCallFrame -----------------------------------------------------------
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::caller(
-    /* [out, retval] */ IWebScriptCallFrame**)
+    /* [out, retval] */ IWebScriptCallFrame** callFrame)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!callFrame)
+        return E_POINTER;
+
+    *callFrame = m_caller.get();
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::scopeChain(
-    /* [out, retval] */ IEnumVARIANT**)
+    /* [out, retval] */ IEnumVARIANT** result)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!result)
+        return E_POINTER;
+
+    // FIXME: If there is no current body do we need to make scope chain from the global object?
+
+    *result = EnumScopes::createInstance(m_state->scopeChain());
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::functionName(
-    /* [out, retval] */ BSTR*)
+    /* [out, retval] */ BSTR* funcName)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!funcName)
+        return E_POINTER;
+
+    if (m_state->currentBody()) {
+        FunctionImp* func = m_state->function();
+        if (!func)
+            return E_FAIL;
+
+        *funcName = WebCore::BString(func->functionName()).release();
+    }
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptCallFrame::stringByEvaluatingJavaScriptFromString(
-    /* [in] */ BSTR,
-    /* [out, retval] */ BSTR*)
+    /* [in] */ BSTR script,
+    /* [out, retval] */ BSTR* result)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!script)
+        return E_FAIL;
+
+    if (!result)
+        return E_POINTER;
+
+    *result = 0;
+
+    JSLock lock;
+
+    ExecState* state = m_state;
+    Interpreter* interp  = state->dynamicInterpreter();
+    JSObject* globObj = interp->globalObject();
+
+    // find "eval"
+    JSObject* eval = 0;
+    if (state->currentBody()) {  // "eval" won't work without context (i.e. at global scope)
+        JSValue* v = globObj->get(state, "eval");
+        if (v->isObject() && static_cast<JSObject*>(v)->implementsCall())
+            eval = static_cast<JSObject*>(v);
+        else
+            // no "eval" - fallback operates on global exec state
+            state = interp->globalExec();
+    }
+
+    JSValue* savedException = state->exception();
+    state->clearException();
+
+    UString code(reinterpret_cast<KJS::UChar*>(script), SysStringLen(script));
+
+    // evaluate
+    JSValue* scriptExecutionResult;
+    if (eval) {
+        List args;
+        args.append(jsString(code));
+        scriptExecutionResult = eval->call(state, 0, args);
+    } else
+        // no "eval", or no context (i.e. global scope) - use global fallback
+        scriptExecutionResult = interp->evaluate(UString(), 0, code.data(), code.size(), globObj).value();
+
+    if (state->hadException())
+        scriptExecutionResult = state->exception();    // (may be redundant depending on which eval path was used)
+    state->setException(savedException);
+
+    if (!scriptExecutionResult)
+        return E_FAIL;
+
+    scriptExecutionResult->isString();
+    *result = WebCore::BString(WebCore::String(scriptExecutionResult->getString())).release();
+
+    return S_OK;
 }
index c055552299fde4037ac31c07e0d520b177373e62..338cc2bb4e2784867c6b88ff45880503eb3ea325 100644 (file)
 
 #include "IWebScriptCallFrame.h"
 
+#include <JavaScriptCore/ExecState.h>
+#include <WebCore/COMPtr.h>
+
 class WebScriptCallFrame : public IWebScriptCallFrame {
 public:
     static WebScriptCallFrame* createInstance();
 
 private:
     WebScriptCallFrame();
-    ~WebScriptCallFrame();
+    virtual ~WebScriptCallFrame();
 
 public:
     // IUnknown
@@ -45,9 +48,9 @@ public:
         /* [in] */ REFIID riid,
         /* [retval][out] */ void** ppvObject);
     
-    virtual ULONG STDMETHODCALLTYPE AddRef( void);
+    virtual ULONG STDMETHODCALLTYPE AddRef();
 
-    virtual ULONG STDMETHODCALLTYPE Release( void);
+    virtual ULONG STDMETHODCALLTYPE Release();
 
     // IWebScriptCallFrame
     virtual HRESULT STDMETHODCALLTYPE caller(
@@ -64,6 +67,9 @@ public:
         /* [out, retval] */ BSTR*);
 
 private:
+    KJS::ExecState* m_state;
+    COMPtr<WebScriptCallFrame> m_caller;
+
     ULONG m_refCount;
 };
 
index 90bce398c2eb8d446fe78d1880245875c51f9baa..5994efd5d487ba40619ea92026147d2666711245 100644 (file)
@@ -24,6 +24,7 @@
  */
 
 #include "config.h"
+#include "IWebScriptDebugListener.h"
 #include "WebKitDLL.h"
 #include "WebScriptDebugServer.h"
 
 #include <wtf/Vector.h>
 
 static Vector<IWebView*> sViews;
+static WebScriptDebugServer* sSharedWebScriptDebugServer;
+static unsigned sListenerCount = 0;
+
+unsigned WebScriptDebugServer::listenerCount() { return sListenerCount; };
 
 // EnumViews ------------------------------------------------------------------
 
@@ -40,82 +45,93 @@ class EnumViews : public IEnumVARIANT
 public:
     EnumViews() : m_refCount(1), m_current(sViews.begin()) { }
 
-    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject)
-    {
-        *ppvObject = 0;
-        if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IEnumVARIANT))
-            *ppvObject = this;
-        else
-            return E_NOINTERFACE;
+    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
+    virtual ULONG STDMETHODCALLTYPE AddRef();
+    virtual ULONG STDMETHODCALLTYPE Release();
 
-        AddRef();
-        return S_OK;
-    }
+    virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched);
+    virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt);
+    virtual HRESULT STDMETHODCALLTYPE Reset(void);
+    virtual HRESULT STDMETHODCALLTYPE Clone(IEnumVARIANT**);
 
-    virtual ULONG STDMETHODCALLTYPE AddRef(void)
-    {
-        return ++m_refCount;
-    }
+private:
+    ULONG m_refCount;
+    Vector<IWebView*>::iterator m_current;
+};
 
-    virtual ULONG STDMETHODCALLTYPE Release(void)
-    {
-        ULONG newRef = --m_refCount;
-        if (!newRef)
-            delete(this);
-        return newRef;
-    }
+HRESULT STDMETHODCALLTYPE EnumViews::QueryInterface(REFIID riid, void** ppvObject)
+{
+    *ppvObject = 0;
+    if (IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IEnumVARIANT))
+        *ppvObject = this;
+    else
+        return E_NOINTERFACE;
 
-    virtual HRESULT STDMETHODCALLTYPE Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
-    {
-        if (pCeltFetched)
-            *pCeltFetched = 0;
-        if (!rgVar)
-            return E_POINTER;
-        VariantInit(rgVar);
-        if (!celt || celt > 1)
-            return S_FALSE;
-        if (m_current == sViews.end())
-            return S_FALSE;
-
-        IUnknown* unknown;
-        HRESULT hr = (*m_current++)->QueryInterface(IID_IUnknown, (void**)&unknown);
-        if (FAILED(hr))
-            return hr;
-
-        V_VT(rgVar) = VT_UNKNOWN;
-        V_UNKNOWN(rgVar) = unknown;
-
-        if (pCeltFetched)
-            *pCeltFetched = 1;
-        return S_OK;
-    }
+    AddRef();
+    return S_OK;
+}
 
-    virtual HRESULT STDMETHODCALLTYPE Skip(ULONG celt)
-    {
-        m_current += celt;
-        return (m_current != sViews.end()) ? S_OK : S_FALSE;
-    }
+ULONG STDMETHODCALLTYPE EnumViews::AddRef()
+{
+    return ++m_refCount;
+}
 
-    virtual HRESULT STDMETHODCALLTYPE Reset(void)
-    {
-        m_current = sViews.begin();
-        return S_OK;
-    }
+ULONG STDMETHODCALLTYPE EnumViews::Release()
+{
+    ULONG newRef = --m_refCount;
+    if (!newRef)
+        delete(this);
+    return newRef;
+}
 
-    virtual HRESULT STDMETHODCALLTYPE Clone(IEnumVARIANT**)
-    {
-        return E_NOTIMPL;
-    }
+HRESULT STDMETHODCALLTYPE EnumViews::Next(ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
+{
+    if (pCeltFetched)
+        *pCeltFetched = 0;
+    if (!rgVar)
+        return E_POINTER;
+    VariantInit(rgVar);
+    if (!celt || celt > 1)
+        return S_FALSE;
+    if (m_current == sViews.end())
+        return S_FALSE;
+
+    IUnknown* unknown;
+    HRESULT hr = (*m_current++)->QueryInterface(IID_IUnknown, (void**)&unknown);
+    if (FAILED(hr))
+        return hr;
+
+    V_VT(rgVar) = VT_UNKNOWN;
+    V_UNKNOWN(rgVar) = unknown;
+
+    if (pCeltFetched)
+        *pCeltFetched = 1;
+    return S_OK;
+}
 
-private:
-    ULONG m_refCount;
-    Vector<IWebView*>::iterator m_current;
-};
+HRESULT STDMETHODCALLTYPE EnumViews::Skip(ULONG celt)
+{
+    m_current += celt;
+    return (m_current != sViews.end()) ? S_OK : S_FALSE;
+}
+
+HRESULT STDMETHODCALLTYPE EnumViews::Reset(void)
+{
+    m_current = sViews.begin();
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE EnumViews::Clone(IEnumVARIANT**)
+{
+    return E_NOTIMPL;
+}
 
 // WebScriptDebugServer ------------------------------------------------------------
 
 WebScriptDebugServer::WebScriptDebugServer()
-: m_refCount(0)
+    : m_refCount(0)
+    , m_paused(false)
+    , m_step(false)
 {
     gClassCount++;
 }
@@ -132,6 +148,15 @@ WebScriptDebugServer* WebScriptDebugServer::createInstance()
     return instance;
 }
 
+WebScriptDebugServer* WebScriptDebugServer::sharedWebScriptDebugServer()
+{
+    if (!sSharedWebScriptDebugServer)
+        sSharedWebScriptDebugServer = WebScriptDebugServer::createInstance();
+
+    return sSharedWebScriptDebugServer;
+}
+
+
 // IUnknown -------------------------------------------------------------------
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::QueryInterface(REFIID riid, void** ppvObject)
@@ -148,12 +173,12 @@ HRESULT STDMETHODCALLTYPE WebScriptDebugServer::QueryInterface(REFIID riid, void
     return S_OK;
 }
 
-ULONG STDMETHODCALLTYPE WebScriptDebugServer::AddRef(void)
+ULONG STDMETHODCALLTYPE WebScriptDebugServer::AddRef()
 {
     return ++m_refCount;
 }
 
-ULONG STDMETHODCALLTYPE WebScriptDebugServer::Release(void)
+ULONG STDMETHODCALLTYPE WebScriptDebugServer::Release()
 {
     ULONG newRef = --m_refCount;
     if (!newRef)
@@ -181,41 +206,208 @@ void WebScriptDebugServer::viewRemoved(IWebView* view)
 
 // IWebScriptDebugServer -----------------------------------------------------------
 
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::sharedWebScriptDebugServer( 
+    /* [retval][out] */ IWebScriptDebugServer** server)
+{
+    if (!server)
+        return E_POINTER;
+
+    *server = WebScriptDebugServer::sharedWebScriptDebugServer();
+    (*server)->AddRef();
+
+    return S_OK;
+}
+
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::addListener(
-    /* [in] */ const IWebScriptDebugListener*)
+    /* [in] */ IWebScriptDebugListener* listener)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!listener)
+        return E_POINTER;
+
+    sListenerCount++;
+    m_listeners.add(listener);
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::removeListener(
-    /* [in] */ const IWebScriptDebugListener*)
+    /* [in] */ IWebScriptDebugListener* listener)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!listener)
+        return E_POINTER;
+
+    if (!m_listeners.contains(listener))
+        return S_OK;
+
+    ASSERT(sListenerCount >= 1);
+    sListenerCount--;
+    m_listeners.remove(listener);
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::step()
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    m_step = true;
+    m_paused = false;
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::pause()
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    m_paused = true;
+    m_step = false;
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::resume()
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    m_paused = false;
+    m_step = false;
+
+    return S_OK;
 }
 
 HRESULT STDMETHODCALLTYPE WebScriptDebugServer::isPaused(
-    /* [out, retval] */ BOOL*)
+    /* [out, retval] */ BOOL* isPaused)
 {
-    ASSERT_NOT_REACHED();
-    return E_NOTIMPL;
+    if (!isPaused)
+        return E_POINTER;
+
+    *isPaused = m_paused;
+    return S_OK;
+}
+
+
+void WebScriptDebugServer::suspendProcessIfPaused()
+{
+    // FIXME: There needs to be some sort of busy wait here.
+
+    if (m_step) {
+        m_step = false;
+        m_paused = true;
+    }
+}
+
+// IWebScriptDebugListener
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didLoadMainResourceForDataSource(
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebDataSource* dataSource)
+{
+    if (!webView || !dataSource)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).didLoadMainResourceForDataSource(webView, dataSource);
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didParseSource(
+    /* [in] */ IWebView* webView,
+    /* [in] */ BSTR sourceCode,
+    /* [in] */ UINT baseLineNumber,
+    /* [in] */ BSTR url,
+    /* [in] */ int sourceID,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !sourceCode || !url || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).didParseSource(webView, sourceCode, baseLineNumber, url, sourceID, webFrame);
+
+    return S_OK;
 }
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::failedToParseSource(
+    /* [in] */ IWebView* webView,
+    /* [in] */ BSTR sourceCode,
+    /* [in] */ UINT baseLineNumber,
+    /* [in] */ BSTR url,
+    /* [in] */ BSTR error,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !sourceCode || !url || !error || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).failedToParseSource(webView, sourceCode, baseLineNumber, url, error, webFrame);
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::didEnterCallFrame(
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !frame || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).didEnterCallFrame(webView, frame, sourceID, lineNumber, webFrame);
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willExecuteStatement(
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !frame || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).willExecuteStatement(webView, frame, sourceID, lineNumber, webFrame);
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::willLeaveCallFrame(
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !frame || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).willLeaveCallFrame(webView, frame, sourceID, lineNumber, webFrame);
+
+    return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebScriptDebugServer::exceptionWasRaised(
+    /* [in] */ IWebView* webView,
+    /* [in] */ IWebScriptCallFrame* frame,
+    /* [in] */ int sourceID,
+    /* [in] */ int lineNumber,
+    /* [in] */ IWebFrame* webFrame)
+{
+    if (!webView || !frame || !webFrame)
+        return E_FAIL;
+
+    ListenerSet listenersCopy = m_listeners;
+    for (ListenerSet::iterator it = listenersCopy.begin(); it != listenersCopy.end(); ++it)
+        (**it).exceptionWasRaised(webView, frame, sourceID, lineNumber, webFrame);
+
+    return S_OK;
+}
+
+
index ec948b07162aea29fc9ceadc954600802b76af7b..b4279829593a07cdbf4a52a847981257e542a249 100644 (file)
 
 #include "IWebScriptDebugServer.h"
 
+#include "IWebScriptDebugListener.h"
+#include <wtf/HashSet.h>
+#include <WebCore/COMPtr.h>
+
 interface IWebView;
 
-class WebScriptDebugServer : public IWebScriptDebugServer
+typedef HashSet<COMPtr<IWebScriptDebugListener> > ListenerSet;
+
+class WebScriptDebugServer : public IWebScriptDebugServer, public IWebScriptDebugListener
 {
 public:
     static WebScriptDebugServer* createInstance();
+    static WebScriptDebugServer* sharedWebScriptDebugServer();
+
     static void viewAdded(IWebView* view);
     static void viewRemoved(IWebView* view);
 
 private:
     WebScriptDebugServer();
-    ~WebScriptDebugServer();
+    virtual ~WebScriptDebugServer();
 
 public:
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface( 
         /* [in] */ REFIID riid,
-        /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-    
-    virtual ULONG STDMETHODCALLTYPE AddRef( void);
+        /* [iid_is][out] */ void** ppvObject);
+
+    virtual ULONG STDMETHODCALLTYPE AddRef();
 
-    virtual ULONG STDMETHODCALLTYPE Release( void);
+    virtual ULONG STDMETHODCALLTYPE Release();
 
     // IWebScriptDebugServer
+    virtual HRESULT STDMETHODCALLTYPE sharedWebScriptDebugServer( 
+        /* [retval][out] */ IWebScriptDebugServer** server);
+
     virtual HRESULT STDMETHODCALLTYPE addListener(
-        /* [in] */ const IWebScriptDebugListener*);
+        /* [in] */ IWebScriptDebugListener*);
 
     virtual HRESULT STDMETHODCALLTYPE removeListener(
-        /* [in] */ const IWebScriptDebugListener*);
+        /* [in] */ IWebScriptDebugListener*);
 
     virtual HRESULT STDMETHODCALLTYPE step();
 
@@ -67,7 +78,64 @@ public:
     virtual HRESULT STDMETHODCALLTYPE isPaused(
         /* [out, retval] */ BOOL* isPaused);
 
+    // IWebScriptDebugListener
+    virtual HRESULT STDMETHODCALLTYPE didLoadMainResourceForDataSource(
+        /* [in] */ IWebView* webView,
+        /* [in] */ IWebDataSource* dataSource);
+
+    virtual HRESULT STDMETHODCALLTYPE didParseSource(
+        /* [in] */ IWebView* webView,
+        /* [in] */ BSTR sourceCode,
+        /* [in] */ UINT baseLineNumber,
+        /* [in] */ BSTR url,
+        /* [in] */ int sourceID,
+        /* [in] */ IWebFrame* webFrame);
+
+    virtual HRESULT STDMETHODCALLTYPE failedToParseSource(
+        /* [in] */ IWebView* webView,
+        /* [in] */ BSTR sourceCode,
+        /* [in] */ UINT baseLineNumber,
+        /* [in] */ BSTR url,
+        /* [in] */ BSTR error,
+        /* [in] */ IWebFrame*);
+
+    virtual HRESULT STDMETHODCALLTYPE didEnterCallFrame(
+        /* [in] */ IWebView* webView,
+        /* [in] */ IWebScriptCallFrame* frame,
+        /* [in] */ int sourceID,
+        /* [in] */ int lineNumber,
+        /* [in] */ IWebFrame*);
+
+    virtual HRESULT STDMETHODCALLTYPE willExecuteStatement(
+        /* [in] */ IWebView*,
+        /* [in] */ IWebScriptCallFrame*,
+        /* [in] */ int sourceID,
+        /* [in] */ int lineNumber,
+        /* [in] */ IWebFrame*);
+
+    virtual HRESULT STDMETHODCALLTYPE willLeaveCallFrame(
+        /* [in] */ IWebView* webView,
+        /* [in] */ IWebScriptCallFrame* frame,
+        /* [in] */ int sourceID,
+        /* [in] */ int lineNumber,
+        /* [in] */ IWebFrame*);
+
+    virtual HRESULT STDMETHODCALLTYPE exceptionWasRaised(
+        /* [in] */ IWebView* webView,
+        /* [in] */ IWebScriptCallFrame*,
+        /* [in] */ int sourceID,
+        /* [in] */ int lineNumber,
+        /* [in] */ IWebFrame*);
+
+    void suspendProcessIfPaused();
+    static unsigned listenerCount();
+
 private:
+    ListenerSet m_listeners;
+
+    bool m_paused;
+    bool m_step;
+
     ULONG m_refCount;
 };
 
diff --git a/WebKit/win/WebScriptDebugger.cpp b/WebKit/win/WebScriptDebugger.cpp
new file mode 100644 (file)
index 0000000..03ba0de
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include "config.h"
+#include "WebKitDLL.h"
+#include "WebScriptDebugger.h"
+
+#include "IWebView.h"
+#include "WebFrame.h"
+#include "WebScriptDebugServer.h"
+
+#include <WebCore/BString.h>
+#include <WebCore/kjs_binding.h>
+#include <WebCore/kjs_proxy.h>
+#include <WebCore/PlatformString.h>
+
+#include <WebCore/COMPtr.h>
+
+using namespace WebCore;
+
+WebScriptDebugger::WebScriptDebugger(WebFrame* frame)
+    : m_frame(frame)
+{
+    ASSERT(m_frame);
+    if (KJSProxy* proxy = core(m_frame)->scriptProxy())
+        attach(static_cast<KJS::Interpreter*>(proxy->interpreter()));
+}
+
+bool WebScriptDebugger::sourceParsed(KJS::ExecState*, int sourceId, const KJS::UString& sourceURL,
+                  const KJS::UString& source, int startingLineNumber, int errorLine, const KJS::UString& /*errorMsg*/)
+{
+    if (WebScriptDebugServer::listenerCount() <= 0)
+        return true;
+
+    COMPtr<IWebView> webView;
+    if (FAILED(m_frame->webView(&webView)))
+        return false;
+
+    BString bSource = String(source);
+    BString bSourceURL = String(sourceURL);
+    
+    if (errorLine == -1) {
+        WebScriptDebugServer::sharedWebScriptDebugServer()->didParseSource(webView.get(),
+            bSource,
+            startingLineNumber,
+            bSourceURL,
+            sourceId,
+            m_frame);
+    } else {
+        // FIXME: the error var should be made with the information in the errorMsg.  It is not a simple
+        // UString to BSTR conversion there is some logic involved that I don't fully understand yet.
+        BString error(L"An Error Occurred.");
+        WebScriptDebugServer::sharedWebScriptDebugServer()->failedToParseSource(webView.get(),
+            bSource,
+            startingLineNumber,
+            bSourceURL,
+            error,
+            m_frame);
+    }
+
+    return true;
+}
+
diff --git a/WebKit/win/WebScriptDebugger.h b/WebKit/win/WebScriptDebugger.h
new file mode 100644 (file)
index 0000000..14c7c93
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (C) 2007 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef WebScriptDebugger_H
+#define WebScriptDebugger_H
+
+#include <JavaScriptCore/debugger.h>
+
+class WebFrame;
+
+namespace KJS {
+    class ExecState;
+}
+
+class WebScriptDebugger : public KJS::Debugger {
+public:
+    WebScriptDebugger(WebFrame*);
+
+    bool sourceParsed(KJS::ExecState*, int sourceId, const KJS::UString& sourceURL,
+        const KJS::UString& source, int startingLineNumber, int errorLine, const KJS::UString& errorMsg);
+
+private:
+    WebFrame* m_frame;
+};
+
+#endif
index 788545f12121531fa6989c7bda24f9cf157a6e06..8274105c87d4c9d505fe7f95abd52af678547b97 100644 (file)
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include "config.h"
 #include "WebKitDLL.h"
-
 #include "WebScriptScope.h"
 
 #include <wtf/Assertions.h>
 
 // WebScriptScope ------------------------------------------------------------
 
-WebScriptScope::WebScriptScope()
-: m_refCount(0)
+WebScriptScope::WebScriptScope(KJS::JSObject* scope)
+    : m_refCount(0)
+    , m_scope(scope)
 {
     gClassCount++;
 }
@@ -45,6 +46,13 @@ WebScriptScope::~WebScriptScope()
     gClassCount--;
 }
 
+WebScriptScope* WebScriptScope::createInstance(KJS::JSObject* scope)
+{
+    WebScriptScope* instance = new WebScriptScope(scope);
+    instance->AddRef();
+    return instance;
+}
+
 // IUnknown -------------------------------------------------------------------
 
 HRESULT STDMETHODCALLTYPE WebScriptScope::QueryInterface(REFIID riid, void** ppvObject)
index a646011d349a02be5294cd0cecc49798a19ad29d..988d1ba34f91dfbfe61cb066490db8c101cf96e1 100644 (file)
 
 #include "IWebScriptScope.h"
 
+#include <kjs/object.h>
+
 class WebScriptScope : public IWebScriptScope {
 public:
-    WebScriptScope();
+    static WebScriptScope* createInstance(KJS::JSObject* scope);
+
+private:
+    WebScriptScope(KJS::JSObject* scope);
     virtual ~WebScriptScope();
 
+public:
     // IUnknown
     virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject);
     virtual ULONG STDMETHODCALLTYPE AddRef(void);
@@ -51,6 +57,7 @@ public:
     
 protected:
     ULONG m_refCount;
+    KJS::JSObject* m_scope;
 };
 
 #endif