refactor: move PDF viewer to OOPIF (#41728)
https://issues.chromium.org/issues/40268279
This commit is contained in:
parent
ba3b647fd7
commit
38ef9a7690
6 changed files with 260 additions and 12 deletions
|
@ -6,10 +6,16 @@
|
|||
|
||||
#include <string>
|
||||
|
||||
#include "base/memory/weak_ptr.h"
|
||||
#include "base/numerics/safe_conversions.h"
|
||||
#include "base/strings/utf_string_conversions.h"
|
||||
#include "base/values.h"
|
||||
#include "chrome/browser/pdf/pdf_viewer_stream_manager.h"
|
||||
#include "chrome/common/extensions/api/pdf_viewer_private.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "components/pdf/common/constants.h"
|
||||
#include "components/prefs/pref_service.h"
|
||||
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
|
||||
#include "shell/browser/electron_browser_context.h"
|
||||
#include "url/url_constants.h"
|
||||
|
||||
|
@ -22,6 +28,11 @@ namespace IsAllowedLocalFileAccess =
|
|||
|
||||
namespace SetPdfOcrPref = api::pdf_viewer_private::SetPdfOcrPref;
|
||||
|
||||
namespace SetPdfPluginAttributes =
|
||||
api::pdf_viewer_private::SetPdfPluginAttributes;
|
||||
|
||||
namespace SetPdfDocumentTitle = api::pdf_viewer_private::SetPdfDocumentTitle;
|
||||
|
||||
// Check if the current URL is allowed based on a list of allowlisted domains.
|
||||
bool IsUrlAllowedToEmbedLocalFiles(
|
||||
const GURL& current_url,
|
||||
|
@ -43,8 +54,46 @@ bool IsUrlAllowedToEmbedLocalFiles(
|
|||
return false;
|
||||
}
|
||||
|
||||
// Get the `StreamContainer` associated with the `extension_host`.
|
||||
base::WeakPtr<StreamContainer> GetStreamContainer(
|
||||
content::RenderFrameHost* extension_host) {
|
||||
content::RenderFrameHost* embedder_host = extension_host->GetParent();
|
||||
if (!embedder_host) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto* pdf_viewer_stream_manager =
|
||||
pdf::PdfViewerStreamManager::FromRenderFrameHost(embedder_host);
|
||||
if (!pdf_viewer_stream_manager) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return pdf_viewer_stream_manager->GetStreamContainer(embedder_host);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
PdfViewerPrivateGetStreamInfoFunction::PdfViewerPrivateGetStreamInfoFunction() =
|
||||
default;
|
||||
|
||||
PdfViewerPrivateGetStreamInfoFunction::
|
||||
~PdfViewerPrivateGetStreamInfoFunction() = default;
|
||||
|
||||
ExtensionFunction::ResponseAction PdfViewerPrivateGetStreamInfoFunction::Run() {
|
||||
base::WeakPtr<StreamContainer> stream =
|
||||
GetStreamContainer(render_frame_host());
|
||||
if (!stream) {
|
||||
return RespondNow(Error("Failed to get StreamContainer"));
|
||||
}
|
||||
|
||||
api::pdf_viewer_private::StreamInfo stream_info;
|
||||
stream_info.original_url = stream->original_url().spec();
|
||||
stream_info.stream_url = stream->stream_url().spec();
|
||||
stream_info.tab_id = stream->tab_id();
|
||||
stream_info.embedded = stream->embedded();
|
||||
return RespondNow(WithArguments(stream_info.ToValue()));
|
||||
}
|
||||
|
||||
PdfViewerPrivateIsAllowedLocalFileAccessFunction::
|
||||
PdfViewerPrivateIsAllowedLocalFileAccessFunction() = default;
|
||||
|
||||
|
@ -61,6 +110,37 @@ PdfViewerPrivateIsAllowedLocalFileAccessFunction::Run() {
|
|||
IsUrlAllowedToEmbedLocalFiles(GURL(params->url), base::Value::List())));
|
||||
}
|
||||
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction::
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction() = default;
|
||||
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction::
|
||||
~PdfViewerPrivateSetPdfDocumentTitleFunction() = default;
|
||||
|
||||
// This function is only called for full-page PDFs.
|
||||
ExtensionFunction::ResponseAction
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction::Run() {
|
||||
content::WebContents* web_contents = GetSenderWebContents();
|
||||
if (!web_contents) {
|
||||
return RespondNow(Error("Could not find a valid web contents."));
|
||||
}
|
||||
|
||||
// Title should only be set for full-page PDFs.
|
||||
// MIME type associated with sender `WebContents` must be `application/pdf`
|
||||
// for a full-page PDF.
|
||||
EXTENSION_FUNCTION_VALIDATE(web_contents->GetContentsMimeType() ==
|
||||
pdf::kPDFMimeType);
|
||||
|
||||
std::optional<SetPdfDocumentTitle::Params> params =
|
||||
SetPdfDocumentTitle::Params::Create(args());
|
||||
EXTENSION_FUNCTION_VALIDATE(params);
|
||||
|
||||
web_contents->UpdateTitleForEntry(
|
||||
web_contents->GetController().GetLastCommittedEntry(),
|
||||
base::UTF8ToUTF16(params->title));
|
||||
|
||||
return RespondNow(NoArguments());
|
||||
}
|
||||
|
||||
PdfViewerPrivateIsPdfOcrAlwaysActiveFunction::
|
||||
PdfViewerPrivateIsPdfOcrAlwaysActiveFunction() = default;
|
||||
|
||||
|
@ -87,4 +167,42 @@ ExtensionFunction::ResponseAction PdfViewerPrivateSetPdfOcrPrefFunction::Run() {
|
|||
return RespondNow(WithArguments(false));
|
||||
}
|
||||
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction::
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction() = default;
|
||||
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction::
|
||||
~PdfViewerPrivateSetPdfPluginAttributesFunction() = default;
|
||||
|
||||
ExtensionFunction::ResponseAction
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction::Run() {
|
||||
std::optional<SetPdfPluginAttributes::Params> params =
|
||||
SetPdfPluginAttributes::Params::Create(args());
|
||||
EXTENSION_FUNCTION_VALIDATE(params);
|
||||
|
||||
base::WeakPtr<StreamContainer> stream =
|
||||
GetStreamContainer(render_frame_host());
|
||||
if (!stream) {
|
||||
return RespondNow(Error("Failed to get StreamContainer"));
|
||||
}
|
||||
|
||||
const api::pdf_viewer_private::PdfPluginAttributes& attributes =
|
||||
params->attributes;
|
||||
// Check the `background_color` is an integer.
|
||||
double whole = 0.0;
|
||||
if (std::modf(attributes.background_color, &whole) != 0.0) {
|
||||
return RespondNow(Error("Background color is not an integer"));
|
||||
}
|
||||
|
||||
// Check the `background_color` is within the range of a uint32_t.
|
||||
if (!base::IsValueInRangeForNumericType<uint32_t>(
|
||||
attributes.background_color)) {
|
||||
return RespondNow(Error("Background color out of bounds"));
|
||||
}
|
||||
|
||||
stream->set_pdf_plugin_attributes(mime_handler::PdfPluginAttributes::New(
|
||||
/*background_color=*/attributes.background_color,
|
||||
/*allow_javascript=*/attributes.allow_javascript));
|
||||
return RespondNow(NoArguments());
|
||||
}
|
||||
|
||||
} // namespace extensions
|
||||
|
|
|
@ -9,6 +9,24 @@
|
|||
|
||||
namespace extensions {
|
||||
|
||||
class PdfViewerPrivateGetStreamInfoFunction : public ExtensionFunction {
|
||||
public:
|
||||
DECLARE_EXTENSION_FUNCTION("pdfViewerPrivate.getStreamInfo",
|
||||
PDFVIEWERPRIVATE_GETSTREAMINFO)
|
||||
|
||||
PdfViewerPrivateGetStreamInfoFunction();
|
||||
PdfViewerPrivateGetStreamInfoFunction(
|
||||
const PdfViewerPrivateGetStreamInfoFunction&) = delete;
|
||||
PdfViewerPrivateGetStreamInfoFunction& operator=(
|
||||
const PdfViewerPrivateGetStreamInfoFunction&) = delete;
|
||||
|
||||
protected:
|
||||
~PdfViewerPrivateGetStreamInfoFunction() override;
|
||||
|
||||
// Override from ExtensionFunction:
|
||||
ResponseAction Run() override;
|
||||
};
|
||||
|
||||
class PdfViewerPrivateIsAllowedLocalFileAccessFunction
|
||||
: public ExtensionFunction {
|
||||
public:
|
||||
|
@ -28,6 +46,24 @@ class PdfViewerPrivateIsAllowedLocalFileAccessFunction
|
|||
ResponseAction Run() override;
|
||||
};
|
||||
|
||||
class PdfViewerPrivateSetPdfDocumentTitleFunction : public ExtensionFunction {
|
||||
public:
|
||||
DECLARE_EXTENSION_FUNCTION("pdfViewerPrivate.setPdfDocumentTitle",
|
||||
PDFVIEWERPRIVATE_SETPDFDOCUMENTTITLE)
|
||||
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction();
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction(
|
||||
const PdfViewerPrivateSetPdfDocumentTitleFunction&) = delete;
|
||||
PdfViewerPrivateSetPdfDocumentTitleFunction& operator=(
|
||||
const PdfViewerPrivateSetPdfDocumentTitleFunction&) = delete;
|
||||
|
||||
protected:
|
||||
~PdfViewerPrivateSetPdfDocumentTitleFunction() override;
|
||||
|
||||
// Override from ExtensionFunction:
|
||||
ResponseAction Run() override;
|
||||
};
|
||||
|
||||
class PdfViewerPrivateIsPdfOcrAlwaysActiveFunction : public ExtensionFunction {
|
||||
public:
|
||||
DECLARE_EXTENSION_FUNCTION("pdfViewerPrivate.isPdfOcrAlwaysActive",
|
||||
|
@ -64,6 +100,25 @@ class PdfViewerPrivateSetPdfOcrPrefFunction : public ExtensionFunction {
|
|||
ResponseAction Run() override;
|
||||
};
|
||||
|
||||
class PdfViewerPrivateSetPdfPluginAttributesFunction
|
||||
: public ExtensionFunction {
|
||||
public:
|
||||
DECLARE_EXTENSION_FUNCTION("pdfViewerPrivate.setPdfPluginAttributes",
|
||||
PDFVIEWERPRIVATE_SETPDFPLUGINATTRIBUTES)
|
||||
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction();
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction(
|
||||
const PdfViewerPrivateSetPdfPluginAttributesFunction&) = delete;
|
||||
PdfViewerPrivateSetPdfPluginAttributesFunction& operator=(
|
||||
const PdfViewerPrivateSetPdfPluginAttributesFunction&) = delete;
|
||||
|
||||
protected:
|
||||
~PdfViewerPrivateSetPdfPluginAttributesFunction() override;
|
||||
|
||||
// Override from ExtensionFunction:
|
||||
ResponseAction Run() override;
|
||||
};
|
||||
|
||||
} // namespace extensions
|
||||
|
||||
#endif // ELECTRON_SHELL_BROWSER_EXTENSIONS_API_PDF_VIEWER_PRIVATE_PDF_VIEWER_PRIVATE_API_H_
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue