From f7568f634898a9be5405f718c5881a18b5399253 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Thu, 20 Jan 2022 14:16:58 +0100 Subject: [PATCH] :sparkles: Minor improvements on exporter. --- exporter/src/app/browser.cljs | 30 +++++++---- exporter/src/app/util/object.cljs | 86 +++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+), 10 deletions(-) create mode 100644 exporter/src/app/util/object.cljs diff --git a/exporter/src/app/browser.cljs b/exporter/src/app/browser.cljs index 276694939..b16ad95cf 100644 --- a/exporter/src/app/browser.cljs +++ b/exporter/src/app/browser.cljs @@ -12,9 +12,9 @@ [app.common.logging :as l] [app.common.uuid :as uuid] [app.config :as cf] + [app.util.object :as obj] [promesa.core :as p])) - (l/set-level! :trace) ;; --- BROWSER API @@ -35,7 +35,8 @@ [page {:keys [timeout cookie user-agent viewport]}] (let [timeout (or timeout default-timeout) user-agent (or user-agent default-user-agent) - viewport (d/merge default-viewport viewport)] + viewport (merge default-viewport viewport)] + (p/do! (.setViewport ^js page #js {:width (:width viewport) :height (:height viewport) @@ -63,13 +64,15 @@ (defn screenshot ([frame] (screenshot frame nil)) ([frame {:keys [full-page? omit-background? type] - :or {full-page? false - type "png" + :or {type "png" + full-page? false omit-background? false}}] - (.screenshot ^js frame #js {:fullPage full-page? - :clip nil - :type (name type) - :omitBackground omit-background?}))) + (let [options (-> (obj/new) + (obj/set! "type" (name type)) + (obj/set! "omitBackground" omit-background?) + (cond-> full-page? (-> (obj/set! "fullPage" true) + (obj/set! "clip" nil))))] + (.screenshot ^js frame options)))) (defn pdf ([page] (pdf page nil)) @@ -81,7 +84,7 @@ :height (:height viewport) :scale (:scale viewport) :printBackground true - :preferCSSPageSize false})))) + :preferCSSPageSize true})))) (defn eval! [frame f] (.evaluate ^js frame f)) @@ -100,10 +103,17 @@ (defonce pool (atom nil)) (defonce pool-browser-id (atom 1)) +(def default-chrome-args + #js ["--no-sandbox" + "--font-render-hinting=none" + "--disable-setuid-sandbox" + "--disable-accelerated-2d-canvas" + "--disable-gpu"]) + (def browser-pool-factory (letfn [(create [] (let [path (cf/get :browser-executable-path "/usr/bin/google-chrome")] - (-> (pp/launch #js {:executablePath path :args #js ["--no-sandbox" "--font-render-hinting=none"]}) + (-> (pp/launch #js {:executablePath path :args default-chrome-args}) (p/then (fn [browser] (let [id (deref pool-browser-id)] (l/info :origin "factory" :action "create" :browser-id id) diff --git a/exporter/src/app/util/object.cljs b/exporter/src/app/util/object.cljs new file mode 100644 index 000000000..35dcaeccc --- /dev/null +++ b/exporter/src/app/util/object.cljs @@ -0,0 +1,86 @@ +;; This Source Code Form is subject to the terms of the Mozilla Public +;; License, v. 2.0. If a copy of the MPL was not distributed with this +;; file, You can obtain one at http://mozilla.org/MPL/2.0/. +;; +;; Copyright (c) UXBOX Labs SL + +(ns app.util.object + "A collection of helpers for work with javascript objects." + (:refer-clojure :exclude [set! get get-in merge clone contains?]) + (:require + [cuerdas.core :as str])) + +(defn new [] #js {}) + +(defn get + ([obj k] + (when-not (nil? obj) + (unchecked-get obj k))) + ([obj k default] + (let [result (get obj k)] + (if (undefined? result) default result)))) + +(defn contains? + [obj k] + (some? (unchecked-get obj k))) + +(defn get-keys + [obj] + (js/Object.keys ^js obj)) + +(defn get-in + ([obj keys] + (get-in obj keys nil)) + + ([obj keys default] + (loop [key (first keys) + keys (rest keys) + res obj] + (if (or (nil? key) (nil? res)) + (or res default) + (recur (first keys) + (rest keys) + (unchecked-get res key)))))) + +(defn clone + [a] + (js/Object.assign #js {} a)) + +(defn merge! + ([a b] + (js/Object.assign a b)) + ([a b & more] + (reduce merge! (merge! a b) more))) + +(defn merge + ([a b] + (js/Object.assign #js {} a b)) + ([a b & more] + (reduce merge! (merge a b) more))) + +(defn set! + [obj key value] + (unchecked-set obj key value) + obj) + +(defn update! + [obj key f & args] + (let [found (get obj key ::not-found)] + (if-not (identical? ::not-found found) + (do (unchecked-set obj key (apply f found args)) + obj) + obj))) + +(defn- props-key-fn + [key] + (if (or (= key :class) (= key :class-name)) + "className" + (str/camel (name key)))) + +(defn clj->props + [props] + (clj->js props :keyword-fn props-key-fn)) + +(defn ^boolean in? + [obj prop] + (js* "~{} in ~{}" prop obj))