// CBrowseDlg.cpp : implementation file // #include "stdafx.h" #include "cbrowse.h" #include "CBrowseDlg.h" #include "ControlEventSink.h" #include "..\..\src\control\DHTMLCmdIds.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #include #include #include #include #include void __cdecl fperr(int sig) { CString sError; sError.Format("FP Error %08x", sig); AfxMessageBox(sError); } TCHAR *aURLs[] = { _T("http://whippy/calendar.html"), _T("http://www.mozilla.org"), _T("http://www.yahoo.com"), _T("http://www.netscape.com"), _T("http://www.microsoft.com") }; CBrowseDlg *CBrowseDlg::m_pBrowseDlg = NULL; ///////////////////////////////////////////////////////////////////////////// // CBrowseDlg dialog CBrowseDlg::CBrowseDlg(CWnd* pParent /*=NULL*/) : CDialog(CBrowseDlg::IDD, pParent) { signal(SIGFPE, fperr); double x = 0.0; double y = 1.0/x; //{{AFX_DATA_INIT(CBrowseDlg) //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_pBrowseDlg = this; m_pControlSite = NULL; m_clsid = CLSID_NULL; m_bUseCustomPopupMenu = FALSE; m_bUseCustomDropTarget = FALSE; m_bEditMode = FALSE; m_bNewWindow = FALSE; m_bCanGoBack = FALSE; m_bCanGoForward = FALSE; } void CBrowseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBrowseDlg) DDX_Control(pDX, IDC_STOP, m_btnStop); DDX_Control(pDX, IDC_FORWARD, m_btnForward); DDX_Control(pDX, IDC_BACKWARD, m_btnBack); DDX_Control(pDX, IDC_URL, m_cmbURLs); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CBrowseDlg, CDialog) //{{AFX_MSG_MAP(CBrowseDlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_GO, OnGo) ON_BN_CLICKED(IDC_BACKWARD, OnBackward) ON_BN_CLICKED(IDC_FORWARD, OnForward) ON_WM_CLOSE() ON_WM_DESTROY() ON_WM_SIZE() ON_COMMAND(ID_FILE_EXIT, OnFileExit) ON_COMMAND(ID_VIEW_GOTO_BACK, OnViewGotoBack) ON_COMMAND(ID_VIEW_GOTO_FORWARD, OnViewGotoForward) ON_COMMAND(ID_VIEW_GOTO_HOME, OnViewGotoHome) ON_COMMAND(ID_EDIT_COPY, OnEditCopy) ON_COMMAND(ID_EDIT_CUT, OnEditCut) ON_COMMAND(ID_EDIT_PASTE, OnEditPaste) ON_COMMAND(ID_HELP_ABOUT, OnHelpAbout) ON_UPDATE_COMMAND_UI(ID_VIEW_GOTO_BACK, OnUpdateViewGotoBack) ON_UPDATE_COMMAND_UI(ID_VIEW_GOTO_FORWARD, OnUpdateViewGotoForward) ON_COMMAND(ID_EDIT_SELECTALL, OnEditSelectAll) ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh) ON_COMMAND(ID_VIEW_VIEWSOURCE, OnViewViewSource) ON_BN_CLICKED(IDC_STOP, OnStop) ON_COMMAND(ID_FILE_SAVEAS, OnFileSaveAs) ON_COMMAND(ID_FILE_PRINT, OnFilePrint) ON_COMMAND(ID_DEBUG_VISIBLE, OnDebugVisible) ON_UPDATE_COMMAND_UI(ID_DEBUG_VISIBLE, OnUpdateDebugVisible) ON_COMMAND(ID_DEBUG_POSTDATATEST, OnDebugPostDataTest) ON_BN_CLICKED(IDC_RELOAD, OnReload) ON_COMMAND(ID_VIEW_EDITMODE, OnViewEditmode) ON_COMMAND(ID_VIEW_OPENLINKSINNEWWINDOWS, OnViewOpenInNewWindow) ON_UPDATE_COMMAND_UI(ID_VIEW_EDITMODE, OnUpdateViewEditmode) ON_UPDATE_COMMAND_UI(ID_VIEW_OPENLINKSINNEWWINDOWS, OnUpdateViewOpenInNewWindow) ON_COMMAND(ID_FILE_PAGESETUP, OnFilePagesetup) //}}AFX_MSG_MAP ON_COMMAND(IDB_BOLD, OnEditBold) ON_COMMAND(IDB_ITALIC, OnEditItalic) ON_COMMAND(IDB_UNDERLINE, OnEditUnderline) END_MESSAGE_MAP() #define IL_CLOSEDFOLDER 0 #define IL_OPENFOLDER 1 #define IL_TEST 2 #define IL_TESTFAILED 3 #define IL_TESTPASSED 4 #define IL_TESTPARTIAL 5 #define IL_NODE IL_TEST ///////////////////////////////////////////////////////////////////////////// // CBrowseDlg message handlers BOOL CBrowseDlg::OnInitDialog() { CDialog::OnInitDialog(); CWinApp *pApp = AfxGetApp(); m_szTestURL = pApp->GetProfileString(SECTION_TEST, KEY_TESTURL, KEY_TESTURL_DEFAULTVALUE); m_szTestCGI = pApp->GetProfileString(SECTION_TEST, KEY_TESTCGI, KEY_TESTCGI_DEFAULTVALUE); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon CRect rcTabMarker; GetDlgItem(IDC_TAB_MARKER)->GetWindowRect(&rcTabMarker); ScreenToClient(rcTabMarker); m_dlgPropSheet.AddPage(&m_TabMessages); m_dlgPropSheet.AddPage(&m_TabTests); m_dlgPropSheet.AddPage(&m_TabDOM); m_TabMessages.m_pBrowseDlg = this; m_TabTests.m_pBrowseDlg = this; m_TabDOM.m_pBrowseDlg = this; m_dlgPropSheet.Create(this, WS_CHILD | WS_VISIBLE, 0); m_dlgPropSheet.ModifyStyleEx (0, WS_EX_CONTROLPARENT); m_dlgPropSheet.ModifyStyle( 0, WS_TABSTOP ); m_dlgPropSheet.SetWindowPos( NULL, rcTabMarker.left-7, rcTabMarker.top-7, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE ); // Image list m_cImageList.Create(16, 16, ILC_COLOR | ILC_MASK, 0, 10); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_CLOSEDFOLDER)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_OPENFOLDER)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TEST)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTFAILED)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTPASSED)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTPARTIAL)); // Set up the editor bar CRect rcEditBarMarker; GetDlgItem(IDC_EDITBAR_MARKER)->GetWindowRect(&rcEditBarMarker); ScreenToClient(rcEditBarMarker); GetDlgItem(IDC_EDITBAR_MARKER)->DestroyWindow(); m_EditBar.Create(this); m_EditBar.LoadToolBar(IDR_DHTMLEDIT); m_EditBar.SetWindowPos(&wndTop, rcEditBarMarker.left, rcEditBarMarker.top, rcEditBarMarker.Width(), rcEditBarMarker.Height(), SWP_SHOWWINDOW); // Set up some URLs. The first couple are internal m_cmbURLs.AddString(m_szTestURL); for (int i = 0; i < sizeof(aURLs) / sizeof(aURLs[0]); i++) { m_cmbURLs.AddString(aURLs[i]); } m_cmbURLs.SetCurSel(0); // Create the contained web browser CreateWebBrowser(); // Load the menu m_menu.LoadMenu(IDR_MAIN); SetMenu(&m_menu); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CBrowseDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CPaintDC dc(this); m_pControlSite->Draw(dc.m_hDC); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CBrowseDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } struct EnumData { CBrowseDlg *pBrowseDlg; CSize sizeDelta; }; BOOL CALLBACK EnumChildProc(HWND hwnd, LPARAM lParam) { EnumData *pData = (EnumData *) lParam; CBrowseDlg *pThis = pData->pBrowseDlg; switch (::GetDlgCtrlID(hwnd)) { case IDC_BROWSER_MARKER: { CWnd *pMarker = pThis->GetDlgItem(IDC_BROWSER_MARKER); CRect rcMarker; pMarker->GetWindowRect(&rcMarker); pThis->ScreenToClient(rcMarker); rcMarker.right += pData->sizeDelta.cx; rcMarker.bottom += pData->sizeDelta.cy; if (rcMarker.Width() > 10 && rcMarker.Height() > 10) { pMarker->SetWindowPos(&CWnd::wndBottom, 0, 0, rcMarker.Width(), rcMarker.Height(), SWP_NOMOVE | SWP_NOACTIVATE | SWP_HIDEWINDOW); pThis->m_pControlSite->SetPosition(rcMarker); } } break; case IDC_TAB_MARKER: { CWnd *pMarker = pThis->GetDlgItem(IDC_TAB_MARKER); CRect rcMarker; pMarker->GetWindowRect(&rcMarker); pThis->ScreenToClient(rcMarker); rcMarker.top += pData->sizeDelta.cy; if (rcMarker.top > 70) { pMarker->SetWindowPos(&CWnd::wndBottom, rcMarker.left, rcMarker.top, 0, 0, SWP_NOSIZE | SWP_NOACTIVATE | SWP_HIDEWINDOW); pThis->m_dlgPropSheet.SetWindowPos(NULL, rcMarker.left - 7, rcMarker.top - 7, 0, 0, SWP_NOREPOSITION | SWP_NOSIZE | SWP_NOACTIVATE); } } } return TRUE; } void CBrowseDlg::OnSize(UINT nType, int cx, int cy) { CDialog::OnSize(nType, cx, cy); if (m_hWnd == NULL) { return; } static CSize sizeOld(-1, -1); CSize sizeNew(cx, cy); if (sizeOld.cx != -1) { EnumData data; data.pBrowseDlg = this; data.sizeDelta = sizeNew - sizeOld; ::EnumChildWindows(GetSafeHwnd(), EnumChildProc, (LPARAM) &data); } sizeOld = sizeNew; } HRESULT CBrowseDlg::CreateWebBrowser() { // Get the position of the browser marker CRect rcMarker; GetDlgItem(IDC_BROWSER_MARKER)->GetWindowRect(&rcMarker); ScreenToClient(rcMarker); GetDlgItem(IDC_BROWSER_MARKER)->ShowWindow(FALSE); // GetDlgItem(IDC_BROWSER_MARKER)->DestroyWindow(); CBrowserCtlSiteInstance::CreateInstance(&m_pControlSite); if (m_pControlSite == NULL) { OutputString(_T("Error: could not create control site")); return E_OUTOFMEMORY; } CBrowseEventSinkInstance *pEventSink = NULL; CBrowseEventSinkInstance::CreateInstance(&pEventSink); if (pEventSink == NULL) { m_pControlSite->Release(); m_pControlSite = NULL; OutputString(_T("Error: could not create event sink")); return E_OUTOFMEMORY; } pEventSink->m_pBrowseDlg = this; HRESULT hr; PropertyList pl; m_pControlSite->AddRef(); m_pControlSite->m_bUseCustomPopupMenu = m_bUseCustomPopupMenu; m_pControlSite->m_bUseCustomDropTarget = m_bUseCustomDropTarget; m_pControlSite->Create(m_clsid, pl); hr = m_pControlSite->Attach(GetSafeHwnd(), rcMarker, NULL); if (hr != S_OK) { OutputString(_T("Error: Cannot attach to browser control, hr = 0x%08x"), hr); } else { OutputString(_T("Sucessfully attached to browser control")); } m_pControlSite->SetPosition(rcMarker); hr = m_pControlSite->Advise(pEventSink, DIID_DWebBrowserEvents2, &m_dwCookie); if (hr != S_OK) { OutputString(_T("Error: Cannot subscribe to DIID_DWebBrowserEvents2 events, hr = 0x%08x"), hr); } else { OutputString(_T("Sucessfully subscribed to events")); } CComPtr spUnkBrowser; m_pControlSite->GetControlUnknown(&spUnkBrowser); CIPtr(IWebBrowser2) spWebBrowser = spUnkBrowser; if (spWebBrowser) { spWebBrowser->put_RegisterAsDropTarget(VARIANT_TRUE); } return S_OK; } HRESULT CBrowseDlg::DestroyWebBrowser() { if (m_pControlSite) { m_pControlSite->Unadvise(DIID_DWebBrowserEvents2, m_dwCookie); m_pControlSite->Detach(); m_pControlSite->Release(); m_pControlSite = NULL; } return S_OK; } void CBrowseDlg::PopulateTests() { // Create the test tree CTreeCtrl &tc = m_TabTests.m_tcTests; tc.SetImageList(&m_cImageList, TVSIL_NORMAL); for (int i = 0; i < nTestSets; i++) { TestSet *pTestSet = &aTestSets[i]; HTREEITEM hParent = tc.InsertItem(pTestSet->szName, IL_CLOSEDFOLDER, IL_CLOSEDFOLDER); m_TabTests.m_tcTests.SetItemData(hParent, (DWORD) pTestSet); if (pTestSet->pfnPopulator) { pTestSet->pfnPopulator(pTestSet); } for (int j = 0; j < pTestSet->nTests; j++) { Test *pTest = &pTestSet->aTests[j]; HTREEITEM hTest = tc.InsertItem(pTest->szName, IL_TEST, IL_TEST, hParent); if (hTest) { tc.SetItemData(hTest, (DWORD) pTest); } } } } void CBrowseDlg::UpdateURL() { CIPtr(IWebBrowser) spBrowser; GetWebBrowser(&spBrowser); if (spBrowser) { USES_CONVERSION; BSTR szLocation = NULL; spBrowser->get_LocationURL(&szLocation); m_cmbURLs.SetWindowText(W2T(szLocation)); SysFreeString(szLocation); } } HRESULT CBrowseDlg::GetWebBrowser(IWebBrowser **pWebBrowser) { if (pWebBrowser == NULL) { return E_INVALIDARG; } *pWebBrowser = NULL; if (m_pControlSite) { IUnknown *pIUnkBrowser = NULL; m_pControlSite->GetControlUnknown(&pIUnkBrowser); if (pIUnkBrowser) { pIUnkBrowser->QueryInterface(IID_IWebBrowser, (void **) pWebBrowser); pIUnkBrowser->Release(); if (*pWebBrowser) { return S_OK; } } } return E_FAIL; } void CBrowseDlg::OnGo() { UpdateData(); CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { CString szURL; m_cmbURLs.GetWindowText(szURL); CComVariant vFlags(m_bNewWindow ? navOpenInNewWindow : 0); BSTR bstrURL = szURL.AllocSysString(); HRESULT hr = webBrowser->Navigate(bstrURL, &vFlags, NULL, NULL, NULL); if (FAILED(hr)) { OutputString("Navigate failed (hr=0x%08x)", hr); } ::SysFreeString(bstrURL); } } void CBrowseDlg::OnStop() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { webBrowser->Stop(); } } void CBrowseDlg::OnReload() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { CComVariant vValue(REFRESH_COMPLETELY); webBrowser->Refresh2(&vValue); } } void CBrowseDlg::OnBackward() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { webBrowser->GoBack(); } } void CBrowseDlg::OnForward() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { webBrowser->GoForward(); } } void CBrowseDlg::RunTestSet(TestSet *pTestSet) { ASSERT(pTestSet); if (pTestSet == NULL) { return; } for (int j = 0; j < pTestSet->nTests; j++) { Test *pTest = &pTestSet->aTests[j]; RunTest(pTest); } } TestResult CBrowseDlg::RunTest(Test *pTest) { ASSERT(pTest); TestResult nResult = trFailed; CString szMsg; szMsg.Format(_T("Running test \"%s\""), pTest->szName); OutputString(szMsg); if (pTest && pTest->pfn) { BrowserInfo cInfo; cInfo.pTest = pTest; cInfo.clsid = m_clsid; cInfo.pControlSite = m_pControlSite; cInfo.pIUnknown = NULL; cInfo.pBrowseDlg = this; cInfo.szTestURL = m_szTestURL; cInfo.szTestCGI = m_szTestCGI; if (cInfo.pControlSite) { cInfo.pControlSite->GetControlUnknown(&cInfo.pIUnknown); } nResult = pTest->pfn(cInfo); pTest->nLastResult = nResult; if (cInfo.pIUnknown) { cInfo.pIUnknown->Release(); } } switch (nResult) { case trFailed: OutputString(_T("Test failed")); break; case trPassed: OutputString(_T("Test passed")); break; case trPartial: OutputString(_T("Test partial")); break; default: break; } return nResult; } void CBrowseDlg::OutputString(const TCHAR *szMessage, ...) { if (m_pBrowseDlg == NULL) { return; } TCHAR szBuffer[256]; va_list cArgs; va_start(cArgs, szMessage); _vstprintf(szBuffer, szMessage, cArgs); va_end(cArgs); CString szOutput; szOutput.Format(_T("%s"), szBuffer); m_TabMessages.m_lbMessages.AddString(szOutput); m_TabMessages.m_lbMessages.SetTopIndex(m_TabMessages.m_lbMessages.GetCount() - 1); } void CBrowseDlg::UpdateTest(HTREEITEM hItem, TestResult nResult) { if (nResult == trPassed) { m_TabTests.m_tcTests.SetItemImage(hItem, IL_TESTPASSED, IL_TESTPASSED); } else if (nResult == trFailed) { m_TabTests.m_tcTests.SetItemImage(hItem, IL_TESTFAILED, IL_TESTFAILED); } else if (nResult == trPartial) { m_TabTests.m_tcTests.SetItemImage(hItem, IL_TESTPARTIAL, IL_TESTPARTIAL); } } void CBrowseDlg::UpdateTestSet(HTREEITEM hItem) { // Examine the results HTREEITEM hTest = m_TabTests.m_tcTests.GetNextItem(hItem, TVGN_CHILD); while (hTest) { Test *pTest = (Test *) m_TabTests.m_tcTests.GetItemData(hTest); UpdateTest(hTest, pTest->nLastResult); hTest = m_TabTests.m_tcTests.GetNextItem(hTest, TVGN_NEXT); } } void CBrowseDlg::OnRunTest() { HTREEITEM hItem = m_TabTests.m_tcTests.GetNextItem(NULL, TVGN_FIRSTVISIBLE); while (hItem) { UINT nState = m_TabTests.m_tcTests.GetItemState(hItem, TVIS_SELECTED); if (!(nState & TVIS_SELECTED)) { hItem = m_TabTests.m_tcTests.GetNextItem(hItem, TVGN_NEXTVISIBLE); continue; } if (m_TabTests.m_tcTests.ItemHasChildren(hItem)) { // Run complete set of tests TestSet *pTestSet = (TestSet *) m_TabTests.m_tcTests.GetItemData(hItem); RunTestSet(pTestSet); UpdateTestSet(hItem); } else { // Find the test Test *pTest = (Test *) m_TabTests.m_tcTests.GetItemData(hItem); TestResult nResult = RunTest(pTest); UpdateTest(hItem, nResult); } hItem = m_TabTests.m_tcTests.GetNextItem(hItem, TVGN_NEXTVISIBLE); } } struct _ElementPos { HTREEITEM m_htiParent; CIPtr(IHTMLElementCollection) m_cpElementCollection; int m_nIndex; _ElementPos(HTREEITEM htiParent, IHTMLElementCollection *pElementCollection, int nIndex) { m_htiParent = htiParent; m_cpElementCollection = pElementCollection; m_nIndex = nIndex; } _ElementPos() { } }; void CBrowseDlg::OnRefreshDOM() { m_TabDOM.m_tcDOM.DeleteAllItems(); std::stack<_ElementPos> cStack; CComPtr cpUnkPtr; m_pControlSite->GetControlUnknown(&cpUnkPtr); CIPtr(IWebBrowserApp) cpWebBrowser = cpUnkPtr; if (cpWebBrowser == NULL) { return; } CIPtr(IDispatch) cpDispDocument; cpWebBrowser->get_Document(&cpDispDocument); if (cpDispDocument == NULL) { return; } // Recurse the DOM, building a tree CIPtr(IHTMLDocument2) cpDocElement = cpDispDocument; CIPtr(IHTMLElementCollection) cpColl; HRESULT hr = cpDocElement->get_all( &cpColl ); cStack.push(_ElementPos(NULL, cpColl, 0)); while (!cStack.empty()) { // Pop next position from stack _ElementPos pos = cStack.top(); cStack.pop(); // Iterate through elemenets in collection LONG nElements = 0;; pos.m_cpElementCollection->get_length(&nElements); for (int i = pos.m_nIndex; i < nElements; i++ ) { CComVariant vName(i); CComVariant vIndex; CIPtr(IDispatch) cpDisp; hr = pos.m_cpElementCollection->item( vName, vIndex, &cpDisp ); if ( hr != S_OK ) { continue; } CIPtr(IHTMLElement) cpElem = cpDisp; if (cpElem == NULL) { continue; } // Get tag name BSTR bstrTagName = NULL; hr = cpElem->get_tagName(&bstrTagName); CString szTagName = bstrTagName; SysFreeString(bstrTagName); // Add an icon to the tree HTREEITEM htiParent = m_TabDOM.m_tcDOM.InsertItem(szTagName, IL_CLOSEDFOLDER, IL_CLOSEDFOLDER, pos.m_htiParent); CIPtr(IDispatch) cpDispColl; hr = cpElem->get_children(&cpDispColl); if (hr == S_OK) { CIPtr(IHTMLElementCollection) cpChildColl = cpDispColl; cStack.push(_ElementPos(pos.m_htiParent, pos.m_cpElementCollection, pos.m_nIndex + 1)); cStack.push(_ElementPos(htiParent, cpChildColl, 0)); break; } } } } void CBrowseDlg::OnClose() { DestroyWebBrowser(); DestroyWindow(); } void CBrowseDlg::OnDestroy() { CDialog::OnDestroy(); delete this; } void CBrowseDlg::ExecOleCommand(const GUID *pguidGroup, DWORD nCmdId) { CComPtr spUnkBrowser; m_pControlSite->GetControlUnknown(&spUnkBrowser); CIPtr(IOleCommandTarget) spCommandTarget = spUnkBrowser; if (spCommandTarget) { HRESULT hr = spCommandTarget->Exec(&CGID_MSHTML, nCmdId, 0, NULL, NULL); OutputString(_T("Exec(%d), returned %08x"), (int) nCmdId, hr); } else { OutputString(_T("Error: Browser does not support IOleCommandTarget")); } } void CBrowseDlg::OnEditBold() { ExecOleCommand(&CGID_MSHTML, IDM_BOLD); } void CBrowseDlg::OnEditItalic() { ExecOleCommand(&CGID_MSHTML, IDM_ITALIC); } void CBrowseDlg::OnEditUnderline() { ExecOleCommand(&CGID_MSHTML, IDM_UNDERLINE); } void CBrowseDlg::OnFileExit() { OnClose(); } void CBrowseDlg::OnViewRefresh() { OnReload(); } void CBrowseDlg::OnViewGotoBack() { OnBackward(); } void CBrowseDlg::OnViewGotoForward() { OnForward(); } void CBrowseDlg::OnUpdateViewGotoBack(CCmdUI* pCmdUI) { pCmdUI->Enable(m_bCanGoBack); } void CBrowseDlg::OnUpdateViewGotoForward(CCmdUI* pCmdUI) { pCmdUI->Enable(m_bCanGoForward); } void CBrowseDlg::OnViewGotoHome() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { webBrowser->GoHome(); } } void CBrowseDlg::OnEditCopy() { ExecOleCommand(NULL, OLECMDID_COPY); } void CBrowseDlg::OnEditCut() { ExecOleCommand(NULL, OLECMDID_CUT); } void CBrowseDlg::OnEditPaste() { ExecOleCommand(NULL, OLECMDID_PASTE); } void CBrowseDlg::OnEditSelectAll() { ExecOleCommand(NULL, OLECMDID_SELECTALL); } void CBrowseDlg::OnHelpAbout() { AfxMessageBox(_T("CBrowse - Browser Control Test Harness")); } void CBrowseDlg::OnViewViewSource() { ExecOleCommand(&CGID_MSHTML, 3); } void CBrowseDlg::OnFileSaveAs() { ExecOleCommand(NULL, OLECMDID_SAVEAS); } void CBrowseDlg::OnFilePrint() { ExecOleCommand(NULL, OLECMDID_PRINT); } void CBrowseDlg::OnFilePagesetup() { ExecOleCommand(NULL, OLECMDID_PAGESETUP); } void CBrowseDlg::OnDebugVisible() { VARIANT_BOOL visible = VARIANT_TRUE; CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { CIPtr(IWebBrowserApp) cpWebBrowser = webBrowser; cpWebBrowser->get_Visible(&visible); cpWebBrowser->put_Visible(visible == VARIANT_TRUE ? VARIANT_FALSE : VARIANT_TRUE); } } void CBrowseDlg::OnUpdateDebugVisible(CCmdUI* pCmdUI) { VARIANT_BOOL visible = VARIANT_TRUE; CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { CIPtr(IWebBrowserApp) cpWebBrowser = webBrowser; cpWebBrowser->get_Visible(&visible); } pCmdUI->SetCheck(visible == VARIANT_TRUE ? 1 : 0); } void CBrowseDlg::OnDebugPostDataTest() { CComPtr webBrowser; if (SUCCEEDED(GetWebBrowser(&webBrowser))) { CIPtr(IWebBrowser2) cpWebBrowser = webBrowser; CComVariant vURL(L"http://www.mozilla.org/htdig-cgi/htsearch"); const char *szPostData="config=htdig&restrict=&exclude=&words=embedding&method=and&format=builtin-long"; size_t nSize = strlen(szPostData); SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, nSize); LPSTR pPostData; SafeArrayAccessData(psa, (LPVOID*) &pPostData); memcpy(pPostData, szPostData, nSize); SafeArrayUnaccessData(psa); CComVariant vPostData; vPostData.vt = VT_ARRAY | VT_UI1; vPostData.parray = psa; CComVariant vHeaders(L"Content-Type: application/x-www-form-urlencoded\r\n"); cpWebBrowser->Navigate2( &vURL, NULL, // Flags NULL, // Target &vPostData, &vHeaders // Headers ); } } void CBrowseDlg::OnViewEditmode() { m_bEditMode = m_bEditMode ? FALSE : TRUE; DWORD nCmdID = m_bEditMode ? IDM_EDITMODE : IDM_BROWSEMODE; ExecOleCommand(&CGID_MSHTML, nCmdID); // if (m_pControlSite) // { // m_pControlSite->SetAmbientUserMode((m_btnEditMode.GetCheck() == 0) ? FALSE : TRUE); // } } void CBrowseDlg::OnViewOpenInNewWindow() { m_bNewWindow = m_bNewWindow ? FALSE : TRUE; } void CBrowseDlg::OnUpdateViewEditmode(CCmdUI* pCmdUI) { pCmdUI->SetCheck(m_bEditMode ? 1 : 0); } void CBrowseDlg::OnUpdateViewOpenInNewWindow(CCmdUI* pCmdUI) { pCmdUI->SetCheck(1); //m_bNewWindow ? 1 : 0); }