Merge branch 'webview-ie-fixes'

IE-based xwWebView improvements.

See https://github.com/wxWidgets/wxWidgets/pull/1987
This commit is contained in:
Vadim Zeitlin 2020-07-23 16:39:13 +02:00
commit 6787b0548b
3 changed files with 211 additions and 4 deletions

View File

@ -73,7 +73,7 @@ public:
wxDECLARE_NO_COPY_CLASS(wxWebViewIEImpl);
};
class VirtualProtocol : public wxIInternetProtocol
class VirtualProtocol : public wxIInternetProtocol, public wxIInternetProtocolInfo
{
protected:
wxIInternetProtocolSink* m_protocolSink;
@ -114,6 +114,27 @@ public:
ULARGE_INTEGER* WXUNUSED(plibNewPosition)) wxOVERRIDE
{ return E_FAIL; }
HRESULT STDMETHODCALLTYPE UnlockRequest() wxOVERRIDE { return S_OK; }
//IInternetProtocolInfo
HRESULT STDMETHODCALLTYPE CombineUrl(
LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags, LPWSTR pwzResult,
DWORD cchResult, DWORD *pcchResult,
DWORD dwReserved) wxOVERRIDE;
HRESULT STDMETHODCALLTYPE ParseUrl(
LPCWSTR pwzUrl, wxPARSEACTION ParseAction,
DWORD dwParseFlags, LPWSTR pwzResult,
DWORD cchResult, DWORD *pcchResult,
DWORD dwReserved) wxOVERRIDE;
HRESULT STDMETHODCALLTYPE CompareUrl(
LPCWSTR pwzUrl1,
LPCWSTR pwzUrl2,
DWORD dwCompareFlags) wxOVERRIDE;
HRESULT STDMETHODCALLTYPE QueryInfo(
LPCWSTR pwzUrl, wxQUERYOPTION OueryOption,
DWORD dwQueryFlags, LPVOID pBuffer,
DWORD cbBuffer, DWORD *pcbBuf,
DWORD dwReserved) wxOVERRIDE;
};
class ClassFactory : public IClassFactory

View File

@ -27,6 +27,10 @@ struct IHTMLDocument2;
#define REFRESH_COMPLETELY 3
#endif
#ifndef INET_E_DEFAULT_ACTION
#define INET_E_DEFAULT_ACTION ((HRESULT)0x800C0011L)
#endif
typedef enum __wxMIDL_IBindStatusCallback_0006
{
wxBSCF_FIRSTDATANOTIFICATION = 0x1,
@ -136,6 +140,53 @@ public:
DWORD dwReserved) = 0;
};
// This interface uses a couple of enums which are not defined in old MinGW
// SDK headers, but we don't have any reliable way to test if they're actually
// defined, so define our own enums, containing just the values we need: this
// compiles everywhere and is ABI-compatible with the real enums.
enum wxPARSEACTION
{
wxPARSE_SECURITY_URL = 3,
wxPARSE_SECURITY_DOMAIN = 17
};
enum wxQUERYOPTION
{
// We don't actually need any values in this one.
};
class wxIInternetProtocolInfo : public IUnknown
{
public:
virtual HRESULT STDMETHODCALLTYPE ParseUrl(LPCWSTR pwzUrl,
wxPARSEACTION ParseAction,
DWORD dwParseFlags,
LPWSTR pwzResult,
DWORD cchResult,
DWORD *pcchResult,
DWORD dwReserved) = 0;
virtual HRESULT STDMETHODCALLTYPE CombineUrl(LPCWSTR pwzBaseUrl,
LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags,
LPWSTR pwzResult,
DWORD cchResult,
DWORD *pcchResult,
DWORD dwReserved) = 0;
virtual HRESULT STDMETHODCALLTYPE CompareUrl(LPCWSTR pwzUrl1,
LPCWSTR pwzUrl2,
DWORD dwCompareFlags) = 0;
virtual HRESULT STDMETHODCALLTYPE QueryInfo(LPCWSTR pwzUrl,
wxQUERYOPTION OueryOption,
DWORD dwQueryFlags,
LPVOID pBuffer,
DWORD cbBuffer,
DWORD *pcbBuf,
DWORD dwReserved) = 0;
};
/* end of urlmon.h */
/* mshtmhst.h */
@ -166,7 +217,8 @@ typedef enum _tagwxDOCHOSTUIFLAG
DOCHOSTUIFLAG_DISABLE_EDIT_NS_FIXUP = 0x400000,
DOCHOSTUIFLAG_LOCAL_MACHINE_ACCESS_CHECK = 0x800000,
DOCHOSTUIFLAG_DISABLE_UNTRUSTEDPROTOCOL = 0x1000000,
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION = 0x4000000
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION = 0x4000000,
DOCHOSTUIFLAG_DPI_AWARE = 0x40000000
} DOCHOSTUIFLAG;
typedef struct _tagwxDOCHOSTUIINFO

View File

@ -40,6 +40,7 @@ namespace {
DEFINE_GUID(wxIID_IInternetProtocolRoot,0x79eac9e3,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
DEFINE_GUID(wxIID_IInternetProtocol,0x79eac9e4,0xbaf9,0x11ce,0x8c,0x82,0,0xaa,0,0x4b,0xa9,0xb);
DEFINE_GUID(wxIID_IInternetProtocolInfo,0x79eac9ec,0xbaf9,0x11ce,0x8c, 0x82,0,0xaa,0,0x4b,0xa9,0x0b);
DEFINE_GUID(wxIID_IDocHostUIHandler, 0xbd3f23c0, 0xd43e, 0x11cf, 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a);
DEFINE_GUID(wxIID_IHTMLElement2,0x3050f434,0x98b5,0x11cf,0xbb,0x82,0,0xaa,0,0xbd,0xce,0x0b);
DEFINE_GUID(wxIID_IMarkupServices,0x3050f4a0,0x98b5,0x11cf,0xbb,0x82,0,0xaa,0,0xbd,0xce,0x0b);
@ -1621,7 +1622,61 @@ BEGIN_IID_TABLE(VirtualProtocol)
ADD_RAW_IID(wxIID_IInternetProtocol)
END_IID_TABLE;
IMPLEMENT_IUNKNOWN_METHODS(VirtualProtocol)
STDMETHODIMP VirtualProtocol::QueryInterface(REFIID riid, void **ppv)
{
wxLogQueryInterface(wxT("VirtualProtocol"), riid);
if(riid == IID_IUnknown)
{
wxIInternetProtocolRoot *InternetProtocolRoot = this;
IUnknown *Unknown = InternetProtocolRoot;
*ppv = Unknown;
AddRef();
return S_OK;
}
if(riid == wxIID_IInternetProtocolRoot)
{
wxIInternetProtocolRoot *InternetProtocolRoot = this;
*ppv = InternetProtocolRoot;
AddRef();
return S_OK;
}
if(riid == wxIID_IInternetProtocol)
{
wxIInternetProtocol *InternetProtocol = this;
*ppv = InternetProtocol;
AddRef();
return S_OK;
}
if(riid == wxIID_IInternetProtocolInfo)
{
wxIInternetProtocolInfo *InternetProtocolInfo = this;
*ppv = InternetProtocolInfo;
AddRef();
return S_OK;
}
*ppv = NULL;
return (HRESULT) E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) VirtualProtocol::AddRef()
{
wxLogAddRef(wxT("VirtualProtocol"), m_cRef);
return ++m_cRef;
}
STDMETHODIMP_(ULONG) VirtualProtocol::Release()
{
wxLogRelease(wxT("VirtualProtocol"), m_cRef);
if( --m_cRef == wxAutoULong(0))
{
delete this;
return 0;
}
else
return m_cRef;
}
HRESULT STDMETHODCALLTYPE VirtualProtocol::Start(LPCWSTR szUrl, wxIInternetProtocolSink *pOIProtSink,
wxIInternetBindInfo *pOIBindInfo, DWORD grfPI,
@ -1689,6 +1744,84 @@ HRESULT STDMETHODCALLTYPE VirtualProtocol::Read(void *pv, ULONG cb, ULONG *pcbRe
}
}
HRESULT STDMETHODCALLTYPE VirtualProtocol::CombineUrl(
LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl,
DWORD dwCombineFlags, LPWSTR pwzResult,
DWORD cchResult, DWORD *pcchResult,
DWORD dwReserved)
{
wxUnusedVar(pwzBaseUrl);
wxUnusedVar(pwzRelativeUrl);
wxUnusedVar(dwCombineFlags);
wxUnusedVar(pwzResult);
wxUnusedVar(cchResult);
wxUnusedVar(pcchResult);
wxUnusedVar(dwReserved);
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE VirtualProtocol::ParseUrl(
LPCWSTR pwzUrl, wxPARSEACTION ParseAction,
DWORD dwParseFlags, LPWSTR pwzResult,
DWORD cchResult, DWORD *pcchResult,
DWORD dwReserved)
{
wxUnusedVar(pwzUrl);
wxUnusedVar(ParseAction);
wxUnusedVar(dwParseFlags);
wxUnusedVar(pwzResult);
wxUnusedVar(cchResult);
wxUnusedVar(pcchResult);
wxUnusedVar(dwReserved);
switch (ParseAction)
{
case wxPARSE_SECURITY_URL:
case wxPARSE_SECURITY_DOMAIN:
{
LPWSTR Result = L"http://localhost";
size_t Len = wcslen(Result);
if(cchResult <= Len)
return S_FALSE;
wcscpy(pwzResult, Result);
*pcchResult = Len;
return S_OK;
}
}
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE VirtualProtocol::CompareUrl(
LPCWSTR pwzUrl1,
LPCWSTR pwzUrl2,
DWORD dwCompareFlags)
{
wxUnusedVar(pwzUrl1);
wxUnusedVar(pwzUrl2);
wxUnusedVar(dwCompareFlags);
return INET_E_DEFAULT_ACTION;
}
HRESULT STDMETHODCALLTYPE VirtualProtocol::QueryInfo(
LPCWSTR pwzUrl, wxQUERYOPTION OueryOption,
DWORD dwQueryFlags, LPVOID pBuffer,
DWORD cbBuffer, DWORD *pcbBuf,
DWORD dwReserved)
{
wxUnusedVar(pwzUrl);
wxUnusedVar(OueryOption);
wxUnusedVar(dwQueryFlags);
wxUnusedVar(pBuffer);
wxUnusedVar(cbBuffer);
wxUnusedVar(pcbBuf);
wxUnusedVar(dwReserved);
return INET_E_DEFAULT_ACTION;
}
BEGIN_IID_TABLE(ClassFactory)
ADD_IID(Unknown)
ADD_IID(ClassFactory)
@ -1759,7 +1892,8 @@ HRESULT wxSTDCALL DocHostUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
// redirected.
pInfo->dwFlags |= DOCHOSTUIFLAG_NO3DBORDER |
DOCHOSTUIFLAG_THEME |
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION;
DOCHOSTUIFLAG_ENABLE_REDIRECT_NOTIFICATION |
DOCHOSTUIFLAG_DPI_AWARE;
return S_OK;
}