Index: src/plugin/PluginClass.cpp |
diff --git a/src/plugin/PluginClass.cpp b/src/plugin/PluginClass.cpp |
index c97bf962172d2b9bf41151c3fc36d800d496982a..8d70330084d68fc77c6d61ae36d86954834f18aa 100644 |
--- a/src/plugin/PluginClass.cpp |
+++ b/src/plugin/PluginClass.cpp |
@@ -76,7 +76,6 @@ CPluginClass::CPluginClass() |
// _CrtDumpMemoryLeaks(); |
m_isAdviced = false; |
- m_nConnectionID = 0; |
m_hTabWnd = NULL; |
m_hStatusBarWnd = NULL; |
m_hPaneWnd = NULL; |
@@ -114,28 +113,6 @@ void CPluginClass::FinalRelease() |
s_criticalSectionBrowser.Unlock(); |
} |
- |
-// This method tries to get a 'connection point' from the stored browser, which can be |
-// used to attach or detach from the stream of browser events |
-CComPtr<IConnectionPoint> CPluginClass::GetConnectionPoint() |
-{ |
- CComQIPtr<IConnectionPointContainer, &IID_IConnectionPointContainer> pContainer(GetBrowser()); |
- if (!pContainer) |
- { |
- return NULL; |
- } |
- |
- CComPtr<IConnectionPoint> pPoint; |
- HRESULT hr = pContainer->FindConnectionPoint(DIID_DWebBrowserEvents2, &pPoint); |
- if (FAILED(hr)) |
- { |
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_FIND_CONNECTION_POINT, "Class::GetConnectionPoint - FindConnectionPoint") |
- return NULL; |
- } |
- |
- return pPoint; |
-} |
- |
HWND CPluginClass::GetBrowserHWND() const |
{ |
SHANDLE_PTR hBrowserWndHandle = NULL; |
@@ -262,34 +239,30 @@ STDMETHODIMP CPluginClass::SetSite(IUnknown* unknownSite) |
try |
{ |
// Check if loaded as BHO |
- if (GetBrowser()) |
+ auto webBrowser = GetBrowser(); |
+ if (webBrowser) |
{ |
DEBUG_GENERAL("Loaded as BHO"); |
- CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); |
- if (pPoint) |
+ HRESULT hr = DispEventAdvise(webBrowser); |
+ if (SUCCEEDED(hr)) |
{ |
- HRESULT hr = pPoint->Advise((IDispatch*)this, &m_nConnectionID); |
- if (SUCCEEDED(hr)) |
+ m_isAdviced = true; |
Oleksandr
2015/01/09 00:02:17
NIT: m_isAdvised. I know it was my spelling mistak
|
+ try |
{ |
- m_isAdviced = true; |
- |
- try |
- { |
- std::thread startInitObjectThread(StartInitObject, this); |
- startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr. |
- } |
- catch (const std::system_error& ex) |
- { |
- auto errDescription = std::string("Class::Thread - Failed to create StartInitObject thread, ") + |
- ex.code().message() + ex.what(); |
- DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str()); |
- } |
+ std::thread startInitObjectThread(StartInitObject, this); |
+ startInitObjectThread.detach(); // TODO: but actually we should wait for the thread in the dtr. |
} |
- else |
+ catch (const std::system_error& ex) |
{ |
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVICE, "Class::SetSite - Advice"); |
+ auto errDescription = std::string("Class::Thread - Failed to create StartInitObject thread, ") + |
+ ex.code().message() + ex.what(); |
+ DEBUG_ERROR_LOG(ex.code().value(), PLUGIN_ERROR_THREAD, PLUGIN_ERROR_MAIN_THREAD_CREATE_PROCESS, errDescription.c_str()); |
} |
} |
+ else |
+ { |
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_ADVICE, "Class::SetSite - Advice"); |
+ } |
} |
else // Check if loaded as toolbar handler |
{ |
@@ -501,83 +474,106 @@ void CPluginClass::ShowStatusBar() |
DEBUG_GENERAL("ShowStatusBar end"); |
} |
-void CPluginClass::BeforeNavigate2(DISPPARAMS* pDispParams) |
+void STDMETHODCALLTYPE CPluginClass::OnBeforeNavigate2( |
+ /* [in] */ IDispatch* frameBrowserDisp, |
+ /* [in] */ VARIANT* urlVariant, |
+ /* [in] */ VARIANT* /*Flags*/, |
+ /* [in] */ VARIANT* /*TargetFrameName*/, |
+ /* [in] */ VARIANT* /*PostData*/, |
+ /* [in] */ VARIANT* /*Headers*/, |
+ /* [in, out] */ VARIANT_BOOL* /*Cancel*/) |
{ |
- |
- if (pDispParams->cArgs < 7) |
+ ATL::CComQIPtr<IWebBrowser2> webBrowser = frameBrowserDisp; |
+ if (!webBrowser) |
{ |
return; |
} |
- //Register a mime filter if it's not registered yet |
- if (s_mimeFilter == NULL) |
- { |
- s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
- } |
- // Get the IWebBrowser2 interface |
- CComQIPtr<IWebBrowser2, &IID_IWebBrowser2> WebBrowser2Ptr; |
- VARTYPE vt = pDispParams->rgvarg[6].vt; |
- if (vt == VT_DISPATCH) |
- { |
- WebBrowser2Ptr = pDispParams->rgvarg[6].pdispVal; |
- } |
- else |
+ if (!urlVariant || urlVariant->vt != VT_BSTR) |
{ |
- // Wrong type, return. |
return; |
} |
+ std::wstring url(V_BSTR(urlVariant), SysStringLen(V_BSTR(urlVariant))); |
Oleksandr
2015/01/09 00:02:17
I would prefer minimizing the amount of macros we
sergei
2015/01/09 16:10:30
Sure, fine for me, fixed.
|
+ UnescapeUrl(url); |
- // Get the URL |
- CString url; |
- vt = pDispParams->rgvarg[5].vt; |
- if (vt == VT_BYREF + VT_VARIANT) |
- { |
- url = pDispParams->rgvarg[5].pvarVal->bstrVal; |
- |
- CPluginClient::UnescapeUrl(url); |
- } |
- else |
+ //Register a mime filter if it's not registered yet |
+ if (s_mimeFilter == NULL) |
{ |
- // Wrong type, return. |
- return; |
+ s_mimeFilter = CPluginClientFactory::GetMimeFilterClientInstance(); |
} |
+ CString urlCString = ToCString(url); |
+ |
// If webbrowser2 is equal to top level browser (as set in SetSite), we are navigating new page |
CPluginClient* client = CPluginClient::GetInstance(); |
- if (url.Find(L"javascript") == 0) |
+ if (urlCString.Find(L"javascript") == 0) |
{ |
} |
- else if (GetBrowser().IsEqualObject(WebBrowser2Ptr)) |
+ else if (GetBrowser().IsEqualObject(webBrowser)) |
{ |
- m_tab->OnNavigate(url); |
+ m_tab->OnNavigate(urlCString); |
- DEBUG_GENERAL(L"================================================================================\nBegin main navigation url:" + url + "\n================================================================================") |
+ DEBUG_GENERAL(L"================================================================================\nBegin main navigation url:" + urlCString + "\n================================================================================") |
#ifdef ENABLE_DEBUG_RESULT |
- CPluginDebug::DebugResultDomain(url); |
+ CPluginDebug::DebugResultDomain(urlCString); |
#endif |
UpdateStatusBar(); |
} |
else |
{ |
- DEBUG_NAVI(L"Navi::Begin navigation url:" + url) |
- m_tab->CacheFrame(url); |
+ DEBUG_NAVI(L"Navi::Begin navigation url:" + urlCString) |
+ m_tab->CacheFrame(urlCString); |
} |
} |
-STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) |
+ |
+void STDMETHODCALLTYPE CPluginClass::OnDownloadBegin() |
+{ |
+ DEBUG_NAVI("Navi::Download Begin") |
+} |
+ |
+void STDMETHODCALLTYPE CPluginClass::OnDownloadComplete() |
+{ |
+ DEBUG_NAVI("Navi::Download Complete") |
+ ATL::CComPtr<IWebBrowser2> browser = GetBrowser(); |
+ if (browser) |
+ { |
+ m_tab->OnDownloadComplete(browser); |
+ } |
+} |
+ |
+void STDMETHODCALLTYPE CPluginClass::OnDocumentComplete(IDispatch* frameBrowserDisp, VARIANT* /*urlOrPidl*/) |
+{ |
+ ATL::CComQIPtr<IWebBrowser2> webBrowser2 = frameBrowserDisp; |
+ if (!webBrowser2) |
+ { |
+ return; |
+ } |
+ ATL::CString frameSrc; |
+ ATL::CComBSTR locationUrl; |
+ if (FAILED(webBrowser2->get_LocationURL(&locationUrl)) && !!locationUrl) |
+ { |
+ return; |
+ } |
+ frameSrc = locationUrl; |
+ CPluginClient::UnescapeUrl(frameSrc); |
+ bool isRootPageBrowser = GetBrowser().IsEqualObject(webBrowser2); |
+ m_tab->OnDocumentComplete(webBrowser2, frameSrc, isRootPageBrowser); |
+} |
+ |
+void STDMETHODCALLTYPE CPluginClass::OnWindowStateChanged(unsigned long flags, unsigned long validFlagsMask) |
{ |
DEBUG_GENERAL("Tab changed"); |
- bool newtabshown = pDispParams->rgvarg[1].intVal==3; |
+ bool newtabshown = validFlagsMask == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED) |
+ && flags == (OLECMDIDF_WINDOWSTATE_USERVISIBLE | OLECMDIDF_WINDOWSTATE_ENABLED); |
if (newtabshown) |
{ |
std::map<DWORD,CPluginClass*>::const_iterator it = s_threadInstances.find(GetCurrentThreadId()); |
if (it == s_threadInstances.end()) |
{ |
s_threadInstances[::GetCurrentThreadId()] = this; |
- |
- |
if (!m_isInitializedOk) |
{ |
m_isInitializedOk = true; |
@@ -591,148 +587,26 @@ STDMETHODIMP CPluginClass::OnTabChanged(DISPPARAMS* pDispParams, WORD wFlags) |
} |
notificationMessage.Hide(); |
DEBUG_GENERAL("Tab change end"); |
- return VARIANT_TRUE; |
} |
-// This gets called whenever there's a browser event |
-STDMETHODIMP CPluginClass::Invoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS* pDispParams, VARIANT* pvarResult, EXCEPINFO* pExcepInfo, UINT* puArgErr) |
+void STDMETHODCALLTYPE CPluginClass::OnCommandStateChange(long /*command*/, VARIANT_BOOL /*enable*/) |
Oleksandr
2015/01/09 00:02:17
Is there any reason why parameter names are commen
|
{ |
- WCHAR tmp[256]; |
- wsprintf(tmp, L"Invoke: %d\n", dispidMember); |
- DEBUG_GENERAL(tmp); |
- switch (dispidMember) |
+ if (m_hPaneWnd == NULL) |
{ |
- |
- case DISPID_WINDOWSTATECHANGED: |
- return OnTabChanged(pDispParams, wFlags); |
- break; |
- case DISPID_HTMLDOCUMENTEVENTS2_ONBEFOREUPDATE: |
- return VARIANT_TRUE; |
- break; |
- |
- case DISPID_HTMLDOCUMENTEVENTS2_ONCLICK: |
- return VARIANT_TRUE; |
- break; |
- |
- case DISPID_EVMETH_ONLOAD: |
- DEBUG_NAVI("Navi::OnLoad") |
- return VARIANT_TRUE; |
- break; |
- |
- case DISPID_EVMETH_ONCHANGE: |
- return VARIANT_TRUE; |
- |
- case DISPID_EVMETH_ONMOUSEDOWN: |
- return VARIANT_TRUE; |
- |
- case DISPID_EVMETH_ONMOUSEENTER: |
- return VARIANT_TRUE; |
- |
- case DISPID_IHTMLIMGELEMENT_START: |
- return VARIANT_TRUE; |
- |
- case STDDISPID_XOBJ_ERRORUPDATE: |
- return VARIANT_TRUE; |
- |
- case STDDISPID_XOBJ_ONPROPERTYCHANGE: |
- return VARIANT_TRUE; |
- |
- case DISPID_READYSTATECHANGE: |
- DEBUG_NAVI("Navi::ReadyStateChange") |
- return VARIANT_TRUE; |
- |
- case DISPID_BEFORENAVIGATE: |
- DEBUG_NAVI("Navi::BeforeNavigate") |
- return VARIANT_TRUE; |
- case DISPID_COMMANDSTATECHANGE: |
- if (m_hPaneWnd == NULL) |
- { |
- CreateStatusBarPane(); |
- } |
- else |
- { |
- if (CPluginClient::GetInstance()->GetIEVersion() > 6) |
- { |
- RECT rect; |
- BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); |
- if (rectRes == TRUE) |
- { |
- MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom - rect.top, TRUE); |
- } |
- } |
- } |
- break; |
- case DISPID_STATUSTEXTCHANGE: |
- break; |
- |
- case DISPID_BEFORENAVIGATE2: |
- BeforeNavigate2(pDispParams); |
- break; |
- |
- case DISPID_DOWNLOADBEGIN: |
- { |
- DEBUG_NAVI("Navi::Download Begin") |
- } |
- break; |
- |
- case DISPID_DOWNLOADCOMPLETE: |
- { |
- DEBUG_NAVI("Navi::Download Complete") |
- |
- CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
- if (browser) |
- { |
- m_tab->OnDownloadComplete(browser); |
- } |
- } |
- break; |
- |
- case DISPID_DOCUMENTCOMPLETE: |
+ CreateStatusBarPane(); |
+ } |
+ else |
+ { |
+ if (CPluginClient::GetInstance()->GetIEVersion() > 6) |
{ |
- DEBUG_NAVI("Navi::Document Complete") |
- |
- CComQIPtr<IWebBrowser2> browser = GetBrowser(); |
- |
- if (browser && pDispParams->cArgs >= 2 && pDispParams->rgvarg[1].vt == VT_DISPATCH) |
+ RECT rect; |
+ BOOL rectRes = GetClientRect(m_hStatusBarWnd, &rect); |
+ if (rectRes == TRUE) |
{ |
- CComQIPtr<IWebBrowser2> pBrowser = pDispParams->rgvarg[1].pdispVal; |
- if (pBrowser) |
- { |
- CString url; |
- CComBSTR bstrUrl; |
- if (SUCCEEDED(pBrowser->get_LocationURL(&bstrUrl)) && ::SysStringLen(bstrUrl) > 0) |
- { |
- url = bstrUrl; |
- |
- CPluginClient::UnescapeUrl(url); |
- |
- m_tab->OnDocumentComplete(browser, url, browser.IsEqualObject(pBrowser)); |
- } |
- } |
+ MoveWindow(m_hPaneWnd, rect.right - 200, 0, m_nPaneWidth, rect.bottom - rect.top, TRUE); |
} |
} |
- break; |
- |
- case DISPID_ONQUIT: |
- case DISPID_QUIT: |
- { |
- Unadvice(); |
- } |
- break; |
- |
- default: |
- { |
- CString did; |
- did.Format(L"DispId:%u", dispidMember); |
- |
- DEBUG_NAVI(L"Navi::Default " + did) |
- } |
- |
- // do nothing |
- break; |
} |
- |
- return VARIANT_TRUE; |
} |
bool CPluginClass::InitObject(bool bBHO) |
@@ -1731,22 +1605,17 @@ void CPluginClass::UpdateStatusBar() |
} |
-void CPluginClass::Unadvice() |
+void STDMETHODCALLTYPE CPluginClass::Unadvice() |
{ |
s_criticalSectionLocal.Lock(); |
{ |
if (m_isAdviced) |
{ |
- CComPtr<IConnectionPoint> pPoint = GetConnectionPoint(); |
- if (pPoint) |
+ HRESULT hr = DispEventUnadvise(GetBrowser()); |
+ if (FAILED(hr)) |
{ |
- HRESULT hr = pPoint->Unadvise(m_nConnectionID); |
- if (FAILED(hr)) |
- { |
- DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVICE, "Class::Unadvice - Unadvise"); |
- } |
+ DEBUG_ERROR_LOG(hr, PLUGIN_ERROR_SET_SITE, PLUGIN_ERROR_SET_SITE_UNADVICE, "Class::Unadvice - Unadvise"); |
} |
- |
m_isAdviced = false; |
} |
} |