Commit a8e3cf7c authored by lazyboy@chromium.org's avatar lazyboy@chromium.org

Fix print preview dialog for <webview>.

Make constrained window use embedder's native window
(through its WebContents) instead of using webview's.

After print preview got enabled by default, the code
trying to bring up print preview dialog (a constrained
window) started crashing the browser.

BUG=286487
Test=In chromeos device/LinuxAura/Mac: load the sample
browser app
https://github.com/GoogleChrome/chrome-app-samples/tree/master/webview-samples/browser
Navigate to a page that calls window.print()
http://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_print
Click "Print this page" to trigger window.print() inside
webview.
It should
1) not crash
2) correctly show the preview and print the contents of
the webview, not the entire app. This
means it shouldn't print the chrome (address bar/buttons etc.)
of the browser sample.

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276372 0039d316-1c4b-4281-b951-d872f2087c98
parent 5ba097ca
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h" #include "chrome/browser/ui/cocoa/constrained_window/constrained_window_mac.h"
#include "base/logging.h" #include "base/logging.h"
#include "chrome/browser/guest_view/web_view/web_view_guest.h"
#include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/browser_window.h"
#import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet.h" #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_sheet.h"
...@@ -22,13 +23,18 @@ ConstrainedWindowMac::ConstrainedWindowMac( ...@@ -22,13 +23,18 @@ ConstrainedWindowMac::ConstrainedWindowMac(
content::WebContents* web_contents, content::WebContents* web_contents,
id<ConstrainedWindowSheet> sheet) id<ConstrainedWindowSheet> sheet)
: delegate_(delegate), : delegate_(delegate),
web_contents_(web_contents), web_contents_(NULL),
sheet_([sheet retain]), sheet_([sheet retain]),
shown_(false) { shown_(false) {
DCHECK(web_contents); DCHECK(web_contents);
WebViewGuest* web_view_guest = WebViewGuest::FromWebContents(web_contents);
// For embedded WebContents, use the embedder's WebContents for constrained
// window.
web_contents_ = web_view_guest && web_view_guest->embedder_web_contents() ?
web_view_guest->embedder_web_contents() : web_contents;
DCHECK(sheet_.get()); DCHECK(sheet_.get());
WebContentsModalDialogManager* web_contents_modal_dialog_manager = WebContentsModalDialogManager* web_contents_modal_dialog_manager =
WebContentsModalDialogManager::FromWebContents(web_contents); WebContentsModalDialogManager::FromWebContents(web_contents_);
web_contents_modal_dialog_manager->ShowModalDialog(this); web_contents_modal_dialog_manager->ShowModalDialog(this);
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <algorithm> #include <algorithm>
#include "chrome/browser/guest_view/web_view/web_view_guest.h"
#include "chrome/browser/ui/browser_finder.h" #include "chrome/browser/ui/browser_finder.h"
#include "components/web_modal/web_contents_modal_dialog_host.h" #include "components/web_modal/web_contents_modal_dialog_host.h"
#include "components/web_modal/web_contents_modal_dialog_manager.h" #include "components/web_modal/web_contents_modal_dialog_manager.h"
...@@ -120,8 +121,16 @@ void UpdateBrowserModalDialogPosition(views::Widget* widget, ...@@ -120,8 +121,16 @@ void UpdateBrowserModalDialogPosition(views::Widget* widget,
widget->GetRootView()->GetPreferredSize()); widget->GetRootView()->GetPreferredSize());
} }
views::Widget* ShowWebModalDialogViews(views::WidgetDelegate* dialog, views::Widget* ShowWebModalDialogViews(
content::WebContents* web_contents) { views::WidgetDelegate* dialog,
content::WebContents* initiator_web_contents) {
WebViewGuest* web_view_guest = WebViewGuest::FromWebContents(
initiator_web_contents);
// For embedded WebContents, use the embedder's WebContents for constrained
// window.
content::WebContents* web_contents =
web_view_guest && web_view_guest->embedder_web_contents() ?
web_view_guest->embedder_web_contents() : initiator_web_contents;
views::Widget* widget = CreateWebModalDialogViews(dialog, web_contents); views::Widget* widget = CreateWebModalDialogViews(dialog, web_contents);
web_modal::WebContentsModalDialogManager::FromWebContents(web_contents)-> web_modal::WebContentsModalDialogManager::FromWebContents(web_contents)->
ShowModalDialog(widget->GetNativeWindow()); ShowModalDialog(widget->GetNativeWindow());
......
...@@ -33,8 +33,9 @@ void UpdateBrowserModalDialogPosition( ...@@ -33,8 +33,9 @@ void UpdateBrowserModalDialogPosition(
web_modal::ModalDialogHost* dialog_host); web_modal::ModalDialogHost* dialog_host);
// Calls CreateWebModalDialogViews, shows the dialog, and returns its widget. // Calls CreateWebModalDialogViews, shows the dialog, and returns its widget.
views::Widget* ShowWebModalDialogViews(views::WidgetDelegate* dialog, views::Widget* ShowWebModalDialogViews(
content::WebContents* web_contents); views::WidgetDelegate* dialog,
content::WebContents* initiator_web_contents);
// Create a widget for |dialog| that is modal to |web_contents|. // Create a widget for |dialog| that is modal to |web_contents|.
views::Widget* CreateWebModalDialogViews(views::WidgetDelegate* dialog, views::Widget* CreateWebModalDialogViews(views::WidgetDelegate* dialog,
......
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