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 @@
#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/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_permission_helper_delegate.h"
#include "content/public/browser/browser_context.h"
......@@ -47,6 +48,14 @@ AppViewGuestDelegate* ChromeExtensionsAPIClient::CreateAppViewGuestDelegate()
return new ChromeAppViewGuestDelegate();
}
scoped_ptr<MimeHandlerViewGuestDelegate>
ChromeExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const {
return scoped_ptr<ChromeMimeHandlerViewGuestDelegate>(
new ChromeMimeHandlerViewGuestDelegate(guest))
.PassAs<MimeHandlerViewGuestDelegate>();
}
WebViewGuestDelegate* ChromeExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const {
return new ChromeWebViewGuestDelegate(web_view_guest);
......
......@@ -24,6 +24,9 @@ class ChromeExtensionsAPIClient : public ExtensionsAPIClient {
std::map<settings_namespace::Namespace, ValueStoreCache*>* caches)
OVERRIDE;
virtual AppViewGuestDelegate* CreateAppViewGuestDelegate() const OVERRIDE;
virtual scoped_ptr<MimeHandlerViewGuestDelegate>
CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const OVERRIDE;
virtual WebViewGuestDelegate* CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const OVERRIDE;
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 @@
'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.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.h',
'browser/guest_view/web_view/chrome_web_view_permission_helper_delegate.cc',
......
......@@ -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_guest.h",
"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.h",
"guest_view/web_view/web_view_constants.cc",
......
......@@ -5,6 +5,7 @@
#include "extensions/browser/api/extensions_api_client.h"
#include "base/logging.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest_delegate.h"
namespace extensions {
class AppViewGuestDelegate;
......@@ -30,6 +31,12 @@ AppViewGuestDelegate* ExtensionsAPIClient::CreateAppViewGuestDelegate() const {
return NULL;
}
scoped_ptr<MimeHandlerViewGuestDelegate>
ExtensionsAPIClient::CreateMimeHandlerViewGuestDelegate(
MimeHandlerViewGuest* guest) const {
return scoped_ptr<MimeHandlerViewGuestDelegate>();
}
WebViewGuestDelegate* ExtensionsAPIClient::CreateWebViewGuestDelegate(
WebViewGuest* web_view_guest) const {
return NULL;
......
......@@ -8,6 +8,7 @@
#include <map>
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "extensions/browser/api/storage/settings_namespace.h"
class GURL;
......@@ -22,6 +23,8 @@ class BrowserContext;
namespace extensions {
class AppViewGuestDelegate;
class MimeHandlerViewGuest;
class MimeHandlerViewGuestDelegate;
class WebViewGuest;
class WebViewGuestDelegate;
class WebViewPermissionHelper;
......@@ -57,6 +60,10 @@ class ExtensionsAPIClient {
// Creates the AppViewGuestDelegate.
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
// returned WebViewGuestDelegate.
virtual WebViewGuestDelegate* CreateWebViewGuestDelegate (
......
......@@ -8,9 +8,11 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.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_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_guest_delegate.h"
#include "extensions/common/feature_switch.h"
#include "extensions/strings/grit/extensions_strings.h"
#include "net/base/url_util.h"
......@@ -35,7 +37,9 @@ GuestViewBase* MimeHandlerViewGuest::Create(
MimeHandlerViewGuest::MimeHandlerViewGuest(
content::BrowserContext* browser_context,
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() {
......@@ -94,6 +98,11 @@ void MimeHandlerViewGuest::DidAttachToEmbedder() {
std::string());
}
void MimeHandlerViewGuest::DidInitialize() {
if (delegate_)
delegate_->AttachHelpers();
}
void MimeHandlerViewGuest::HandleKeyboardEvent(
WebContents* source,
const content::NativeWebKeyboardEvent& event) {
......
......@@ -9,6 +9,8 @@
namespace extensions {
class MimeHandlerViewGuestDelegate;
class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
public:
static GuestViewBase* Create(content::BrowserContext* browser_context,
......@@ -25,6 +27,7 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
const base::DictionaryValue& create_params,
const WebContentsCreatedCallback& callback) OVERRIDE;
virtual void DidAttachToEmbedder() OVERRIDE;
virtual void DidInitialize() OVERRIDE;
// WebContentsDelegate implementation.
virtual void HandleKeyboardEvent(
......@@ -36,6 +39,8 @@ class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
int guest_instance_id);
virtual ~MimeHandlerViewGuest();
scoped_ptr<MimeHandlerViewGuestDelegate> delegate_;
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 @@
'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.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.h',
'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