1 /*
2 * Copyright (C) 2010 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26 #include "config.h"
27 #include "WebInspectorProxy.h"
28
29 #if ENABLE(INSPECTOR)
30
31 #include "WebKitBundle.h"
32 #include "WebPageProxy.h"
33 #include "WebProcessProxy.h"
34 #include "WebView.h"
35 #include <WebCore/WebCoreInstanceHandle.h>
36 #include <wtf/PassRefPtr.h>
37 #include <wtf/RetainPtr.h>
38 #include <wtf/text/StringConcatenate.h>
39 #include <wtf/text/WTFString.h>
40
41 using namespace WebCore;
42
43 namespace WebKit {
44
45 static const LPCWSTR kWebKit2InspectorWindowClassName = L"WebKit2InspectorWindowClass";
46
registerInspectorViewWindowClass()47 bool WebInspectorProxy::registerInspectorViewWindowClass()
48 {
49 static bool haveRegisteredWindowClass = false;
50 if (haveRegisteredWindowClass)
51 return true;
52 haveRegisteredWindowClass = true;
53
54 WNDCLASSEX wcex;
55
56 wcex.cbSize = sizeof(WNDCLASSEX);
57 wcex.style = CS_DBLCLKS;
58 wcex.lpfnWndProc = WebInspectorProxy::InspectorViewWndProc;
59 wcex.cbClsExtra = 0;
60 wcex.cbWndExtra = sizeof(WebInspectorProxy*);
61 wcex.hInstance = instanceHandle();
62 wcex.hIcon = 0;
63 wcex.hCursor = ::LoadCursor(0, IDC_ARROW);
64 wcex.hbrBackground = 0;
65 wcex.lpszMenuName = 0;
66 wcex.lpszClassName = kWebKit2InspectorWindowClassName;
67 wcex.hIconSm = 0;
68
69 return !!::RegisterClassEx(&wcex);
70 }
71
InspectorViewWndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)72 LRESULT CALLBACK WebInspectorProxy::InspectorViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
73 {
74 LONG_PTR longPtr = ::GetWindowLongPtr(hWnd, 0);
75
76 if (WebInspectorProxy* inspectorView = reinterpret_cast<WebInspectorProxy*>(longPtr))
77 return inspectorView->wndProc(hWnd, message, wParam, lParam);
78
79 if (message == WM_CREATE) {
80 LPCREATESTRUCT createStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
81
82 // Associate the WebInspectorProxy with the window.
83 ::SetWindowLongPtr(hWnd, 0, (LONG_PTR)createStruct->lpCreateParams);
84 return 0;
85 }
86
87 return ::DefWindowProc(hWnd, message, wParam, lParam);
88 }
89
wndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)90 LRESULT WebInspectorProxy::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
91 {
92 LRESULT lResult = 0;
93 bool handled = true;
94
95 switch (message) {
96 case WM_SIZE:
97 lResult = onSizeEvent(hWnd, message, wParam, lParam, handled);
98 break;
99 case WM_GETMINMAXINFO:
100 lResult = onMinMaxInfoEvent(hWnd, message, wParam, lParam, handled);
101 break;
102 case WM_SETFOCUS:
103 lResult = onSetFocusEvent(hWnd, message, wParam, lParam, handled);
104 break;
105 case WM_CLOSE:
106 lResult = onCloseEvent(hWnd, message, wParam, lParam, handled);
107 break;
108 default:
109 handled = false;
110 break;
111 }
112
113 if (!handled)
114 lResult = ::DefWindowProc(hWnd, message, wParam, lParam);
115
116 return lResult;
117 }
118
onSizeEvent(HWND,UINT,WPARAM,LPARAM,bool &)119 LRESULT WebInspectorProxy::onSizeEvent(HWND, UINT, WPARAM, LPARAM, bool&)
120 {
121 RECT rect;
122 ::GetClientRect(m_inspectorWindow, &rect);
123
124 ::SetWindowPos(m_inspectorView->window(), 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
125
126 return 0;
127 }
128
onSetFocusEvent(HWND,UINT,WPARAM,LPARAM lParam,bool &)129 LRESULT WebInspectorProxy::onSetFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
130 {
131 ::SetFocus(m_inspectorView->window());
132
133 return 0;
134 }
135
onMinMaxInfoEvent(HWND,UINT,WPARAM,LPARAM lParam,bool &)136 LRESULT WebInspectorProxy::onMinMaxInfoEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
137 {
138 MINMAXINFO* info = reinterpret_cast<MINMAXINFO*>(lParam);
139 POINT size = {minimumWindowWidth, minimumWindowHeight};
140 info->ptMinTrackSize = size;
141
142 return 0;
143 }
144
onCloseEvent(HWND,UINT,WPARAM,LPARAM,bool &)145 LRESULT WebInspectorProxy::onCloseEvent(HWND, UINT, WPARAM, LPARAM, bool&)
146 {
147 ::ShowWindow(m_inspectorWindow, SW_HIDE);
148 close();
149
150 return 0;
151 }
152
platformCreateInspectorPage()153 WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
154 {
155 ASSERT(!m_inspectorView);
156 ASSERT(!m_inspectorWindow);
157
158 RECT emptyRect = { 0 };
159 m_inspectorView = WebView::create(emptyRect, m_page->process()->context(), inspectorPageGroup(), 0);
160
161 return m_inspectorView->page();
162 }
163
platformOpen()164 void WebInspectorProxy::platformOpen()
165 {
166 registerInspectorViewWindowClass();
167
168 m_inspectorWindow = ::CreateWindowEx(0, kWebKit2InspectorWindowClassName, 0, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
169 0, 0, initialWindowWidth, initialWindowHeight, 0, 0, instanceHandle(), this);
170 ASSERT(::IsWindow(m_inspectorWindow));
171
172 m_inspectorView->setParentWindow(m_inspectorWindow);
173 ::ShowWindow(m_inspectorWindow, SW_SHOW);
174 }
175
platformClose()176 void WebInspectorProxy::platformClose()
177 {
178 ASSERT(!m_isVisible || m_inspectorWindow);
179 ASSERT(!m_isVisible || m_inspectorView);
180
181 if (m_inspectorWindow) {
182 ASSERT(::IsWindow(m_inspectorWindow));
183 ::DestroyWindow(m_inspectorWindow);
184 }
185
186 m_inspectorWindow = 0;
187 m_inspectorView = 0;
188 }
189
platformInspectedURLChanged(const String & urlString)190 void WebInspectorProxy::platformInspectedURLChanged(const String& urlString)
191 {
192 // FIXME: this should be made localizable once WebKit2 supports it. <rdar://problem/8728860>
193 String title = makeString("Web Inspector ", static_cast<UChar>(0x2014), ' ', urlString);
194 ::SetWindowTextW(m_inspectorWindow, title.charactersWithNullTermination());
195 }
196
inspectorPageURL() const197 String WebInspectorProxy::inspectorPageURL() const
198 {
199 RetainPtr<CFURLRef> htmlURLRef(AdoptCF, CFBundleCopyResourceURL(webKitBundle(), CFSTR("inspector"), CFSTR("html"), CFSTR("inspector")));
200 if (!htmlURLRef)
201 return String();
202
203 return String(CFURLGetString(htmlURLRef.get()));
204 }
205
206 } // namespace WebKit
207
208 #endif // ENABLE(INSPECTOR)
209