PageRenderTime 43ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/mozilla/mozilla/dist/include/ax_common/IWebBrowserImpl.h

http://kmbrasil.codeplex.com
C++ Header | 1182 lines | 899 code | 118 blank | 165 comment | 128 complexity | 5d450d9b61473038795518e3c6029eba MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, GPL-2.0
  1. /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
  2. /* ***** BEGIN LICENSE BLOCK *****
  3. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  4. *
  5. * The contents of this file are subject to the Mozilla Public License Version
  6. * 1.1 (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. * http://www.mozilla.org/MPL/
  9. *
  10. * Software distributed under the License is distributed on an "AS IS" basis,
  11. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. * for the specific language governing rights and limitations under the
  13. * License.
  14. *
  15. * The Original Code is mozilla.org code.
  16. *
  17. * The Initial Developer of the Original Code is
  18. * Netscape Communications Corporation.
  19. * Portions created by the Initial Developer are Copyright (C) 1998
  20. * the Initial Developer. All Rights Reserved.
  21. *
  22. * Contributor(s):
  23. * Adam Lock <adamlock@eircom.net>
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * either the GNU General Public License Version 2 or later (the "GPL"), or
  27. * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  28. * in which case the provisions of the GPL or the LGPL are applicable instead
  29. * of those above. If you wish to allow use of your version of this file only
  30. * under the terms of either the GPL or the LGPL, and not to allow others to
  31. * use your version of this file under the terms of the MPL, indicate your
  32. * decision by deleting the provisions above and replace them with the notice
  33. * and other provisions required by the GPL or the LGPL. If you do not delete
  34. * the provisions above, a recipient may use your version of this file under
  35. * the terms of any one of the MPL, the GPL or the LGPL.
  36. *
  37. * ***** END LICENSE BLOCK ***** */
  38. #ifndef IWEBBROWSERIMPL_H
  39. #define IWEBBROWSERIMPL_H
  40. #include <mshtml.h>
  41. #include "nsIWebNavigation.h"
  42. #include "nsIPrefBranch.h"
  43. #include "nsIPrefLocalizedString.h"
  44. #include "nsIDOMWindow.h"
  45. #include "nsIBaseWindow.h"
  46. #include "nsIWindowWatcher.h"
  47. #include "nsIInputStream.h"
  48. #include "nsIByteArrayInputStream.h"
  49. #include "nsIURI.h"
  50. #include "PropertyList.h"
  51. // CPMozillaControl.h was autogenerated by the ATL proxy wizard so don't edit it!
  52. #include "CPMozillaControl.h"
  53. #define ENSURE_BROWSER_IS_VALID() \
  54. if (!BrowserIsValid()) \
  55. { \
  56. NS_ASSERTION(0, "Browser is not valid"); \
  57. return SetErrorInfo(E_UNEXPECTED, L"Browser is not in a valid state"); \
  58. }
  59. #define ENSURE_GET_WEBNAV() \
  60. nsCOMPtr<nsIWebNavigation> webNav; \
  61. nsresult rv = GetWebNavigation(getter_AddRefs(webNav)); \
  62. if (NS_FAILED(rv)) \
  63. { \
  64. NS_ASSERTION(0, "Cannot get nsIWebNavigation"); \
  65. return SetErrorInfo(E_UNEXPECTED, L"Could not obtain nsIWebNavigation interface"); \
  66. }
  67. template<class T, const CLSID *pclsid, const GUID* plibid = &LIBID_MSHTML>
  68. class IWebBrowserImpl :
  69. public CStockPropImpl<T, IWebBrowser2, &IID_IWebBrowser2, plibid>,
  70. public CProxyDWebBrowserEvents<T>,
  71. public CProxyDWebBrowserEvents2<T>
  72. {
  73. public:
  74. IWebBrowserImpl()
  75. {
  76. // Ready state of control
  77. mBrowserReadyState = READYSTATE_UNINITIALIZED;
  78. // Flag indicates if the browser is busy
  79. mBusyFlag = PR_FALSE;
  80. }
  81. public:
  82. // Methods to be implemented by the derived class
  83. // Return the nsIWebNavigation object
  84. virtual nsresult GetWebNavigation(nsIWebNavigation **aWebNav) = 0;
  85. // Return the nsIDOMWindow object
  86. virtual nsresult GetDOMWindow(nsIDOMWindow **aDOMWindow) = 0;
  87. // Return the nsIPrefBranch object
  88. virtual nsresult GetPrefs(nsIPrefBranch **aPrefBranch) = 0;
  89. // Return the valid state of the browser
  90. virtual PRBool BrowserIsValid() = 0;
  91. public:
  92. // Properties related to this interface
  93. // Post data from last navigate operation
  94. CComVariant mLastPostData;
  95. // Ready status of the browser
  96. READYSTATE mBrowserReadyState;
  97. // Controls starts off unbusy
  98. PRBool mBusyFlag;
  99. // Property list
  100. PropertyList mPropertyList;
  101. // Helper methods
  102. //
  103. // Sets error information for VB programmers and the like who want to know why
  104. // some method call failed.
  105. //
  106. virtual HRESULT SetErrorInfo(HRESULT hr, LPCOLESTR lpszDesc = NULL)
  107. {
  108. if (lpszDesc == NULL)
  109. {
  110. // Fill in a few generic descriptions
  111. switch (hr)
  112. {
  113. case E_UNEXPECTED:
  114. lpszDesc = L"Method was called while control was uninitialized";
  115. break;
  116. case E_INVALIDARG:
  117. lpszDesc = L"Method was called with an invalid parameter";
  118. break;
  119. }
  120. }
  121. AtlSetErrorInfo(*pclsid, lpszDesc, 0, NULL, GUID_NULL, hr, NULL);
  122. return hr;
  123. }
  124. // IWebBrowser implementation
  125. virtual HRESULT STDMETHODCALLTYPE GoBack(void)
  126. {
  127. ATLTRACE(_T("IWebBrowserImpl::GoBack()\n"));
  128. ENSURE_BROWSER_IS_VALID();
  129. ENSURE_GET_WEBNAV();
  130. PRBool aCanGoBack = PR_FALSE;
  131. webNav->GetCanGoBack(&aCanGoBack);
  132. if (aCanGoBack == PR_TRUE)
  133. {
  134. webNav->GoBack();
  135. }
  136. return S_OK;
  137. }
  138. virtual HRESULT STDMETHODCALLTYPE GoForward(void)
  139. {
  140. ATLTRACE(_T("IWebBrowserImpl::GoBack()\n"));
  141. ENSURE_BROWSER_IS_VALID();
  142. ENSURE_GET_WEBNAV();
  143. PRBool aCanGoForward = PR_FALSE;
  144. webNav->GetCanGoForward(&aCanGoForward);
  145. if (aCanGoForward == PR_TRUE)
  146. {
  147. webNav->GoForward();
  148. }
  149. return S_OK;
  150. }
  151. virtual HRESULT STDMETHODCALLTYPE GoHome(void)
  152. {
  153. ATLTRACE(_T("IWebBrowserImpl::GoHome()\n"));
  154. ENSURE_BROWSER_IS_VALID();
  155. CComBSTR bstrUrl(L"http://home.netscape.com/");
  156. // Find the home page stored in prefs
  157. nsCOMPtr<nsIPrefBranch> prefBranch;
  158. if (NS_SUCCEEDED(GetPrefs(getter_AddRefs(prefBranch))))
  159. {
  160. nsCOMPtr<nsIPrefLocalizedString> homePage;
  161. prefBranch->GetComplexValue("browser.startup.homepage",
  162. NS_GET_IID(nsIPrefLocalizedString),
  163. getter_AddRefs(homePage));
  164. if (homePage)
  165. {
  166. nsXPIDLString homePageString;
  167. nsresult rv = homePage->ToString(getter_Copies(homePageString));
  168. if (NS_SUCCEEDED(rv))
  169. {
  170. bstrUrl = homePageString.get();
  171. }
  172. }
  173. }
  174. // Navigate to the home page
  175. Navigate(bstrUrl, NULL, NULL, NULL, NULL);
  176. return S_OK;
  177. }
  178. virtual HRESULT STDMETHODCALLTYPE GoSearch(void)
  179. {
  180. ATLTRACE(_T("IWebBrowserImpl::GoSearch()\n"));
  181. ENSURE_BROWSER_IS_VALID();
  182. CComBSTR bstrUrl(L"http://search.netscape.com/");
  183. //NOTE: This code has not been implemented yet
  184. #if 0
  185. // Find the home page stored in prefs
  186. nsCOMPtr<nsIPrefBranch> prefBranch;
  187. if (NS_SUCCEEDED(GetPrefs(getter_AddRefs(prefBranch))))
  188. {
  189. // TODO find and navigate to the search page stored in prefs
  190. // and not this hard coded address
  191. }
  192. #endif
  193. // Navigate to the search page
  194. Navigate(bstrUrl, NULL, NULL, NULL, NULL);
  195. return S_OK;
  196. }
  197. virtual HRESULT STDMETHODCALLTYPE Navigate(BSTR URL, VARIANT __RPC_FAR *Flags, VARIANT __RPC_FAR *TargetFrameName, VARIANT __RPC_FAR *PostData, VARIANT __RPC_FAR *Headers)
  198. {
  199. ATLTRACE(_T("IWebBrowserImpl::Navigate()\n"));
  200. ENSURE_BROWSER_IS_VALID();
  201. // Extract the URL parameter
  202. if (URL == NULL)
  203. {
  204. NS_ASSERTION(0, "No URL supplied");
  205. return SetErrorInfo(E_INVALIDARG);
  206. }
  207. PRBool openInNewWindow = PR_FALSE;
  208. PRUint32 loadFlags = nsIWebNavigation::LOAD_FLAGS_NONE;
  209. // Extract the navigate flags parameter
  210. LONG lFlags = 0;
  211. if (Flags &&
  212. Flags->vt != VT_ERROR &&
  213. Flags->vt != VT_EMPTY &&
  214. Flags->vt != VT_NULL)
  215. {
  216. CComVariant vFlags;
  217. if ( vFlags.ChangeType(VT_I4, Flags) != S_OK )
  218. {
  219. NS_ASSERTION(0, "Flags param is invalid");
  220. return SetErrorInfo(E_INVALIDARG);
  221. }
  222. lFlags = vFlags.lVal;
  223. }
  224. if (lFlags & navOpenInNewWindow)
  225. {
  226. openInNewWindow = PR_TRUE;
  227. }
  228. if (lFlags & navNoHistory)
  229. {
  230. // Disable history
  231. loadFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_HISTORY;
  232. }
  233. if (lFlags & navNoReadFromCache)
  234. {
  235. // Disable read from cache
  236. loadFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE;
  237. }
  238. if (lFlags & navNoWriteToCache)
  239. {
  240. // Disable write to cache
  241. loadFlags |= nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE;
  242. }
  243. // Extract the target frame parameter
  244. nsCOMPtr<nsIWebNavigation> targetNav;
  245. if (TargetFrameName &&
  246. TargetFrameName->vt == VT_BSTR &&
  247. TargetFrameName->bstrVal)
  248. {
  249. // Search for the named frame
  250. nsCOMPtr<nsIDOMWindow> window;
  251. GetDOMWindow(getter_AddRefs(window));
  252. if (window)
  253. {
  254. nsCOMPtr<nsIWindowWatcher> windowWatcher = do_GetService(NS_WINDOWWATCHER_CONTRACTID);
  255. if (windowWatcher)
  256. {
  257. nsCOMPtr<nsIDOMWindow> targetWindow;
  258. windowWatcher->GetWindowByName(TargetFrameName->bstrVal, window,
  259. getter_AddRefs(targetWindow));
  260. if (targetWindow)
  261. {
  262. targetNav = do_GetInterface(targetWindow);
  263. }
  264. }
  265. }
  266. // No target nav? Open in new window
  267. if (!targetNav)
  268. openInNewWindow = PR_TRUE;
  269. }
  270. // Open in new window
  271. if (openInNewWindow)
  272. {
  273. CComQIPtr<IDispatch> spDispNew;
  274. VARIANT_BOOL bCancel = VARIANT_FALSE;
  275. // Test if the event sink can give us a new window to navigate into
  276. Fire_NewWindow2(&spDispNew, &bCancel);
  277. lFlags &= ~(navOpenInNewWindow);
  278. if ((bCancel == VARIANT_FALSE) && spDispNew)
  279. {
  280. CComQIPtr<IWebBrowser2> spOther = spDispNew;
  281. if (spOther)
  282. {
  283. CComVariant vURL(URL);
  284. CComVariant vFlags(lFlags);
  285. return spOther->Navigate2(&vURL, &vFlags, TargetFrameName, PostData, Headers);
  286. }
  287. }
  288. // NOTE: The IE control will launch an instance of iexplore.exe and
  289. // return an interface to that if the client does not respond to
  290. // FireNewWindow2, but the Mozilla control will not. Potentially
  291. // it could also open an instance of IE for such occasions.
  292. //
  293. // Can't open a new window without client support
  294. return S_OK;
  295. }
  296. // As documented in MSDN:
  297. //
  298. // The post data specified by PostData is passed as a SAFEARRAY
  299. // structure. The variant should be of type VT_ARRAY and point to
  300. // a SAFEARRAY. The SAFEARRAY should be of element type VT_UI1,
  301. // dimension one, and have an element count equal to the number of
  302. // bytes of post data.
  303. // Extract the post data parameter
  304. nsCOMPtr<nsIInputStream> postDataStream;
  305. mLastPostData.Clear();
  306. if (PostData &&
  307. PostData->vt == (VT_ARRAY | VT_UI1) &&
  308. PostData->parray)
  309. {
  310. mLastPostData.Copy(PostData);
  311. unsigned long nSizeData = PostData->parray->rgsabound[0].cElements;
  312. if (nSizeData > 0)
  313. {
  314. char szCL[64];
  315. sprintf(szCL, "Content-Length: %lu\r\n\r\n", nSizeData);
  316. unsigned long nSizeCL = strlen(szCL);
  317. unsigned long nSize = nSizeCL + nSizeData;
  318. char *tmp = (char *) nsMemory::Alloc(nSize + 1); // byte stream owns this mem
  319. if (tmp)
  320. {
  321. // Copy the array data into a buffer
  322. SafeArrayLock(PostData->parray);
  323. memcpy(tmp, szCL, nSizeCL);
  324. memcpy(tmp + nSizeCL, PostData->parray->pvData, nSizeData);
  325. tmp[nSize] = '\0';
  326. SafeArrayUnlock(PostData->parray);
  327. // Create a byte array input stream object.
  328. nsCOMPtr<nsIByteArrayInputStream> stream;
  329. nsresult rv = NS_NewByteArrayInputStream(
  330. getter_AddRefs(stream), tmp, nSize);
  331. if (NS_FAILED(rv) || !stream)
  332. {
  333. NS_ASSERTION(0, "cannot create byte stream");
  334. nsMemory::Free(tmp);
  335. return SetErrorInfo(E_UNEXPECTED);
  336. }
  337. postDataStream = stream;
  338. }
  339. }
  340. }
  341. // Extract the headers parameter
  342. nsCOMPtr<nsIByteArrayInputStream> headersStream;
  343. if (Headers &&
  344. Headers->vt == VT_BSTR &&
  345. Headers->bstrVal)
  346. {
  347. USES_CONVERSION;
  348. char *headers = OLE2A(Headers->bstrVal);
  349. if (headers)
  350. {
  351. size_t nSize = SysStringLen(Headers->bstrVal) + 1;
  352. char *tmp = (char *) nsMemory::Alloc(nSize); // byteArray stream owns this mem
  353. if (tmp)
  354. {
  355. // Copy BSTR to buffer
  356. WideCharToMultiByte(CP_ACP, 0, Headers->bstrVal, nSize - 1, tmp, nSize, NULL, NULL);
  357. tmp[nSize - 1] = '\0';
  358. // Create a byte array input stream object which will own the buffer
  359. nsCOMPtr<nsIByteArrayInputStream> stream;
  360. nsresult rv =
  361. NS_NewByteArrayInputStream(getter_AddRefs(stream), tmp, nSize);
  362. if (NS_FAILED(rv) || !stream)
  363. {
  364. NS_ASSERTION(0, "cannot create byte stream");
  365. nsMemory::Free(tmp);
  366. }
  367. headersStream = do_QueryInterface(stream);
  368. }
  369. }
  370. }
  371. // Use the specified target or the top level web navigation
  372. nsCOMPtr<nsIWebNavigation> webNavToUse;
  373. if (targetNav)
  374. {
  375. webNavToUse = targetNav;
  376. }
  377. else
  378. {
  379. GetWebNavigation(getter_AddRefs(webNavToUse));
  380. }
  381. // Load the URL
  382. nsresult rv = NS_ERROR_FAILURE;
  383. if (webNavToUse)
  384. {
  385. rv = webNavToUse->LoadURI(URL,
  386. loadFlags, nsnull, postDataStream, headersStream);
  387. }
  388. return NS_SUCCEEDED(rv) ? S_OK : E_FAIL;
  389. }
  390. virtual HRESULT STDMETHODCALLTYPE Refresh(void)
  391. {
  392. ATLTRACE(_T("IWebBrowserImpl::Refresh()\n"));
  393. // Reload the page
  394. CComVariant vRefreshType(REFRESH_NORMAL);
  395. return Refresh2(&vRefreshType);
  396. }
  397. virtual HRESULT STDMETHODCALLTYPE Refresh2(VARIANT __RPC_FAR *Level)
  398. {
  399. ATLTRACE(_T("IWebBrowserImpl::Refresh2()\n"));
  400. ENSURE_BROWSER_IS_VALID();
  401. ENSURE_GET_WEBNAV();
  402. if (Level == NULL)
  403. return E_INVALIDARG;
  404. // Check the requested refresh type
  405. OLECMDID_REFRESHFLAG iRefreshLevel = OLECMDIDF_REFRESH_NORMAL;
  406. CComVariant vLevelAsInt;
  407. if ( vLevelAsInt.ChangeType(VT_I4, Level) != S_OK )
  408. {
  409. NS_ASSERTION(0, "Cannot change refresh type to int");
  410. return SetErrorInfo(E_UNEXPECTED);
  411. }
  412. iRefreshLevel = (OLECMDID_REFRESHFLAG) vLevelAsInt.iVal;
  413. // Turn the IE refresh type into the nearest NG equivalent
  414. PRUint32 flags = nsIWebNavigation::LOAD_FLAGS_NONE;
  415. switch (iRefreshLevel & OLECMDIDF_REFRESH_LEVELMASK)
  416. {
  417. case OLECMDIDF_REFRESH_NORMAL:
  418. case OLECMDIDF_REFRESH_IFEXPIRED:
  419. case OLECMDIDF_REFRESH_CONTINUE:
  420. case OLECMDIDF_REFRESH_NO_CACHE:
  421. case OLECMDIDF_REFRESH_RELOAD:
  422. flags = nsIWebNavigation::LOAD_FLAGS_NONE;
  423. break;
  424. case OLECMDIDF_REFRESH_COMPLETELY:
  425. flags = nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE | nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY;
  426. break;
  427. default:
  428. // No idea what refresh type this is supposed to be
  429. NS_ASSERTION(0, "Unknown refresh type");
  430. return SetErrorInfo(E_UNEXPECTED);
  431. }
  432. webNav->Reload(flags);
  433. return S_OK;
  434. }
  435. virtual HRESULT STDMETHODCALLTYPE Stop(void)
  436. {
  437. ATLTRACE(_T("IWebBrowserImpl::Stop()\n"));
  438. ENSURE_BROWSER_IS_VALID();
  439. ENSURE_GET_WEBNAV();
  440. webNav->Stop(nsIWebNavigation::STOP_ALL);
  441. return S_OK;
  442. }
  443. virtual HRESULT STDMETHODCALLTYPE get_Application(IDispatch __RPC_FAR *__RPC_FAR *ppDisp)
  444. {
  445. ATLTRACE(_T("IWebBrowserImpl::get_Application()\n"));
  446. ENSURE_BROWSER_IS_VALID();
  447. if (!ppDisp)
  448. {
  449. return SetErrorInfo(E_INVALIDARG);
  450. }
  451. // Return a pointer to this controls dispatch interface
  452. *ppDisp = (IDispatch *) this;
  453. (*ppDisp)->AddRef();
  454. return S_OK;
  455. }
  456. virtual HRESULT STDMETHODCALLTYPE get_Parent(IDispatch __RPC_FAR *__RPC_FAR *ppDisp)
  457. {
  458. // TODO
  459. return E_NOTIMPL;
  460. }
  461. virtual HRESULT STDMETHODCALLTYPE get_Container(IDispatch __RPC_FAR *__RPC_FAR *ppDisp)
  462. {
  463. ATLTRACE(_T("IWebBrowserImpl::get_Container()\n"));
  464. ENSURE_BROWSER_IS_VALID();
  465. if (!ppDisp)
  466. {
  467. return SetErrorInfo(E_INVALIDARG);
  468. }
  469. //TODO: Implement get_Container: Retrieve a pointer to the IDispatch interface of the container.
  470. *ppDisp = NULL;
  471. return SetErrorInfo(E_UNEXPECTED);
  472. }
  473. virtual HRESULT STDMETHODCALLTYPE get_Document(IDispatch __RPC_FAR *__RPC_FAR *ppDisp)
  474. {
  475. ATLTRACE(_T("IWebBrowserImpl::get_Document()\n"));
  476. ENSURE_BROWSER_IS_VALID();
  477. if (!ppDisp)
  478. {
  479. return SetErrorInfo(E_INVALIDARG);
  480. }
  481. *ppDisp = NULL;
  482. return E_NOTIMPL;
  483. }
  484. virtual HRESULT STDMETHODCALLTYPE get_TopLevelContainer(VARIANT_BOOL __RPC_FAR *pBool)
  485. {
  486. ATLTRACE(_T("IWebBrowserImpl::get_TopLevelContainer()\n"));
  487. ENSURE_BROWSER_IS_VALID();
  488. if (!pBool)
  489. {
  490. return SetErrorInfo(E_INVALIDARG);
  491. }
  492. //TODO: Implement get_TopLevelContainer
  493. *pBool = VARIANT_TRUE;
  494. return S_OK;
  495. }
  496. virtual HRESULT STDMETHODCALLTYPE get_Type(BSTR __RPC_FAR *Type)
  497. {
  498. ATLTRACE(_T("IWebBrowserImpl::get_Type()\n"));
  499. ENSURE_BROWSER_IS_VALID();
  500. //NOTE: This code should work in theory, but can't be verified because GetDoctype
  501. // has not been implemented yet.
  502. #if 0
  503. nsIDOMDocument *pIDOMDocument = nsnull;
  504. if ( SUCCEEDED(GetDOMDocument(&pIDOMDocument)) )
  505. {
  506. nsIDOMDocumentType *pIDOMDocumentType = nsnull;
  507. if ( SUCCEEDED(pIDOMDocument->GetDoctype(&pIDOMDocumentType)) )
  508. {
  509. nsAutoString docName;
  510. pIDOMDocumentType->GetName(docName);
  511. //NG_TRACE("pIDOMDocumentType returns: %s", docName);
  512. //Still need to manipulate docName so that it goes into *Type param of this function.
  513. }
  514. }
  515. #endif
  516. //TODO: Implement get_Type
  517. return SetErrorInfo(E_FAIL, L"get_Type: failed");
  518. }
  519. virtual HRESULT STDMETHODCALLTYPE get_Left(long __RPC_FAR *pl)
  520. {
  521. ATLTRACE(_T("IWebBrowserImpl::get_Left()\n"));
  522. ENSURE_BROWSER_IS_VALID();
  523. if (pl == NULL)
  524. {
  525. return SetErrorInfo(E_INVALIDARG);
  526. }
  527. //TODO: Implement get_Left - Should return the left position of this control.
  528. *pl = 0;
  529. return S_OK;
  530. }
  531. virtual HRESULT STDMETHODCALLTYPE put_Left(long Left)
  532. {
  533. ATLTRACE(_T("IWebBrowserImpl::put_Left()\n"));
  534. ENSURE_BROWSER_IS_VALID();
  535. //TODO: Implement put_Left - Should set the left position of this control.
  536. return S_OK;
  537. }
  538. virtual HRESULT STDMETHODCALLTYPE get_Top(long __RPC_FAR *pl)
  539. {
  540. ATLTRACE(_T("IWebBrowserImpl::get_Top()\n"));
  541. ENSURE_BROWSER_IS_VALID();
  542. if (pl == NULL)
  543. {
  544. return SetErrorInfo(E_INVALIDARG);
  545. }
  546. //TODO: Implement get_Top - Should return the top position of this control.
  547. *pl = 0;
  548. return S_OK;
  549. }
  550. virtual HRESULT STDMETHODCALLTYPE put_Top(long Top)
  551. {
  552. ATLTRACE(_T("IWebBrowserImpl::put_Top()\n"));
  553. ENSURE_BROWSER_IS_VALID();
  554. //TODO: Implement set_Top - Should set the top position of this control.
  555. return S_OK;
  556. }
  557. virtual HRESULT STDMETHODCALLTYPE get_Width(long __RPC_FAR *pl)
  558. {
  559. ATLTRACE(_T("IWebBrowserImpl::get_Width()\n"));
  560. ENSURE_BROWSER_IS_VALID();
  561. //TODO: Implement get_Width- Should return the width of this control.
  562. if (pl == NULL)
  563. {
  564. return SetErrorInfo(E_INVALIDARG);
  565. }
  566. *pl = 0;
  567. return S_OK;
  568. }
  569. virtual HRESULT STDMETHODCALLTYPE put_Width(long Width)
  570. {
  571. ATLTRACE(_T("IWebBrowserImpl::put_Width()\n"));
  572. ENSURE_BROWSER_IS_VALID();
  573. //TODO: Implement put_Width - Should set the width of this control.
  574. return S_OK;
  575. }
  576. virtual HRESULT STDMETHODCALLTYPE get_Height(long __RPC_FAR *pl)
  577. {
  578. ATLTRACE(_T("IWebBrowserImpl::get_Height()\n"));
  579. ENSURE_BROWSER_IS_VALID();
  580. if (pl == NULL)
  581. {
  582. return SetErrorInfo(E_INVALIDARG);
  583. }
  584. //TODO: Implement get_Height - Should return the hieght of this control.
  585. *pl = 0;
  586. return S_OK;
  587. }
  588. virtual HRESULT STDMETHODCALLTYPE put_Height(long Height)
  589. {
  590. ATLTRACE(_T("IWebBrowserImpl::put_Height()\n"));
  591. ENSURE_BROWSER_IS_VALID();
  592. //TODO: Implement put_Height - Should set the height of this control.
  593. return S_OK;
  594. }
  595. virtual HRESULT STDMETHODCALLTYPE get_LocationName(BSTR __RPC_FAR *LocationName)
  596. {
  597. ATLTRACE(_T("IWebBrowserImpl::get_LocationName()\n"));
  598. ENSURE_BROWSER_IS_VALID();
  599. if (LocationName == NULL)
  600. {
  601. return SetErrorInfo(E_INVALIDARG);
  602. }
  603. // Get the url from the web shell
  604. nsXPIDLString szLocationName;
  605. ENSURE_GET_WEBNAV();
  606. nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(webNav);
  607. baseWindow->GetTitle(getter_Copies(szLocationName));
  608. if (nsnull == (const PRUnichar *) szLocationName)
  609. {
  610. return SetErrorInfo(E_UNEXPECTED);
  611. }
  612. // Convert the string to a BSTR
  613. USES_CONVERSION;
  614. LPCOLESTR pszConvertedLocationName = W2COLE((const PRUnichar *) szLocationName);
  615. *LocationName = SysAllocString(pszConvertedLocationName);
  616. return S_OK;
  617. }
  618. virtual HRESULT STDMETHODCALLTYPE get_LocationURL(BSTR __RPC_FAR *LocationURL)
  619. {
  620. ATLTRACE(_T("IWebBrowserImpl::get_LocationURL()\n"));
  621. ENSURE_BROWSER_IS_VALID();
  622. if (LocationURL == NULL)
  623. {
  624. return SetErrorInfo(E_INVALIDARG);
  625. }
  626. nsCOMPtr<nsIURI> uri;
  627. // Get the current url from the browser
  628. nsCOMPtr<nsIWebNavigation> webNav;
  629. GetWebNavigation(getter_AddRefs(webNav));
  630. if (webNav)
  631. {
  632. webNav->GetCurrentURI(getter_AddRefs(uri));
  633. }
  634. if (uri)
  635. {
  636. USES_CONVERSION;
  637. nsCAutoString aURI;
  638. uri->GetAsciiSpec(aURI);
  639. *LocationURL = SysAllocString(A2OLE(aURI.get()));
  640. }
  641. else
  642. {
  643. *LocationURL = NULL;
  644. }
  645. return S_OK;
  646. }
  647. virtual HRESULT STDMETHODCALLTYPE get_Busy(VARIANT_BOOL __RPC_FAR *pBool)
  648. {
  649. ATLTRACE(_T("IWebBrowserImpl::get_Busy()\n"));
  650. ENSURE_BROWSER_IS_VALID();
  651. if (!pBool)
  652. {
  653. return SetErrorInfo(E_INVALIDARG);
  654. }
  655. *pBool = (mBusyFlag) ? VARIANT_TRUE : VARIANT_FALSE;
  656. return S_OK;
  657. }
  658. // IWebBrowserApp implementation
  659. virtual HRESULT STDMETHODCALLTYPE Quit(void)
  660. {
  661. ATLTRACE(_T("IWebBrowserImpl::Quit()\n"));
  662. ENSURE_BROWSER_IS_VALID();
  663. //This generates an exception in the IE control.
  664. // TODO fire quit event
  665. return S_OK;
  666. }
  667. virtual HRESULT STDMETHODCALLTYPE ClientToWindow(int __RPC_FAR *pcx, int __RPC_FAR *pcy)
  668. {
  669. ATLTRACE(_T("IWebBrowserImpl::ClientToWindow()\n"));
  670. ENSURE_BROWSER_IS_VALID();
  671. //This generates an exception in the IE control.
  672. // TODO convert points to be relative to browser
  673. return S_OK;
  674. }
  675. virtual HRESULT STDMETHODCALLTYPE PutProperty(BSTR Property, VARIANT vtValue)
  676. {
  677. ATLTRACE(_T("IWebBrowserImpl::PutProperty()\n"));
  678. ENSURE_BROWSER_IS_VALID();
  679. if (Property == NULL)
  680. {
  681. return SetErrorInfo(E_INVALIDARG);
  682. }
  683. mPropertyList.AddOrReplaceNamedProperty(Property, vtValue);
  684. return S_OK;
  685. }
  686. virtual HRESULT STDMETHODCALLTYPE GetProperty(BSTR Property, VARIANT __RPC_FAR *pvtValue)
  687. {
  688. ATLTRACE(_T("IWebBrowserImpl::GetProperty()\n"));
  689. ENSURE_BROWSER_IS_VALID();
  690. if (Property == NULL || pvtValue == NULL)
  691. {
  692. return SetErrorInfo(E_INVALIDARG);
  693. }
  694. VariantInit(pvtValue);
  695. for (unsigned long i = 0; i < mPropertyList.GetSize(); i++)
  696. {
  697. if (wcsicmp(mPropertyList.GetNameOf(i), Property) == 0)
  698. {
  699. // Copy the new value
  700. VariantCopy(pvtValue, const_cast<VARIANT *>(mPropertyList.GetValueOf(i)));
  701. return S_OK;
  702. }
  703. }
  704. return S_OK;
  705. }
  706. virtual HRESULT STDMETHODCALLTYPE get_Name(BSTR __RPC_FAR *Name)
  707. {
  708. ATLTRACE(_T("IWebBrowserImpl::get_Name()\n"));
  709. ENSURE_BROWSER_IS_VALID();
  710. if (Name == NULL)
  711. {
  712. return SetErrorInfo(E_INVALIDARG);
  713. }
  714. // TODO: Implement get_Name (get Mozilla's executable name)
  715. *Name = SysAllocString(L"Mozilla Web Browser Control");
  716. return S_OK;
  717. }
  718. virtual HRESULT STDMETHODCALLTYPE get_HWND(long __RPC_FAR *pHWND)
  719. {
  720. ATLTRACE(_T("IWebBrowserImpl::get_HWND()\n"));
  721. ENSURE_BROWSER_IS_VALID();
  722. if (pHWND == NULL)
  723. {
  724. return SetErrorInfo(E_INVALIDARG);
  725. }
  726. //This is supposed to return a handle to the IE main window. Since that doesn't exist
  727. //in the control's case, this shouldn't do anything.
  728. *pHWND = NULL;
  729. return S_OK;
  730. }
  731. virtual HRESULT STDMETHODCALLTYPE get_FullName(BSTR __RPC_FAR *FullName)
  732. {
  733. ATLTRACE(_T("IWebBrowserImpl::get_FullName()\n"));
  734. ENSURE_BROWSER_IS_VALID();
  735. if (FullName == NULL)
  736. {
  737. return SetErrorInfo(E_INVALIDARG);
  738. }
  739. // TODO: Implement get_FullName (Return the full path of the executable containing this control)
  740. *FullName = SysAllocString(L""); // TODO get Mozilla's executable name
  741. return S_OK;
  742. }
  743. virtual HRESULT STDMETHODCALLTYPE get_Path(BSTR __RPC_FAR *Path)
  744. {
  745. ATLTRACE(_T("IWebBrowserImpl::get_Path()\n"));
  746. ENSURE_BROWSER_IS_VALID();
  747. if (Path == NULL)
  748. {
  749. return SetErrorInfo(E_INVALIDARG);
  750. }
  751. // TODO: Implement get_Path (get Mozilla's path)
  752. *Path = SysAllocString(L"");
  753. return S_OK;
  754. }
  755. virtual HRESULT STDMETHODCALLTYPE get_Visible(VARIANT_BOOL __RPC_FAR *pBool)
  756. {
  757. ATLTRACE(_T("IWebBrowserImpl::get_Visible()\n"));
  758. ENSURE_BROWSER_IS_VALID();
  759. if (pBool == NULL)
  760. {
  761. return SetErrorInfo(E_INVALIDARG);
  762. }
  763. //TODO: Implement get_Visible?
  764. *pBool = VARIANT_TRUE;
  765. return S_OK;
  766. }
  767. virtual HRESULT STDMETHODCALLTYPE put_Visible(VARIANT_BOOL Value)
  768. {
  769. ATLTRACE(_T("IWebBrowserImpl::put_Visible()\n"));
  770. ENSURE_BROWSER_IS_VALID();
  771. //TODO: Implement put_Visible?
  772. return S_OK;
  773. }
  774. virtual HRESULT STDMETHODCALLTYPE get_StatusBar(VARIANT_BOOL __RPC_FAR *pBool)
  775. {
  776. ATLTRACE(_T("IWebBrowserImpl::get_StatusBar()\n"));
  777. ENSURE_BROWSER_IS_VALID();
  778. if (pBool == NULL)
  779. {
  780. return SetErrorInfo(E_INVALIDARG);
  781. }
  782. //There is no StatusBar in this control.
  783. *pBool = VARIANT_FALSE;
  784. return S_OK;
  785. }
  786. virtual HRESULT STDMETHODCALLTYPE put_StatusBar(VARIANT_BOOL Value)
  787. {
  788. ATLTRACE(_T("IWebBrowserImpl::put_StatusBar()\n"));
  789. ENSURE_BROWSER_IS_VALID();
  790. //There is no StatusBar in this control.
  791. return S_OK;
  792. }
  793. virtual HRESULT STDMETHODCALLTYPE get_StatusText(BSTR __RPC_FAR *StatusText)
  794. {
  795. ATLTRACE(_T("IWebBrowserImpl::get_StatusText()\n"));
  796. ENSURE_BROWSER_IS_VALID();
  797. if (StatusText == NULL)
  798. {
  799. return SetErrorInfo(E_INVALIDARG);
  800. }
  801. //TODO: Implement get_StatusText
  802. //NOTE: This function is related to the MS status bar which doesn't exist in this control. Needs more
  803. // investigation, but probably doesn't apply.
  804. *StatusText = SysAllocString(L"");
  805. return S_OK;
  806. }
  807. virtual HRESULT STDMETHODCALLTYPE put_StatusText(BSTR StatusText)
  808. {
  809. ATLTRACE(_T("IWebBrowserImpl::put_StatusText()\n"));
  810. ENSURE_BROWSER_IS_VALID();
  811. //TODO: Implement put_StatusText
  812. //NOTE: This function is related to the MS status bar which doesn't exist in this control. Needs more
  813. // investigation, but probably doesn't apply.
  814. return S_OK;
  815. }
  816. virtual HRESULT STDMETHODCALLTYPE get_ToolBar(int __RPC_FAR *Value)
  817. {
  818. ATLTRACE(_T("IWebBrowserImpl::get_ToolBar()\n"));
  819. ENSURE_BROWSER_IS_VALID();
  820. if (Value == NULL)
  821. {
  822. return SetErrorInfo(E_INVALIDARG);
  823. }
  824. //There is no ToolBar in this control.
  825. *Value = FALSE;
  826. return S_OK;
  827. }
  828. virtual HRESULT STDMETHODCALLTYPE put_ToolBar(int Value)
  829. {
  830. ATLTRACE(_T("IWebBrowserImpl::put_ToolBar()\n"));
  831. ENSURE_BROWSER_IS_VALID();
  832. //There is no ToolBar in this control.
  833. return S_OK;
  834. }
  835. virtual HRESULT STDMETHODCALLTYPE get_MenuBar(VARIANT_BOOL __RPC_FAR *Value)
  836. {
  837. ATLTRACE(_T("IWebBrowserImpl::get_MenuBar()\n"));
  838. ENSURE_BROWSER_IS_VALID();
  839. if (Value == NULL)
  840. {
  841. return SetErrorInfo(E_INVALIDARG);
  842. }
  843. //There is no MenuBar in this control.
  844. *Value = VARIANT_FALSE;
  845. return S_OK;
  846. }
  847. virtual HRESULT STDMETHODCALLTYPE put_MenuBar(VARIANT_BOOL Value)
  848. {
  849. ATLTRACE(_T("IWebBrowserImpl::put_MenuBar()\n"));
  850. ENSURE_BROWSER_IS_VALID();
  851. //There is no MenuBar in this control.
  852. return S_OK;
  853. }
  854. virtual HRESULT STDMETHODCALLTYPE get_FullScreen(VARIANT_BOOL __RPC_FAR *pbFullScreen)
  855. {
  856. ATLTRACE(_T("IWebBrowserImpl::get_FullScreen()\n"));
  857. ENSURE_BROWSER_IS_VALID();
  858. if (pbFullScreen == NULL)
  859. {
  860. return SetErrorInfo(E_INVALIDARG);
  861. }
  862. //FullScreen mode doesn't really apply to this control.
  863. *pbFullScreen = VARIANT_FALSE;
  864. return S_OK;
  865. }
  866. virtual HRESULT STDMETHODCALLTYPE put_FullScreen(VARIANT_BOOL bFullScreen)
  867. {
  868. ATLTRACE(_T("IWebBrowserImpl::put_FullScreen()\n"));
  869. ENSURE_BROWSER_IS_VALID();
  870. //FullScreen mode doesn't really apply to this control.
  871. return S_OK;
  872. }
  873. // IWebBrowser2 implementation
  874. virtual HRESULT STDMETHODCALLTYPE Navigate2(VARIANT __RPC_FAR *URL, VARIANT __RPC_FAR *Flags, VARIANT __RPC_FAR *TargetFrameName, VARIANT __RPC_FAR *PostData, VARIANT __RPC_FAR *Headers)
  875. {
  876. ATLTRACE(_T("IWebBrowserImpl::Navigate2()\n"));
  877. CComVariant vURLAsString;
  878. if (vURLAsString.ChangeType(VT_BSTR, URL) != S_OK)
  879. {
  880. return SetErrorInfo(E_INVALIDARG);
  881. }
  882. return Navigate(vURLAsString.bstrVal, Flags, TargetFrameName, PostData, Headers);
  883. }
  884. virtual HRESULT STDMETHODCALLTYPE QueryStatusWB(OLECMDID cmdID, OLECMDF __RPC_FAR *pcmdf)
  885. {
  886. ATLTRACE(_T("IWebBrowserImpl::QueryStatusWB()\n"));
  887. ENSURE_BROWSER_IS_VALID();
  888. if (pcmdf == NULL)
  889. {
  890. return SetErrorInfo(E_INVALIDARG);
  891. }
  892. // Call through to IOleCommandTarget::QueryStatus
  893. CComQIPtr<IOleCommandTarget> cmdTarget = this;
  894. if (cmdTarget)
  895. {
  896. OLECMD cmd;
  897. HRESULT hr;
  898. cmd.cmdID = cmdID;
  899. cmd.cmdf = 0;
  900. hr = cmdTarget->QueryStatus(NULL, 1, &cmd, NULL);
  901. if (SUCCEEDED(hr))
  902. {
  903. *pcmdf = (OLECMDF) cmd.cmdf;
  904. }
  905. return hr;
  906. }
  907. return E_NOTIMPL;
  908. }
  909. virtual HRESULT STDMETHODCALLTYPE ExecWB(OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT __RPC_FAR *pvaIn, VARIANT __RPC_FAR *pvaOut)
  910. {
  911. ATLTRACE(_T("IWebBrowserImpl::ExecWB()\n"));
  912. ENSURE_BROWSER_IS_VALID();
  913. // Call through to IOleCommandTarget::Exec
  914. CComQIPtr<IOleCommandTarget> cmdTarget = this;
  915. if (cmdTarget)
  916. {
  917. return cmdTarget->Exec(NULL, cmdID, cmdexecopt, pvaIn, pvaOut);
  918. }
  919. return E_NOTIMPL;
  920. }
  921. virtual HRESULT STDMETHODCALLTYPE ShowBrowserBar(VARIANT __RPC_FAR *pvaClsid, VARIANT __RPC_FAR *pvarShow, VARIANT __RPC_FAR *pvarSize)
  922. {
  923. ATLTRACE(_T("IWebBrowserImpl::ShowBrowserBar()\n"));
  924. ENSURE_BROWSER_IS_VALID();
  925. return S_OK;
  926. }
  927. virtual HRESULT STDMETHODCALLTYPE get_ReadyState(READYSTATE __RPC_FAR *plReadyState)
  928. {
  929. ATLTRACE(_T("IWebBrowserImpl::get_ReadyState()\n"));
  930. // Note: may be called when browser is not yet initialized so there
  931. // is no validity check here.
  932. if (plReadyState == NULL)
  933. {
  934. return SetErrorInfo(E_INVALIDARG);
  935. }
  936. *plReadyState = mBrowserReadyState;
  937. return S_OK;
  938. }
  939. virtual HRESULT STDMETHODCALLTYPE get_Offline(VARIANT_BOOL __RPC_FAR *pbOffline)
  940. {
  941. ATLTRACE(_T("IWebBrowserImpl::get_Offline()\n"));
  942. ENSURE_BROWSER_IS_VALID();
  943. if (pbOffline == NULL)
  944. {
  945. return SetErrorInfo(E_INVALIDARG);
  946. }
  947. //TODO: Implement get_Offline
  948. *pbOffline = VARIANT_FALSE;
  949. return S_OK;
  950. }
  951. virtual HRESULT STDMETHODCALLTYPE put_Offline(VARIANT_BOOL bOffline)
  952. {
  953. ATLTRACE(_T("IWebBrowserImpl::put_Offline()\n"));
  954. ENSURE_BROWSER_IS_VALID();
  955. //TODO: Implement get_Offline
  956. return S_OK;
  957. }
  958. virtual HRESULT STDMETHODCALLTYPE get_Silent(VARIANT_BOOL __RPC_FAR *pbSilent)
  959. {
  960. ATLTRACE(_T("IWebBrowserImpl::get_Silent()\n"));
  961. ENSURE_BROWSER_IS_VALID();
  962. if (pbSilent == NULL)
  963. {
  964. return SetErrorInfo(E_INVALIDARG);
  965. }
  966. //Only really applies to the IE app, not a control
  967. *pbSilent = VARIANT_FALSE;
  968. return S_OK;
  969. }
  970. virtual HRESULT STDMETHODCALLTYPE put_Silent(VARIANT_BOOL bSilent)
  971. {
  972. ATLTRACE(_T("IWebBrowserImpl::put_Silent()\n"));
  973. ENSURE_BROWSER_IS_VALID();
  974. //Only really applies to the IE app, not a control
  975. return S_OK;
  976. }
  977. virtual HRESULT STDMETHODCALLTYPE get_RegisterAsBrowser(VARIANT_BOOL __RPC_FAR *pbRegister)
  978. {
  979. ATLTRACE(_T("IWebBrowserImpl::get_RegisterAsBrowser()\n"));
  980. ENSURE_BROWSER_IS_VALID();
  981. if (pbRegister == NULL)
  982. {
  983. return SetErrorInfo(E_INVALIDARG);
  984. }
  985. //TODO: Implement get_RegisterAsBrowser
  986. *pbRegister = VARIANT_FALSE;
  987. return S_OK;
  988. }
  989. virtual HRESULT STDMETHODCALLTYPE put_RegisterAsBrowser(VARIANT_BOOL bRegister)
  990. {
  991. ATLTRACE(_T("IWebBrowserImpl::put_RegisterAsBrowser()\n"));
  992. ENSURE_BROWSER_IS_VALID();
  993. //TODO: Implement put_RegisterAsBrowser
  994. return S_OK;
  995. }
  996. virtual HRESULT STDMETHODCALLTYPE get_RegisterAsDropTarget(VARIANT_BOOL __RPC_FAR *pbRegister)
  997. {
  998. // TODO
  999. return E_NOTIMPL;
  1000. }
  1001. virtual HRESULT STDMETHODCALLTYPE put_RegisterAsDropTarget(VARIANT_BOOL bRegister)
  1002. {
  1003. // TODO
  1004. return E_NOTIMPL;
  1005. }
  1006. virtual HRESULT STDMETHODCALLTYPE get_TheaterMode(VARIANT_BOOL __RPC_FAR *pbRegister)
  1007. {
  1008. ATLTRACE(_T("IWebBrowserImpl::get_TheaterMode()\n"));
  1009. ENSURE_BROWSER_IS_VALID();
  1010. if (pbRegister == NULL)
  1011. {
  1012. return SetErrorInfo(E_INVALIDARG);
  1013. }
  1014. // TheaterMode doesn't apply to this control.
  1015. *pbRegister = VARIANT_FALSE;
  1016. return S_OK;
  1017. }
  1018. virtual HRESULT STDMETHODCALLTYPE put_TheaterMode(VARIANT_BOOL bRegister)
  1019. {
  1020. ATLTRACE(_T("IWebBrowserImpl::put_TheaterMode()\n"));
  1021. ENSURE_BROWSER_IS_VALID();
  1022. //There is no TheaterMode in this control.
  1023. return S_OK;
  1024. }
  1025. virtual HRESULT STDMETHODCALLTYPE get_AddressBar(VARIANT_BOOL __RPC_FAR *Value)
  1026. {
  1027. ATLTRACE(_T("IWebBrowserImpl::get_AddressBar()\n"));
  1028. ENSURE_BROWSER_IS_VALID();
  1029. if (Value == NULL)
  1030. {
  1031. return SetErrorInfo(E_INVALIDARG);
  1032. }
  1033. //There is no AddressBar in this control.
  1034. *Value = VARIANT_FALSE;
  1035. return S_OK;
  1036. }
  1037. virtual HRESULT STDMETHODCALLTYPE put_AddressBar(VARIANT_BOOL Value)
  1038. {
  1039. ATLTRACE(_T("IWebBrowserImpl::put_AddressBar()\n"));
  1040. ENSURE_BROWSER_IS_VALID();
  1041. //There is no AddressBar in this control.
  1042. return S_OK;
  1043. }
  1044. virtual HRESULT STDMETHODCALLTYPE get_Resizable(VARIANT_BOOL __RPC_FAR *Value)
  1045. {
  1046. ATLTRACE(_T("IWebBrowserImpl::get_Resizable()\n"));
  1047. ENSURE_BROWSER_IS_VALID();
  1048. if (Value == NULL)
  1049. {
  1050. return SetErrorInfo(E_INVALIDARG);
  1051. }
  1052. //TODO: Not sure if this should actually be implemented or not.
  1053. *Value = VARIANT_TRUE;
  1054. return S_OK;
  1055. }
  1056. virtual HRESULT STDMETHODCALLTYPE put_Resizable(VARIANT_BOOL Value)
  1057. {
  1058. ATLTRACE(_T("IWebBrowserImpl::put_Resizable()\n"));
  1059. ENSURE_BROWSER_IS_VALID();
  1060. //TODO: Not sure if this should actually be implemented or not.
  1061. return S_OK;
  1062. }
  1063. };
  1064. #endif