diff options
author | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 17:46:43 +0000 |
---|---|---|
committer | tommi@chromium.org <tommi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-13 17:46:43 +0000 |
commit | 25299f2df64fa07dd8a94b2c5c301ea9b0a0b6f6 (patch) | |
tree | 92e605a5270f053a6389fe74741200b190111ca3 /chrome_frame/bind_context_info.h | |
parent | a9ff2c0716e6ad021e555de88d54e8e199afe0d7 (diff) | |
download | chromium_src-25299f2df64fa07dd8a94b2c5c301ea9b0a0b6f6.zip chromium_src-25299f2df64fa07dd8a94b2c5c301ea9b0a0b6f6.tar.gz chromium_src-25299f2df64fa07dd8a94b2c5c301ea9b0a0b6f6.tar.bz2 |
Use an interface to get to the C++ object pointer instead of casting directly.
The object was being marshalled so, we were casting an ole32 proxy object to our implementation. To avoid marshalling altogether I'm also using the FTM. So, yeah, we're going belt and suspenders.
TEST=See bug.
BUG=43988
Review URL: http://codereview.chromium.org/2011016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47160 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/bind_context_info.h')
-rw-r--r-- | chrome_frame/bind_context_info.h | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/chrome_frame/bind_context_info.h b/chrome_frame/bind_context_info.h index b6dca88..d41c440 100644 --- a/chrome_frame/bind_context_info.h +++ b/chrome_frame/bind_context_info.h @@ -11,15 +11,24 @@ #include "base/scoped_bstr_win.h" #include "base/scoped_comptr_win.h" +class __declspec(uuid("71CC3EC7-7E8A-457f-93BC-1090CF31CC18")) +IBindContextInfoInternal : public IUnknown { + public: + STDMETHOD(GetCppObject)(void** me) = 0; +}; + // This class maintains contextual information used by ChromeFrame. // This information is maintained in the bind context. -class BindContextInfo : public IUnknown, public CComObjectRoot { +class BindContextInfo + : public IBindContextInfoInternal, + public CComObjectRoot { public: BindContextInfo(); - virtual ~BindContextInfo() {} + ~BindContextInfo(); BEGIN_COM_MAP(BindContextInfo) - COM_INTERFACE_ENTRY(IUnknown) + COM_INTERFACE_ENTRY(IBindContextInfoInternal) + COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, ftm_) END_COM_MAP() // Returns the BindContextInfo instance associated with the bind @@ -52,20 +61,37 @@ class BindContextInfo : public IUnknown, public CComObjectRoot { return cache_; } - void set_url(const std::wstring& url) { - url_ = url; + // Accept a const wchar_t* to ensure that we don't have a reference + // to someone else's buffer. + void set_url(const wchar_t* url) { + DCHECK(url); + if (url) { + url_ = url; + } else { + url_.clear(); + } } - const std::wstring url() const { + const std::wstring& url() const { return url_; } + protected: + STDMETHOD(GetCppObject)(void** me) { + DCHECK(me); + *me = static_cast<BindContextInfo*>(this); + return S_OK; + } + + HRESULT Initialize(IBindCtx* bind_ctx); + private: ScopedComPtr<IStream> cache_; bool no_cache_; bool chrome_request_; bool is_switching_; std::wstring url_; + ScopedComPtr<IUnknown> ftm_; DISALLOW_COPY_AND_ASSIGN(BindContextInfo); }; |