Commit 9b204d37 authored by lazyboy's avatar lazyboy Committed by Commit bot

Add delegate to install web_contents helpers for MimeHandlerView.

These helpers are necessary to make PDF print/save work properly.
However they are not sufficient:
1) PDF SaveAs requires a bit more work to pass in the URL,
  a temporary hack is shown here: http://crrev.com/554893002/
2) PDF Print requires Constrained windows to work with mime-handler view,
  which is being fixed in http://crrev.com/552013005

BUG=411765
Test=Once the changes noted above is done, it should be
possible to print/save PDF from mime-handler-view.
mime-handler-view can be triggered by navigating to a PDF with the
following two chrome flags:
--out-of-process-pdf
--enable-mime-handler-view

Review URL: https://codereview.chromium.org/556723002

Cr-Commit-Position: refs/heads/master@{#294074}
parent 18cedb3f
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "chrome/browser/extensions/api/storage/sync_value_store_cache.h" #include "chrome/browser/extensions/api/storage/sync_value_store_cache.h"
#include "chrome/browser/guest_view/app_view/chrome_app_view_guest_delegate.h" #include "chrome/browser/guest_view/app_view/chrome_app_view_guest_delegate.h"
#include "chrome/browser/guest_view/extension_options/extension_options_guest.h" #include "chrome/browser/guest_view/extension_options/extension_options_guest.h"
#include "chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h"
#include "chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h" #include "chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.h"
#include "chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h" #include "chrome/browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.h"
#include "content/public/browser/browser_context.h" #include "content/public/browser/browser_context.h"
...@@ -47,6 +48,14 @@ AppViewGuestDelegate* ChromeExtensionsAPIClient::CreateAppViewGuestDelegate() ...@@ -47,6 +48,14 @@ AppViewGuestDelegate* ChromeExtensionsAPIClient::CreateAppViewGuestDelegate()
return new ChromeAppViewGuestDelegate(); return new ChromeAppViewGuestDelegate();
} }
scoped_ptr<MimeHandlerViewGuestDelegate>
ChromeExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const {
return scoped_ptr<ChromeMimeHandlerViewGuestDelegate>(
new ChromeMimeHandlerViewGuestDelegate(guest))
.PassAs<MimeHandlerViewGuestDelegate>();
}
WebViewGuestDelegate* ChromeExtensionsAPIClient::CreateWebViewGuestDelegate( WebViewGuestDelegate* ChromeExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const { WebViewGuest* web_view_guest) const {
return new ChromeWebViewGuestDelegate(web_view_guest); return new ChromeWebViewGuestDelegate(web_view_guest);
......
...@@ -24,6 +24,9 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient { ...@@ -24,6 +24,9 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient {
std::map<settings_namespace::Namespace, ValueStoreCache*>* caches) std::map<settings_namespace::Namespace, ValueStoreCache*>* caches)
OVERRIDE; OVERRIDE;
virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const OVERRIDE; virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const OVERRIDE;
virtual scoped_ptr<MimeHandlerViewGuestDelegate>
CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const OVERRIDE;
virtual WebViewGuestDelegate* CreateWebViewGuestDelegate( virtual WebViewGuestDelegate* CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const OVERRIDE; WebViewGuest* web_view_guest) const OVERRIDE;
virtual WebViewPermissionHelperDelegate* virtual WebViewPermissionHelperDelegate*
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h"
#include "chrome/browser/ui/pdf/chrome_pdf_web_contents_helper_client.h"
#include "components/pdf/browser/pdf_web_contents_helper.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#if defined(ENABLE_PRINTING)
#if defined(ENABLE_FULL_PRINTING)
#include "chrome/browser/printing/print_preview_message_handler.h"
#include "chrome/browser/printing/print_view_manager.h"
#else
#include "chrome/browser/printing/print_view_manager_basic.h"
#endif // defined(ENABLE_FULL_PRINTING)
#endif // defined(ENABLE_PRINTING)
ChromeMimeHandlerViewGuestDelegate::ChromeMimeHandlerViewGuestDelegate(
extensions::MimeHandlerViewGuest* guest)
: extensions::MimeHandlerViewGuestDelegate(guest), guest_(guest) {
}
ChromeMimeHandlerViewGuestDelegate::~ChromeMimeHandlerViewGuestDelegate() {
}
// TODO(lazyboy): Investigate ways to move this out to /extensions.
void ChromeMimeHandlerViewGuestDelegate::AttachHelpers() {
content::WebContents* web_contents = guest_->web_contents();
#if defined(ENABLE_PRINTING)
#if defined(ENABLE_FULL_PRINTING)
printing::PrintViewManager::CreateForWebContents(web_contents);
printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents);
#else
printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
#endif // defined(ENABLE_FULL_PRINTING)
#endif // defined(ENABLE_PRINTING)
pdf::PDFWebContentsHelper::CreateForWebContentsWithClient(
web_contents,
scoped_ptr<pdf::PDFWebContentsHelperClient>(
new ChromePDFWebContentsHelperClient()));
}
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_CHROME_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
#define CHROME_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_CHROME_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
namespace content {
class WebContents;
} // namespace content
class ChromeMimeHandlerViewGuestDelegate
: public extensions::MimeHandlerViewGuestDelegate {
public:
explicit ChromeMimeHandlerViewGuestDelegate(
extensions::MimeHandlerViewGuest* guest);
virtual ~ChromeMimeHandlerViewGuestDelegate();
virtual void AttachHelpers() OVERRIDE;
private:
extensions::MimeHandlerViewGuest* guest_; // Owns us.
DISALLOW_COPY_AND_ASSIGN(ChromeMimeHandlerViewGuestDelegate);
};
#endif // CHROME_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_CHROME_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
...@@ -1457,6 +1457,8 @@ ...@@ -1457,6 +1457,8 @@
'browser/guest_view/extension_options/extension_options_guest.h', 'browser/guest_view/extension_options/extension_options_guest.h',
'browser/guest_view/app_view/chrome_app_view_guest_delegate.cc', 'browser/guest_view/app_view/chrome_app_view_guest_delegate.cc',
'browser/guest_view/app_view/chrome_app_view_guest_delegate.h', 'browser/guest_view/app_view/chrome_app_view_guest_delegate.h',
'browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.cc',
'browser/guest_view/mime_handler_view/chrome_mime_handler_view_guest_delegate.h',
'browser/guest_view/web_view/chrome_web_view_guest_delegate.cc', 'browser/guest_view/web_view/chrome_web_view_guest_delegate.cc',
'browser/guest_view/web_view/chrome_web_view_guest_delegate.h', 'browser/guest_view/web_view/chrome_web_view_guest_delegate.h',
'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc', 'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc',
......
...@@ -308,6 +308,7 @@ source_set("browser") { ...@@ -308,6 +308,7 @@ source_set("browser") {
"guest_view/mime_handler_view/mime_handler_view_constants.h", "guest_view/mime_handler_view/mime_handler_view_constants.h",
"guest_view/mime_handler_view/mime_handler_view_guest.h", "guest_view/mime_handler_view/mime_handler_view_guest.h",
"guest_view/mime_handler_view/mime_handler_view_guest.cc", "guest_view/mime_handler_view/mime_handler_view_guest.cc",
"guest_view/mime_handler_view/mime_handler_view_guest_delegate.h",
"guest_view/web_view/javascript_dialog_helper.cc", "guest_view/web_view/javascript_dialog_helper.cc",
"guest_view/web_view/javascript_dialog_helper.h", "guest_view/web_view/javascript_dialog_helper.h",
"guest_view/web_view/web_view_constants.cc", "guest_view/web_view/web_view_constants.cc",
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "extensions/browser/api/extensions_api_client.h" #include "extensions/browser/api/extensions_api_client.h"
#include "base/logging.h" #include "base/logging.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
namespace extensions { namespace extensions {
class AppViewGuestDelegate; class AppViewGuestDelegate;
...@@ -30,6 +31,12 @@ AppViewGuestDelegate* ExtensionsAPIClient::CreateAppViewGuestDelegate() const { ...@@ -30,6 +31,12 @@ AppViewGuestDelegate* ExtensionsAPIClient::CreateAppViewGuestDelegate() const {
return NULL; return NULL;
} }
scoped_ptr<MimeHandlerViewGuestDelegate>
ExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const {
return scoped_ptr<MimeHandlerViewGuestDelegate>();
}
WebViewGuestDelegate* ExtensionsAPIClient::CreateWebViewGuestDelegate( WebViewGuestDelegate* ExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const { WebViewGuest* web_view_guest) const {
return NULL; return NULL;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <map> #include <map>
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "extensions/browser/api/storage/settings_namespace.h" #include "extensions/browser/api/storage/settings_namespace.h"
class GURL; class GURL;
...@@ -22,6 +23,8 @@ class BrowserContext; ...@@ -22,6 +23,8 @@ class BrowserContext;
namespace extensions { namespace extensions {
class AppViewGuestDelegate; class AppViewGuestDelegate;
class MimeHandlerViewGuest;
class MimeHandlerViewGuestDelegate;
class WebViewGuest; class WebViewGuest;
class WebViewGuestDelegate; class WebViewGuestDelegate;
class WebViewPermissionHelper; class WebViewPermissionHelper;
...@@ -57,6 +60,10 @@ class ExtensionsAPIClient { ...@@ -57,6 +60,10 @@ class ExtensionsAPIClient {
// Creates the AppViewGuestDelegate. // Creates the AppViewGuestDelegate.
virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const; virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const;
// Creates a delegate for MimeHandlerViewGuest.
virtual scoped_ptr<MimeHandlerViewGuestDelegate>
CreateMimeHandlerViewGuestDelegate(MimeHandlerViewGuest* guest) const;
// Returns a delegate for some of WebViewGuest's behavior. The caller owns the // Returns a delegate for some of WebViewGuest's behavior. The caller owns the
// returned WebViewGuestDelegate. // returned WebViewGuestDelegate.
virtual WebViewGuestDelegate* CreateWebViewGuestDelegate ( virtual WebViewGuestDelegate* CreateWebViewGuestDelegate (
......
...@@ -8,9 +8,11 @@ ...@@ -8,9 +8,11 @@
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "extensions/browser/api/extensions_api_client.h"
#include "extensions/browser/guest_view/guest_view_constants.h" #include "extensions/browser/guest_view/guest_view_constants.h"
#include "extensions/browser/guest_view/guest_view_manager.h" #include "extensions/browser/guest_view/guest_view_manager.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h" #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
#include "extensions/common/feature_switch.h" #include "extensions/common/feature_switch.h"
#include "extensions/strings/grit/extensions_strings.h" #include "extensions/strings/grit/extensions_strings.h"
#include "net/base/url_util.h" #include "net/base/url_util.h"
...@@ -35,7 +37,9 @@ GuestViewBase* MimeHandlerViewGuest::Create( ...@@ -35,7 +37,9 @@ GuestViewBase* MimeHandlerViewGuest::Create(
MimeHandlerViewGuest::MimeHandlerViewGuest( MimeHandlerViewGuest::MimeHandlerViewGuest(
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
int guest_instance_id) int guest_instance_id)
: GuestView<MimeHandlerViewGuest>(browser_context, guest_instance_id) { : GuestView<MimeHandlerViewGuest>(browser_context, guest_instance_id),
delegate_(ExtensionsAPIClient::Get()->CreateMimeHandlerViewGuestDelegate(
this)) {
} }
MimeHandlerViewGuest::~MimeHandlerViewGuest() { MimeHandlerViewGuest::~MimeHandlerViewGuest() {
...@@ -94,6 +98,11 @@ void MimeHandlerViewGuest::DidAttachToEmbedder() { ...@@ -94,6 +98,11 @@ void MimeHandlerViewGuest::DidAttachToEmbedder() {
std::string()); std::string());
} }
void MimeHandlerViewGuest::DidInitialize() {
if (delegate_)
delegate_->AttachHelpers();
}
void MimeHandlerViewGuest::HandleKeyboardEvent( void MimeHandlerViewGuest::HandleKeyboardEvent(
WebContents* source, WebContents* source,
const content::NativeWebKeyboardEvent& event) { const content::NativeWebKeyboardEvent& event) {
......
...@@ -9,6 +9,8 @@ ...@@ -9,6 +9,8 @@
namespace extensions { namespace extensions {
class MimeHandlerViewGuestDelegate;
class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> { class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
public: public:
static GuestViewBase* Create(content::BrowserContext* browser_context, static GuestViewBase* Create(content::BrowserContext* browser_context,
...@@ -25,6 +27,7 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> { ...@@ -25,6 +27,7 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
const base::DictionaryValue& create_params, const base::DictionaryValue& create_params,
const WebContentsCreatedCallback& callback) OVERRIDE; const WebContentsCreatedCallback& callback) OVERRIDE;
virtual void DidAttachToEmbedder() OVERRIDE; virtual void DidAttachToEmbedder() OVERRIDE;
virtual void DidInitialize() OVERRIDE;
// WebContentsDelegate implementation. // WebContentsDelegate implementation.
virtual void HandleKeyboardEvent( virtual void HandleKeyboardEvent(
...@@ -36,6 +39,8 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> { ...@@ -36,6 +39,8 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
int guest_instance_id); int guest_instance_id);
virtual ~MimeHandlerViewGuest(); virtual ~MimeHandlerViewGuest();
scoped_ptr<MimeHandlerViewGuestDelegate> delegate_;
DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewGuest); DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewGuest);
}; };
......
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
#define EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
#include "base/macros.h"
namespace content {
class WebContents;
} // namespace content
namespace extensions {
class MimeHandlerViewGuest;
// A delegate class of MimeHandlerViewGuest that are not a part of chrome.
class MimeHandlerViewGuestDelegate {
public:
explicit MimeHandlerViewGuestDelegate(MimeHandlerViewGuest* guest) {}
virtual ~MimeHandlerViewGuestDelegate() {}
// Attaches helpers upon initializing the WebContents.
virtual void AttachHelpers() {}
private:
DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewGuestDelegate);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_DELEGATE_H_
...@@ -570,6 +570,7 @@ ...@@ -570,6 +570,7 @@
'browser/guest_view/guest_view.h', 'browser/guest_view/guest_view.h',
'browser/guest_view/mime_handler_view/mime_handler_view_constants.cc', 'browser/guest_view/mime_handler_view/mime_handler_view_constants.cc',
'browser/guest_view/mime_handler_view/mime_handler_view_constants.h', 'browser/guest_view/mime_handler_view/mime_handler_view_constants.h',
'browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h',
'browser/guest_view/mime_handler_view/mime_handler_view_guest.cc', 'browser/guest_view/mime_handler_view/mime_handler_view_guest.cc',
'browser/guest_view/mime_handler_view/mime_handler_view_guest.h', 'browser/guest_view/mime_handler_view/mime_handler_view_guest.h',
'browser/guest_view/web_view/javascript_dialog_helper.cc', 'browser/guest_view/web_view/javascript_dialog_helper.cc',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment