diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2021-02-04 14:48:52 +0100 |
---|---|---|
committer | Szabolcs David <davidsz@inf.u-szeged.hu> | 2021-03-06 08:28:04 +0100 |
commit | 8f56ea6806d9a72d4b705da5f6f90fa5a6873567 (patch) | |
tree | d4f5d01cde73e34973990ae5a5f3cb271516db15 /src/core/renderer/content_renderer_client_qt.cpp | |
parent | 84104b7d100553c1550c525759ef6fb4446c31be (diff) |
Show PDF viewer in a guest view
This is the basic support of guest views, implemented based
on Chrome.
- Embed PDF as a child frame instead of navigating to its
extension WebUI. Keep the original URL (pointing to the file) to
extend functionality of PDF viewer with URL parameters.
- Make RenderWidgetHostInputEventRouter to work and modify most of
the event forwarding logic to use that. This way WebEngine supports
pages with multiple RenderWidgetHost and guest views can be
interactive with user input.
[ChangeLog] PDF files are opened as embedded objects, WebEngine
will not navigate the content away from the requested file to
present it. PDF viewer can accept URL parameters (e.g. to control
zooming or fitting to view). Also, PDF viewer is interactive
when displayed in a subframe.
Task-number: QTBUG-80463
Task-number: QTBUG-86152
Task-number: QTBUG-90712
Change-Id: Ib1591fbd9a594891cdeace8e9dae0d3cc21a9f8e
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'src/core/renderer/content_renderer_client_qt.cpp')
-rw-r--r-- | src/core/renderer/content_renderer_client_qt.cpp | 56 |
1 files changed, 37 insertions, 19 deletions
diff --git a/src/core/renderer/content_renderer_client_qt.cpp b/src/core/renderer/content_renderer_client_qt.cpp index cafdeddb4..317fde8f7 100644 --- a/src/core/renderer/content_renderer_client_qt.cpp +++ b/src/core/renderer/content_renderer_client_qt.cpp @@ -91,6 +91,8 @@ #if BUILDFLAG(ENABLE_EXTENSIONS) #include "common/extensions/extensions_client_qt.h" #include "extensions/extensions_renderer_client_qt.h" +#include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.h" +#include "mojo/public/cpp/bindings/associated_remote.h" #endif //ENABLE_EXTENSIONS #if BUILDFLAG(ENABLE_PLUGINS) @@ -220,6 +222,11 @@ void ContentRendererClientQt::RenderFrameCreated(content::RenderFrame *render_fr new printing::PrintRenderFrameHelper(render_frame, base::WrapUnique(new PrintWebViewHelperDelegateQt())); #endif // QT_CONFIG(webengine_printing_and_pdf) #if BUILDFLAG(ENABLE_EXTENSIONS) + blink::AssociatedInterfaceRegistry *associated_interfaces = render_frame_observer->associatedInterfaces(); + associated_interfaces->AddInterface(base::BindRepeating( + &extensions::MimeHandlerViewContainerManager::BindReceiver, + render_frame->GetRoutingID())); + auto registry = std::make_unique<service_manager::BinderRegistry>(); ExtensionsRendererClientQt::GetInstance()->RenderFrameCreated(render_frame, render_frame_observer->registry()); #endif @@ -337,6 +344,30 @@ std::unique_ptr<blink::WebPrescientNetworking> ContentRendererClientQt::CreatePr return std::make_unique<network_hints::WebPrescientNetworkingImpl>(render_frame); } +bool ContentRendererClientQt::IsPluginHandledExternally(content::RenderFrame *render_frame, + const blink::WebElement &plugin_element, + const GURL &original_url, + const std::string &original_mime_type) +{ +#if BUILDFLAG(ENABLE_EXTENSIONS) && BUILDFLAG(ENABLE_PLUGINS) + bool found = false; + content::WebPluginInfo plugin_info; + std::string mime_type; + + render_frame->Send(new FrameHostMsg_GetPluginInfo(render_frame->GetRoutingID(), original_url, + render_frame->GetWebFrame()->Top()->GetSecurityOrigin(), + original_mime_type, &found, &plugin_info, &mime_type)); + + return extensions::MimeHandlerViewContainerManager::Get( + content::RenderFrame::FromWebFrame( + plugin_element.GetDocument().GetFrame()), + true /* create_if_does_not_exist */) + ->CreateFrameContainer(plugin_element, original_url, mime_type, plugin_info); +#else + return false; +#endif +} + bool ContentRendererClientQt::OverrideCreatePlugin(content::RenderFrame *render_frame, const blink::WebPluginParams ¶ms, blink::WebPlugin **plugin) @@ -347,7 +378,6 @@ bool ContentRendererClientQt::OverrideCreatePlugin(content::RenderFrame *render_ #endif //ENABLE_EXTENSIONS #if BUILDFLAG(ENABLE_PLUGINS) - chrome::mojom::PluginInfoPtr plugin_info = chrome::mojom::PluginInfo::New(); content::WebPluginInfo info; std::string mime_type; bool found = false; @@ -355,30 +385,18 @@ bool ContentRendererClientQt::OverrideCreatePlugin(content::RenderFrame *render_ render_frame->Send(new FrameHostMsg_GetPluginInfo(render_frame->GetRoutingID(), params.url, render_frame->GetWebFrame()->Top()->GetSecurityOrigin(), params.mime_type.Utf8(), &found, &info, &mime_type)); - if (!found) { - *plugin = CreatePlugin(render_frame, params, *plugin_info); - return true; - } + if (!found) + *plugin = LoadablePluginPlaceholderQt::CreateLoadableMissingPlugin(render_frame, params)->plugin(); + else + *plugin = render_frame->CreatePlugin(info, params, nullptr); #endif // BUILDFLAG(ENABLE_PLUGINS) - return content::ContentRendererClient::OverrideCreatePlugin(render_frame, params, plugin); + return true; } bool ContentRendererClientQt::IsOriginIsolatedPepperPlugin(const base::FilePath& plugin_path) { - return plugin_path.value() == FILE_PATH_LITERAL("internal-pdf-viewer/"); -} - -#if BUILDFLAG(ENABLE_PLUGINS) -// static -blink::WebPlugin* ContentRendererClientQt::CreatePlugin(content::RenderFrame* render_frame, - const blink::WebPluginParams& original_params, - const chrome::mojom::PluginInfo& plugin_info) -{ - // If the browser plugin is to be enabled, this should be handled by the - // renderer, so the code won't reach here due to the early exit in OverrideCreatePlugin. - return LoadablePluginPlaceholderQt::CreateLoadableMissingPlugin(render_frame, original_params)->plugin(); + return plugin_path.value() == FILE_PATH_LITERAL("internal-pdf-viewer"); } -#endif //BUILDFLAG(ENABLE_PLUGINS) #if QT_CONFIG(webengine_webrtc) && QT_CONFIG(webengine_extensions) chrome::WebRtcLoggingAgentImpl *ContentRendererClientQt::GetWebRtcLoggingAgent() |