2009-08-14 Pavel Feldman <pfeldman@chromium.org>
authorpfeldman@chromium.org <pfeldman@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Aug 2009 11:39:16 +0000 (11:39 +0000)
committerpfeldman@chromium.org <pfeldman@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 14 Aug 2009 11:39:16 +0000 (11:39 +0000)
        Reviewed by Timothy Hatcher.

        WebInspector: Wrap console objects late (in the frontend) so that injected
        script was already in place.

        https://bugs.webkit.org/show_bug.cgi?id=28297

        * inspector/ConsoleMessage.cpp:
        (WebCore::ConsoleMessage::ConsoleMessage):
        * inspector/ConsoleMessage.h:
        * inspector/InspectorController.cpp:
        (WebCore::InspectorController::addMessageToConsole):
        (WebCore::InspectorController::startGroup):
        (WebCore::InspectorController::setFrontendProxyObject):
        * inspector/InspectorController.h:
        * inspector/InspectorFrontend.cpp:
        (WebCore::InspectorFrontend::InspectorFrontend):
        (WebCore::InspectorFrontend::addMessageToConsole):
        * inspector/InspectorFrontend.h:

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

WebCore/ChangeLog
WebCore/inspector/ConsoleMessage.cpp
WebCore/inspector/ConsoleMessage.h
WebCore/inspector/InspectorController.cpp
WebCore/inspector/InspectorController.h
WebCore/inspector/InspectorFrontend.cpp
WebCore/inspector/InspectorFrontend.h

index 5bd34eb..325b4ff 100644 (file)
@@ -1,3 +1,25 @@
+2009-08-14  Pavel Feldman  <pfeldman@chromium.org>
+
+        Reviewed by Timothy Hatcher.
+
+        WebInspector: Wrap console objects late (in the frontend) so that injected
+        script was already in place.
+
+        https://bugs.webkit.org/show_bug.cgi?id=28297
+
+        * inspector/ConsoleMessage.cpp:
+        (WebCore::ConsoleMessage::ConsoleMessage):
+        * inspector/ConsoleMessage.h:
+        * inspector/InspectorController.cpp:
+        (WebCore::InspectorController::addMessageToConsole):
+        (WebCore::InspectorController::startGroup):
+        (WebCore::InspectorController::setFrontendProxyObject):
+        * inspector/InspectorController.h:
+        * inspector/InspectorFrontend.cpp:
+        (WebCore::InspectorFrontend::InspectorFrontend):
+        (WebCore::InspectorFrontend::addMessageToConsole):
+        * inspector/InspectorFrontend.h:
+
 2009-08-13  Simon Fraser  <simon.fraser@apple.com>
 
         Reviewed by Dan Bernstein.
index f2fe108..f9d8708 100644 (file)
@@ -50,18 +50,29 @@ ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, c
 {
 }
 
-ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, const Vector<ScriptString>& frames, const Vector<ScriptValue>& wrappedArguments, unsigned li, const String& u, unsigned g)
+ConsoleMessage::ConsoleMessage(MessageSource s, MessageType t, MessageLevel l, ScriptCallStack* callStack, unsigned g, bool storeTrace)
     : m_source(s)
     , m_type(t)
     , m_level(l)
-    , m_frames(frames)
-    , m_wrappedArguments(wrappedArguments)
-    , m_line(li)
-    , m_url(u)
+    , m_wrappedArguments(callStack->at(0).argumentCount())
+    , m_frames(storeTrace ? callStack->size() : 0)
     , m_groupLevel(g)
     , m_repeatCount(1)
 {
+    const ScriptCallFrame& lastCaller = callStack->at(0);
+    m_line = lastCaller.lineNumber();
+    m_url = lastCaller.sourceURL().string();
+
+    // FIXME: For now, just store function names as strings.
+    // As ScriptCallStack start storing line number and source URL for all
+    // frames, refactor to use that, as well.
+    if (storeTrace) {
+        for (unsigned i = 0; i < callStack->size(); ++i)
+            m_frames[i] = callStack->at(i).functionName();
+    }
 
+    for (unsigned i = 0; i < lastCaller.argumentCount(); ++i)
+        m_wrappedArguments[i] = quarantineValue(callStack->state(), lastCaller.argumentAt(i));
 }
 
 void ConsoleMessage::addToConsole(InspectorFrontend* frontend)
index 5b1560d..910a007 100644 (file)
@@ -45,7 +45,7 @@ namespace WebCore {
     class ConsoleMessage {
     public:
         ConsoleMessage(MessageSource, MessageType, MessageLevel, const String& m, unsigned li, const String& u, unsigned g);        
-        ConsoleMessage(MessageSource, MessageType, MessageLevel, const Vector<ScriptString>& frames, const Vector<ScriptValue>& wrappedArguments, unsigned li, const String& u, unsigned g);
+        ConsoleMessage(MessageSource, MessageType, MessageLevel, ScriptCallStack*, unsigned g, bool storeTrace = false);
 
         void addToConsole(InspectorFrontend* frontend);
         void incrementCount() { ++m_repeatCount; };
@@ -59,8 +59,8 @@ namespace WebCore {
         MessageType m_type;
         MessageLevel m_level;
         String m_message;
-        Vector<ScriptString> m_frames;
         Vector<ScriptValue> m_wrappedArguments;
+        Vector<ScriptString> m_frames;
         unsigned m_line;
         String m_url;
         unsigned m_groupLevel;
index 4512311..1150adb 100644 (file)
@@ -354,24 +354,7 @@ void InspectorController::addMessageToConsole(MessageSource source, MessageType
     if (!enabled())
         return;
 
-    Vector<ScriptValue> wrappedArguments(callStack->at(0).argumentCount());
-    bool storeTrace = type == TraceMessageType;
-    Vector<ScriptString> frames(storeTrace ? callStack->size() : 0);
-
-    const ScriptCallFrame& lastCaller = callStack->at(0);
-
-    // FIXME: For now, just store function names as strings.
-    // As ScriptCallStack start storing line number and source URL for all
-    // frames, refactor to use that, as well.
-    if (storeTrace) {
-        for (unsigned i = 0; i < callStack->size(); ++i)
-            frames[i] = callStack->at(i).functionName();
-    }
-
-    for (unsigned i = 0; i < lastCaller.argumentCount(); ++i)
-        wrappedArguments[i] = wrapObject(quarantineValue(callStack->state(), lastCaller.argumentAt(i)));
-
-    addConsoleMessage(callStack->state(), new ConsoleMessage(source, type, level, frames, wrappedArguments, lastCaller.lineNumber(), lastCaller.sourceURL().string(), m_groupLevel));
+    addConsoleMessage(callStack->state(), new ConsoleMessage(source, type, level, callStack, m_groupLevel, type == TraceMessageType));
 }
 
 void InspectorController::addMessageToConsole(MessageSource source, MessageType type, MessageLevel level, const String& message, unsigned lineNumber, const String& sourceID)
@@ -414,7 +397,7 @@ void InspectorController::startGroup(MessageSource source, ScriptCallStack* call
 {
     ++m_groupLevel;
 
-    addMessageToConsole(source, StartGroupMessageType, LogMessageLevel, callStack);
+    addConsoleMessage(callStack->state(), new ConsoleMessage(source, StartGroupMessageType, LogMessageLevel, callStack, m_groupLevel));
 }
 
 void InspectorController::endGroup(MessageSource source, unsigned lineNumber, const String& sourceURL)
@@ -568,7 +551,7 @@ void InspectorController::setFrontendProxyObject(ScriptState* scriptState, Scrip
 {
     m_scriptState = scriptState;
     m_injectedScriptObj = injectedScriptObj;
-    m_frontend.set(new InspectorFrontend(scriptState, webInspectorObj));
+    m_frontend.set(new InspectorFrontend(this, scriptState, webInspectorObj));
     m_domAgent = new InspectorDOMAgent(m_frontend.get());
 }
 
index 0d8c42c..59a959f 100644 (file)
@@ -271,7 +271,6 @@ public:
 
 private:
     friend class InspectorBackend;
     // Following are used from InspectorBackend and internally.
     void scriptObjectReady();
     void moveWindowBy(float x, float y) const;
@@ -280,6 +279,11 @@ private:
     void storeLastActivePanel(const String& panelName);
     void closeWindow();
     InspectorDOMAgent* domAgent() { return m_domAgent.get(); }
+
+    friend class InspectorFrontend;
+    // Following are used from InspectorFrontend only. We don't want to expose them to the
+    // rest of the InspectorController clients.
+    // TODO: extract these into a separate interface.
     ScriptValue wrapObject(const ScriptValue& object);
     ScriptValue unwrapObject(const String& objectId);
 
index 44e01af..da11cf7 100644 (file)
@@ -32,7 +32,7 @@
 
 #include "ConsoleMessage.h"
 #include "Frame.h"
-#include "InspectorController.h"  // TODO(pfeldman): Extract SpecialPanels to remove include.
+#include "InspectorController.h"
 #include "Node.h"
 #include "ScriptFunctionCall.h"
 #include "ScriptObject.h"
@@ -49,8 +49,9 @@
 
 namespace WebCore {
 
-InspectorFrontend::InspectorFrontend(ScriptState* scriptState, ScriptObject webInspector)
-    : m_scriptState(scriptState)
+InspectorFrontend::InspectorFrontend(InspectorController* inspectorController, ScriptState* scriptState, ScriptObject webInspector)
+    : m_inspectorController(inspectorController)
+    , m_scriptState(scriptState)
     , m_webInspector(webInspector)
 {
 }
@@ -79,7 +80,7 @@ void InspectorFrontend::addMessageToConsole(const ScriptObject& messageObj, cons
             function->appendArgument(frames[i]);
     } else if (!wrappedArguments.isEmpty()) {
         for (unsigned i = 0; i < wrappedArguments.size(); ++i)
-            function->appendArgument(wrappedArguments[i]);
+            function->appendArgument(m_inspectorController->wrapObject(wrappedArguments[i]));
     } else
         function->appendArgument(message);
     function->call();
index df1a12e..ba92418 100644 (file)
@@ -47,6 +47,7 @@ namespace WebCore {
     class ConsoleMessage;
     class Database;
     class Frame;
+    class InspectorController;
     class InspectorResource;
     class Node;
     class ScriptFunctionCall;
@@ -55,7 +56,7 @@ namespace WebCore {
 
     class InspectorFrontend {
     public:
-        InspectorFrontend(ScriptState*, ScriptObject webInspector);
+        InspectorFrontend(InspectorController* inspectorController, ScriptState*, ScriptObject webInspector);
         ~InspectorFrontend();
 
         ScriptArray newScriptArray();
@@ -116,6 +117,7 @@ namespace WebCore {
     private:
         PassOwnPtr<ScriptFunctionCall> newFunctionCall(const String& functionName);
         void callSimpleFunction(const String& functionName);
+        InspectorController* m_inspectorController;
         ScriptState* m_scriptState;
         ScriptObject m_webInspector;
     };