165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebInspectorProxy.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#if ENABLE(INSPECTOR)
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include "WebKitBundle.h"
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebPageProxy.h"
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include "WebProcessProxy.h"
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebView.h"
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebCore/WebCoreInstanceHandle.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/PassRefPtr.h>
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/RetainPtr.h>
3881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <wtf/text/StringConcatenate.h>
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/text/WTFString.h>
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore;
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit {
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic const LPCWSTR kWebKit2InspectorWindowClassName = L"WebKit2InspectorWindowClass";
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochbool WebInspectorProxy::registerInspectorViewWindowClass()
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static bool haveRegisteredWindowClass = false;
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (haveRegisteredWindowClass)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return true;
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    haveRegisteredWindowClass = true;
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WNDCLASSEX wcex;
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbSize = sizeof(WNDCLASSEX);
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.style          = CS_DBLCLKS;
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpfnWndProc    = WebInspectorProxy::InspectorViewWndProc;
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbClsExtra     = 0;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.cbWndExtra     = sizeof(WebInspectorProxy*);
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hInstance      = instanceHandle();
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIcon          = 0;
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hCursor        = ::LoadCursor(0, IDC_ARROW);
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hbrBackground  = 0;
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszMenuName   = 0;
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.lpszClassName  = kWebKit2InspectorWindowClassName;
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    wcex.hIconSm        = 0;
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return !!::RegisterClassEx(&wcex);
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT CALLBACK WebInspectorProxy::InspectorViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LONG_PTR longPtr = ::GetWindowLongPtr(hWnd, 0);
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (WebInspectorProxy* inspectorView = reinterpret_cast<WebInspectorProxy*>(longPtr))
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return inspectorView->wndProc(hWnd, message, wParam, lParam);
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (message == WM_CREATE) {
8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        LPCREATESTRUCT createStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        // Associate the WebInspectorProxy with the window.
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ::SetWindowLongPtr(hWnd, 0, (LONG_PTR)createStruct->lpCreateParams);
8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return 0;
8565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
8665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
8765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return ::DefWindowProc(hWnd, message, wParam, lParam);
8865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
8965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebInspectorProxy::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    LRESULT lResult = 0;
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    bool handled = true;
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    switch (message) {
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WM_SIZE:
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = onSizeEvent(hWnd, message, wParam, lParam, handled);
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WM_GETMINMAXINFO:
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = onMinMaxInfoEvent(hWnd, message, wParam, lParam, handled);
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WM_SETFOCUS:
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = onSetFocusEvent(hWnd, message, wParam, lParam, handled);
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    case WM_CLOSE:
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = onCloseEvent(hWnd, message, wParam, lParam, handled);
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    default:
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        handled = false;
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        break;
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!handled)
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        lResult = ::DefWindowProc(hWnd, message, wParam, lParam);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return lResult;
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebInspectorProxy::onSizeEvent(HWND, UINT, WPARAM, LPARAM, bool&)
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT rect;
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::GetClientRect(m_inspectorWindow, &rect);
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetWindowPos(m_inspectorView->window(), 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebInspectorProxy::onSetFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::SetFocus(m_inspectorView->window());
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebInspectorProxy::onMinMaxInfoEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MINMAXINFO* info = reinterpret_cast<MINMAXINFO*>(lParam);
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    POINT size = {minimumWindowWidth, minimumWindowHeight};
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    info->ptMinTrackSize = size;
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochLRESULT WebInspectorProxy::onCloseEvent(HWND, UINT, WPARAM, LPARAM, bool&)
14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::ShowWindow(m_inspectorWindow, SW_HIDE);
14865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    close();
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_inspectorView);
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(!m_inspectorWindow);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    RECT emptyRect = { 0 };
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    m_inspectorView = WebView::create(emptyRect, m_page->process()->context(), inspectorPageGroup(), 0);
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return m_inspectorView->page();
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebInspectorProxy::platformOpen()
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
16665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    registerInspectorViewWindowClass();
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inspectorWindow = ::CreateWindowEx(0, kWebKit2InspectorWindowClassName, 0, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        0, 0, initialWindowWidth, initialWindowHeight, 0, 0, instanceHandle(), this);
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(::IsWindow(m_inspectorWindow));
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inspectorView->setParentWindow(m_inspectorWindow);
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ::ShowWindow(m_inspectorWindow, SW_SHOW);
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebInspectorProxy::platformClose()
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1782fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_isVisible || m_inspectorWindow);
1792fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    ASSERT(!m_isVisible || m_inspectorView);
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1812fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    if (m_inspectorWindow) {
1822fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ASSERT(::IsWindow(m_inspectorWindow));
1832fc2651226baac27029e38c9d6ef883fa32084dbSteve Block        ::DestroyWindow(m_inspectorWindow);
1842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    }
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inspectorWindow = 0;
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_inspectorView = 0;
18865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
19081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WebInspectorProxy::platformInspectedURLChanged(const String& urlString)
19181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
19281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // FIXME: this should be made localizable once WebKit2 supports it. <rdar://problem/8728860>
19381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    String title = makeString("Web Inspector ", static_cast<UChar>(0x2014), ' ', urlString);
19481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    ::SetWindowTextW(m_inspectorWindow, title.charactersWithNullTermination());
19581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
19681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
19765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochString WebInspectorProxy::inspectorPageURL() const
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
19981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    RetainPtr<CFURLRef> htmlURLRef(AdoptCF, CFBundleCopyResourceURL(webKitBundle(), CFSTR("inspector"), CFSTR("html"), CFSTR("inspector")));
20065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (!htmlURLRef)
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return String();
20265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return String(CFURLGetString(htmlURLRef.get()));
20465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit
20765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#endif // ENABLE(INSPECTOR)
209