Rename source files for consistency
[wxWidgets.git] / src / msw / webview_ie.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: src/msw/webview_ie.cpp
3 // Purpose: wxMSW wxWebViewIE class implementation for web view component
4 // Author: Marianne Gagnon
5 // Id: $Id$
6 // Copyright: (c) 2010 Marianne Gagnon
7 // Licence: wxWindows licence
8 /////////////////////////////////////////////////////////////////////////////
9
10 // For compilers that support precompilation, includes "wx.h".
11 #include "wx/wxprec.h"
12
13 #if defined(__BORLANDC__)
14 #pragma hdrstop
15 #endif
16
17 #include "wx/msw/webview_ie.h"
18
19 #if wxHAVE_WEB_BACKEND_IE
20
21 #include <olectl.h>
22 #include <oleidl.h>
23 #include <exdispid.h>
24 #include <exdisp.h>
25 #include <mshtml.h>
26
27 #ifdef __MINGW32__
28 // FIXME: Seems like MINGW does not have these, how to handle cleanly?
29 #define DISPID_COMMANDSTATECHANGE 105
30 typedef enum CommandStateChangeConstants {
31 CSC_UPDATECOMMANDS = (int) 0xFFFFFFFF,
32 CSC_NAVIGATEFORWARD = 0x1,
33 CSC_NAVIGATEBACK = 0x2
34 } CommandStateChangeConstants;
35
36
37 // FIXME: Seems like MINGW does not have these, how to handle cleanly?
38 #define DISPID_NAVIGATECOMPLETE2 252
39 #define DISPID_NAVIGATEERROR 271
40 #define OLECMDID_OPTICAL_ZOOM 63
41 #define INET_E_ERROR_FIRST 0x800C0002L
42 #define INET_E_INVALID_URL 0x800C0002L
43 #define INET_E_NO_SESSION 0x800C0003L
44 #define INET_E_CANNOT_CONNECT 0x800C0004L
45 #define INET_E_RESOURCE_NOT_FOUND 0x800C0005L
46 #define INET_E_OBJECT_NOT_FOUND 0x800C0006L
47 #define INET_E_DATA_NOT_AVAILABLE 0x800C0007L
48 #define INET_E_DOWNLOAD_FAILURE 0x800C0008L
49 #define INET_E_AUTHENTICATION_REQUIRED 0x800C0009L
50 #define INET_E_NO_VALID_MEDIA 0x800C000AL
51 #define INET_E_CONNECTION_TIMEOUT 0x800C000BL
52 #define INET_E_INVALID_REQUEST 0x800C000CL
53 #define INET_E_UNKNOWN_PROTOCOL 0x800C000DL
54 #define INET_E_SECURITY_PROBLEM 0x800C000EL
55 #define INET_E_CANNOT_LOAD_DATA 0x800C000FL
56 #define INET_E_CANNOT_INSTANTIATE_OBJECT 0x800C0010L
57 #define INET_E_QUERYOPTION_UNKNOWN 0x800C0013L
58 #define INET_E_REDIRECT_FAILED 0x800C0014L
59 #define INET_E_REDIRECT_TO_DIR 0x800C0015L
60 #define INET_E_CANNOT_LOCK_REQUEST 0x800C0016L
61 #define INET_E_USE_EXTEND_BINDING 0x800C0017L
62 #define INET_E_TERMINATED_BIND 0x800C0018L
63 #define INET_E_INVALID_CERTIFICATE 0x800C0019L
64 #define INET_E_CODE_DOWNLOAD_DECLINED 0x800C0100L
65 #define INET_E_RESULT_DISPATCHED 0x800C0200L
66 #define INET_E_CANNOT_REPLACE_SFP_FILE 0x800C0300L
67 #define INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY 0x800C0500L
68 #define INET_E_CODE_INSTALL_SUPPRESSED 0x800C0400L
69
70 #define REFRESH_COMPLETELY 3
71 #endif
72
73 BEGIN_EVENT_TABLE(wxWebViewIE, wxControl)
74 EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent)
75 EVT_ERASE_BACKGROUND(wxWebViewIE::onEraseBg)
76 END_EVENT_TABLE()
77
78 bool wxWebViewIE::Create(wxWindow* parent,
79 wxWindowID id,
80 const wxString& url,
81 const wxPoint& pos,
82 const wxSize& size,
83 long style,
84 const wxString& name)
85 {
86 if (!wxControl::Create(parent, id, pos, size, style,
87 wxDefaultValidator, name))
88 {
89 return false;
90 }
91
92 m_webBrowser = NULL;
93 m_canNavigateBack = false;
94 m_canNavigateForward = false;
95 m_isBusy = false;
96
97 if (::CoCreateInstance(CLSID_WebBrowser, NULL,
98 CLSCTX_INPROC_SERVER, // CLSCTX_INPROC,
99 IID_IWebBrowser2 , (void**)&m_webBrowser) != 0)
100 {
101 wxLogError("Failed to initialize IE, CoCreateInstance returned an error");
102 return false;
103 }
104
105 m_ie.SetDispatchPtr(m_webBrowser); // wxAutomationObject will release itself
106
107 m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
108 m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
109 //m_webBrowser->put_Silent(VARIANT_FALSE);
110
111 m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser);
112
113 SetBackgroundStyle(wxBG_STYLE_PAINT);
114 SetDoubleBuffered(true);
115 return true;
116 }
117
118
119 void wxWebViewIE::LoadUrl(const wxString& url)
120 {
121 wxVariant out = m_ie.CallMethod("Navigate", (BSTR) url.wc_str(),
122 NULL, NULL, NULL, NULL);
123
124 // FIXME: why is out value null??
125 //(HRESULT)(out.GetLong()) == S_OK;
126 }
127
128 void wxWebViewIE::SetPage(const wxString& html, const wxString& baseUrl)
129 {
130 LoadUrl("about:blank");
131
132 // Let the wx events generated for navigation events be processed, so
133 // that the underlying IE component completes its Document object.
134 // FIXME: calling wxYield is not elegant nor very reliable probably
135 wxYield();
136
137 wxVariant documentVariant = m_ie.GetProperty("Document");
138 void* documentPtr = documentVariant.GetVoidPtr();
139
140 wxASSERT (documentPtr != NULL);
141
142 // TODO: consider the "baseUrl" parameter if possible
143 // TODO: consider encoding
144 BSTR bstr = SysAllocString(html.wc_str());
145
146 // Creates a new one-dimensional array
147 SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
148 if (psaStrings != NULL)
149 {
150 VARIANT *param;
151 HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
152 param->vt = VT_BSTR;
153 param->bstrVal = bstr;
154
155 hr = SafeArrayUnaccessData(psaStrings);
156
157 IHTMLDocument2* document = (IHTMLDocument2*)documentPtr;
158 document->write(psaStrings);
159
160 // SafeArrayDestroy calls SysFreeString for each BSTR
161 SafeArrayDestroy(psaStrings);
162 }
163 else
164 {
165 wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
166 }
167
168 }
169
170 wxString wxWebViewIE::GetPageSource()
171 {
172 wxVariant documentVariant = m_ie.GetProperty("Document");
173 void* documentPtr = documentVariant.GetVoidPtr();
174
175 if (documentPtr == NULL)
176 {
177 return wxEmptyString;
178 }
179
180 IHTMLDocument2* document = (IHTMLDocument2*)documentPtr;
181
182 IHTMLElement *bodyTag = NULL;
183 IHTMLElement *htmlTag = NULL;
184 document->get_body(&bodyTag);
185 wxASSERT(bodyTag != NULL);
186
187 document->Release();
188 bodyTag->get_parentElement(&htmlTag);
189 wxASSERT(htmlTag != NULL);
190
191 BSTR bstr;
192 htmlTag->get_outerHTML(&bstr);
193
194 bodyTag->Release();
195 htmlTag->Release();
196
197 //wxMessageBox(wxString(bstr));
198
199 // TODO: check encoding
200 return wxString(bstr);
201 }
202
203 // FIXME? retrieve OLECMDID_GETZOOMRANGE instead of hardcoding range 0-4
204 wxWebViewZoom wxWebViewIE::GetZoom()
205 {
206 const int zoom = GetIETextZoom();
207
208 switch (zoom)
209 {
210 case 0:
211 return wxWEB_VIEW_ZOOM_TINY;
212 break;
213 case 1:
214 return wxWEB_VIEW_ZOOM_SMALL;
215 break;
216 case 2:
217 return wxWEB_VIEW_ZOOM_MEDIUM;
218 break;
219 case 3:
220 return wxWEB_VIEW_ZOOM_LARGE;
221 break;
222 case 4:
223 return wxWEB_VIEW_ZOOM_LARGEST;
224 break;
225 default:
226 wxASSERT(false);
227 return wxWEB_VIEW_ZOOM_MEDIUM;
228 }
229 }
230 void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
231 {
232 // I know I could cast from enum to int since wxWebViewZoom happens to
233 // match with IE's zoom levels, but I don't like doing that, what if enum
234 // values change...
235 switch (zoom)
236 {
237 case wxWEB_VIEW_ZOOM_TINY:
238 SetIETextZoom(0);
239 break;
240 case wxWEB_VIEW_ZOOM_SMALL:
241 SetIETextZoom(1);
242 break;
243 case wxWEB_VIEW_ZOOM_MEDIUM:
244 SetIETextZoom(2);
245 break;
246 case wxWEB_VIEW_ZOOM_LARGE:
247 SetIETextZoom(3);
248 break;
249 case wxWEB_VIEW_ZOOM_LARGEST:
250 SetIETextZoom(4);
251 break;
252 default:
253 wxASSERT(false);
254 }
255 }
256
257 void wxWebViewIE::SetIETextZoom(int level)
258 {
259 VARIANT zoomVariant;
260 VariantInit (&zoomVariant);
261 V_VT(&zoomVariant) = VT_I4;
262 V_I4(&zoomVariant) = level;
263
264 HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM,
265 OLECMDEXECOPT_DONTPROMPTUSER,
266 &zoomVariant, NULL);
267 wxASSERT (result == S_OK);
268
269 VariantClear (&zoomVariant);
270 }
271
272 int wxWebViewIE::GetIETextZoom()
273 {
274 VARIANT zoomVariant;
275 VariantInit (&zoomVariant);
276 V_VT(&zoomVariant) = VT_I4;
277 V_I4(&zoomVariant) = 4;
278
279 HRESULT result = m_webBrowser->ExecWB(OLECMDID_ZOOM,
280 OLECMDEXECOPT_DONTPROMPTUSER,
281 NULL, &zoomVariant);
282 wxASSERT (result == S_OK);
283
284 int zoom = V_I4(&zoomVariant);
285 // wxMessageBox(wxString::Format("Zoom : %i", zoom));
286 VariantClear (&zoomVariant);
287
288 return zoom;
289 }
290
291 void wxWebViewIE::SetIEOpticalZoom(float zoom)
292 {
293 // TODO: add support for optical zoom (IE7+ only)
294
295 // TODO: get range from OLECMDID_OPTICAL_GETZOOMRANGE instead of hardcoding?
296 wxASSERT(zoom >= 10.0f);
297 wxASSERT(zoom <= 1000.0f);
298
299 VARIANT zoomVariant;
300 VariantInit (&zoomVariant);
301 V_VT(&zoomVariant) = VT_I4;
302 V_I4(&zoomVariant) = (zoom * 100.0f);
303
304 HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM,
305 OLECMDEXECOPT_DODEFAULT,
306 &zoomVariant,
307 NULL);
308 wxASSERT (result == S_OK);
309 }
310
311 float wxWebViewIE::GetIEOpticalZoom()
312 {
313 // TODO: add support for optical zoom (IE7+ only)
314
315 VARIANT zoomVariant;
316 VariantInit (&zoomVariant);
317 V_VT(&zoomVariant) = VT_I4;
318 V_I4(&zoomVariant) = -1;
319
320 HRESULT result = m_webBrowser->ExecWB((OLECMDID)OLECMDID_OPTICAL_ZOOM,
321 OLECMDEXECOPT_DODEFAULT, NULL,
322 &zoomVariant);
323 wxASSERT (result == S_OK);
324
325 const int zoom = V_I4(&zoomVariant);
326 VariantClear (&zoomVariant);
327
328 return zoom / 100.0f;
329 }
330
331 void wxWebViewIE::SetZoomType(wxWebViewZoomType)
332 {
333 // TODO: add support for optical zoom (IE7+ only)
334 wxASSERT(false);
335 }
336
337 wxWebViewZoomType wxWebViewIE::GetZoomType() const
338 {
339 // TODO: add support for optical zoom (IE7+ only)
340 return wxWEB_VIEW_ZOOM_TYPE_TEXT;
341 }
342
343 bool wxWebViewIE::CanSetZoomType(wxWebViewZoomType) const
344 {
345 // both are supported
346 // TODO: IE6 only supports text zoom, check if it's IE6 first
347 return true;
348 }
349
350 void wxWebViewIE::Print()
351 {
352 m_webBrowser->ExecWB(OLECMDID_PRINTPREVIEW,
353 OLECMDEXECOPT_DODEFAULT, NULL, NULL);
354 }
355
356 void wxWebViewIE::GoBack()
357 {
358 wxVariant out = m_ie.CallMethod("GoBack");
359
360 // FIXME: why is out value null??
361 //return (HRESULT)(out.GetLong()) == S_OK;
362 }
363
364 void wxWebViewIE::GoForward()
365 {
366 wxVariant out = m_ie.CallMethod("GoForward");
367
368 // FIXME: why is out value null??
369 //return (HRESULT)(out.GetLong()) == S_OK;
370 }
371
372 void wxWebViewIE::Stop()
373 {
374 wxVariant out = m_ie.CallMethod("Stop");
375
376 // FIXME: why is out value null??
377 //return (HRESULT)(out.GetLong()) == S_OK;
378 }
379
380
381 void wxWebViewIE::Reload(wxWebViewReloadFlags flags)
382 {
383 wxVariant out;
384
385 if (flags & wxWEB_VIEW_RELOAD_NO_CACHE)
386 {
387 wxVariant level(REFRESH_COMPLETELY, "VT_I2");
388 //level = 3;
389 // VARIANTARG level;
390 // VariantInit(&level);
391 // V_VT(&level) = VT_I2;
392 // V_I2(&level) = REFRESH_COMPLETELY;
393 out = m_ie.CallMethod("Refresh2", &level);
394 }
395 else
396 {
397 out = m_ie.CallMethod("Refresh");
398 }
399
400 if (out.GetType() != "null")
401 {
402 wxMessageBox("Non-null return message : " + out.GetType());
403 }
404 }
405
406 bool wxWebViewIE::IsOfflineMode()
407 {
408 wxVariant out = m_ie.GetProperty("Offline");
409
410 wxASSERT(out.GetType() == "bool");
411
412 return out.GetBool();
413 }
414
415 void wxWebViewIE::SetOfflineMode(bool offline)
416 {
417 // FIXME: the wxWidgets docs do not really document what the return
418 // parameter of PutProperty is
419 const bool success = m_ie.PutProperty("Offline", (offline ?
420 VARIANT_TRUE :
421 VARIANT_FALSE));
422 wxASSERT(success);
423 }
424
425 bool wxWebViewIE::IsBusy()
426 {
427 if (m_isBusy) return true;
428
429 wxVariant out = m_ie.GetProperty("Busy");
430
431 wxASSERT(out.GetType() == "bool");
432
433 return out.GetBool();
434 }
435
436 wxString wxWebViewIE::GetCurrentURL()
437 {
438 wxVariant out = m_ie.GetProperty("LocationURL");
439
440 wxASSERT(out.GetType() == "string");
441 return out.GetString();
442 }
443
444 wxString wxWebViewIE::GetCurrentTitle()
445 {
446 wxVariant out = m_ie.GetProperty("LocationName");
447
448 wxASSERT(out.GetType() == "string");
449 return out.GetString();
450 }
451
452 void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt)
453 {
454 if (m_webBrowser == NULL) return;
455
456 switch (evt.GetDispatchId())
457 {
458 case DISPID_BEFORENAVIGATE2:
459 {
460 m_isBusy = true;
461
462 wxString url = evt[1].GetString();
463 wxString target = evt[3].GetString();
464
465 wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATING,
466 GetId(), url, target, true);
467 event.SetEventObject(this);
468 HandleWindowEvent(event);
469
470 if (event.IsVetoed())
471 {
472 wxActiveXEventNativeMSW* nativeParams =
473 evt.GetNativeParameters();
474 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
475 }
476
477 // at this point, either the navigation event has been cancelled
478 // and we're not busy, either it was accepted and IWebBrowser2's
479 // Busy property will be true; so we don't need our override
480 // flag anymore.
481 m_isBusy = false;
482
483 break;
484 }
485
486 case DISPID_NAVIGATECOMPLETE2:
487 {
488 wxString url = evt[1].GetString();
489 // TODO: set target parameter if possible
490 wxString target = wxEmptyString;
491 wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_NAVIGATED,
492 GetId(), url, target, false);
493 event.SetEventObject(this);
494 HandleWindowEvent(event);
495 break;
496 }
497
498 case DISPID_PROGRESSCHANGE:
499 {
500 // download progress
501 break;
502 }
503
504 case DISPID_DOCUMENTCOMPLETE:
505 {
506 wxString url = evt[1].GetString();
507 // TODO: set target parameter if possible
508 wxString target = wxEmptyString;
509 wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_LOADED, GetId(),
510 url, target, false);
511 event.SetEventObject(this);
512 HandleWindowEvent(event);
513 break;
514 }
515
516 case DISPID_STATUSTEXTCHANGE:
517 {
518 break;
519 }
520
521 case DISPID_TITLECHANGE:
522 {
523 break;
524 }
525
526 case DISPID_NAVIGATEERROR:
527 {
528 wxWebNavigationError errorType = wxWEB_NAV_ERR_OTHER;
529 wxString errorCode = "?";
530 switch (evt[3].GetLong())
531 {
532 case INET_E_INVALID_URL: // (0x800C0002L or -2146697214)
533 errorCode = "INET_E_INVALID_URL";
534 errorType = wxWEB_NAV_ERR_REQUEST;
535 break;
536 case INET_E_NO_SESSION: // (0x800C0003L or -2146697213)
537 errorCode = "INET_E_NO_SESSION";
538 errorType = wxWEB_NAV_ERR_CONNECTION;
539 break;
540 case INET_E_CANNOT_CONNECT: // (0x800C0004L or -2146697212)
541 errorCode = "INET_E_CANNOT_CONNECT";
542 errorType = wxWEB_NAV_ERR_CONNECTION;
543 break;
544 case INET_E_RESOURCE_NOT_FOUND: // (0x800C0005L or -2146697211)
545 errorCode = "INET_E_RESOURCE_NOT_FOUND";
546 errorType = wxWEB_NAV_ERR_NOT_FOUND;
547 break;
548 case INET_E_OBJECT_NOT_FOUND: // (0x800C0006L or -2146697210)
549 errorCode = "INET_E_OBJECT_NOT_FOUND";
550 errorType = wxWEB_NAV_ERR_NOT_FOUND;
551 break;
552 case INET_E_DATA_NOT_AVAILABLE: // (0x800C0007L or -2146697209)
553 errorCode = "INET_E_DATA_NOT_AVAILABLE";
554 errorType = wxWEB_NAV_ERR_NOT_FOUND;
555 break;
556 case INET_E_DOWNLOAD_FAILURE: // (0x800C0008L or -2146697208)
557 errorCode = "INET_E_DOWNLOAD_FAILURE";
558 errorType = wxWEB_NAV_ERR_CONNECTION;
559 break;
560 case INET_E_AUTHENTICATION_REQUIRED: // (0x800C0009L or -2146697207)
561 errorCode = "INET_E_AUTHENTICATION_REQUIRED";
562 errorType = wxWEB_NAV_ERR_AUTH;
563 break;
564 case INET_E_NO_VALID_MEDIA: // (0x800C000AL or -2146697206)
565 errorCode = "INET_E_NO_VALID_MEDIA";
566 errorType = wxWEB_NAV_ERR_REQUEST;
567 break;
568 case INET_E_CONNECTION_TIMEOUT: // (0x800C000BL or -2146697205)
569 errorCode = "INET_E_CONNECTION_TIMEOUT";
570 errorType = wxWEB_NAV_ERR_CONNECTION;
571 break;
572 case INET_E_INVALID_REQUEST: // (0x800C000CL or -2146697204)
573 errorCode = "INET_E_INVALID_REQUEST";
574 errorType = wxWEB_NAV_ERR_REQUEST;
575 break;
576 case INET_E_UNKNOWN_PROTOCOL: // (0x800C000DL or -2146697203)
577 errorCode = "INET_E_UNKNOWN_PROTOCOL";
578 errorType = wxWEB_NAV_ERR_REQUEST;
579 break;
580 case INET_E_SECURITY_PROBLEM: // (0x800C000EL or -2146697202)
581 errorCode = "INET_E_SECURITY_PROBLEM";
582 errorType = wxWEB_NAV_ERR_SECURITY;
583 break;
584 case INET_E_CANNOT_LOAD_DATA: // (0x800C000FL or -2146697201)
585 errorCode = "INET_E_CANNOT_LOAD_DATA";
586 errorType = wxWEB_NAV_ERR_OTHER;
587 break;
588 case INET_E_CANNOT_INSTANTIATE_OBJECT:
589 // CoCreateInstance will return an error code if this happens,
590 // we'll handle this above.
591 return;
592 break;
593 case INET_E_REDIRECT_FAILED: // (0x800C0014L or -2146697196)
594 errorCode = "INET_E_REDIRECT_FAILED";
595 errorType = wxWEB_NAV_ERR_OTHER;
596 break;
597 case INET_E_REDIRECT_TO_DIR: // (0x800C0015L or -2146697195)
598 errorCode = "INET_E_REDIRECT_TO_DIR";
599 errorType = wxWEB_NAV_ERR_REQUEST;
600 break;
601 case INET_E_CANNOT_LOCK_REQUEST: // (0x800C0016L or -2146697194)
602 errorCode = "INET_E_CANNOT_LOCK_REQUEST";
603 errorType = wxWEB_NAV_ERR_OTHER;
604 break;
605 case INET_E_USE_EXTEND_BINDING: // (0x800C0017L or -2146697193)
606 errorCode = "INET_E_USE_EXTEND_BINDING";
607 errorType = wxWEB_NAV_ERR_OTHER;
608 break;
609 case INET_E_TERMINATED_BIND: // (0x800C0018L or -2146697192)
610 errorCode = "INET_E_TERMINATED_BIND";
611 errorType = wxWEB_NAV_ERR_OTHER;
612 break;
613 case INET_E_INVALID_CERTIFICATE: // (0x800C0019L or -2146697191)
614 errorCode = "INET_E_INVALID_CERTIFICATE";
615 errorType = wxWEB_NAV_ERR_CERTIFICATE;
616 break;
617 case INET_E_CODE_DOWNLOAD_DECLINED: // (0x800C0100L or -2146696960)
618 errorCode = "INET_E_CODE_DOWNLOAD_DECLINED";
619 errorType = wxWEB_NAV_ERR_USER_CANCELLED;
620 break;
621 case INET_E_RESULT_DISPATCHED: // (0x800C0200L or -2146696704)
622 // cancel request cancelled...
623 errorCode = "INET_E_RESULT_DISPATCHED";
624 errorType = wxWEB_NAV_ERR_OTHER;
625 break;
626 case INET_E_CANNOT_REPLACE_SFP_FILE: // (0x800C0300L or -2146696448)
627 errorCode = "INET_E_CANNOT_REPLACE_SFP_FILE";
628 errorType = wxWEB_NAV_ERR_SECURITY;
629 break;
630 case INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY:
631 errorCode = "INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY";
632 errorType = wxWEB_NAV_ERR_SECURITY;
633 break;
634 case INET_E_CODE_INSTALL_SUPPRESSED:
635 errorCode = "INET_E_CODE_INSTALL_SUPPRESSED";
636 errorType = wxWEB_NAV_ERR_SECURITY;
637 break;
638 }
639
640 wxString url = evt[1].GetString();
641 wxString target = evt[2].GetString();
642 wxWebNavigationEvent event(wxEVT_COMMAND_WEB_VIEW_ERROR, GetId(),
643 url, target, false);
644 event.SetEventObject(this);
645 event.SetInt(errorType);
646 event.SetString(errorCode);
647 HandleWindowEvent(event);
648 break;
649 }
650
651 case DISPID_COMMANDSTATECHANGE:
652 {
653 long commandId = evt[0].GetLong();
654 bool enable = evt[1].GetBool();
655 if (commandId == CSC_NAVIGATEBACK)
656 {
657 m_canNavigateBack = enable;
658 }
659 else if (commandId == CSC_NAVIGATEFORWARD)
660 {
661 m_canNavigateForward = enable;
662 }
663 }
664
665 /*
666 case DISPID_NEWWINDOW2:
667 //case DISPID_NEWWINDOW3:
668 {
669 wxLogMessage("DISPID_NEWWINDOW2\n");
670 wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters();
671 // Cancel the attempt to open a new window
672 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
673 }*/
674 }
675
676 evt.Skip();
677 }
678
679 #endif