]> git.saurik.com Git - wxWidgets.git/blame - src/msw/webview_ie.cpp
No real changes, just refactor wxControlContainer code a little.
[wxWidgets.git] / src / msw / webview_ie.cpp
CommitLineData
61b98a2d 1/////////////////////////////////////////////////////////////////////////////
8290e3cd 2// Name: src/msw/webview_ie.cpp
61b98a2d
SL
3// Purpose: wxMSW wxWebViewIE class implementation for web view component
4// Author: Marianne Gagnon
5// Id: $Id$
153530af 6// Copyright: (c) 2010 Marianne Gagnon, 2011 Steven Lamerton
61b98a2d
SL
7// Licence: wxWindows licence
8/////////////////////////////////////////////////////////////////////////////
9
384b8d9f
SL
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
8290e3cd 17#include "wx/msw/webview_ie.h"
61b98a2d 18
9d2f31db 19#if wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE
61b98a2d
SL
20
21#include <olectl.h>
22#include <oleidl.h>
23#include <exdispid.h>
24#include <exdisp.h>
25#include <mshtml.h>
cd4e4673 26#include "wx/msw/registry.h"
1d7d04d7 27#include "wx/msw/missing.h"
7d3f6b4d 28#include "wx/filesys.h"
e924e848 29#include "wx/dynlib.h"
f559d1a2 30#include <initguid.h>
c1381581 31#include <wininet.h>
f559d1a2
VZ
32
33/* These GUID definitions are our own implementation to support interfaces
34 * normally in urlmon.h. See include/wx/msw/webview_ie.h
35 */
36
37namespace {
38
39DEFINE_GUID(wxIID_IInternetProtocolRoot,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
40DEFINE_GUID(wxIID_IInternetProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
accc94d5 41DEFINE_GUID(wxIID_IDocHostUIHandler, 0xbd3f23c0, 0xd43e, 0x11cf, 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a);
e52aec97
SL
42DEFINE_GUID(wxIID_IHTMLElement2,0x3050f434,0x98b5,0x11cf,0xbb,0x82,0,0xaa,0,0xbd,0xce,0x0b);
43DEFINE_GUID(wxIID_IMarkupServices,0x3050f4a0,0x98b5,0x11cf,0xbb,0x82,0,0xaa,0,0xbd,0xce,0x0b);
44DEFINE_GUID(wxIID_IMarkupContainer,0x3050f5f9,0x98b5,0x11cf,0xbb,0x82,0,0xaa,0,0xbd,0xce,0x0b);
f559d1a2 45
66ac0400
SL
46enum //Internal find flags
47{
236cff73
SL
48 wxWEBVIEW_FIND_ADD_POINTERS = 0x0001,
49 wxWEBVIEW_FIND_REMOVE_HIGHLIGHT = 0x0002
66ac0400
SL
50};
51
f559d1a2 52}
7d3f6b4d 53
c1381581
SL
54//Convenience function for error conversion
55#define WX_ERROR_CASE(error, wxerror) \
56 case error: \
57 event.SetString(#error); \
58 event.SetInt(wxerror); \
59 break;
60
cddf4541
SL
61wxIMPLEMENT_DYNAMIC_CLASS(wxWebViewIE, wxWebView);
62
61b98a2d 63BEGIN_EVENT_TABLE(wxWebViewIE, wxControl)
97ad1425
SL
64 EVT_ACTIVEX(wxID_ANY, wxWebViewIE::onActiveXEvent)
65 EVT_ERASE_BACKGROUND(wxWebViewIE::onEraseBg)
61b98a2d
SL
66END_EVENT_TABLE()
67
68bool wxWebViewIE::Create(wxWindow* parent,
69 wxWindowID id,
70 const wxString& url,
71 const wxPoint& pos,
72 const wxSize& size,
73 long style,
74 const wxString& name)
75{
76 if (!wxControl::Create(parent, id, pos, size, style,
77 wxDefaultValidator, name))
78 {
79 return false;
80 }
81
82 m_webBrowser = NULL;
61b98a2d 83 m_isBusy = false;
74af0b13
SL
84 m_historyLoadingFromList = false;
85 m_historyEnabled = true;
86 m_historyPosition = -1;
236cff73 87 m_zoomType = wxWEBVIEW_ZOOM_TYPE_TEXT;
66ac0400 88 FindClear();
61b98a2d
SL
89
90 if (::CoCreateInstance(CLSID_WebBrowser, NULL,
91 CLSCTX_INPROC_SERVER, // CLSCTX_INPROC,
92 IID_IWebBrowser2 , (void**)&m_webBrowser) != 0)
93 {
94 wxLogError("Failed to initialize IE, CoCreateInstance returned an error");
95 return false;
96 }
97
98 m_ie.SetDispatchPtr(m_webBrowser); // wxAutomationObject will release itself
99
100 m_webBrowser->put_RegisterAsBrowser(VARIANT_TRUE);
101 m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
61b98a2d 102
c420d57b 103 m_uiHandler = new DocHostUIHandler(this);
accc94d5
SL
104
105 m_container = new wxIEContainer(this, IID_IWebBrowser2, m_webBrowser, m_uiHandler);
61b98a2d 106
9447a0d6
SL
107 EnableControlFeature(21 /* FEATURE_DISABLE_NAVIGATION_SOUNDS */);
108
4d0dddc7 109 LoadURL(url);
61b98a2d
SL
110 return true;
111}
112
39498710
SL
113wxWebViewIE::~wxWebViewIE()
114{
8626e0b7
SL
115 wxDynamicLibrary urlMon(wxT("urlmon.dll"));
116 if(urlMon.HasSymbol(wxT("CoInternetGetSession")))
39498710 117 {
8626e0b7
SL
118 typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD,
119 wxIInternetSession**,
120 DWORD);
121 wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon);
122
123 wxIInternetSession* session;
124 HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0);
125 if(FAILED(res))
126 {
127 wxFAIL_MSG("Could not retrive internet session");
128 }
129
130 for(unsigned int i = 0; i < m_factories.size(); i++)
131 {
132 session->UnregisterNameSpace(m_factories[i],
133 (m_factories[i]->GetName()).wc_str());
134 m_factories[i]->Release();
135 }
39498710 136 }
66ac0400 137 FindClear();
39498710 138}
61b98a2d 139
4d0dddc7 140void wxWebViewIE::LoadURL(const wxString& url)
61b98a2d 141{
e8d243a9 142 m_ie.CallMethod("Navigate", wxConvertStringToOle(url));
61b98a2d
SL
143}
144
a977376a 145void wxWebViewIE::DoSetPage(const wxString& html, const wxString& baseUrl)
61b98a2d 146{
7f98bdd6 147 BSTR bstr = SysAllocString(OLESTR(""));
61b98a2d
SL
148 SAFEARRAY *psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
149 if (psaStrings != NULL)
150 {
151 VARIANT *param;
152 HRESULT hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
153 param->vt = VT_BSTR;
154 param->bstrVal = bstr;
442262d4 155
7f98bdd6 156 hr = SafeArrayUnaccessData(psaStrings);
accc94d5 157
f40f8e17 158 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
159
160 if(!document)
161 return;
162
61b98a2d 163 document->write(psaStrings);
7f98bdd6 164 document->close();
61b98a2d 165
61b98a2d 166 SafeArrayDestroy(psaStrings);
442262d4 167
7f98bdd6
SL
168 bstr = SysAllocString(html.wc_str());
169
170 // Creates a new one-dimensional array
171 psaStrings = SafeArrayCreateVector(VT_VARIANT, 0, 1);
172 if (psaStrings != NULL)
173 {
174 hr = SafeArrayAccessData(psaStrings, (LPVOID*)&param);
175 param->vt = VT_BSTR;
176 param->bstrVal = bstr;
177 hr = SafeArrayUnaccessData(psaStrings);
178
179 document = GetDocument();
e81ef297
SL
180
181 if(!document)
182 return;
183
7f98bdd6 184 document->write(psaStrings);
7f98bdd6
SL
185
186 // SafeArrayDestroy calls SysFreeString for each BSTR
187 SafeArrayDestroy(psaStrings);
188
189 //We send the events when we are done to mimic webkit
190 //Navigated event
ce7fe42e 191 wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATED,
7f98bdd6
SL
192 GetId(), baseUrl, "");
193 event.SetEventObject(this);
194 HandleWindowEvent(event);
195
196 //Document complete event
ce7fe42e 197 event.SetEventType(wxEVT_WEBVIEW_LOADED);
7f98bdd6
SL
198 event.SetEventObject(this);
199 HandleWindowEvent(event);
200 }
201 else
202 {
203 wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL");
204 }
61b98a2d
SL
205 }
206 else
207 {
7f98bdd6 208 wxLogError("wxWebViewIE::SetPage() : psaStrings is NULL during clear");
61b98a2d 209 }
61b98a2d
SL
210}
211
e669ddde 212wxString wxWebViewIE::GetPageSource() const
61b98a2d 213{
f40f8e17 214 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
215
216 if(document)
7fbc727b 217 {
f40f8e17
SL
218 wxCOMPtr<IHTMLElement> bodyTag;
219 wxCOMPtr<IHTMLElement> htmlTag;
e81ef297
SL
220 wxString source;
221 HRESULT hr = document->get_body(&bodyTag);
7fbc727b
SL
222 if(SUCCEEDED(hr))
223 {
e81ef297
SL
224 hr = bodyTag->get_parentElement(&htmlTag);
225 if(SUCCEEDED(hr))
226 {
227 BSTR bstr;
228 htmlTag->get_outerHTML(&bstr);
229 source = wxString(bstr);
e81ef297 230 }
7fbc727b 231 }
e81ef297
SL
232 return source;
233 }
234 else
235 {
236 return "";
237 }
61b98a2d
SL
238}
239
e669ddde 240wxWebViewZoom wxWebViewIE::GetZoom() const
61b98a2d 241{
8acbf08b
SL
242 switch( m_zoomType )
243 {
236cff73 244 case wxWEBVIEW_ZOOM_TYPE_LAYOUT:
8acbf08b 245 return GetIEOpticalZoom();
236cff73 246 case wxWEBVIEW_ZOOM_TYPE_TEXT:
8acbf08b
SL
247 return GetIETextZoom();
248 default:
249 wxFAIL;
250 }
423adfde
SL
251
252 //Dummy return to stop compiler warnings
236cff73 253 return wxWEBVIEW_ZOOM_MEDIUM;
1d7d04d7 254
61b98a2d 255}
c5f417cb 256
61b98a2d
SL
257void wxWebViewIE::SetZoom(wxWebViewZoom zoom)
258{
8acbf08b
SL
259 switch( m_zoomType )
260 {
236cff73 261 case wxWEBVIEW_ZOOM_TYPE_LAYOUT:
8acbf08b
SL
262 SetIEOpticalZoom(zoom);
263 break;
236cff73 264 case wxWEBVIEW_ZOOM_TYPE_TEXT:
8acbf08b
SL
265 SetIETextZoom(zoom);
266 break;
267 default:
268 wxFAIL;
269 }
61b98a2d
SL
270}
271
c5f417cb 272void wxWebViewIE::SetIETextZoom(wxWebViewZoom level)
61b98a2d 273{
1d7d04d7 274 //We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
c5f417cb
SL
275 //is 0 to 4 so the check is unnecessary, these match exactly with the
276 //enum values
61b98a2d
SL
277 VARIANT zoomVariant;
278 VariantInit (&zoomVariant);
279 V_VT(&zoomVariant) = VT_I4;
280 V_I4(&zoomVariant) = level;
281
8acbf08b
SL
282#if wxDEBUG_LEVEL
283 HRESULT result =
284#endif
285 m_webBrowser->ExecWB(OLECMDID_ZOOM,
286 OLECMDEXECOPT_DONTPROMPTUSER,
287 &zoomVariant, NULL);
c5f417cb 288 wxASSERT(result == S_OK);
61b98a2d
SL
289}
290
e669ddde 291wxWebViewZoom wxWebViewIE::GetIETextZoom() const
61b98a2d
SL
292{
293 VARIANT zoomVariant;
294 VariantInit (&zoomVariant);
295 V_VT(&zoomVariant) = VT_I4;
61b98a2d 296
8acbf08b
SL
297#if wxDEBUG_LEVEL
298 HRESULT result =
299#endif
300 m_webBrowser->ExecWB(OLECMDID_ZOOM,
301 OLECMDEXECOPT_DONTPROMPTUSER,
302 NULL, &zoomVariant);
c5f417cb 303 wxASSERT(result == S_OK);
61b98a2d 304
c5f417cb
SL
305 //We can safely cast here as we know that the range matches our enum
306 return static_cast<wxWebViewZoom>(V_I4(&zoomVariant));
61b98a2d
SL
307}
308
c5f417cb 309void wxWebViewIE::SetIEOpticalZoom(wxWebViewZoom level)
61b98a2d 310{
1d7d04d7 311 //We do not use OLECMDID_OPTICAL_GETZOOMRANGE as the docs say the range
c5f417cb 312 //is 10 to 1000 so the check is unnecessary
61b98a2d
SL
313 VARIANT zoomVariant;
314 VariantInit (&zoomVariant);
315 V_VT(&zoomVariant) = VT_I4;
c5f417cb
SL
316
317 //We make a somewhat arbitray map here, taken from values used by webkit
318 switch(level)
319 {
236cff73 320 case wxWEBVIEW_ZOOM_TINY:
c5f417cb
SL
321 V_I4(&zoomVariant) = 60;
322 break;
236cff73 323 case wxWEBVIEW_ZOOM_SMALL:
c5f417cb
SL
324 V_I4(&zoomVariant) = 80;
325 break;
236cff73 326 case wxWEBVIEW_ZOOM_MEDIUM:
c5f417cb
SL
327 V_I4(&zoomVariant) = 100;
328 break;
236cff73 329 case wxWEBVIEW_ZOOM_LARGE:
c5f417cb
SL
330 V_I4(&zoomVariant) = 130;
331 break;
236cff73 332 case wxWEBVIEW_ZOOM_LARGEST:
c5f417cb
SL
333 V_I4(&zoomVariant) = 160;
334 break;
335 default:
336 wxFAIL;
337 }
61b98a2d 338
8acbf08b
SL
339#if wxDEBUG_LEVEL
340 HRESULT result =
341#endif
342 m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
343 OLECMDEXECOPT_DODEFAULT,
344 &zoomVariant,
345 NULL);
c5f417cb 346 wxASSERT(result == S_OK);
61b98a2d
SL
347}
348
e669ddde 349wxWebViewZoom wxWebViewIE::GetIEOpticalZoom() const
61b98a2d 350{
61b98a2d
SL
351 VARIANT zoomVariant;
352 VariantInit (&zoomVariant);
353 V_VT(&zoomVariant) = VT_I4;
61b98a2d 354
8acbf08b
SL
355#if wxDEBUG_LEVEL
356 HRESULT result =
357#endif
358 m_webBrowser->ExecWB((OLECMDID)63 /*OLECMDID_OPTICAL_ZOOM*/,
359 OLECMDEXECOPT_DODEFAULT, NULL,
360 &zoomVariant);
c5f417cb 361 wxASSERT(result == S_OK);
61b98a2d
SL
362
363 const int zoom = V_I4(&zoomVariant);
61b98a2d 364
c5f417cb
SL
365 //We make a somewhat arbitray map here, taken from values used by webkit
366 if (zoom <= 65)
367 {
236cff73 368 return wxWEBVIEW_ZOOM_TINY;
c5f417cb
SL
369 }
370 else if (zoom > 65 && zoom <= 90)
371 {
236cff73 372 return wxWEBVIEW_ZOOM_SMALL;
c5f417cb
SL
373 }
374 else if (zoom > 90 && zoom <= 115)
375 {
236cff73 376 return wxWEBVIEW_ZOOM_MEDIUM;
c5f417cb
SL
377 }
378 else if (zoom > 115 && zoom <= 145)
379 {
236cff73 380 return wxWEBVIEW_ZOOM_LARGE;
c5f417cb 381 }
423adfde 382 else /*if (zoom > 145) */ //Using else removes a compiler warning
c5f417cb 383 {
236cff73 384 return wxWEBVIEW_ZOOM_LARGEST;
c5f417cb 385 }
61b98a2d
SL
386}
387
c5f417cb 388void wxWebViewIE::SetZoomType(wxWebViewZoomType type)
61b98a2d 389{
c5f417cb 390 m_zoomType = type;
61b98a2d
SL
391}
392
393wxWebViewZoomType wxWebViewIE::GetZoomType() const
394{
c5f417cb 395 return m_zoomType;
61b98a2d
SL
396}
397
cd4e4673 398bool wxWebViewIE::CanSetZoomType(wxWebViewZoomType type) const
61b98a2d 399{
cd4e4673
SL
400 //IE 6 and below only support text zoom, so check the registry to see what
401 //version we actually have
402 wxRegKey key(wxRegKey::HKLM, "Software\\Microsoft\\Internet Explorer");
403 wxString value;
404 key.QueryValue("Version", value);
405
406 long version = wxAtoi(value.Left(1));
236cff73 407 if(version <= 6 && type == wxWEBVIEW_ZOOM_TYPE_LAYOUT)
cd4e4673
SL
408 return false;
409 else
410 return true;
61b98a2d
SL
411}
412
413void wxWebViewIE::Print()
414{
415 m_webBrowser->ExecWB(OLECMDID_PRINTPREVIEW,
416 OLECMDEXECOPT_DODEFAULT, NULL, NULL);
417}
418
e669ddde 419bool wxWebViewIE::CanGoBack() const
61b98a2d 420{
74af0b13
SL
421 if(m_historyEnabled)
422 return m_historyPosition > 0;
423 else
424 return false;
425}
61b98a2d 426
e669ddde 427bool wxWebViewIE::CanGoForward() const
74af0b13
SL
428{
429 if(m_historyEnabled)
22ca10fa 430 return m_historyPosition != static_cast<int>(m_historyList.size()) - 1;
74af0b13
SL
431 else
432 return false;
61b98a2d
SL
433}
434
c13d6ac1 435void wxWebViewIE::LoadHistoryItem(wxSharedPtr<wxWebViewHistoryItem> item)
61b98a2d 436{
74af0b13
SL
437 int pos = -1;
438 for(unsigned int i = 0; i < m_historyList.size(); i++)
439 {
3e7968c2
SL
440 //We compare the actual pointers to find the correct item
441 if(m_historyList[i].get() == item.get())
74af0b13
SL
442 pos = i;
443 }
1d7d04d7 444 wxASSERT_MSG(pos != static_cast<int>(m_historyList.size()),
22ca10fa 445 "invalid history item");
74af0b13 446 m_historyLoadingFromList = true;
4d0dddc7 447 LoadURL(item->GetUrl());
74af0b13
SL
448 m_historyPosition = pos;
449}
61b98a2d 450
c13d6ac1 451wxVector<wxSharedPtr<wxWebViewHistoryItem> > wxWebViewIE::GetBackwardHistory()
5cbda74b 452{
c13d6ac1 453 wxVector<wxSharedPtr<wxWebViewHistoryItem> > backhist;
5cbda74b
SL
454 //As we don't have std::copy or an iterator constructor in the wxwidgets
455 //native vector we construct it by hand
456 for(int i = 0; i < m_historyPosition; i++)
457 {
458 backhist.push_back(m_historyList[i]);
459 }
460 return backhist;
461}
462
c13d6ac1 463wxVector<wxSharedPtr<wxWebViewHistoryItem> > wxWebViewIE::GetForwardHistory()
5cbda74b 464{
c13d6ac1 465 wxVector<wxSharedPtr<wxWebViewHistoryItem> > forwardhist;
5cbda74b
SL
466 //As we don't have std::copy or an iterator constructor in the wxwidgets
467 //native vector we construct it by hand
22ca10fa 468 for(int i = m_historyPosition + 1; i < static_cast<int>(m_historyList.size()); i++)
5cbda74b
SL
469 {
470 forwardhist.push_back(m_historyList[i]);
471 }
472 return forwardhist;
473}
474
74af0b13
SL
475void wxWebViewIE::GoBack()
476{
3e7968c2 477 LoadHistoryItem(m_historyList[m_historyPosition - 1]);
74af0b13
SL
478}
479
480void wxWebViewIE::GoForward()
481{
3e7968c2 482 LoadHistoryItem(m_historyList[m_historyPosition + 1]);
61b98a2d
SL
483}
484
485void wxWebViewIE::Stop()
486{
7fbc727b 487 m_ie.CallMethod("Stop");
61b98a2d
SL
488}
489
74af0b13
SL
490void wxWebViewIE::ClearHistory()
491{
492 m_historyList.clear();
493 m_historyPosition = -1;
494}
495
496void wxWebViewIE::EnableHistory(bool enable)
497{
498 m_historyEnabled = enable;
499 m_historyList.clear();
500 m_historyPosition = -1;
501}
61b98a2d
SL
502
503void wxWebViewIE::Reload(wxWebViewReloadFlags flags)
504{
7aa18fc7
SL
505 VARIANTARG level;
506 VariantInit(&level);
507 V_VT(&level) = VT_I2;
61b98a2d 508
7aa18fc7 509 switch(flags)
61b98a2d 510 {
236cff73 511 case wxWEBVIEW_RELOAD_DEFAULT:
7aa18fc7
SL
512 V_I2(&level) = REFRESH_NORMAL;
513 break;
236cff73 514 case wxWEBVIEW_RELOAD_NO_CACHE:
7aa18fc7
SL
515 V_I2(&level) = REFRESH_COMPLETELY;
516 break;
517 default:
518 wxFAIL_MSG("Unexpected reload type");
61b98a2d
SL
519 }
520
7aa18fc7 521 m_webBrowser->Refresh2(&level);
61b98a2d
SL
522}
523
524bool wxWebViewIE::IsOfflineMode()
525{
526 wxVariant out = m_ie.GetProperty("Offline");
527
528 wxASSERT(out.GetType() == "bool");
529
530 return out.GetBool();
531}
532
533void wxWebViewIE::SetOfflineMode(bool offline)
534{
535 // FIXME: the wxWidgets docs do not really document what the return
536 // parameter of PutProperty is
8acbf08b
SL
537#if wxDEBUG_LEVEL
538 const bool success =
539#endif
540 m_ie.PutProperty("Offline", (offline ?
541 VARIANT_TRUE :
542 VARIANT_FALSE));
61b98a2d
SL
543 wxASSERT(success);
544}
545
e669ddde 546bool wxWebViewIE::IsBusy() const
60eabdbe 547{
61b98a2d
SL
548 if (m_isBusy) return true;
549
550 wxVariant out = m_ie.GetProperty("Busy");
551
552 wxASSERT(out.GetType() == "bool");
553
554 return out.GetBool();
555}
556
e669ddde 557wxString wxWebViewIE::GetCurrentURL() const
61b98a2d
SL
558{
559 wxVariant out = m_ie.GetProperty("LocationURL");
560
561 wxASSERT(out.GetType() == "string");
562 return out.GetString();
563}
564
e669ddde 565wxString wxWebViewIE::GetCurrentTitle() const
61b98a2d 566{
f40f8e17 567 wxCOMPtr<IHTMLDocument2> document(GetDocument());
7fbc727b 568
e81ef297
SL
569 if(document)
570 {
571 BSTR title;
572 document->get_nameProp(&title);
e81ef297
SL
573 return wxString(title);
574 }
575 else
576 {
577 return "";
578 }
61b98a2d
SL
579}
580
e669ddde 581bool wxWebViewIE::CanCut() const
4681a3ea
SL
582{
583 return CanExecCommand("Cut");
584}
585
e669ddde 586bool wxWebViewIE::CanCopy() const
4681a3ea
SL
587{
588 return CanExecCommand("Copy");
589}
34326da7 590
e669ddde 591bool wxWebViewIE::CanPaste() const
4681a3ea
SL
592{
593 return CanExecCommand("Paste");
594}
595
596void wxWebViewIE::Cut()
597{
598 ExecCommand("Cut");
599}
600
601void wxWebViewIE::Copy()
602{
603 ExecCommand("Copy");
604}
605
606void wxWebViewIE::Paste()
607{
608 ExecCommand("Paste");
609}
610
e669ddde 611bool wxWebViewIE::CanUndo() const
97e49559
SL
612{
613 return CanExecCommand("Undo");
614}
34326da7 615
e669ddde 616bool wxWebViewIE::CanRedo() const
97e49559
SL
617{
618 return CanExecCommand("Redo");
619}
620
621void wxWebViewIE::Undo()
622{
623 ExecCommand("Undo");
624}
625
626void wxWebViewIE::Redo()
627{
628 ExecCommand("Redo");
629}
630
66ac0400
SL
631long wxWebViewIE::Find(const wxString& text, int flags)
632{
633 //If the text is empty then we clear.
634 if(text.IsEmpty())
635 {
636 ClearSelection();
236cff73 637 if(m_findFlags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT)
66ac0400 638 {
236cff73 639 FindInternal(m_findText, (m_findFlags &~ wxWEBVIEW_FIND_HIGHLIGHT_RESULT), wxWEBVIEW_FIND_REMOVE_HIGHLIGHT);
66ac0400
SL
640 }
641 FindClear();
642 return wxNOT_FOUND;
643 }
644 //Have we done this search before?
645 if(m_findText == text)
646 {
647 //Just do a highlight?
236cff73 648 if((flags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT) != (m_findFlags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT))
66ac0400
SL
649 {
650 m_findFlags = flags;
651 if(!m_findPointers.empty())
652 {
236cff73 653 FindInternal(m_findText, m_findFlags, ((flags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT) == 0 ? wxWEBVIEW_FIND_REMOVE_HIGHLIGHT : 0));
66ac0400
SL
654 }
655 return m_findPosition;
656 }
236cff73 657 else if(((m_findFlags & wxWEBVIEW_FIND_ENTIRE_WORD) == (flags & wxWEBVIEW_FIND_ENTIRE_WORD)) && ((m_findFlags & wxWEBVIEW_FIND_MATCH_CASE) == (flags&wxWEBVIEW_FIND_MATCH_CASE)))
66ac0400
SL
658 {
659 m_findFlags = flags;
236cff73 660 return FindNext(((flags & wxWEBVIEW_FIND_BACKWARDS) ? -1 : 1));
66ac0400
SL
661 }
662 }
663 //Remove old highlight if any.
236cff73 664 if(m_findFlags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT)
66ac0400 665 {
236cff73 666 FindInternal(m_findText, (m_findFlags &~ wxWEBVIEW_FIND_HIGHLIGHT_RESULT), wxWEBVIEW_FIND_REMOVE_HIGHLIGHT);
66ac0400
SL
667 }
668 //Reset find variables.
669 FindClear();
670 ClearSelection();
671 m_findText = text;
672 m_findFlags = flags;
1b48beaa 673 //find the text and return wxNOT_FOUND if there are no matches.
236cff73 674 FindInternal(text, flags, wxWEBVIEW_FIND_ADD_POINTERS);
1b48beaa
VZ
675 if(m_findPointers.empty())
676 return wxNOT_FOUND;
677
678 // Or their number if there are.
679 return m_findPointers.size();
66ac0400
SL
680}
681
c7cbe308
SL
682void wxWebViewIE::SetEditable(bool enable)
683{
f40f8e17 684 wxCOMPtr<IHTMLDocument2> document(GetDocument());
7fbc727b 685
e81ef297
SL
686 if(document)
687 {
688 if( enable )
689 document->put_designMode(SysAllocString(L"On"));
690 else
691 document->put_designMode(SysAllocString(L"Off"));
692
e81ef297 693 }
c7cbe308
SL
694}
695
e669ddde 696bool wxWebViewIE::IsEditable() const
c7cbe308 697{
f40f8e17 698 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
699
700 if(document)
701 {
702 BSTR mode;
703 document->get_designMode(&mode);
e81ef297
SL
704 if(wxString(mode) == "On")
705 return true;
706 else
707 return false;
708 }
c7cbe308 709 else
e81ef297 710 {
c7cbe308 711 return false;
e81ef297 712 }
c7cbe308
SL
713}
714
63a65070
SL
715void wxWebViewIE::SelectAll()
716{
717 ExecCommand("SelectAll");
718}
719
e669ddde 720bool wxWebViewIE::HasSelection() const
63a65070 721{
f40f8e17 722 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
723
724 if(document)
7fbc727b 725 {
f40f8e17 726 wxCOMPtr<IHTMLSelectionObject> selection;
e81ef297
SL
727 wxString sel;
728 HRESULT hr = document->get_selection(&selection);
729 if(SUCCEEDED(hr))
730 {
731 BSTR type;
732 selection->get_type(&type);
733 sel = wxString(type);
e81ef297 734 }
e81ef297
SL
735 return sel != "None";
736 }
737 else
738 {
739 return false;
7fbc727b 740 }
63a65070
SL
741}
742
743void wxWebViewIE::DeleteSelection()
744{
745 ExecCommand("Delete");
746}
747
e669ddde 748wxString wxWebViewIE::GetSelectedText() const
c9355a3d 749{
f40f8e17 750 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
751
752 if(document)
c9355a3d 753 {
f40f8e17 754 wxCOMPtr<IHTMLSelectionObject> selection;
e81ef297
SL
755 wxString selected;
756 HRESULT hr = document->get_selection(&selection);
c9355a3d
SL
757 if(SUCCEEDED(hr))
758 {
f40f8e17 759 wxCOMPtr<IDispatch> disrange;
e81ef297 760 hr = selection->createRange(&disrange);
c9355a3d
SL
761 if(SUCCEEDED(hr))
762 {
f40f8e17 763 wxCOMPtr<IHTMLTxtRange> range;
e81ef297
SL
764 hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
765 if(SUCCEEDED(hr))
766 {
767 BSTR text;
768 range->get_text(&text);
769 selected = wxString(text);
e81ef297 770 }
c9355a3d 771 }
c9355a3d 772 }
e81ef297
SL
773 return selected;
774 }
775 else
776 {
777 return "";
c9355a3d 778 }
c9355a3d
SL
779}
780
e669ddde 781wxString wxWebViewIE::GetSelectedSource() const
0fe8a1b6 782{
f40f8e17 783 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
784
785 if(document)
0fe8a1b6 786 {
f40f8e17 787 wxCOMPtr<IHTMLSelectionObject> selection;
e81ef297
SL
788 wxString selected;
789 HRESULT hr = document->get_selection(&selection);
0fe8a1b6
SL
790 if(SUCCEEDED(hr))
791 {
f40f8e17 792 wxCOMPtr<IDispatch> disrange;
e81ef297 793 hr = selection->createRange(&disrange);
0fe8a1b6
SL
794 if(SUCCEEDED(hr))
795 {
f40f8e17 796 wxCOMPtr<IHTMLTxtRange> range;
e81ef297
SL
797 hr = disrange->QueryInterface(IID_IHTMLTxtRange, (void**)&range);
798 if(SUCCEEDED(hr))
799 {
800 BSTR text;
801 range->get_htmlText(&text);
802 selected = wxString(text);
e81ef297 803 }
0fe8a1b6 804 }
0fe8a1b6 805 }
e81ef297
SL
806 return selected;
807 }
808 else
809 {
810 return "";
0fe8a1b6 811 }
0fe8a1b6
SL
812}
813
41933aa5
SL
814void wxWebViewIE::ClearSelection()
815{
f40f8e17 816 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
817
818 if(document)
41933aa5 819 {
f40f8e17 820 wxCOMPtr<IHTMLSelectionObject> selection;
e81ef297
SL
821 wxString selected;
822 HRESULT hr = document->get_selection(&selection);
823 if(SUCCEEDED(hr))
824 {
825 selection->empty();
e81ef297 826 }
41933aa5 827 }
41933aa5
SL
828}
829
e669ddde 830wxString wxWebViewIE::GetPageText() const
241b769f 831{
f40f8e17 832 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
833
834 if(document)
241b769f 835 {
e81ef297 836 wxString text;
f40f8e17 837 wxCOMPtr<IHTMLElement> body;
e81ef297
SL
838 HRESULT hr = document->get_body(&body);
839 if(SUCCEEDED(hr))
840 {
841 BSTR out;
842 body->get_innerText(&out);
843 text = wxString(out);
e81ef297 844 }
e81ef297
SL
845 return text;
846 }
847 else
848 {
849 return "";
241b769f 850 }
241b769f
SL
851}
852
c9ccc09c
SL
853void wxWebViewIE::RunScript(const wxString& javascript)
854{
f40f8e17 855 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
856
857 if(document)
c9ccc09c 858 {
f40f8e17 859 wxCOMPtr<IHTMLWindow2> window;
e81ef297
SL
860 wxString language = "javascript";
861 HRESULT hr = document->get_parentWindow(&window);
862 if(SUCCEEDED(hr))
863 {
864 VARIANT level;
865 VariantInit(&level);
866 V_VT(&level) = VT_EMPTY;
867 window->execScript(SysAllocString(javascript.wc_str()),
868 SysAllocString(language.wc_str()),
869 &level);
870 }
c9ccc09c 871 }
c9ccc09c
SL
872}
873
7d8d6163 874void wxWebViewIE::RegisterHandler(wxSharedPtr<wxWebViewHandler> handler)
29365629 875{
e924e848
SL
876 wxDynamicLibrary urlMon(wxT("urlmon.dll"));
877 if(urlMon.HasSymbol(wxT("CoInternetGetSession")))
29365629 878 {
f559d1a2 879 typedef HRESULT (WINAPI *CoInternetGetSession_t)(DWORD, wxIInternetSession**, DWORD);
e924e848
SL
880 wxDYNLIB_FUNCTION(CoInternetGetSession_t, CoInternetGetSession, urlMon);
881
882 ClassFactory* cf = new ClassFactory(handler);
f559d1a2 883 wxIInternetSession* session;
e924e848
SL
884 HRESULT res = (*pfnCoInternetGetSession)(0, &session, 0);
885 if(FAILED(res))
886 {
887 wxFAIL_MSG("Could not retrive internet session");
888 }
29365629 889
c9a828e7
VZ
890 HRESULT hr = session->RegisterNameSpace(cf, CLSID_FileProtocol,
891 handler->GetName().wc_str(),
892 0, NULL, 0);
e924e848
SL
893 if(FAILED(hr))
894 {
895 wxFAIL_MSG("Could not register protocol");
896 }
39498710 897 m_factories.push_back(cf);
e924e848
SL
898 }
899 else
29365629 900 {
e924e848 901 wxFAIL_MSG("urlmon does not contain CoInternetGetSession");
29365629
SL
902 }
903}
904
e669ddde 905bool wxWebViewIE::CanExecCommand(wxString command) const
4681a3ea 906{
f40f8e17 907 wxCOMPtr<IHTMLDocument2> document(GetDocument());
7fbc727b 908
e81ef297
SL
909 if(document)
910 {
911 VARIANT_BOOL enabled;
912
913 document->queryCommandEnabled(SysAllocString(command.wc_str()), &enabled);
e81ef297
SL
914
915 return (enabled == VARIANT_TRUE);
916 }
917 else
918 {
919 return false;
920 }
4681a3ea 921
4681a3ea
SL
922}
923
924void wxWebViewIE::ExecCommand(wxString command)
925{
f40f8e17 926 wxCOMPtr<IHTMLDocument2> document(GetDocument());
e81ef297
SL
927
928 if(document)
929 {
930 document->execCommand(SysAllocString(command.wc_str()), VARIANT_FALSE, VARIANT(), NULL);
e81ef297 931 }
617227c3 932}
4681a3ea 933
f40f8e17 934wxCOMPtr<IHTMLDocument2> wxWebViewIE::GetDocument() const
617227c3 935{
f40f8e17
SL
936 wxCOMPtr<IDispatch> dispatch;
937 wxCOMPtr<IHTMLDocument2> document;
e81ef297 938 HRESULT result = m_webBrowser->get_Document(&dispatch);
601d0ba7 939 if(dispatch && SUCCEEDED(result))
e81ef297 940 {
e81ef297 941 //document is set to null automatically if the interface isn't supported
f40f8e17 942 dispatch->QueryInterface(IID_IHTMLDocument2, (void**)&document);
e81ef297 943 }
f40f8e17 944 return document;
4681a3ea
SL
945}
946
938506b1 947bool wxWebViewIE::IsElementVisible(wxCOMPtr<IHTMLElement> elm)
66ac0400 948{
938506b1 949 wxCOMPtr<IHTMLElement> elm1 = elm;
66ac0400
SL
950 BSTR tmp_bstr;
951 bool is_visible = true;
952 //This method is not perfect but it does discover most of the hidden elements.
953 //so if a better solution is found, then please do improve.
954 while(elm1)
955 {
938506b1 956 wxCOMPtr<wxIHTMLElement2> elm2;
e52aec97 957 if(SUCCEEDED(elm1->QueryInterface(wxIID_IHTMLElement2, (void**) &elm2)))
66ac0400 958 {
938506b1 959 wxCOMPtr<wxIHTMLCurrentStyle> style;
66ac0400
SL
960 if(SUCCEEDED(elm2->get_currentStyle(&style)))
961 {
962 //Check if the object has the style display:none.
963 if((style->get_display(&tmp_bstr) != S_OK) ||
964 (tmp_bstr != NULL && (_wcsicmp(tmp_bstr, L"none") == 0)))
965 {
966 is_visible = false;
967 }
968 //Check if the object has the style visibility:hidden.
79fdb1d1 969 if((is_visible && (style->get_visibility(&tmp_bstr) != S_OK)) ||
66ac0400
SL
970 (tmp_bstr != NULL && _wcsicmp(tmp_bstr, L"hidden") == 0))
971 {
972 is_visible = false;
973 }
974 style->Release();
975 }
976 elm2->Release();
977 }
978
979 //Lets check the object's parent element.
980 IHTMLElement* parent;
981 if(is_visible && SUCCEEDED(elm1->get_parentElement(&parent)))
982 {
66ac0400
SL
983 elm1 = parent;
984 }
985 else
986 {
987 elm1->Release();
988 break;
989 }
990 }
991 return is_visible;
992}
993
994void wxWebViewIE::FindInternal(const wxString& text, int flags, int internal_flag)
995{
66ac0400 996 long find_flag = 0;
938506b1
SL
997 wxCOMPtr<wxIMarkupServices> pIMS;
998 wxCOMPtr<IHTMLDocument2> document = GetDocument();
999
66ac0400 1000 //This function does the acutal work.
938506b1 1001 if(document && SUCCEEDED(document->QueryInterface(wxIID_IMarkupServices, (void **)&pIMS)))
66ac0400 1002 {
938506b1 1003 wxCOMPtr<wxIMarkupContainer> pIMC;
e52aec97 1004 if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupContainer, (void **)&pIMC)))
66ac0400 1005 {
938506b1 1006 wxCOMPtr<wxIMarkupPointer> ptrBegin, ptrEnd;
66ac0400
SL
1007 BSTR attr_bstr = SysAllocString(L"style=\"background-color:#ffff00\"");
1008 BSTR text_bstr = SysAllocString(text.wc_str());
1009 pIMS->CreateMarkupPointer(&ptrBegin);
1010 pIMS->CreateMarkupPointer(&ptrEnd);
1011
a8da90b8 1012 ptrBegin->SetGravity(wxPOINTER_GRAVITY_Right);
66ac0400
SL
1013 ptrBegin->MoveToContainer(pIMC, TRUE);
1014 //Create the find flag from the wx one.
236cff73 1015 if(flags & wxWEBVIEW_FIND_ENTIRE_WORD)
66ac0400 1016 {
a8da90b8 1017 find_flag |= wxFINDTEXT_WHOLEWORD;
66ac0400 1018 }
236cff73 1019 if(flags & wxWEBVIEW_FIND_MATCH_CASE)
66ac0400 1020 {
a8da90b8 1021 find_flag |= wxFINDTEXT_MATCHCASE;
66ac0400
SL
1022 }
1023
1024 //A little speed-up to avoid to re-alloc in the positions vector.
1025 if(text.Len() < 3 && m_findPointers.capacity() < 500)
1026 {
1027 m_findPointers.reserve(text.Len() == 1 ? 1000 : 500);
1028 }
1029
1030 while(ptrBegin->FindText(text_bstr, find_flag, ptrEnd, NULL) == S_OK)
1031 {
938506b1 1032 wxCOMPtr<IHTMLElement> elm;
66ac0400
SL
1033 if(ptrBegin->CurrentScope(&elm) == S_OK)
1034 {
1035 if(IsElementVisible(elm))
1036 {
1037 //Highlight the word if the flag was set.
236cff73 1038 if(flags & wxWEBVIEW_FIND_HIGHLIGHT_RESULT)
66ac0400
SL
1039 {
1040 IHTMLElement* pFontEl;
a8da90b8 1041 pIMS->CreateElement(wxTAGID_FONT, attr_bstr, &pFontEl);
66ac0400
SL
1042 pIMS->InsertElement(pFontEl, ptrBegin, ptrEnd);
1043 }
236cff73 1044 if(internal_flag & wxWEBVIEW_FIND_REMOVE_HIGHLIGHT)
66ac0400
SL
1045 {
1046 IHTMLElement* pFontEl;
1047 ptrBegin->CurrentScope(&pFontEl);
1048 pIMS->RemoveElement(pFontEl);
1049 pFontEl->Release();
1050 }
236cff73 1051 if(internal_flag & wxWEBVIEW_FIND_ADD_POINTERS)
66ac0400 1052 {
e52aec97 1053 wxIMarkupPointer *cptrBegin, *cptrEnd;
66ac0400
SL
1054 pIMS->CreateMarkupPointer(&cptrBegin);
1055 pIMS->CreateMarkupPointer(&cptrEnd);
1056 cptrBegin->MoveToPointer(ptrBegin);
1057 cptrEnd->MoveToPointer(ptrEnd);
1058 m_findPointers.push_back(wxFindPointers(cptrBegin,cptrEnd));
1059 }
1060 }
66ac0400
SL
1061 }
1062 ptrBegin->MoveToPointer(ptrEnd);
1063 }
1064 //Clean up.
1065 SysFreeString(text_bstr);
1066 SysFreeString(attr_bstr);
66ac0400 1067 }
66ac0400 1068 }
66ac0400
SL
1069}
1070
1071long wxWebViewIE::FindNext(int direction)
1072{
1073 //Don't bother if we have no pointers set.
1074 if(m_findPointers.empty())
1075 {
1076 return wxNOT_FOUND;
1077 }
1078 //Manage the find position and do some checks.
1079 if(direction > 0)
1080 {
1081 m_findPosition++;
1082 }
1083 else
1084 {
1085 m_findPosition--;
1086 }
1087
1088 if(m_findPosition >= (signed)m_findPointers.size())
1089 {
236cff73 1090 if(m_findFlags & wxWEBVIEW_FIND_WRAP)
66ac0400
SL
1091 {
1092 m_findPosition = 0;
1093 }
1094 else
1095 {
1096 m_findPosition--;
1097 return wxNOT_FOUND;
1098 }
1099 }
1100 else if(m_findPosition < 0)
1101 {
236cff73 1102 if(m_findFlags & wxWEBVIEW_FIND_WRAP)
66ac0400
SL
1103 {
1104 m_findPosition = m_findPointers.size()-1;
1105 }
1106 else
1107 {
1108 m_findPosition++;
1109 return wxNOT_FOUND;
1110 }
1111 }
938506b1
SL
1112
1113 wxCOMPtr<IHTMLDocument2> document = GetDocument();
1114 wxCOMPtr<IHTMLElement> body_element;
1115
66ac0400
SL
1116 long ret = -1;
1117 //Now try to create a range from the body.
938506b1 1118 if(document && SUCCEEDED(document->get_body(&body_element)))
66ac0400 1119 {
938506b1 1120 wxCOMPtr<IHTMLBodyElement> body;
66ac0400
SL
1121 if(SUCCEEDED(body_element->QueryInterface(IID_IHTMLBodyElement,(void**)&body)))
1122 {
938506b1 1123 wxCOMPtr<wxIHTMLTxtRange> range;
e52aec97 1124 if(SUCCEEDED(body->createTextRange((IHTMLTxtRange**)(&range))))
66ac0400 1125 {
938506b1 1126 wxCOMPtr<wxIMarkupServices> pIMS;
66ac0400 1127 //So far so good, now we try to position our find pointers.
e52aec97 1128 if(SUCCEEDED(document->QueryInterface(wxIID_IMarkupServices,(void **)&pIMS)))
66ac0400 1129 {
e52aec97 1130 wxIMarkupPointer *begin = m_findPointers[m_findPosition].begin, *end = m_findPointers[m_findPosition].end;
66ac0400
SL
1131 if(pIMS->MoveRangeToPointers(begin,end,range) == S_OK && range->select() == S_OK)
1132 {
1133 ret = m_findPosition;
1134 }
66ac0400 1135 }
66ac0400 1136 }
66ac0400 1137 }
66ac0400 1138 }
66ac0400
SL
1139 return ret;
1140}
1141
1142void wxWebViewIE::FindClear()
1143{
1144 //Reset find variables.
1145 m_findText.Empty();
236cff73 1146 m_findFlags = wxWEBVIEW_FIND_DEFAULT;
66ac0400
SL
1147 m_findPosition = -1;
1148
1149 //The m_findPointers contains pointers for the found text.
1150 //Since it uses ref counting we call release on the pointers first
1151 //before we remove them from the vector. In other words do not just
1152 //remove elements from m_findPointers without calling release first
1153 //or you will get a memory leak.
1154 size_t count = m_findPointers.size();
1155 for(size_t i = 0; i < count; i++)
1156 {
1157 m_findPointers[i].begin->Release();
1158 m_findPointers[i].end->Release();
1159 }
1160 m_findPointers.clear();
1161}
1162
9447a0d6
SL
1163bool wxWebViewIE::EnableControlFeature(long flag, bool enable)
1164{
1165#if wxUSE_DYNLIB_CLASS
1166
1167 wxDynamicLibrary urlMon(wxT("urlmon.dll"));
34326da7
SL
1168 if( urlMon.IsLoaded() &&
1169 urlMon.HasSymbol("CoInternetSetFeatureEnabled") &&
9447a0d6
SL
1170 urlMon.HasSymbol("CoInternetIsFeatureEnabled"))
1171 {
1172 typedef HRESULT (WINAPI *CoInternetSetFeatureEnabled_t)(DWORD, DWORD, BOOL);
1173 typedef HRESULT (WINAPI *CoInternetIsFeatureEnabled_t)(DWORD, DWORD);
1174
1175 wxDYNLIB_FUNCTION(CoInternetSetFeatureEnabled_t, CoInternetSetFeatureEnabled, urlMon);
1176 wxDYNLIB_FUNCTION(CoInternetIsFeatureEnabled_t, CoInternetIsFeatureEnabled, urlMon);
1177
1178 HRESULT hr = (*pfnCoInternetIsFeatureEnabled)(flag,
1179 0x2 /* SET_FEATURE_ON_PROCESS */);
1180 if((hr == S_OK && enable) || (hr == S_FALSE && !enable))
1181 return true;
1182
1183 hr = (*pfnCoInternetSetFeatureEnabled)(flag,
1184 0x2/* SET_FEATURE_ON_PROCESS */,
1185 (enable ? TRUE : FALSE));
1186 if ( FAILED(hr) )
1187 {
1188 wxLogApiError(wxT("CoInternetSetFeatureEnabled"), hr);
1189 return false;
1190 }
1191 return true;
1192 }
1193 return false;
1194#else
1195 wxUnusedVar(flag);
1196 wxUnusedVar(enable);
1197 return false;
1198#endif // wxUSE_DYNLIB_CLASS/!wxUSE_DYNLIB_CLASS
1199}
1200
61b98a2d
SL
1201void wxWebViewIE::onActiveXEvent(wxActiveXEvent& evt)
1202{
1203 if (m_webBrowser == NULL) return;
1204
1205 switch (evt.GetDispatchId())
1206 {
1207 case DISPID_BEFORENAVIGATE2:
1208 {
1209 m_isBusy = true;
1210
1211 wxString url = evt[1].GetString();
1212 wxString target = evt[3].GetString();
1213
ce7fe42e 1214 wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATING,
3225a4b8 1215 GetId(), url, target);
e11b9a6b
SL
1216
1217 //skip empty javascript events.
1218 if(url == "javascript:\"\"" && target.IsEmpty())
1219 {
1220 event.Veto();
1221 }
1222 else
1223 {
1224 event.SetEventObject(this);
1225 HandleWindowEvent(event);
1226 }
61b98a2d 1227
3225a4b8 1228 if (!event.IsAllowed())
61b98a2d
SL
1229 {
1230 wxActiveXEventNativeMSW* nativeParams =
1231 evt.GetNativeParameters();
1232 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[0]) = VARIANT_TRUE;
1233 }
1234
1235 // at this point, either the navigation event has been cancelled
1236 // and we're not busy, either it was accepted and IWebBrowser2's
1237 // Busy property will be true; so we don't need our override
1238 // flag anymore.
1239 m_isBusy = false;
1240
1241 break;
1242 }
1243
1244 case DISPID_NAVIGATECOMPLETE2:
1245 {
1246 wxString url = evt[1].GetString();
1247 // TODO: set target parameter if possible
1248 wxString target = wxEmptyString;
ce7fe42e 1249 wxWebViewEvent event(wxEVT_WEBVIEW_NAVIGATED,
3225a4b8 1250 GetId(), url, target);
61b98a2d
SL
1251 event.SetEventObject(this);
1252 HandleWindowEvent(event);
1253 break;
1254 }
1255
1256 case DISPID_PROGRESSCHANGE:
1257 {
1258 // download progress
1259 break;
1260 }
1261
1262 case DISPID_DOCUMENTCOMPLETE:
1263 {
3ee442ff
SL
1264 //Only send a complete even if we are actually finished, this brings
1265 //the event in to line with webkit
1266 READYSTATE rs;
1267 m_webBrowser->get_ReadyState( &rs );
1268 if(rs != READYSTATE_COMPLETE)
1269 break;
1270
61b98a2d 1271 wxString url = evt[1].GetString();
113e0a92
SL
1272
1273 //As we are complete we also add to the history list, but not if the
1274 //page is not the main page, ie it is a subframe
60eabdbe 1275 //We also have to check if we are loading a file:// url, if so we
f239a200
SL
1276 //need to change the comparison as ie passes back a different style
1277 //of url
60eabdbe
VZ
1278 if(m_historyEnabled && !m_historyLoadingFromList &&
1279 (url == GetCurrentURL() ||
1280 (GetCurrentURL().substr(0, 4) == "file" &&
f239a200 1281 wxFileSystem::URLToFileName(GetCurrentURL()).GetFullPath() == url)))
74af0b13
SL
1282 {
1283 //If we are not at the end of the list, then erase everything
1284 //between us and the end before adding the new page
22ca10fa 1285 if(m_historyPosition != static_cast<int>(m_historyList.size()) - 1)
74af0b13
SL
1286 {
1287 m_historyList.erase(m_historyList.begin() + m_historyPosition + 1,
1288 m_historyList.end());
1289 }
c13d6ac1 1290 wxSharedPtr<wxWebViewHistoryItem> item(new wxWebViewHistoryItem(url, GetCurrentTitle()));
74af0b13
SL
1291 m_historyList.push_back(item);
1292 m_historyPosition++;
1293 }
1294 //Reset as we are done now
1295 m_historyLoadingFromList = false;
66ac0400
SL
1296 //Reset the find values.
1297 FindClear();
61b98a2d
SL
1298 // TODO: set target parameter if possible
1299 wxString target = wxEmptyString;
ce7fe42e 1300 wxWebViewEvent event(wxEVT_WEBVIEW_LOADED, GetId(),
3225a4b8 1301 url, target);
61b98a2d
SL
1302 event.SetEventObject(this);
1303 HandleWindowEvent(event);
1304 break;
1305 }
1306
1307 case DISPID_STATUSTEXTCHANGE:
1308 {
1309 break;
1310 }
1311
1312 case DISPID_TITLECHANGE:
1313 {
153530af
SL
1314 wxString title = evt[0].GetString();
1315
ce7fe42e 1316 wxWebViewEvent event(wxEVT_WEBVIEW_TITLE_CHANGED,
3225a4b8 1317 GetId(), GetCurrentURL(), "");
153530af
SL
1318 event.SetString(title);
1319 event.SetEventObject(this);
1320 HandleWindowEvent(event);
61b98a2d
SL
1321 break;
1322 }
1323
1324 case DISPID_NAVIGATEERROR:
1325 {
ce7fe42e 1326 wxWebViewEvent event(wxEVT_WEBVIEW_ERROR, GetId(),
c1381581
SL
1327 evt[1].GetString(), evt[2].GetString());
1328 event.SetEventObject(this);
1329
61b98a2d
SL
1330 switch (evt[3].GetLong())
1331 {
c1381581 1332 // 400 Error codes
236cff73
SL
1333 WX_ERROR_CASE(HTTP_STATUS_BAD_REQUEST, wxWEBVIEW_NAV_ERR_REQUEST)
1334 WX_ERROR_CASE(HTTP_STATUS_DENIED, wxWEBVIEW_NAV_ERR_AUTH)
1335 WX_ERROR_CASE(HTTP_STATUS_PAYMENT_REQ, wxWEBVIEW_NAV_ERR_OTHER)
1336 WX_ERROR_CASE(HTTP_STATUS_FORBIDDEN, wxWEBVIEW_NAV_ERR_AUTH)
1337 WX_ERROR_CASE(HTTP_STATUS_NOT_FOUND, wxWEBVIEW_NAV_ERR_NOT_FOUND)
1338 WX_ERROR_CASE(HTTP_STATUS_BAD_METHOD, wxWEBVIEW_NAV_ERR_REQUEST)
1339 WX_ERROR_CASE(HTTP_STATUS_NONE_ACCEPTABLE, wxWEBVIEW_NAV_ERR_OTHER)
1340 WX_ERROR_CASE(HTTP_STATUS_PROXY_AUTH_REQ, wxWEBVIEW_NAV_ERR_AUTH)
1341 WX_ERROR_CASE(HTTP_STATUS_REQUEST_TIMEOUT, wxWEBVIEW_NAV_ERR_CONNECTION)
1342 WX_ERROR_CASE(HTTP_STATUS_CONFLICT, wxWEBVIEW_NAV_ERR_REQUEST)
1343 WX_ERROR_CASE(HTTP_STATUS_GONE, wxWEBVIEW_NAV_ERR_NOT_FOUND)
1344 WX_ERROR_CASE(HTTP_STATUS_LENGTH_REQUIRED, wxWEBVIEW_NAV_ERR_REQUEST)
1345 WX_ERROR_CASE(HTTP_STATUS_PRECOND_FAILED, wxWEBVIEW_NAV_ERR_REQUEST)
1346 WX_ERROR_CASE(HTTP_STATUS_REQUEST_TOO_LARGE, wxWEBVIEW_NAV_ERR_REQUEST)
1347 WX_ERROR_CASE(HTTP_STATUS_URI_TOO_LONG, wxWEBVIEW_NAV_ERR_REQUEST)
1348 WX_ERROR_CASE(HTTP_STATUS_UNSUPPORTED_MEDIA, wxWEBVIEW_NAV_ERR_REQUEST)
1349 WX_ERROR_CASE(HTTP_STATUS_RETRY_WITH, wxWEBVIEW_NAV_ERR_OTHER)
c1381581
SL
1350
1351 // 500 - Error codes
236cff73
SL
1352 WX_ERROR_CASE(HTTP_STATUS_SERVER_ERROR, wxWEBVIEW_NAV_ERR_CONNECTION)
1353 WX_ERROR_CASE(HTTP_STATUS_NOT_SUPPORTED, wxWEBVIEW_NAV_ERR_CONNECTION)
1354 WX_ERROR_CASE(HTTP_STATUS_BAD_GATEWAY, wxWEBVIEW_NAV_ERR_CONNECTION)
1355 WX_ERROR_CASE(HTTP_STATUS_SERVICE_UNAVAIL, wxWEBVIEW_NAV_ERR_CONNECTION)
1356 WX_ERROR_CASE(HTTP_STATUS_GATEWAY_TIMEOUT, wxWEBVIEW_NAV_ERR_CONNECTION)
1357 WX_ERROR_CASE(HTTP_STATUS_VERSION_NOT_SUP, wxWEBVIEW_NAV_ERR_REQUEST)
c1381581
SL
1358
1359 // URL Moniker error codes
236cff73
SL
1360 WX_ERROR_CASE(INET_E_INVALID_URL, wxWEBVIEW_NAV_ERR_REQUEST)
1361 WX_ERROR_CASE(INET_E_NO_SESSION, wxWEBVIEW_NAV_ERR_CONNECTION)
1362 WX_ERROR_CASE(INET_E_CANNOT_CONNECT, wxWEBVIEW_NAV_ERR_CONNECTION)
1363 WX_ERROR_CASE(INET_E_RESOURCE_NOT_FOUND, wxWEBVIEW_NAV_ERR_NOT_FOUND)
1364 WX_ERROR_CASE(INET_E_OBJECT_NOT_FOUND, wxWEBVIEW_NAV_ERR_NOT_FOUND)
1365 WX_ERROR_CASE(INET_E_DATA_NOT_AVAILABLE, wxWEBVIEW_NAV_ERR_NOT_FOUND)
1366 WX_ERROR_CASE(INET_E_DOWNLOAD_FAILURE, wxWEBVIEW_NAV_ERR_CONNECTION)
1367 WX_ERROR_CASE(INET_E_AUTHENTICATION_REQUIRED, wxWEBVIEW_NAV_ERR_AUTH)
1368 WX_ERROR_CASE(INET_E_NO_VALID_MEDIA, wxWEBVIEW_NAV_ERR_REQUEST)
1369 WX_ERROR_CASE(INET_E_CONNECTION_TIMEOUT, wxWEBVIEW_NAV_ERR_CONNECTION)
1370 WX_ERROR_CASE(INET_E_INVALID_REQUEST, wxWEBVIEW_NAV_ERR_REQUEST)
1371 WX_ERROR_CASE(INET_E_UNKNOWN_PROTOCOL, wxWEBVIEW_NAV_ERR_REQUEST)
1372 WX_ERROR_CASE(INET_E_SECURITY_PROBLEM, wxWEBVIEW_NAV_ERR_SECURITY)
1373 WX_ERROR_CASE(INET_E_CANNOT_LOAD_DATA, wxWEBVIEW_NAV_ERR_OTHER)
1374 WX_ERROR_CASE(INET_E_REDIRECT_FAILED, wxWEBVIEW_NAV_ERR_OTHER)
1375 WX_ERROR_CASE(INET_E_REDIRECT_TO_DIR, wxWEBVIEW_NAV_ERR_REQUEST)
1376 WX_ERROR_CASE(INET_E_CANNOT_LOCK_REQUEST, wxWEBVIEW_NAV_ERR_OTHER)
1377 WX_ERROR_CASE(INET_E_USE_EXTEND_BINDING, wxWEBVIEW_NAV_ERR_OTHER)
1378 WX_ERROR_CASE(INET_E_TERMINATED_BIND, wxWEBVIEW_NAV_ERR_OTHER)
1379 WX_ERROR_CASE(INET_E_INVALID_CERTIFICATE, wxWEBVIEW_NAV_ERR_CERTIFICATE)
1380 WX_ERROR_CASE(INET_E_CODE_DOWNLOAD_DECLINED, wxWEBVIEW_NAV_ERR_USER_CANCELLED)
1381 WX_ERROR_CASE(INET_E_RESULT_DISPATCHED, wxWEBVIEW_NAV_ERR_OTHER)
1382 WX_ERROR_CASE(INET_E_CANNOT_REPLACE_SFP_FILE, wxWEBVIEW_NAV_ERR_SECURITY)
1383 WX_ERROR_CASE(INET_E_CODE_INSTALL_BLOCKED_BY_HASH_POLICY, wxWEBVIEW_NAV_ERR_SECURITY)
1384 WX_ERROR_CASE(INET_E_CODE_INSTALL_SUPPRESSED, wxWEBVIEW_NAV_ERR_SECURITY)
61b98a2d 1385 }
61b98a2d
SL
1386 HandleWindowEvent(event);
1387 break;
1388 }
853b6cd0 1389 case DISPID_NEWWINDOW3:
61b98a2d 1390 {
853b6cd0
SL
1391 wxString url = evt[4].GetString();
1392
ce7fe42e 1393 wxWebViewEvent event(wxEVT_WEBVIEW_NEWWINDOW,
3225a4b8 1394 GetId(), url, wxEmptyString);
853b6cd0
SL
1395 event.SetEventObject(this);
1396 HandleWindowEvent(event);
1397
d676fb21
SL
1398 //We always cancel this event otherwise an Internet Exporer window
1399 //is opened for the url
1400 wxActiveXEventNativeMSW* nativeParams = evt.GetNativeParameters();
1401 *V_BOOLREF(&nativeParams->pDispParams->rgvarg[3]) = VARIANT_TRUE;
be19c556
SL
1402 break;
1403 }
61b98a2d
SL
1404 }
1405
1406 evt.Skip();
1407}
1408
7d8d6163 1409VirtualProtocol::VirtualProtocol(wxSharedPtr<wxWebViewHandler> handler)
7d3f6b4d 1410{
7d3f6b4d 1411 m_file = NULL;
29365629 1412 m_handler = handler;
7d3f6b4d
SL
1413}
1414
9f194b9d
SL
1415BEGIN_IID_TABLE(VirtualProtocol)
1416 ADD_IID(Unknown)
1417 ADD_RAW_IID(wxIID_IInternetProtocolRoot)
1418 ADD_RAW_IID(wxIID_IInternetProtocol)
1419END_IID_TABLE;
7d3f6b4d 1420
9f194b9d 1421IMPLEMENT_IUNKNOWN_METHODS(VirtualProtocol)
7d3f6b4d 1422
a9c5eac9 1423HRESULT STDMETHODCALLTYPE VirtualProtocol::Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink,
f559d1a2 1424 wxIInternetBindInfo *pOIBindInfo, DWORD grfPI,
0995b9dc 1425 HANDLE_PTR dwReserved)
7d3f6b4d 1426{
0995b9dc
SL
1427 wxUnusedVar(szUrl);
1428 wxUnusedVar(pOIBindInfo);
1429 wxUnusedVar(grfPI);
1430 wxUnusedVar(dwReserved);
7d3f6b4d 1431 m_protocolSink = pOIProtSink;
60eabdbe 1432
29365629
SL
1433 //We get the file itself from the protocol handler
1434 m_file = m_handler->GetFile(szUrl);
1435
7d3f6b4d
SL
1436
1437 if(!m_file)
1438 return INET_E_RESOURCE_NOT_FOUND;
1439
1440 //We return the stream length for current and total size as we can always
1441 //read the whole file from the stream
666f73c4 1442 wxFileOffset length = m_file->GetStream()->GetLength();
f559d1a2
VZ
1443 m_protocolSink->ReportData(wxBSCF_FIRSTDATANOTIFICATION |
1444 wxBSCF_DATAFULLYAVAILABLE |
1445 wxBSCF_LASTDATANOTIFICATION,
666f73c4 1446 length, length);
60eabdbe 1447 return S_OK;
7d3f6b4d
SL
1448}
1449
a9c5eac9 1450HRESULT STDMETHODCALLTYPE VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRead)
7d3f6b4d
SL
1451{
1452 //If the file is null we return false to indicte it is finished
60eabdbe 1453 if(!m_file)
7d3f6b4d
SL
1454 return S_FALSE;
1455
1456 wxStreamError err = m_file->GetStream()->Read(pv, cb).GetLastError();
1457 *pcbRead = m_file->GetStream()->LastRead();
1458
1459 if(err == wxSTREAM_NO_ERROR)
1460 {
1461 if(*pcbRead < cb)
1462 {
1463 wxDELETE(m_file);
1464 m_protocolSink->ReportResult(S_OK, 0, NULL);
1465 }
1466 //As we are not eof there is more data
1467 return S_OK;
1468 }
1469 else if(err == wxSTREAM_EOF)
1470 {
1471 wxDELETE(m_file);
1472 m_protocolSink->ReportResult(S_OK, 0, NULL);
1473 //We are eof and so finished
1474 return S_OK;
1475 }
1476 else if(err == wxSTREAM_READ_ERROR)
1477 {
1478 wxDELETE(m_file);
1479 return INET_E_DOWNLOAD_FAILURE;
1480 }
0995b9dc
SL
1481 else
1482 {
070d6391 1483 //Dummy return to suppress a compiler warning
0995b9dc
SL
1484 wxFAIL;
1485 return INET_E_DOWNLOAD_FAILURE;
1486 }
7d3f6b4d
SL
1487}
1488
9f194b9d
SL
1489BEGIN_IID_TABLE(ClassFactory)
1490 ADD_IID(Unknown)
1491 ADD_IID(ClassFactory)
1492END_IID_TABLE;
1493
1494IMPLEMENT_IUNKNOWN_METHODS(ClassFactory)
1495
a9c5eac9 1496HRESULT STDMETHODCALLTYPE ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid,
7d3f6b4d
SL
1497 void ** ppvObject)
1498{
60eabdbe 1499 if (pUnkOuter)
7d3f6b4d 1500 return CLASS_E_NOAGGREGATION;
29365629 1501 VirtualProtocol* vp = new VirtualProtocol(m_handler);
7d3f6b4d
SL
1502 vp->AddRef();
1503 HRESULT hr = vp->QueryInterface(riid, ppvObject);
1504 vp->Release();
1505 return hr;
1506
60eabdbe 1507}
7d3f6b4d
SL
1508
1509STDMETHODIMP ClassFactory::LockServer(BOOL fLock)
1510{
0995b9dc
SL
1511 wxUnusedVar(fLock);
1512 return S_OK;
7d3f6b4d
SL
1513}
1514
34326da7 1515wxIEContainer::wxIEContainer(wxWindow *parent, REFIID iid, IUnknown *pUnk,
accc94d5
SL
1516 DocHostUIHandler* uiHandler) :
1517 wxActiveXContainer(parent,iid,pUnk)
1518{
1519 m_uiHandler = uiHandler;
1520}
1521
1522wxIEContainer::~wxIEContainer()
1523{
1524}
1525
34326da7 1526bool wxIEContainer::QueryClientSiteInterface(REFIID iid, void **_interface,
accc94d5
SL
1527 const char *&desc)
1528{
1529 if (m_uiHandler && IsEqualIID(iid, wxIID_IDocHostUIHandler))
1530 {
1531 *_interface = (IUnknown *) (wxIDocHostUIHandler *) m_uiHandler;
1532 desc = "IDocHostUIHandler";
1533 return true;
1534 }
1535 return false;
1536}
1537
a9c5eac9 1538HRESULT wxSTDCALL DocHostUIHandler::ShowContextMenu(DWORD dwID, POINT *ppt,
34326da7 1539 IUnknown *pcmdtReserved,
accc94d5
SL
1540 IDispatch *pdispReserved)
1541{
1542 wxUnusedVar(dwID);
1543 wxUnusedVar(ppt);
1544 wxUnusedVar(pcmdtReserved);
1545 wxUnusedVar(pdispReserved);
c420d57b
SL
1546 if(m_browser->IsContextMenuEnabled())
1547 return E_NOTIMPL;
1548 else
1549 return S_OK;
accc94d5
SL
1550}
1551
a9c5eac9 1552HRESULT wxSTDCALL DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
accc94d5 1553{
34326da7 1554 //don't show 3d border and enable themes.
accc94d5
SL
1555 pInfo->dwFlags = pInfo->dwFlags | DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME;
1556 return S_OK;
1557}
1558
a9c5eac9 1559HRESULT wxSTDCALL DocHostUIHandler::ShowUI(DWORD dwID,
34326da7 1560 IOleInPlaceActiveObject *pActiveObject,
accc94d5
SL
1561 IOleCommandTarget *pCommandTarget,
1562 IOleInPlaceFrame *pFrame,
1563 IOleInPlaceUIWindow *pDoc)
1564{
1565 wxUnusedVar(dwID);
1566 wxUnusedVar(pActiveObject);
1567 wxUnusedVar(pCommandTarget);
1568 wxUnusedVar(pFrame);
1569 wxUnusedVar(pDoc);
1570 return S_FALSE;
1571}
1572
a9c5eac9 1573HRESULT wxSTDCALL DocHostUIHandler::HideUI(void)
accc94d5
SL
1574{
1575 return E_NOTIMPL;
1576}
1577
a9c5eac9 1578HRESULT wxSTDCALL DocHostUIHandler::UpdateUI(void)
accc94d5
SL
1579{
1580 return E_NOTIMPL;
1581}
1582
a9c5eac9 1583HRESULT wxSTDCALL DocHostUIHandler::EnableModeless(BOOL fEnable)
accc94d5
SL
1584{
1585 wxUnusedVar(fEnable);
1586 return E_NOTIMPL;
1587}
1588
a9c5eac9 1589HRESULT wxSTDCALL DocHostUIHandler::OnDocWindowActivate(BOOL fActivate)
accc94d5
SL
1590{
1591 wxUnusedVar(fActivate);
1592 return E_NOTIMPL;
1593}
1594
a9c5eac9 1595HRESULT wxSTDCALL DocHostUIHandler::OnFrameWindowActivate(BOOL fActivate)
accc94d5
SL
1596{
1597 wxUnusedVar(fActivate);
1598 return E_NOTIMPL;
1599}
1600
a9c5eac9 1601HRESULT wxSTDCALL DocHostUIHandler::ResizeBorder(LPCRECT prcBorder,
accc94d5
SL
1602 IOleInPlaceUIWindow *pUIWindow,
1603 BOOL fFrameWindow)
1604{
1605 wxUnusedVar(prcBorder);
1606 wxUnusedVar(pUIWindow);
1607 wxUnusedVar(fFrameWindow);
1608 return E_NOTIMPL;
1609}
1610
a9c5eac9 1611HRESULT wxSTDCALL DocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
accc94d5
SL
1612 const GUID *pguidCmdGroup,
1613 DWORD nCmdID)
1614{
1615 if(lpMsg && lpMsg->message == WM_KEYDOWN)
1616 {
4ed85025
SL
1617 // check control is down but that it isn't right-alt which is mapped to
1618 // alt + ctrl
1619 if(GetKeyState(VK_CONTROL) & 0x8000 &&
1620 !(GetKeyState(VK_MENU) & 0x8000))
accc94d5 1621 {
e5f9b4ae
VZ
1622 //skip the accelerators used by the control
1623 switch(lpMsg->wParam)
accc94d5 1624 {
e5f9b4ae
VZ
1625 case 'F':
1626 case 'L':
1627 case 'N':
1628 case 'O':
1629 case 'P':
1630 return S_OK;
accc94d5
SL
1631 }
1632 }
1633 //skip F5
1634 if(lpMsg->wParam == VK_F5)
1635 {
1636 return S_OK;
1637 }
1638 }
1639
1640 wxUnusedVar(pguidCmdGroup);
1641 wxUnusedVar(nCmdID);
1642 return E_NOTIMPL;
1643}
1644
a9c5eac9 1645HRESULT wxSTDCALL DocHostUIHandler::GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw)
accc94d5
SL
1646{
1647 wxUnusedVar(pchKey);
1648 wxUnusedVar(dw);
1649 return E_NOTIMPL;
1650}
1651
a9c5eac9 1652HRESULT wxSTDCALL DocHostUIHandler::GetDropTarget(IDropTarget *pDropTarget,
accc94d5
SL
1653 IDropTarget **ppDropTarget)
1654{
1655 wxUnusedVar(pDropTarget);
1656 wxUnusedVar(ppDropTarget);
1657 return E_NOTIMPL;
1658}
1659
a9c5eac9 1660HRESULT wxSTDCALL DocHostUIHandler::GetExternal(IDispatch **ppDispatch)
accc94d5
SL
1661{
1662 wxUnusedVar(ppDispatch);
1663 return E_NOTIMPL;
1664}
1665
a9c5eac9 1666HRESULT wxSTDCALL DocHostUIHandler::TranslateUrl(DWORD dwTranslate,
accc94d5
SL
1667 OLECHAR *pchURLIn,
1668 OLECHAR **ppchURLOut)
1669{
1670 wxUnusedVar(dwTranslate);
1671 wxUnusedVar(pchURLIn);
1672 wxUnusedVar(ppchURLOut);
1673 return E_NOTIMPL;
1674}
1675
a9c5eac9 1676HRESULT wxSTDCALL DocHostUIHandler::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
accc94d5
SL
1677{
1678 wxUnusedVar(pDO);
1679 wxUnusedVar(ppDORet);
1680 return E_NOTIMPL;
1681}
1682
1683BEGIN_IID_TABLE(DocHostUIHandler)
1684 ADD_IID(Unknown)
1685 ADD_RAW_IID(wxIID_IDocHostUIHandler)
1686END_IID_TABLE;
1687
1688IMPLEMENT_IUNKNOWN_METHODS(DocHostUIHandler)
1689
9d2f31db 1690#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE