Ticket #13785: web.patch

File web.patch, 6.4 KB (added by Allonii, 8 years ago)

fixed ref count

  • include/wx/msw/webview_ie.h

     
    356356    wxSharedPtr<wxWebViewHandler> m_handler;
    357357};
    358358
     359class wxWebViewIEUIHandler : public wxIDocHostUIHandler
     360{
     361public:
     362    wxWebViewIEUIHandler();
     363    virtual ~wxWebViewIEUIHandler();
     364    //wxIDocHostUIHandler
     365    HRESULT STDMETHODCALLTYPE GetHostInfo(DOCHOSTUIINFO *pInfo);
     366    HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable);
     367    HRESULT STDMETHODCALLTYPE FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
     368    HRESULT STDMETHODCALLTYPE GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
     369    HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch);
     370    HRESULT STDMETHODCALLTYPE GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw);
     371    HRESULT STDMETHODCALLTYPE HideUI(void);
     372    HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate);
     373    HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate);
     374    HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,BOOL fFrameWindow);
     375    HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID,POINT *ppt,IUnknown *pcmdtReserved,IDispatch *pdispReserved);
     376    HRESULT STDMETHODCALLTYPE ShowUI(DWORD dwID,IOleInPlaceActiveObject *pActiveObject,IOleCommandTarget *pCommandTarget,IOleInPlaceFrame *pFrame,IOleInPlaceUIWindow *pDoc);
     377    HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg,const GUID *pguidCmdGroup,DWORD nCmdID);
     378    HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate,OLECHAR *pchURLIn,OLECHAR **ppchURLOut);
     379    HRESULT STDMETHODCALLTYPE UpdateUI(void);
     380    //IUnknown
     381    ULONG STDMETHODCALLTYPE AddRef();
     382    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);
     383    ULONG STDMETHODCALLTYPE Release();
     384private:
     385    ULONG m_refCount;
     386};
     387
    359388#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE && defined(__WXMSW__)
    360389
    361390#endif // wxWebViewIE_H
  • src/msw/webview_ie.cpp

     
    8282    m_webBrowser->put_RegisterAsDropTarget(VARIANT_TRUE);
    8383
    8484    m_container = new wxActiveXContainer(this, IID_IWebBrowser2, m_webBrowser);
     85    m_container->SetExternalUIHandler(new wxWebViewIEUIHandler);
    8586
    8687    LoadURL(url);
    8788    return true;
     
    11981199
    11991200}
    12001201
     1202wxWebViewIEUIHandler::wxWebViewIEUIHandler()
     1203{
     1204    m_refCount = 0;
     1205}
     1206
     1207wxWebViewIEUIHandler::~wxWebViewIEUIHandler()
     1208{
     1209}
     1210
     1211HRESULT wxWebViewIEUIHandler::GetHostInfo(DOCHOSTUIINFO *pInfo)
     1212{
     1213    //don't show 3d border.
     1214    pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
     1215    return S_OK;
     1216}
     1217
     1218HRESULT wxWebViewIEUIHandler::EnableModeless(BOOL fEnable)
     1219{
     1220    wxUnusedVar(fEnable);
     1221    return E_NOTIMPL;
     1222}
     1223
     1224HRESULT wxWebViewIEUIHandler::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
     1225{
     1226    wxUnusedVar(pDO);
     1227    wxUnusedVar(ppDORet);
     1228    return E_NOTIMPL;
     1229}
     1230
     1231HRESULT wxWebViewIEUIHandler::GetDropTarget(IDropTarget *pDropTarget,IDropTarget **ppDropTarget)
     1232{
     1233    wxUnusedVar(pDropTarget);
     1234    wxUnusedVar(ppDropTarget);
     1235    return E_NOTIMPL;
     1236}
     1237
     1238HRESULT wxWebViewIEUIHandler::GetExternal(IDispatch **ppDispatch)
     1239{
     1240    wxUnusedVar(ppDispatch);
     1241    return E_NOTIMPL;
     1242}
     1243
     1244HRESULT wxWebViewIEUIHandler::GetOptionKeyPath(LPOLESTR *pchKey,DWORD dw)
     1245{
     1246    wxUnusedVar(pchKey);
     1247    wxUnusedVar(dw);
     1248    return E_NOTIMPL;
     1249}
     1250
     1251HRESULT wxWebViewIEUIHandler::HideUI(void)
     1252{
     1253    return E_NOTIMPL;
     1254}
     1255
     1256HRESULT wxWebViewIEUIHandler::OnDocWindowActivate(BOOL fActivate)
     1257{
     1258    wxUnusedVar(fActivate);
     1259    return E_NOTIMPL;
     1260}
     1261
     1262HRESULT wxWebViewIEUIHandler::OnFrameWindowActivate(BOOL fActivate)
     1263{
     1264    wxUnusedVar(fActivate);
     1265    return E_NOTIMPL;
     1266}
     1267
     1268HRESULT wxWebViewIEUIHandler::ResizeBorder(LPCRECT prcBorder,IOleInPlaceUIWindow *pUIWindow,BOOL fFrameWindow)
     1269{
     1270    wxUnusedVar(prcBorder);
     1271    wxUnusedVar(pUIWindow);
     1272    wxUnusedVar(fFrameWindow);
     1273    return E_NOTIMPL;
     1274}
     1275
     1276HRESULT wxWebViewIEUIHandler::ShowContextMenu(DWORD dwID,POINT *ppt,IUnknown *pcmdtReserved,IDispatch *pdispReserved)
     1277{
     1278    wxUnusedVar(dwID);
     1279    wxUnusedVar(ppt);
     1280    wxUnusedVar(pcmdtReserved);
     1281    wxUnusedVar(pdispReserved);
     1282    //we return S_OK do disable menu for now, but option should be
     1283    //given to edit this menu.
     1284    //return E_NOTIMPL;
     1285    return S_OK;
     1286}
     1287
     1288HRESULT wxWebViewIEUIHandler::ShowUI(DWORD dwID,IOleInPlaceActiveObject *pActiveObject,IOleCommandTarget *pCommandTarget,IOleInPlaceFrame *pFrame,IOleInPlaceUIWindow *pDoc)
     1289{
     1290    wxUnusedVar(dwID);
     1291    wxUnusedVar(pActiveObject);
     1292    wxUnusedVar(pCommandTarget);
     1293    wxUnusedVar(pFrame);
     1294    wxUnusedVar(pDoc);
     1295    return S_FALSE;
     1296}
     1297
     1298HRESULT wxWebViewIEUIHandler::TranslateAccelerator(LPMSG lpMsg,const GUID *pguidCmdGroup,DWORD nCmdID)
     1299{
     1300    if(lpMsg && lpMsg->message == WM_KEYDOWN)
     1301    {
     1302        //control is down?
     1303        if((GetKeyState(VK_CONTROL) & 0x8000 ))
     1304        {
     1305            //skip CTRL-N, CTRL-F and CTRL-P
     1306            if(lpMsg->wParam == 'N' || lpMsg->wParam == 'P' || lpMsg->wParam == 'F')
     1307            {
     1308                return S_OK;
     1309            }
     1310        }
     1311        //skip F5
     1312        if(lpMsg->wParam == VK_F5)
     1313        {
     1314            return S_OK;
     1315        }
     1316    }
     1317
     1318    wxUnusedVar(pguidCmdGroup);
     1319    wxUnusedVar(nCmdID);
     1320    return E_NOTIMPL;
     1321}
     1322
     1323HRESULT wxWebViewIEUIHandler::TranslateUrl(DWORD dwTranslate,OLECHAR *pchURLIn,OLECHAR **ppchURLOut)
     1324{
     1325    wxUnusedVar(dwTranslate);
     1326    wxUnusedVar(pchURLIn);
     1327    wxUnusedVar(ppchURLOut);
     1328    return E_NOTIMPL;
     1329}
     1330
     1331HRESULT wxWebViewIEUIHandler::UpdateUI(void)
     1332{
     1333    return E_NOTIMPL;
     1334}
     1335
     1336ULONG wxWebViewIEUIHandler::AddRef(void)
     1337{
     1338    m_refCount++;
     1339    return m_refCount;
     1340}
     1341
     1342HRESULT wxWebViewIEUIHandler::QueryInterface(REFIID riid, void **ppvObject)
     1343{
     1344    if ((riid == IID_IUnknown) || (riid == IID_IDocHostUIHandler))
     1345    {
     1346        *ppvObject = (wxIDocHostUIHandler*)this;
     1347        AddRef();
     1348        return S_OK;
     1349    }
     1350    else
     1351    {
     1352        *ppvObject = NULL;
     1353        return E_POINTER;
     1354    }
     1355}
     1356
     1357ULONG wxWebViewIEUIHandler::Release(void)
     1358{
     1359    m_refCount--;
     1360    if (m_refCount > 0)
     1361    {
     1362        return m_refCount;
     1363    }
     1364    else
     1365    {
     1366        delete this;
     1367        return 0;
     1368    }
     1369
     1370}
     1371
    12011372#endif // wxUSE_WEBVIEW && wxUSE_WEBVIEW_IE