1 /*
2 * Copyright (C) 2007 Kevin Ollivier <kevino@theolliviers.com>
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4 *
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
20 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
21 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
22 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
24 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29 #include "config.h"
30 #include "ChromeClientWx.h"
31 #include "Console.h"
32 #if ENABLE(DATABASE)
33 #include "DatabaseTracker.h"
34 #endif
35 #include "FileChooser.h"
36 #include "FloatRect.h"
37 #include "Frame.h"
38 #include "FrameLoadRequest.h"
39 #include "Icon.h"
40 #include "NavigationAction.h"
41 #include "NotImplemented.h"
42 #include "PlatformString.h"
43 #include "SecurityOrigin.h"
44 #include "PopupMenuWx.h"
45 #include "SearchPopupMenuWx.h"
46 #include "WindowFeatures.h"
47
48 #include <stdio.h>
49
50 #include <wx/wxprec.h>
51 #ifndef WX_PRECOMP
52 #include <wx/wx.h>
53 #endif
54 #include <wx/textdlg.h>
55 #include <wx/tooltip.h>
56
57 #include "WebBrowserShell.h"
58 #include "WebView.h"
59 #include "WebViewPrivate.h"
60
61 namespace WebCore {
62
wkFeaturesforWindowFeatures(const WindowFeatures & features)63 wxWebKitWindowFeatures wkFeaturesforWindowFeatures(const WindowFeatures& features)
64 {
65 wxWebKitWindowFeatures wkFeatures;
66 wkFeatures.menuBarVisible = features.menuBarVisible;
67 wkFeatures.statusBarVisible = features.statusBarVisible;
68 wkFeatures.toolBarVisible = features.toolBarVisible;
69 wkFeatures.locationBarVisible = features.locationBarVisible;
70 wkFeatures.scrollbarsVisible = features.scrollbarsVisible;
71 wkFeatures.resizable = features.resizable;
72 wkFeatures.fullscreen = features.fullscreen;
73 wkFeatures.dialog = features.dialog;
74
75 return wkFeatures;
76 }
77
ChromeClientWx(wxWebView * webView)78 ChromeClientWx::ChromeClientWx(wxWebView* webView)
79 {
80 m_webView = webView;
81 }
82
~ChromeClientWx()83 ChromeClientWx::~ChromeClientWx()
84 {
85 }
86
chromeDestroyed()87 void ChromeClientWx::chromeDestroyed()
88 {
89 notImplemented();
90 }
91
setWindowRect(const FloatRect &)92 void ChromeClientWx::setWindowRect(const FloatRect&)
93 {
94 notImplemented();
95 }
96
windowRect()97 FloatRect ChromeClientWx::windowRect()
98 {
99 notImplemented();
100 return FloatRect();
101 }
102
pageRect()103 FloatRect ChromeClientWx::pageRect()
104 {
105 notImplemented();
106 return FloatRect();
107 }
108
scaleFactor()109 float ChromeClientWx::scaleFactor()
110 {
111 notImplemented();
112 return 1.0;
113 }
114
focus()115 void ChromeClientWx::focus()
116 {
117 notImplemented();
118 }
119
unfocus()120 void ChromeClientWx::unfocus()
121 {
122 notImplemented();
123 }
124
canTakeFocus(FocusDirection)125 bool ChromeClientWx::canTakeFocus(FocusDirection)
126 {
127 notImplemented();
128 return false;
129 }
130
takeFocus(FocusDirection)131 void ChromeClientWx::takeFocus(FocusDirection)
132 {
133 notImplemented();
134 }
135
focusedNodeChanged(Node *)136 void ChromeClientWx::focusedNodeChanged(Node*)
137 {
138 }
139
focusedFrameChanged(Frame *)140 void ChromeClientWx::focusedFrameChanged(Frame*)
141 {
142 }
143
createWindow(Frame *,const FrameLoadRequest &,const WindowFeatures & features,const NavigationAction &)144 Page* ChromeClientWx::createWindow(Frame*, const FrameLoadRequest&, const WindowFeatures& features, const NavigationAction&)
145 {
146 Page* myPage = 0;
147 wxWebViewNewWindowEvent wkEvent(m_webView);
148
149 wxWebKitWindowFeatures wkFeatures = wkFeaturesforWindowFeatures(features);
150 wkEvent.SetWindowFeatures(wkFeatures);
151
152 if (m_webView->GetEventHandler()->ProcessEvent(wkEvent)) {
153 if (wxWebView* webView = wkEvent.GetWebView()) {
154 WebViewPrivate* impl = webView->m_impl;
155 if (impl)
156 myPage = impl->page;
157 }
158 }
159
160 return myPage;
161 }
162
createModalDialog(Frame *,const FrameLoadRequest &)163 Page* ChromeClientWx::createModalDialog(Frame*, const FrameLoadRequest&)
164 {
165 notImplemented();
166 return 0;
167 }
168
show()169 void ChromeClientWx::show()
170 {
171 notImplemented();
172 }
173
canRunModal()174 bool ChromeClientWx::canRunModal()
175 {
176 notImplemented();
177 return false;
178 }
179
runModal()180 void ChromeClientWx::runModal()
181 {
182 notImplemented();
183 }
184
setToolbarsVisible(bool)185 void ChromeClientWx::setToolbarsVisible(bool)
186 {
187 notImplemented();
188 }
189
toolbarsVisible()190 bool ChromeClientWx::toolbarsVisible()
191 {
192 notImplemented();
193 return false;
194 }
195
setStatusbarVisible(bool)196 void ChromeClientWx::setStatusbarVisible(bool)
197 {
198 notImplemented();
199 }
200
statusbarVisible()201 bool ChromeClientWx::statusbarVisible()
202 {
203 notImplemented();
204 return false;
205 }
206
setScrollbarsVisible(bool)207 void ChromeClientWx::setScrollbarsVisible(bool)
208 {
209 notImplemented();
210 }
211
scrollbarsVisible()212 bool ChromeClientWx::scrollbarsVisible()
213 {
214 notImplemented();
215 return false;
216 }
217
setMenubarVisible(bool)218 void ChromeClientWx::setMenubarVisible(bool)
219 {
220 notImplemented();
221 }
222
menubarVisible()223 bool ChromeClientWx::menubarVisible()
224 {
225 notImplemented();
226 return false;
227 }
228
setResizable(bool)229 void ChromeClientWx::setResizable(bool)
230 {
231 notImplemented();
232 }
233
addMessageToConsole(MessageSource source,MessageType type,MessageLevel level,const String & message,unsigned int lineNumber,const String & sourceID)234 void ChromeClientWx::addMessageToConsole(MessageSource source,
235 MessageType type,
236 MessageLevel level,
237 const String& message,
238 unsigned int lineNumber,
239 const String& sourceID)
240 {
241 if (m_webView) {
242 wxWebViewConsoleMessageEvent wkEvent(m_webView);
243 wkEvent.SetMessage(message);
244 wkEvent.SetLineNumber(lineNumber);
245 wkEvent.SetSourceID(sourceID);
246 wkEvent.SetLevel(static_cast<wxWebViewConsoleMessageLevel>(level));
247 m_webView->GetEventHandler()->ProcessEvent(wkEvent);
248 }
249 }
250
canRunBeforeUnloadConfirmPanel()251 bool ChromeClientWx::canRunBeforeUnloadConfirmPanel()
252 {
253 notImplemented();
254 return true;
255 }
256
runBeforeUnloadConfirmPanel(const String & string,Frame * frame)257 bool ChromeClientWx::runBeforeUnloadConfirmPanel(const String& string,
258 Frame* frame)
259 {
260 wxMessageDialog dialog(NULL, string, wxT("Confirm Action?"), wxYES_NO);
261 return dialog.ShowModal() == wxYES;
262 }
263
closeWindowSoon()264 void ChromeClientWx::closeWindowSoon()
265 {
266 notImplemented();
267 }
268
269 /*
270 Sites for testing prompts:
271 Alert - just type in a bad web address or http://www.htmlite.com/JS002.php
272 Prompt - http://www.htmlite.com/JS007.php
273 Confirm - http://www.htmlite.com/JS006.php
274 */
275
runJavaScriptAlert(Frame * frame,const String & string)276 void ChromeClientWx::runJavaScriptAlert(Frame* frame, const String& string)
277 {
278 if (m_webView) {
279 wxWebViewAlertEvent wkEvent(m_webView);
280 wkEvent.SetMessage(string);
281 if (!m_webView->GetEventHandler()->ProcessEvent(wkEvent))
282 wxMessageBox(string, wxT("JavaScript Alert"), wxOK);
283 }
284 }
285
runJavaScriptConfirm(Frame * frame,const String & string)286 bool ChromeClientWx::runJavaScriptConfirm(Frame* frame, const String& string)
287 {
288 bool result = false;
289 if (m_webView) {
290 wxWebViewConfirmEvent wkEvent(m_webView);
291 wkEvent.SetMessage(string);
292 if (m_webView->GetEventHandler()->ProcessEvent(wkEvent))
293 result = wkEvent.GetReturnCode() == wxID_YES;
294 else {
295 wxMessageDialog dialog(NULL, string, wxT("JavaScript Confirm"), wxYES_NO);
296 dialog.Centre();
297 result = (dialog.ShowModal() == wxID_YES);
298 }
299 }
300 return result;
301 }
302
runJavaScriptPrompt(Frame * frame,const String & message,const String & defaultValue,String & result)303 bool ChromeClientWx::runJavaScriptPrompt(Frame* frame, const String& message, const String& defaultValue, String& result)
304 {
305 if (m_webView) {
306 wxWebViewPromptEvent wkEvent(m_webView);
307 wkEvent.SetMessage(message);
308 wkEvent.SetResponse(defaultValue);
309 if (m_webView->GetEventHandler()->ProcessEvent(wkEvent)) {
310 result = wkEvent.GetResponse();
311 return true;
312 }
313 else {
314 wxTextEntryDialog dialog(NULL, message, wxT("JavaScript Prompt"), wxEmptyString, wxOK | wxCANCEL);
315 dialog.Centre();
316 if (dialog.ShowModal() == wxID_OK) {
317 result = dialog.GetValue();
318 return true;
319 }
320 }
321 }
322 return false;
323 }
324
setStatusbarText(const String &)325 void ChromeClientWx::setStatusbarText(const String&)
326 {
327 notImplemented();
328 }
329
shouldInterruptJavaScript()330 bool ChromeClientWx::shouldInterruptJavaScript()
331 {
332 notImplemented();
333 return false;
334 }
335
keyboardUIMode()336 KeyboardUIMode ChromeClientWx::keyboardUIMode()
337 {
338 notImplemented();
339 return KeyboardAccessDefault;
340 }
341
windowResizerRect() const342 IntRect ChromeClientWx::windowResizerRect() const
343 {
344 notImplemented();
345 return IntRect();
346 }
347
invalidateWindow(const IntRect & rect,bool immediate)348 void ChromeClientWx::invalidateWindow(const IntRect& rect, bool immediate)
349 {
350 if (immediate)
351 m_webView->Update();
352 }
353
invalidateContentsForSlowScroll(const IntRect & rect,bool immediate)354 void ChromeClientWx::invalidateContentsForSlowScroll(const IntRect& rect, bool immediate)
355 {
356 invalidateContentsAndWindow(rect, immediate);
357 }
358
invalidateContentsAndWindow(const IntRect & rect,bool immediate)359 void ChromeClientWx::invalidateContentsAndWindow(const IntRect& rect, bool immediate)
360 {
361 if (!m_webView)
362 return;
363
364 m_webView->RefreshRect(rect);
365
366 if (immediate) {
367 m_webView->Update();
368 }
369 }
370
windowToScreen(const IntRect & rect) const371 IntRect ChromeClientWx::windowToScreen(const IntRect& rect) const
372 {
373 notImplemented();
374 return rect;
375 }
376
screenToWindow(const IntPoint & point) const377 IntPoint ChromeClientWx::screenToWindow(const IntPoint& point) const
378 {
379 notImplemented();
380 return point;
381 }
382
platformPageClient() const383 PlatformPageClient ChromeClientWx::platformPageClient() const
384 {
385 return m_webView;
386 }
387
contentsSizeChanged(Frame *,const IntSize &) const388 void ChromeClientWx::contentsSizeChanged(Frame*, const IntSize&) const
389 {
390 notImplemented();
391 }
392
scrollBackingStore(int dx,int dy,const IntRect & scrollViewRect,const IntRect & clipRect)393 void ChromeClientWx::scrollBackingStore(int dx, int dy,
394 const IntRect& scrollViewRect,
395 const IntRect& clipRect)
396 {
397 notImplemented();
398 }
399
updateBackingStore()400 void ChromeClientWx::updateBackingStore()
401 {
402 notImplemented();
403 }
404
mouseDidMoveOverElement(const HitTestResult &,unsigned modifierFlags)405 void ChromeClientWx::mouseDidMoveOverElement(const HitTestResult&, unsigned modifierFlags)
406 {
407 notImplemented();
408 }
409
setToolTip(const String & tip,TextDirection)410 void ChromeClientWx::setToolTip(const String& tip, TextDirection)
411 {
412 wxToolTip* tooltip = m_webView->GetToolTip();
413 if (!tooltip || tooltip->GetTip() != wxString(tip))
414 m_webView->SetToolTip(tip);
415 }
416
print(Frame *)417 void ChromeClientWx::print(Frame*)
418 {
419 notImplemented();
420 }
421
422 #if ENABLE(DATABASE)
exceededDatabaseQuota(Frame *,const String &)423 void ChromeClientWx::exceededDatabaseQuota(Frame*, const String&)
424 {
425 unsigned long long quota = 5 * 1024 * 1024;
426
427 if (wxWebFrame* webFrame = m_webView->GetMainFrame())
428 if (Frame* frame = webFrame->GetFrame())
429 if (Document* document = frame->document())
430 if (!DatabaseTracker::tracker().hasEntryForOrigin(document->securityOrigin()))
431 DatabaseTracker::tracker().setQuota(document->securityOrigin(), quota);
432 }
433 #endif
434
435 #if ENABLE(OFFLINE_WEB_APPLICATIONS)
reachedMaxAppCacheSize(int64_t spaceNeeded)436 void ChromeClientWx::reachedMaxAppCacheSize(int64_t spaceNeeded)
437 {
438 notImplemented();
439 }
440
reachedApplicationCacheOriginQuota(SecurityOrigin *)441 void ChromeClientWx::reachedApplicationCacheOriginQuota(SecurityOrigin*)
442 {
443 notImplemented();
444 }
445 #endif
446
scroll(const IntSize &,const IntRect &,const IntRect &)447 void ChromeClientWx::scroll(const IntSize&, const IntRect&, const IntRect&)
448 {
449 m_webView->Refresh();
450 notImplemented();
451 }
452
runOpenPanel(Frame *,PassRefPtr<FileChooser>)453 void ChromeClientWx::runOpenPanel(Frame*, PassRefPtr<FileChooser>)
454 {
455 notImplemented();
456 }
457
chooseIconForFiles(const Vector<String> & filenames,FileChooser * chooser)458 void ChromeClientWx::chooseIconForFiles(const Vector<String>& filenames, FileChooser* chooser)
459 {
460 chooser->iconLoaded(Icon::createIconForFiles(filenames));
461 }
462
setCursor(const Cursor & cursor)463 void ChromeClientWx::setCursor(const Cursor& cursor)
464 {
465 if (m_webView && cursor.impl())
466 m_webView->SetCursor(*cursor.impl());
467 }
468
requestGeolocationPermissionForFrame(Frame *,Geolocation *)469 void ChromeClientWx::requestGeolocationPermissionForFrame(Frame*, Geolocation*)
470 {
471 // See the comment in WebCore/page/ChromeClient.h
472 notImplemented();
473 }
474
selectItemWritingDirectionIsNatural()475 bool ChromeClientWx::selectItemWritingDirectionIsNatural()
476 {
477 return false;
478 }
479
selectItemAlignmentFollowsMenuWritingDirection()480 bool ChromeClientWx::selectItemAlignmentFollowsMenuWritingDirection()
481 {
482 return false;
483 }
484
createPopupMenu(PopupMenuClient * client) const485 PassRefPtr<PopupMenu> ChromeClientWx::createPopupMenu(PopupMenuClient* client) const
486 {
487 return adoptRef(new PopupMenuWx(client));
488 }
489
createSearchPopupMenu(PopupMenuClient * client) const490 PassRefPtr<SearchPopupMenu> ChromeClientWx::createSearchPopupMenu(PopupMenuClient* client) const
491 {
492 return adoptRef(new SearchPopupMenuWx(client));
493 }
494
495 }
496