#include "StdAfx.h"
#include <ExDispid.h>
#include "browser.h"
#include "iraptor.h"
using namespace ir;
ir::iBrowserThread* ir::iBrowserThread::New( LPVOID data )
{
iBrowserThread* thread = (iBrowserThread*)iThreadMgr::GetThreadMgr()->CreateThread(data, tt_browser);
return thread;
}
ir::iBrowserThread* ir::iBrowserThread::Current()
{
return iThreadMgr::GetThreadMgr()->CurrentBrowserThread();
}
HRESULT ir::iBrowserThread::GetBrowser( IWebBrowser2** ppBrowser )
{
if (Raptor::Thread::Me() == (Raptor::Thread*)this) // 这是当前线程
{
CBrowserView* view = (CBrowserView*)(Raptor::BrowserViewBase*)this->winMain._data;
return view ? view->QueryControl(ppBrowser) : E_UNEXPECTED;
}
// 这是其他线程,首先确保浏览器窗口已经创建完毕
//while (_cookie==0)
while (this->_cookie == 0) WaitForIdle();
return GIT::LoadFromGIT(this->_cookie, IID_IWebBrowser2, (void**)ppBrowser);
}
HRESULT ir::iBrowserThread::GoBack()
{
Raptor::BrowserViewBase* view = (Raptor::BrowserViewBase*)this->winMain._data;
return Browser_GoBack(this->GetThread(), view);
}
HRESULT ir::iBrowserThread::GoForward()
{
Raptor::BrowserViewBase* view = (Raptor::BrowserViewBase*)this->winMain._data;
return Browser_GoForward(this->GetThread(), view);
}
HRESULT ir::iBrowserThread::Refresh()
{
Raptor::BrowserViewBase* view = (Raptor::BrowserViewBase*)this->winMain._data;
return Browser_Refresh(this->GetThread(), view);
}
HRESULT ir::iBrowserThread::Navigate( LPCOLESTR szUrl )
{
Raptor::BrowserViewBase* view = (Raptor::BrowserViewBase*)this->winMain._data;
return Browser_Navigate(this->GetThread(), view, szUrl);
}
void ir::iBrowserThread::GetCommandState( BOOL* pbBackEnabled, BOOL* pbForwardEnabled )
{
Raptor::BrowserViewBase* view = (Raptor::BrowserViewBase*)this->winMain._data;
Browser_GetCommandState(this->GetThread(), view, pbBackEnabled, pbForwardEnabled);
}
HWND ir::iBrowserThread::CreateBrowserWindow( Raptor::Thread* thread, LPVOID create_data )
{
//HRESULT hr = CoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_THREAD);
CoInternetSetFeatureEnabled(FEATURE_WEBOC_POPUPMANAGEMENT, SET_FEATURE_ON_THREAD|SET_FEATURE_ON_PROCESS, TRUE);
//CoInternetSetFeatureEnabled(FEATURE_BEHAVIORS, SET_FEATURE_ON_THREAD/*|SET_FEATURE_ON_PROCESS|0x70*/, TRUE);
//hr = CoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_THREAD);
iBrowserThread* pThis = (iBrowserThread*)thread;
CBrowserView* view = new CBrowserView;
thread->MainWindow()->SetData((Raptor::BrowserViewBase*)view);
return view->Create(MainWin_GetBrowserParent()/*, 0, 0, WS_CHILD|WS_VISIBLE*/);
//return view->Create(Main_Thread()->MainWindow()->Handle()/*, 0, (LPCTSTR)thread->GetThreadData()*/);
}
BOOL CBrowserView::PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;
// give HTML page a chance to translate this message
return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
}
LRESULT CBrowserView::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
LPCREATESTRUCT lpCreateStruct = (LPCREATESTRUCT)lParam;
// 注册消息过滤器
Raptor::Thread* me = Raptor::Thread::Me();
me->AddMessageFilter(/*WtlMessageFilter2RaptorMessageFilter*/(this));
// 执行默认的创建过程
LRESULT lr = DefWindowProc(uMsg, wParam, lParam);
_wb.CoCreateInstance(CLSID_WebBrowser);
CComPtr<IUnknown> unk;
CAxWindow::AttachControl(_wb, &unk);
_wb->put_RegisterAsBrowser(VARIANT_TRUE);
_wb->put_RegisterAsDropTarget(VARIANT_TRUE);
_wb->put_Silent(VARIANT_TRUE);
// 找到浏览器服务器子窗口
::EnumChildWindows(m_hWnd, &EnumChildProc, (LPARAM)this);
if (_isRoot)
{
_event.Connect();
CAxWindow::SetExternalUIHandler(&_hostuihandler);
iBrowserThread* bt = (iBrowserThread*)Raptor::Thread::Me();
bt->_cookie = GIT::SaveToGIT(_wb, IID_IWebBrowser2);
//// 设置用户AmbientDispatch接口
//CComPtr<IAxWinHostWindow> host;
//CAxWindow::QueryHost(&host);
//CAxHostWindow* phost = (CAxHostWindow*)host.p;
////phost->SetAmbientDispatch(&_dlCtrl);
////phost->m_dwDocHostFlags = DOCHOSTUIFLAG_NO3DBORDER | DOCHOSTUIFLAG_THEME | DOCHOSTUIFLAG_NO3DOUTERBORDER; // 这个可以在 CHostUIHandler 里设置
// 打开传入的URL,如果传入空,则打开默认页面
if (me->GetThreadData())
{
CComVariant url = (LPCTSTR)me->GetThreadData();
CComVariant vTmp;
if (lstrcmpiW(url.bstrVal, L"raptor:newtab") == 0)
{
url = BrowserExternal::get_newtaburl();
}
_wb->Navigate2(&url, &vTmp, &vTmp, &vTmp, &vTmp);
}
}
else // 弹窗设置
{
// 设置用户AmbientDispatch接口
CComPtr<IAxWinHostWindow> host;
CAxWindow::QueryHost(&host);
CAxHostWindow* phost = (CAxHostWindow*)host.p;
phost->SetAmbientDispatch(&_dlCtrl);
_dlCtrl._dwFlags =
//DLCTL_DLIMAGES |
//DLCTL_VIDEOS |
//DLCTL_BGSOUNDS |
DLCTL_URL_ENCODING_ENABLE_UTF8 |
DLCTL_DOWNLOADONLY |
DLCTL_SILENT |
DLCTL_NO_SCRIPTS |
DLCTL_NO_JAVA |
DLCTL_NO_DLACTIVEXCTLS |
DLCTL_NO_RUNACTIVEXCTLS |
0;
}
//ShowWindow(SW_SHOW);
return lr;
}
LRESULT CBrowserView::OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
//You should call SetMsgHandled(FALSE) or set bHandled = FALSE for the main window of your application
bHandled = FALSE;
_isDestroying = true;
Raptor::Thread::Me()->RemoveMessageFilter(/*WtlMessageFilter2RaptorMessageFilter*/(this));
// 下面的代码将强行释放该缓存接口
CComPtr<IAxWinHostWindow> host;
CAxWindow::QueryHost(&host);
CAxHostWindow* phost = (CAxHostWindow*)host.p;
phost->SetAmbientDispatch(NULL);
if (_isRoot)
{
iBrowserThread* thread = (iBrowserThread*)Raptor::Thread::Me();
GIT::RevokeFromGIT(thread->_cookie);
_event.Disconnect();
//CWindowImpl<CBrowserView, CAxWindow>::OnFinalMessage(hWnd);
// CAxHostWindow 中有一个BUG,在设置了IDocHostUIHandlerDispatch之后没有在ReleaseAll中释放该接口缓存,在继承窗口类delete this之后才会执行析构函数,导致释放出错
phost->m_spIDocHostUIHandlerDispatch.Release();
}
_wb.Release();
return 0;
}
LRESULT CBrowserView::OnParentNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
UINT msg = (UINT)LOWORD(wParam);
UINT idChild = (UINT)HIWORD(wParam);
if (msg == WM_DESTROY && (HWND)lParam==_hwndBrowserServer)
{
if (!_isRoot)
{
//DestroyWindow();
return 0;
}
if (!_isDestroying)
{
MainWin_RemoveTab(Raptor::Thread::Me()->MainWindow()->Handle());
DestroyWindow();
}
//bHandled = FALSE;
//return lret;
}
return 0;
}
void CBrowserView::OnFinalMessage( HWND hWnd )
{
delete this;
if (_isRoot)
Raptor::Thread::Me()->Close();
//PostQuitMessage(0);
// 还要通知主窗口删除对应的TAB
}
STDMETHODIMP CBrowserEvent::Invoke( DISPID dispIdMember, REFIID /*riid*/, LCID /*lcid*/, WORD wFlags, DISPPARAMS *pdispparams, VARIANT * /*pVarResult*/, EXCEPINFO * /*pExcepInfo*/, UINT * puArgErr )
{
ATLASSERT(wFlags==DISPATCH_METHOD);
//ATLTRACE(L"BrowserEvent::dispid(%d)\n", dispIdMember);
if (dispIdMember==DISPID_BEFORENAVIGATE2)
{
// BeforeNavigate2(LPDISPATCH pDisp, VARIANT FAR* URL, VARIANT FAR* Flags, VARIANT FAR* TargetFrameName, VARIANT FAR* PostData, VARIANT FAR* Headers, BOOL FAR* Cancel)
ATLASSERT(pdispparams->cArgs==7);
//int npdisp = 6;
//int nURL = 5;
//ATLASSERT(V_VT(&pdispparams->rgvarg[npdisp])==VT_DISPATCH && V_VT(&pdispparams->rgvarg[nURL])==(VT_VARIANT|VT_BYREF));
//(static_cast<T*>(this))->_OnBeforeNavigate2(pdispparams->rgvarg[npdisp].pdispVal, pdispparams->rgvarg[nURL].pvarVal);
}
else if (dispIdMember==DISPID_NAVIGATECOMPLETE2)
{
// NavigateComplete2(LPDISPATCH pDisp, VARIANT FAR* URL)
ATLASSERT(pdispparams->cArgs==2);
//int npdisp = 1;
//int nURL = 0;
//ATLASSERT(V_VT(&pdispparams->rgvarg[npdisp])=
- 1
- 2
前往页