OSDN Git Service

Merge WebKit at r71558: Initial merge by git.
[android-x86/external-webkit.git] / WebCore / inspector / InspectorFrontendHost.cpp
index 1aeb1d7..4b7e13f 100644 (file)
 #include "FrameLoader.h"
 #include "HitTestResult.h"
 #include "HTMLFrameOwnerElement.h"
-#include "InspectorClient.h"
-#include "InspectorFrontend.h"
-#include "InspectorResource.h"
+#include "InspectorFrontendClient.h"
 #include "Page.h"
 #include "Pasteboard.h"
+#include "ScriptFunctionCall.h"
 
 #include <wtf/RefPtr.h>
 #include <wtf/StdLibExtras.h>
@@ -54,97 +53,164 @@ using namespace std;
 
 namespace WebCore {
 
-InspectorFrontendHost::InspectorFrontendHost(InspectorController* inspectorController, InspectorClient* client)
-    : m_inspectorController(inspectorController)
-    , m_client(client)
+#if ENABLE(CONTEXT_MENUS)
+class FrontendMenuProvider : public ContextMenuProvider {
+public:
+    static PassRefPtr<FrontendMenuProvider> create(InspectorFrontendHost* frontendHost, ScriptObject webInspector, const Vector<ContextMenuItem*>& items)
+    {
+        return adoptRef(new FrontendMenuProvider(frontendHost, webInspector, items));
+    }
+    
+    void disconnect()
+    {
+        m_webInspector = ScriptObject();
+        m_frontendHost = 0;
+    }
+    
+private:
+    FrontendMenuProvider(InspectorFrontendHost* frontendHost, ScriptObject webInspector,  const Vector<ContextMenuItem*>& items)
+        : m_frontendHost(frontendHost)
+        , m_webInspector(webInspector)
+        , m_items(items)
+    {
+    }
+
+    virtual ~FrontendMenuProvider()
+    {
+        contextMenuCleared();
+    }
+    
+    virtual void populateContextMenu(ContextMenu* menu)
+    {
+        for (size_t i = 0; i < m_items.size(); ++i)
+            menu->appendItem(*m_items[i]);
+    }
+    
+    virtual void contextMenuItemSelected(ContextMenuItem* item)
+    {
+        if (m_frontendHost) {
+            int itemNumber = item->action() - ContextMenuItemBaseCustomTag;
+
+            ScriptFunctionCall function(m_webInspector, "contextMenuItemSelected");
+            function.appendArgument(itemNumber);
+            function.call();
+        }
+    }
+    
+    virtual void contextMenuCleared()
+    {
+        if (m_frontendHost) {
+            ScriptFunctionCall function(m_webInspector, "contextMenuCleared");
+            function.call();
+
+            m_frontendHost->m_menuProvider = 0;
+        }
+        deleteAllValues(m_items);
+        m_items.clear();
+    }
+
+    InspectorFrontendHost* m_frontendHost;
+    ScriptObject m_webInspector;
+    Vector<ContextMenuItem*> m_items;
+};
+#endif
+
+InspectorFrontendHost::InspectorFrontendHost(InspectorFrontendClient* client, Page* frontendPage)
+    : m_client(client)
+    , m_frontendPage(frontendPage)
+#if ENABLE(CONTEXT_MENUS)
+    , m_menuProvider(0)
+#endif
 {
 }
 
 InspectorFrontendHost::~InspectorFrontendHost()
 {
+    ASSERT(!m_client);
+}
+
+void InspectorFrontendHost::disconnectClient()
+{
+    m_client = 0;
+#if ENABLE(CONTEXT_MENUS)
     if (m_menuProvider)
         m_menuProvider->disconnect();
+#endif
+    m_frontendPage = 0;
 }
 
 void InspectorFrontendHost::loaded()
 {
-    if (m_inspectorController)
-        m_inspectorController->scriptObjectReady();
+    if (m_client)
+        m_client->frontendLoaded();
 }
 
-void InspectorFrontendHost::attach()
+void InspectorFrontendHost::requestAttachWindow()
 {
-    if (m_inspectorController)
-        m_inspectorController->attachWindow();
+    if (m_client)
+        m_client->requestAttachWindow();
 }
 
-void InspectorFrontendHost::detach()
+void InspectorFrontendHost::requestDetachWindow()
 {
-    if (m_inspectorController)
-        m_inspectorController->detachWindow();
+    if (m_client)
+        m_client->requestDetachWindow();
 }
 
 void InspectorFrontendHost::closeWindow()
 {
-    if (m_inspectorController)
-        m_inspectorController->closeWindow();
+    if (m_client) {
+        m_client->closeWindow();
+        disconnectClient(); // Disconnect from client.
+    }
 }
 
-void InspectorFrontendHost::windowUnloading()
+void InspectorFrontendHost::disconnectFromBackend()
 {
-    if (m_inspectorController)
-        m_inspectorController->close();
+    if (m_client) {
+        m_client->disconnectFromBackend();
+        disconnectClient(); // Disconnect from client.
+    }
 }
 
-void InspectorFrontendHost::setAttachedWindowHeight(unsigned height)
+void InspectorFrontendHost::bringToFront()
 {
-    if (m_inspectorController)
-        m_inspectorController->setAttachedWindowHeight(height);
+    if (m_client)
+        m_client->bringToFront();
 }
 
-void InspectorFrontendHost::moveWindowBy(float x, float y) const
+void InspectorFrontendHost::inspectedURLChanged(const String& newURL)
 {
-    if (m_inspectorController)
-        m_inspectorController->moveWindowBy(x, y);
+    if (m_client)
+        m_client->inspectedURLChanged(newURL);
 }
 
-String InspectorFrontendHost::localizedStringsURL()
+void InspectorFrontendHost::setAttachedWindowHeight(unsigned height)
 {
-    return m_client->localizedStringsURL();
+    if (m_client)
+        m_client->changeAttachedWindowHeight(height);
 }
 
-String InspectorFrontendHost::hiddenPanels()
+void InspectorFrontendHost::moveWindowBy(float x, float y) const
 {
-    return m_client->hiddenPanels();
+    if (m_client)
+        m_client->moveWindowBy(x, y);
 }
 
-const String& InspectorFrontendHost::platform() const
+void InspectorFrontendHost::setExtensionAPI(const String& script)
 {
-#if PLATFORM(MAC)
-    DEFINE_STATIC_LOCAL(const String, platform, ("mac"));
-#elif OS(WINDOWS)
-    DEFINE_STATIC_LOCAL(const String, platform, ("windows"));
-#elif OS(LINUX)
-    DEFINE_STATIC_LOCAL(const String, platform, ("linux"));
-#else
-    DEFINE_STATIC_LOCAL(const String, platform, ("unknown"));
-#endif
-    return platform;
+    InspectorController* inspector = m_frontendPage->inspectorController();
+    inspector->setInspectorExtensionAPI(script);
 }
 
-const String& InspectorFrontendHost::port() const
+String InspectorFrontendHost::localizedStringsURL()
 {
-#if PLATFORM(QT)
-    DEFINE_STATIC_LOCAL(const String, port, ("qt"));
-#elif PLATFORM(GTK)
-    DEFINE_STATIC_LOCAL(const String, port, ("gtk"));
-#elif PLATFORM(WX)
-    DEFINE_STATIC_LOCAL(const String, port, ("wx"));
-#else
-    DEFINE_STATIC_LOCAL(const String, port, ("unknown"));
-#endif
+    return m_client->localizedStringsURL();
+}
 
-    return port;
+String InspectorFrontendHost::hiddenPanels()
+{
+    return m_client->hiddenPanels();
 }
 
 void InspectorFrontendHost::copyText(const String& text)
@@ -152,33 +218,27 @@ void InspectorFrontendHost::copyText(const String& text)
     Pasteboard::generalPasteboard()->writePlainText(text);
 }
 
-void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMenuItem*>& items)
+void InspectorFrontendHost::sendMessageToBackend(const String& message)
 {
-    if (!m_inspectorController)
-        return;
-    if (!m_inspectorController->windowVisible())
-        return;
-
-
-    m_menuProvider = MenuProvider::create(this, items);
-    ContextMenuController* menuController = m_inspectorController->m_page->contextMenuController();
-    menuController->showContextMenu(event, m_menuProvider);
+    m_client->sendMessageToBackend(message);
 }
 
-void InspectorFrontendHost::contextMenuItemSelected(ContextMenuItem* item)
+#if ENABLE(CONTEXT_MENUS)
+void InspectorFrontendHost::showContextMenu(Event* event, const Vector<ContextMenuItem*>& items)
 {
-    if (m_inspectorController && m_inspectorController->windowVisible()) {
-        int itemNumber = item->action() - ContextMenuItemBaseCustomTag;
-        m_inspectorController->m_frontend->contextMenuItemSelected(itemNumber);
+    ASSERT(m_frontendPage);
+    ScriptState* frontendScriptState = scriptStateFromPage(debuggerWorld(), m_frontendPage);
+    ScriptObject webInspectorObj;
+    if (!ScriptGlobalObject::get(frontendScriptState, "WebInspector", webInspectorObj)) {
+        ASSERT_NOT_REACHED();
+        return;
     }
+    RefPtr<FrontendMenuProvider> menuProvider = FrontendMenuProvider::create(this, webInspectorObj, items);
+    ContextMenuController* menuController = m_frontendPage->contextMenuController();
+    menuController->showContextMenu(event, menuProvider);
+    m_menuProvider = menuProvider.get();
 }
-
-void InspectorFrontendHost::contextMenuCleared()
-{
-    m_menuProvider = 0;
-    if (m_inspectorController && m_inspectorController->windowVisible())
-        m_inspectorController->m_frontend->contextMenuCleared();
-}
+#endif
 
 } // namespace WebCore