summaryrefslogtreecommitdiffstats
path: root/chrome_frame/urlmon_moniker.h
diff options
context:
space:
mode:
authoramit@chromium.org <amit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 00:51:10 +0000
committeramit@chromium.org <amit@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 00:51:10 +0000
commit97965e190cb9f5009f6c97195bef9225c6034931 (patch)
tree96f2320c853a50d06664a1b2134a0dcb97c42bac /chrome_frame/urlmon_moniker.h
parent4a626f876a6dcd77e4d2cfc5d2496acdd44d7fe1 (diff)
downloadchromium_src-97965e190cb9f5009f6c97195bef9225c6034931.zip
chromium_src-97965e190cb9f5009f6c97195bef9225c6034931.tar.gz
chromium_src-97965e190cb9f5009f6c97195bef9225c6034931.tar.bz2
Switch renderer in Moniker patch
Step one of the changes. Inspect data and cause a switch in the moniker patch. Review URL: http://codereview.chromium.org/1589013 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44038 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/urlmon_moniker.h')
-rw-r--r--chrome_frame/urlmon_moniker.h261
1 files changed, 20 insertions, 241 deletions
diff --git a/chrome_frame/urlmon_moniker.h b/chrome_frame/urlmon_moniker.h
index d4b6bbb..885b7fe 100644
--- a/chrome_frame/urlmon_moniker.h
+++ b/chrome_frame/urlmon_moniker.h
@@ -14,8 +14,6 @@
#include "base/logging.h"
#include "base/scoped_comptr_win.h"
#include "base/thread_local.h"
-
-#include "chrome_frame/urlmon_moniker_base.h"
#include "chrome_frame/utils.h"
// This file contains classes that are used to cache the contents of a top-level
@@ -29,14 +27,12 @@
// - Bho::BeforeNavigate - top level url = www.msn.com
// - MSHTML -> MonikerPatch::BindToStorage.
// (IEFrame starts this by calling mshtml!*SuperNavigate*)
-// - request_data is NULL
// - check if the url is a top level url
// - iff the url is a top level url, we switch in our own callback object
-// and hook it up to the bind context (CFUrlmonBindStatusCallback)
-// The callback object caches the document in memory.
+// and hook it up to the bind context (BSCBStorageBind)
// - otherwise just call the original
-// - Bho::OnHttpEquiv is called with done == TRUE. At this point we determine
-// that the page did not have the CF meta tag in it and we delete the cache.
+// - BSCBStorageBind::OnDataAvailable - sniffs data and determines that the
+// renderer is not chrome. Goes into pass through mode.
// - The page loads in mshtml.
//
@@ -47,41 +43,18 @@
// (IEFrame starts this by calling mshtml!*SuperNavigate*)
// - request_data is NULL
// - check if the url is a top level url
-// - iff the url is a top level url (in this case, yes), we switch in our own
-// callback object and hook it up to the bind context
-// (CFUrlmonBindStatusCallback)
-// - As the document is fetched, the callback object caches the
-// document in memory.
-// - Bho::OnHttpEquiv (done == FALSE)
-// - mgr->NavigateToCurrentUrlInCF
-// - Set TLS (MarkBrowserOnThreadForCFNavigation)
-// - Create new bind context, moniker for the URL
-// - NavigateBrowserToMoniker with new moniker, bind context
-// - Our callback _may_ get an error from mshtml indicating that mshtml
-// isn't interested in the data anymore (since we started a new
-// navigation). If that happens, our callback class
-// (CFUrlmonBindStatusCallback) will continue to cache the document
-// until all of it has been retrieved successfully. When the data
-// is all read, we report INET_E_TERMINATE_BIND (see SimpleBindingImpl)
-// as the end result.
-// - In the case where all of the data has been downloaded before
-// - OnHttpEquiv is called, we will already have the cache but the
-// end bind status in the callback will be S_OK.
-// - Bho::BeforeNavigate2 - top level url = http://wave.google.com/
+// - iff the url is a top level url, we switch in our own callback object
+// and hook it up to the bind context (BSCBStorageBind)
+// - BSCBStorageBind::OnDataAvailable - sniffs data and determines that the
+// renderer is chrome. It then registers a special bind context param and
+// sets a magic clip format in the format_etc. Then goes into pass through
+// mode.
+// - mshtml looks at the clip format and re-issues the navigation with the
+// same bind context. Also returns INET_E_TERMINATED_BIND so that same
+// underlying transaction objects are used.
// - IEFrame -> MonikerPatch::BindToStorage
-// - request_data is not NULL since we now have a cached copy of the content.
-// - We call BindToStorageFromCache.
-// - HttpNegotiatePatch::ReportProgress
-// - Check TLS (CheckForCFNavigation) and report chrome mime type
-// - IEFrame does the following:
-// - Creates a new moniker
-// - Calls MonikerPatch::BindToObject
-// - We create an instance of ChromeActiveDocument and initialize it
-// with the cached document.
-// - ChromeActiveDocument gives the UrlmonUrlRequestManager the cached
-// contents (RequestData) which the manager will use as the content
-// when serving up content for the CF document.
-//
+// - We check for the special bind context param and instantiate and
+// return our ActiveDoc
//
// Scenario 3: CF navigation through mshtml link
@@ -102,169 +75,6 @@
// - [Scenario 2]
//
-// An implementation of IStream that delegates to another source
-// but caches all data that is read from the source.
-class ReadStreamCache
- : public CComObjectRootEx<CComSingleThreadModel>,
- public DelegatingReadStream {
- public:
- ReadStreamCache() {
- DLOG(INFO) << __FUNCTION__;
- }
-
- ~ReadStreamCache() {
- DLOG(INFO) << __FUNCTION__ << " cache: " << GetCacheSize();
- }
-
-BEGIN_COM_MAP(ReadStreamCache)
- COM_INTERFACE_ENTRY(IStream)
- COM_INTERFACE_ENTRY(ISequentialStream)
-END_COM_MAP()
-
- IStream* cache() const {
- return cache_;
- }
-
- void RewindCache() const;
-
- HRESULT WriteToCache(const void* data, ULONG size, ULONG* written);
-
- // Returns how many bytes we've cached. Used for logging.
- size_t GetCacheSize() const;
-
- // ISequentialStream.
- STDMETHOD(Read)(void* pv, ULONG cb, ULONG* read);
-
- protected:
- ScopedComPtr<IStream> cache_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(ReadStreamCache);
-};
-
-// Basic implementation of IBinding with the option of offering a way
-// to override the bind result error value.
-class SimpleBindingImpl
- : public CComObjectRootEx<CComSingleThreadModel>,
- public DelegatingBinding {
- public:
- SimpleBindingImpl() : bind_results_(S_OK) {
- }
-
- ~SimpleBindingImpl() {
- }
-
-BEGIN_COM_MAP(SimpleBindingImpl)
- COM_INTERFACE_ENTRY(IBinding)
- COM_INTERFACE_ENTRY_FUNC_BLIND(0, DelegateQI)
-END_COM_MAP()
-
- static STDMETHODIMP DelegateQI(void* obj, REFIID iid, void** ret,
- DWORD cookie);
-
- STDMETHOD(GetBindResult)(CLSID* protocol, DWORD* result_code,
- LPOLESTR* result, DWORD* reserved);
-
- void OverrideBindResults(HRESULT results) {
- bind_results_ = results;
- }
-
- protected:
- HRESULT bind_results_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(SimpleBindingImpl);
-};
-
-class RequestHeaders
- : public base::RefCountedThreadSafe<RequestHeaders> {
- public:
- RequestHeaders() : response_code_(-1) {
- }
-
- ~RequestHeaders() {
- }
-
- void OnBeginningTransaction(const wchar_t* url, const wchar_t* headers,
- const wchar_t* additional_headers);
-
- void OnResponse(DWORD response_code, const wchar_t* response_headers,
- const wchar_t* request_headers);
-
- const std::wstring& request_url() const {
- return request_url_;
- }
-
- // Invokes BeginningTransaction and OnResponse on the |http| object
- // providing already cached headers and status values.
- // Any additional headers returned from either of the two methods are ignored.
- HRESULT FireHttpNegotiateEvents(IHttpNegotiate* http) const;
-
- std::string GetReferrer();
-
- protected:
- std::wstring request_url_;
- std::wstring begin_request_headers_;
- std::wstring additional_request_headers_;
- std::wstring request_headers_;
- std::wstring response_headers_;
- DWORD response_code_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(RequestHeaders);
-};
-
-// Holds cached data for a urlmon request.
-class RequestData
- : public base::RefCountedThreadSafe<RequestData> {
- public:
- RequestData();
- ~RequestData();
-
- void Initialize(RequestHeaders* headers);
-
- // Calls IBindStatusCallback::OnDataAvailable and caches any data that is
- // read during that operation.
- // We also cache the format of the data stream if available during the first
- // call to this method.
- HRESULT DelegateDataRead(IBindStatusCallback* callback, DWORD flags,
- DWORD size, FORMATETC* format, STGMEDIUM* storage,
- size_t* bytes_read);
-
- // Reads everything that's available from |data| into a cached stream.
- void CacheAll(IStream* data);
-
- // Returns a new stream object to read the cache.
- // The returned stream object's seek pointer is at pos 0.
- HRESULT GetResetCachedContentStream(IStream** clone);
-
- size_t GetCachedContentSize() const {
- return stream_delegate_->GetCacheSize();
- }
-
- const FORMATETC& format() const {
- return format_;
- }
-
- RequestHeaders* headers() const {
- return headers_;
- }
-
- void set_headers(RequestHeaders* headers) {
- DCHECK(headers);
- DCHECK(headers_ == NULL);
- headers_ = headers;
- }
-
- protected:
- ScopedComPtr<ReadStreamCache, &GUID_NULL> stream_delegate_;
- FORMATETC format_;
- scoped_refptr<RequestHeaders> headers_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(RequestData);
-};
-
// This class is the link between a few static, moniker related functions to
// the bho. The specific services needed by those functions are abstracted into
// this interface for easier testability.
@@ -277,6 +87,11 @@ class NavigationManager {
// TLS. Returns NULL if no instance exists on the current thread.
static NavigationManager* GetThreadInstance();
+ // Mark a bind context for navigation by storing a bind context param.
+ static HRESULT AttachCFObject(IBindCtx* bind_context);
+ static HRESULT DetachCFObject(IMoniker* moniker, IBindCtx* bind_context,
+ IUnknown** object);
+
void RegisterThreadInstance();
void UnregisterThreadInstance();
@@ -313,14 +128,6 @@ class NavigationManager {
referrer_ = referrer;
}
- // Called when a top level navigation has finished and we don't need to
- // keep the cached content around anymore.
- virtual void ReleaseRequestData() {
- DLOG(INFO) << __FUNCTION__;
- url_.clear();
- SetActiveRequestData(NULL);
- }
-
// Return true if this is a URL that represents a top-level
// document that might have to be rendered in CF.
virtual bool IsTopLevelUrl(const wchar_t* url) {
@@ -338,30 +145,10 @@ class NavigationManager {
// and need to switch over from mshtml to CF.
virtual HRESULT NavigateToCurrentUrlInCF(IBrowserService* browser);
- virtual void SetActiveRequestData(RequestData* request_data);
-
- // When BindToObject is called on a URL before BindToStorage is called,
- // the request and response headers are reported on that moniker.
- // Later BindToStorage is called to fetch the content. We use the
- // RequestHeaders class to carry over the headers to the RequestData object
- // that will be created to hold the content.
- virtual void SetActiveRequestHeaders(RequestHeaders* request_headers) {
- request_headers_ = request_headers;
- }
-
- virtual RequestHeaders* GetActiveRequestHeaders() {
- return request_headers_;
- }
-
- virtual RequestData* GetActiveRequestData(const wchar_t* url) {
- return IsTopLevelUrl(url) ? request_data_.get() : NULL;
- }
-
protected:
std::string referrer_;
std::wstring url_;
- scoped_refptr<RequestData> request_data_;
- scoped_refptr<RequestHeaders> request_headers_;
+
static base::LazyInstance<base::ThreadLocalPointer<NavigationManager> >
thread_singleton_;
@@ -404,14 +191,6 @@ class MonikerPatch {
IMoniker* me, IBindCtx* bind_ctx,
IMoniker* to_left, REFIID iid, void** obj);
- // Reads content from cache (owned by RequestData) and simulates a regular
- // binding by calling the expected methods on the callback object bound to
- // the bind context.
- static HRESULT BindToStorageFromCache(IBindCtx* bind_ctx,
- const wchar_t* mime_type,
- RequestData* data,
- SimpleBindingImpl* binding,
- IStream** cache_out);
};
#endif // CHROME_FRAME_URLMON_MONIKER_H_