|
|
@ -1,10 +1,22 @@ |
|
|
|
#' Capture a screenshot |
|
|
|
#' |
|
|
|
#' For the moment, the capture file is in the current working directory and named |
|
|
|
#' `screenshot.png`. This will change, soon. |
|
|
|
#' |
|
|
|
#' A `magick` image object is returned. |
|
|
|
#' |
|
|
|
#' @section Working around headless Chrome & OS security restrictions: |
|
|
|
#' Security restrictions on various operating systems and OS configurations can cause |
|
|
|
#' headless Chrome execution to fail. As a result, headless Chrome operations should |
|
|
|
#' use a special directory for `decapitated` package operations. You can pass this |
|
|
|
#' in as `work_dir`. If `work_dir` is `NULL` a `.rdecapdata` directory will be |
|
|
|
#' created in your home directory and used for the data, crash dumps and utility |
|
|
|
#' directories for Chrome operations.\cr |
|
|
|
#' \cr |
|
|
|
#' `tempdir()` does not always meet these requirements (after testing on various |
|
|
|
#' macOS 10.13 systems) as Chrome does some interesting attribute setting for |
|
|
|
#' some of its file operations. |
|
|
|
#' \cr |
|
|
|
#' If you pass in a `work_dir`, it must be one that does not violate OS security |
|
|
|
#' restrictions or headless Chrome will not function. |
|
|
|
#' |
|
|
|
#' @md |
|
|
|
#' @note The default Chrome filename is `screenshot.png` |
|
|
|
#' @param url URL to read from |
|
|
@ -18,13 +30,14 @@ |
|
|
|
#' headless Chrome cache. This seems to be necessary primarily on recent versions of macOS. |
|
|
|
#' If numeric, that number of "prime" requests will be sent ahead of the capture request. |
|
|
|
#' If `FALSE` no priming requests will be sent. |
|
|
|
#' @param work_dir See special Section. |
|
|
|
#' @param chrome_bin the path to Chrome (auto-set from `HEADLESS_CHROME` environment variable) |
|
|
|
#' @return `magick` |
|
|
|
#' @export |
|
|
|
#' @examples |
|
|
|
#' chrome_shot("https://www.r-project.org/logo/Rlogo.svg") |
|
|
|
chrome_shot <- function(url, width=NULL, height=NULL, path=NULL, overwrite=TRUE, |
|
|
|
chrome_bin=Sys.getenv("HEADLESS_CHROME")) { |
|
|
|
chrome_shot <- function(url, width=NULL, height=NULL, path=NULL, work_dir = NULL, |
|
|
|
chrome_bin=Sys.getenv("HEADLESS_CHROME")) { |
|
|
|
|
|
|
|
curwd <- getwd() |
|
|
|
on.exit(setwd(curwd), add = TRUE) |
|
|
@ -48,13 +61,15 @@ chrome_shot <- function(url, width=NULL, height=NULL, path=NULL, overwrite=TRUE, |
|
|
|
|
|
|
|
setwd(td) |
|
|
|
|
|
|
|
work_dir <- if (is.null(work_dir)) .get_app_dir() else work_dir |
|
|
|
|
|
|
|
args <- c("--headless") |
|
|
|
args <- c(args, "--disable-gpu") |
|
|
|
args <- c(args, "--no-sandbox") |
|
|
|
args <- c(args, "--allow-no-sandbox-job") |
|
|
|
args <- c(args, sprintf("--user-data-dir=%s", .get_app_dir())) |
|
|
|
args <- c(args, sprintf("--crash-dumps-dir=%s", .get_app_dir())) |
|
|
|
args <- c(args, sprintf("--utility-allowed-dir=%s", .get_app_dir())) |
|
|
|
args <- c(args, sprintf("--user-data-dir=%s", work_dir)) |
|
|
|
args <- c(args, sprintf("--crash-dumps-dir=%s", work_dir)) |
|
|
|
args <- c(args, sprintf("--utility-allowed-dir=%s", work_dir)) |
|
|
|
args <- c(args, "--screenshot", url) |
|
|
|
|
|
|
|
if (!is.null(width) & !is.null(height)) { |
|
|
@ -63,8 +78,7 @@ chrome_shot <- function(url, width=NULL, height=NULL, path=NULL, overwrite=TRUE, |
|
|
|
|
|
|
|
vers <- chrome_version(quiet=TRUE) |
|
|
|
|
|
|
|
if (is.logical(prime) & prime) .prime_url(url, 1, chrome_bin) |
|
|
|
if (is.numeric(prime) & (prime>0)) .prime_url(url, prime, chrome_bin) |
|
|
|
.prime_url(url, as.numeric(prime), work_dir, chrome_bin) |
|
|
|
|
|
|
|
processx::run( |
|
|
|
command = chrome_bin, |
|
|
|