diff --git a/libcef/browser/browser_context_proxy.cc b/libcef/browser/browser_context_proxy.cc index ca5749006..c1772becf 100644 --- a/libcef/browser/browser_context_proxy.cc +++ b/libcef/browser/browser_context_proxy.cc @@ -10,8 +10,28 @@ #include "libcef/browser/url_request_context_getter_proxy.h" #include "base/logging.h" +#include "components/guest_view/common/guest_view_constants.h" +#include "content/browser/streams/stream_context.h" #include "content/public/browser/storage_partition.h" +namespace { + +bool ShouldProxyUserData(const void* key) { + // If this value is not proxied the blob data fails to load for the PDF + // extension. + if (key == content::StreamContext::GetUserDataKey()) + return true; + + // If this value is not proxied then CefBrowserContextImpl::GetGuestManager() + // returns NULL. + if (key == guest_view::kGuestViewManagerKeyName) + return true; + + return false; +} + +} // namespace + CefBrowserContextProxy::CefBrowserContextProxy( CefRefPtr handler, scoped_refptr parent) @@ -26,6 +46,27 @@ CefBrowserContextProxy::~CefBrowserContextProxy() { parent_->RemoveProxy(this); } +base::SupportsUserData::Data* + CefBrowserContextProxy::GetUserData(const void* key) const { + if (ShouldProxyUserData(key)) + return parent_->GetUserData(key); + return BrowserContext::GetUserData(key); +} + +void CefBrowserContextProxy::SetUserData(const void* key, Data* data) { + if (ShouldProxyUserData(key)) + parent_->SetUserData(key, data); + else + BrowserContext::SetUserData(key, data); +} + +void CefBrowserContextProxy::RemoveUserData(const void* key) { + if (ShouldProxyUserData(key)) + parent_->RemoveUserData(key); + else + BrowserContext::RemoveUserData(key); +} + base::FilePath CefBrowserContextProxy::GetPath() const { return parent_->GetPath(); } diff --git a/libcef/browser/browser_context_proxy.h b/libcef/browser/browser_context_proxy.h index 51488ff64..fea07432f 100644 --- a/libcef/browser/browser_context_proxy.h +++ b/libcef/browser/browser_context_proxy.h @@ -29,6 +29,11 @@ class CefBrowserContextProxy : public CefBrowserContext { CefBrowserContextProxy(CefRefPtr handler, scoped_refptr parent); + // SupportsUserData methods. + Data* GetUserData(const void* key) const override; + void SetUserData(const void* key, Data* data) override; + void RemoveUserData(const void* key) override; + // BrowserContext methods. base::FilePath GetPath() const override; scoped_ptr CreateZoomLevelDelegate( diff --git a/patch/patch.cfg b/patch/patch.cfg index 2dd4be043..6b8a60079 100644 --- a/patch/patch.cfg +++ b/patch/patch.cfg @@ -190,4 +190,16 @@ patches = [ 'name': 'browser_frame_host_guest_1687', 'path': '../content/browser/frame_host/', }, + { + # Fix loading of the PDF extension with proxy BrowserContext. + # https://bitbucket.org/chromiumembedded/cef/issues/1710 + 'name': 'stream_context_1710', + 'path': '../content/browser/streams/', + }, + { + # Fix loading of the PDF extension with proxy BrowserContext. + # https://bitbucket.org/chromiumembedded/cef/issues/1710 + 'name': 'supports_user_data_1710', + 'path': '../base/', + }, ] diff --git a/patch/patches/stream_context_1710.patch b/patch/patches/stream_context_1710.patch new file mode 100644 index 000000000..3aff4098c --- /dev/null +++ b/patch/patches/stream_context_1710.patch @@ -0,0 +1,27 @@ +diff --git stream_context.cc stream_context.cc +index e338396..150cde5 100644 +--- stream_context.cc ++++ stream_context.cc +@@ -19,6 +19,10 @@ namespace content { + + StreamContext::StreamContext() {} + ++const void* StreamContext::GetUserDataKey() { ++ return kStreamContextKeyName; ++} ++ + StreamContext* StreamContext::GetFor(BrowserContext* context) { + if (!context->GetUserData(kStreamContextKeyName)) { + scoped_refptr stream = new StreamContext(); +diff --git stream_context.h stream_context.h +index ad8f65c..60310db 100644 +--- stream_context.h ++++ stream_context.h +@@ -28,6 +28,7 @@ class StreamContext + public: + StreamContext(); + ++ CONTENT_EXPORT static const void* GetUserDataKey(); + CONTENT_EXPORT static StreamContext* GetFor(BrowserContext* browser_context); + + void InitializeOnIOThread(); diff --git a/patch/patches/supports_user_data_1710.patch b/patch/patches/supports_user_data_1710.patch new file mode 100644 index 000000000..e336293b8 --- /dev/null +++ b/patch/patches/supports_user_data_1710.patch @@ -0,0 +1,17 @@ +diff --git supports_user_data.h supports_user_data.h +index 711ee7d..cf38fc0 100644 +--- supports_user_data.h ++++ supports_user_data.h +@@ -32,9 +32,9 @@ class BASE_EXPORT SupportsUserData { + // Multiple user data values can be stored under different keys. + // This object will TAKE OWNERSHIP of the given data pointer, and will + // delete the object if it is changed or the object is destroyed. +- Data* GetUserData(const void* key) const; +- void SetUserData(const void* key, Data* data); +- void RemoveUserData(const void* key); ++ virtual Data* GetUserData(const void* key) const; ++ virtual void SetUserData(const void* key, Data* data); ++ virtual void RemoveUserData(const void* key); + + // SupportsUserData is not thread-safe, and on debug build will assert it is + // only used on one thread. Calling this method allows the caller to hand