diff --git a/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.cpp b/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.cpp index 684ba799e00..ebb8425ba33 100644 --- a/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.cpp +++ b/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.cpp @@ -18,6 +18,8 @@ static char THIS_FILE[] = __FILE__; #include +#include + void __cdecl fperr(int sig) { CString sError; @@ -63,6 +65,7 @@ void CBrowseDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CBrowseDlg) + DDX_Control(pDX, IDC_DOMLIST, m_tcDOM); DDX_Control(pDX, IDC_RUNTEST, m_btnRunTest); DDX_Control(pDX, IDC_URL, m_cmbURLs); DDX_Control(pDX, IDC_TESTLIST, m_tcTests); @@ -81,6 +84,7 @@ BEGIN_MESSAGE_MAP(CBrowseDlg, CDialog) ON_BN_CLICKED(IDC_FORWARD, OnForward) ON_NOTIFY(TVN_SELCHANGED, IDC_TESTLIST, OnSelchangedTestlist) ON_NOTIFY(NM_DBLCLK, IDC_TESTLIST, OnDblclkTestlist) + ON_BN_CLICKED(IDC_REFRESHDOM, OnRefreshDOM) //}}AFX_MSG_MAP END_MESSAGE_MAP() @@ -89,6 +93,7 @@ END_MESSAGE_MAP() #define IL_TEST 2 #define IL_TESTFAILED 3 #define IL_TESTPASSED 4 +#define IL_NODE IL_TEST ///////////////////////////////////////////////////////////////////////////// // CBrowseDlg message handlers @@ -109,6 +114,8 @@ BOOL CBrowseDlg::OnInitDialog() m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TEST)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTFAILED)); m_cImageList.Add(AfxGetApp()->LoadIcon(IDI_TESTPASSED)); + + // Create the test tree m_tcTests.SetImageList(&m_cImageList, TVSIL_NORMAL); for (int i = 0; i < nTestSets; i++) { @@ -127,6 +134,9 @@ BOOL CBrowseDlg::OnInitDialog() } } + // Create the DOM tree + m_tcDOM.SetImageList(&m_cImageList, TVSIL_NORMAL); + // Set up some URLs. The first couple are internal m_cmbURLs.AddString(m_szTestURL); for (i = 0; i < sizeof(aURLs) / sizeof(aURLs[0]); i++) @@ -444,3 +454,98 @@ void CBrowseDlg::OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult) OnRuntest(); *pResult = 0; } + +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_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_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; + } + } + } +} + diff --git a/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.h b/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.h index 115c33c79eb..937c2eb8c45 100644 --- a/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.h +++ b/webshell/embed/ActiveX/tests/cbrowse/CBrowseDlg.h @@ -32,6 +32,7 @@ public: // Dialog Data //{{AFX_DATA(CBrowseDlg) enum { IDD = IDD_CBROWSE_DIALOG }; + CTreeCtrl m_tcDOM; CButton m_btnRunTest; CComboBox m_cmbURLs; CTreeCtrl m_tcTests; @@ -62,6 +63,7 @@ protected: afx_msg void OnForward(); afx_msg void OnSelchangedTestlist(NMHDR* pNMHDR, LRESULT* pResult); afx_msg void OnDblclkTestlist(NMHDR* pNMHDR, LRESULT* pResult); + afx_msg void OnRefreshDOM(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; diff --git a/webshell/embed/ActiveX/tests/cbrowse/cbrowse.rc b/webshell/embed/ActiveX/tests/cbrowse/cbrowse.rc index 633980c643e..15041d7f071 100644 --- a/webshell/embed/ActiveX/tests/cbrowse/cbrowse.rc +++ b/webshell/embed/ActiveX/tests/cbrowse/cbrowse.rc @@ -96,29 +96,34 @@ END // Dialog // -IDD_CBROWSE_DIALOG DIALOGEX 0, 0, 477, 318 +IDD_CBROWSE_DIALOG DIALOGEX 0, 0, 507, 318 STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME EXSTYLE WS_EX_APPWINDOW CAPTION "CBrowse" FONT 8, "MS Sans Serif" BEGIN RTEXT "Goto &URL:",IDC_STATIC,6,8,35,10 - DEFPUSHBUTTON "&Go",IDC_GO,230,7,25,13 - CONTROL "",IDC_BROWSER_MARKER,"Static",SS_BLACKFRAME,7,24,310, + DEFPUSHBUTTON "&Go",IDC_GO,172,7,25,13 + CONTROL "",IDC_BROWSER_MARKER,"Static",SS_BLACKFRAME,7,24,252, 205 - PUSHBUTTON "Run",IDC_RUNTEST,325,296,50,14,WS_DISABLED - LISTBOX IDC_LISTMESSAGES,7,247,310,63,WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Run",IDC_RUNTEST,271,289,50,14,WS_DISABLED + LISTBOX IDC_LISTMESSAGES,7,247,252,63,WS_VSCROLL | WS_TABSTOP LTEXT "Messages:",IDC_STATIC,7,233,110,11 CONTROL "Tree1",IDC_TESTLIST,"SysTreeView32",TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | - TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,330,16,134,222 - GROUPBOX "Tests",IDC_STATIC,324,7,146,237 - COMBOBOX IDC_URL,45,7,180,52,CBS_DROPDOWNLIST | WS_VSCROLL | + TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,271,16,100,211 + GROUPBOX "Tests",IDC_STATIC,265,7,112,303 + COMBOBOX IDC_URL,45,7,117,52,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - PUSHBUTTON "<",IDC_BACKWARD,261,7,25,13 - PUSHBUTTON ">",IDC_FORWARD,292,7,25,13 - GROUPBOX "Test Description",IDC_STATIC,324,246,146,45 - LTEXT "",IDC_TESTDESCRIPTION,328,258,137,28 + PUSHBUTTON "<",IDC_BACKWARD,203,7,25,13 + PUSHBUTTON ">",IDC_FORWARD,234,7,25,13 + GROUPBOX "Test Description",IDC_STATIC,271,234,100,49 + LTEXT "",IDC_TESTDESCRIPTION,276,245,90,33 + GROUPBOX "DOM",IDC_STATIC,388,7,112,303 + CONTROL "Tree1",IDC_DOMLIST,"SysTreeView32",TVS_HASBUTTONS | + TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS | + TVS_TRACKSELECT | WS_BORDER | WS_TABSTOP,394,16,100,211 + PUSHBUTTON "Refresh",IDC_REFRESHDOM,394,289,50,14 END @@ -176,9 +181,10 @@ BEGIN IDD_CBROWSE_DIALOG, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 470 + RIGHTMARGIN, 500 TOPMARGIN, 7 BOTTOMMARGIN, 310 + HORZGUIDE, 206 END END #endif // APSTUDIO_INVOKED diff --git a/webshell/embed/ActiveX/tests/cbrowse/resource.h b/webshell/embed/ActiveX/tests/cbrowse/resource.h index 8cf164982b4..e47af6d9fc9 100644 --- a/webshell/embed/ActiveX/tests/cbrowse/resource.h +++ b/webshell/embed/ActiveX/tests/cbrowse/resource.h @@ -22,6 +22,8 @@ #define IDC_FORWARD 1009 #define IDC_TESTDESCRIPTION 1010 #define IDC_TESTURL 1011 +#define IDC_DOMLIST 1012 +#define IDC_REFRESHDOM 1013 // Next default values for new objects // @@ -29,7 +31,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 135 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1012 +#define _APS_NEXT_CONTROL_VALUE 1014 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif