diff options
Diffstat (limited to 'src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp')
-rw-r--r-- | src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp b/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp new file mode 100644 index 000000000..0583060c6 --- /dev/null +++ b/src/core/renderer_host/resource_dispatcher_host_delegate_qt.cpp @@ -0,0 +1,166 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// Copyright 2013 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.Chromium file. + +#include "resource_dispatcher_host_delegate_qt.h" + +#include "base/bind.h" +#include "base/guid.h" +#include "base/strings/stringprintf.h" +#include "base/task/post_task.h" +#include "content/public/browser/browser_task_traits.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/navigation_controller.h" + +#include "content/public/browser/render_frame_host.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/resource_dispatcher_host.h" +#include "content/public/browser/resource_request_info.h" +#include "content/public/browser/stream_info.h" +#include "content/public/browser/web_contents.h" + +#include "extensions/extension_system_qt.h" +#include "extensions/browser/info_map.h" +#include "extensions/common/constants.h" +#include "extensions/common/extension.h" +#include "extensions/common/manifest_handlers/mime_types_handler.h" + +#include "net/base/escape.h" +#include "net/url_request/url_request.h" + +#include "resource_context_qt.h" +#include "type_conversion.h" + +namespace QtWebEngineCore { + +void OnPdfStreamIntercepted( + const GURL& original_url, + std::string extension_id, + int frame_tree_node_id, + const content::ResourceRequestInfo::WebContentsGetter& + web_contents_getter) { + content::WebContents* web_contents = web_contents_getter.Run(); + if (!web_contents) + return; + + // The URL passes the original pdf resource url, that will be requested + // by the pdf viewer extension page. + content::NavigationController::LoadURLParams params( + GURL(base::StringPrintf("%s://%s/index.html?%s", extensions::kExtensionScheme, + extension_id.c_str(), + net::EscapeUrlEncodedData(original_url.spec(), false).c_str()))); + + params.frame_tree_node_id = frame_tree_node_id; + web_contents->GetController().LoadURLWithParams(params); +} + +bool ResourceDispatcherHostDelegateQt::ShouldInterceptResourceAsStream(net::URLRequest *request, + const std::string &mime_type, + GURL *origin, + std::string *payload) +{ + const content::ResourceRequestInfo* info = + content::ResourceRequestInfo::ForRequest(request); + + int render_process_host_id = -1; + int render_frame_id = -1; + if (!content::ResourceRequestInfo::GetRenderFrameForRequest(request, &render_process_host_id, &render_frame_id)) { + return false; + } + + ResourceContextQt *context = static_cast<ResourceContextQt *>(info->GetContext()); + std::vector<std::string> whitelist = MimeTypesHandler::GetMIMETypeWhitelist(); + + extensions::ExtensionSystemQt *extensionSystem = context->GetExtensionSystem(); + if (!extensionSystem) + return false; + + const scoped_refptr<const extensions::InfoMap> extension_info_map(extensionSystem->info_map()); + + for (const std::string &extension_id : whitelist) { + const extensions::Extension *extension = extension_info_map->extensions().GetByID(extension_id); + if (!extension) + continue; + + MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); + if (!handler) + continue; + if (handler->CanHandleMIMEType(mime_type)) { + StreamTargetInfo target_info; + *origin = extensions::Extension::GetBaseURLFromExtensionId(extension_id); + target_info.extension_id = extension_id; + target_info.view_id = base::GenerateGUID(); + *payload = target_info.view_id; + stream_target_info_[request] = target_info; + return true; + } + } + return false; +} + +// Informs the delegate that a Stream was created. The Stream can be read from +// the blob URL of the Stream, but can only be read once. +void ResourceDispatcherHostDelegateQt::OnStreamCreated(net::URLRequest *request, + std::unique_ptr<content::StreamInfo> stream) +{ + const content::ResourceRequestInfo *info = content::ResourceRequestInfo::ForRequest(request); + std::map<net::URLRequest *, StreamTargetInfo>::iterator ix = stream_target_info_.find(request); + CHECK(ix != stream_target_info_.end()); + int render_frame_id = -1; + int render_process_id = -1; + if (!content::ResourceRequestInfo::GetRenderFrameForRequest(request, &render_process_id, &render_frame_id)) { + stream_target_info_.erase(request); + request->Cancel(); + return; + } + + base::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI}, + base::BindOnce(&OnPdfStreamIntercepted, + request->url(), ix->second.extension_id, + info->GetFrameTreeNodeId(), info->GetWebContentsGetterForRequest() + ) + ); + stream_target_info_.erase(request); +} + +} // namespace QtWebEngineCore |