Assertion failure in WebInspectorProxy::platformClose closing main window when inspec...
[WebKit.git] / Source / WebKit2 / UIProcess / win / WebInspectorProxyWin.cpp
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 "WebPageProxy.h"
32 #include "WebView.h"
33 #include <WebCore/WebCoreInstanceHandle.h>
34 #include <wtf/PassRefPtr.h>
35 #include <wtf/RetainPtr.h>
36 #include <wtf/text/WTFString.h>
37
38 using namespace WebCore;
39
40 namespace WebKit {
41
42 static const LPCWSTR kWebKit2InspectorWindowClassName = L"WebKit2InspectorWindowClass";
43
44 bool WebInspectorProxy::registerInspectorViewWindowClass()
45 {
46     static bool haveRegisteredWindowClass = false;
47     if (haveRegisteredWindowClass)
48         return true;
49     haveRegisteredWindowClass = true;
50
51     WNDCLASSEX wcex;
52
53     wcex.cbSize = sizeof(WNDCLASSEX);
54     wcex.style          = CS_DBLCLKS;
55     wcex.lpfnWndProc    = WebInspectorProxy::InspectorViewWndProc;
56     wcex.cbClsExtra     = 0;
57     wcex.cbWndExtra     = sizeof(WebInspectorProxy*);
58     wcex.hInstance      = instanceHandle();
59     wcex.hIcon          = 0;
60     wcex.hCursor        = ::LoadCursor(0, IDC_ARROW);
61     wcex.hbrBackground  = 0;
62     wcex.lpszMenuName   = 0;
63     wcex.lpszClassName  = kWebKit2InspectorWindowClassName;
64     wcex.hIconSm        = 0;
65
66     return !!::RegisterClassEx(&wcex);
67 }
68
69 LRESULT CALLBACK WebInspectorProxy::InspectorViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
70 {
71     LONG_PTR longPtr = ::GetWindowLongPtr(hWnd, 0);
72     
73     if (WebInspectorProxy* inspectorView = reinterpret_cast<WebInspectorProxy*>(longPtr))
74         return inspectorView->wndProc(hWnd, message, wParam, lParam);
75
76     if (message == WM_CREATE) {
77         LPCREATESTRUCT createStruct = reinterpret_cast<LPCREATESTRUCT>(lParam);
78
79         // Associate the WebInspectorProxy with the window.
80         ::SetWindowLongPtr(hWnd, 0, (LONG_PTR)createStruct->lpCreateParams);
81         return 0;
82     }
83
84     return ::DefWindowProc(hWnd, message, wParam, lParam);
85 }
86
87 LRESULT WebInspectorProxy::wndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
88 {
89     LRESULT lResult = 0;
90     bool handled = true;
91
92     switch (message) {
93     case WM_SIZE:
94         lResult = onSizeEvent(hWnd, message, wParam, lParam, handled);
95         break;
96     case WM_GETMINMAXINFO:
97         lResult = onMinMaxInfoEvent(hWnd, message, wParam, lParam, handled);
98         break;
99     case WM_SETFOCUS:
100         lResult = onSetFocusEvent(hWnd, message, wParam, lParam, handled);
101         break;
102     case WM_CLOSE:
103         lResult = onCloseEvent(hWnd, message, wParam, lParam, handled);
104         break;
105     default:
106         handled = false;
107         break;
108     }
109
110     if (!handled)
111         lResult = ::DefWindowProc(hWnd, message, wParam, lParam);
112
113     return lResult;
114 }
115
116 LRESULT WebInspectorProxy::onSizeEvent(HWND, UINT, WPARAM, LPARAM, bool&)
117 {
118     RECT rect;
119     ::GetClientRect(m_inspectorWindow, &rect);
120
121     ::SetWindowPos(m_inspectorView->window(), 0, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER);
122
123     return 0;
124 }
125
126 LRESULT WebInspectorProxy::onSetFocusEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
127 {    
128     ::SetFocus(m_inspectorView->window());
129
130     return 0;
131 }
132
133 LRESULT WebInspectorProxy::onMinMaxInfoEvent(HWND, UINT, WPARAM, LPARAM lParam, bool&)
134 {
135     MINMAXINFO* info = reinterpret_cast<MINMAXINFO*>(lParam);
136     POINT size = {minimumWindowWidth, minimumWindowHeight};
137     info->ptMinTrackSize = size;
138
139     return 0;
140 }
141
142 LRESULT WebInspectorProxy::onCloseEvent(HWND, UINT, WPARAM, LPARAM, bool&)
143 {
144     ::ShowWindow(m_inspectorWindow, SW_HIDE);
145     close();
146
147     return 0;
148 }
149
150 WebPageProxy* WebInspectorProxy::platformCreateInspectorPage()
151 {
152     ASSERT(!m_inspectorView);
153     ASSERT(!m_inspectorWindow);
154
155     RECT emptyRect = { 0 };
156     m_inspectorView = WebView::create(emptyRect, m_page->context(), inspectorPageGroup(), 0);
157
158     return m_inspectorView->page();
159 }
160
161 void WebInspectorProxy::platformOpen()
162 {
163     registerInspectorViewWindowClass();
164
165     m_inspectorWindow = ::CreateWindowEx(0, kWebKit2InspectorWindowClassName, 0, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
166         0, 0, initialWindowWidth, initialWindowHeight, 0, 0, instanceHandle(), this);
167     ASSERT(::IsWindow(m_inspectorWindow));
168
169     m_inspectorView->setParentWindow(m_inspectorWindow);
170     ::ShowWindow(m_inspectorWindow, SW_SHOW);
171 }
172
173 void WebInspectorProxy::platformClose()
174 {
175     ASSERT(!m_isVisible || m_inspectorWindow);
176     ASSERT(!m_isVisible || m_inspectorView);
177
178     if (m_inspectorWindow) {
179         ASSERT(::IsWindow(m_inspectorWindow));
180         ::DestroyWindow(m_inspectorWindow);
181     }
182
183     m_inspectorWindow = 0;
184     m_inspectorView = 0;
185 }
186
187 String WebInspectorProxy::inspectorPageURL() const
188 {
189     RetainPtr<CFURLRef> htmlURLRef(AdoptCF, CFBundleCopyResourceURL(CFBundleGetBundleWithIdentifier(CFSTR("com.apple.WebKit")), CFSTR("inspector"), CFSTR("html"), CFSTR("inspector")));
190     if (!htmlURLRef)
191         return String();
192
193     return String(CFURLGetString(htmlURLRef.get()));
194 }
195
196 } // namespace WebKit
197
198 #endif // ENABLE(INSPECTOR)