From 2e2a0f4a85b6edd89568297c42096a1c90deaa4a Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Wed, 26 Jun 2024 18:10:24 +0100 Subject: [PATCH 01/13] :sparkles: Add check for home page warm up --- .../Media/AboveTheFold/WarmUp/Controller.php | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php index 8493cc1eac..fc69ea0386 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php @@ -75,7 +75,7 @@ public function warm_up_home(): void { return; } - $this->send_to_saas( home_url() ); + $this->send_to_saas( home_url(), true ); $this->queue->add_job_warmup(); } @@ -203,13 +203,14 @@ function ( $link ) use ( $home_url, $reject_uri_pattern ) { * Send link to SaaS to do the warmup. * * @param string $url Url to send. + * @param bool $is_warm_up set to false by default, should be true if request is warm up. * * @return void */ - public function send_to_saas( string $url ) { + public function send_to_saas( string $url, bool $is_warm_up = false ) { $this->api_client->add_to_atf_queue( $url ); - if ( $this->is_mobile() ) { + if ( $this->is_mobile( $is_warm_up ) ) { $this->api_client->add_to_atf_queue( $url, 'mobile' ); } } @@ -237,9 +238,15 @@ public function add_wpr_imagedimensions_query_arg( string $url ): string { /** * Check if the current request is for mobile. * + * @param bool $is_warm_up if check is for warm up or not. + * * @return bool */ - private function is_mobile(): bool { + private function is_mobile( bool $is_warm_up = false ): bool { + if ( $is_warm_up ) { + return true; + } + return $this->options->get( 'cache_mobile', 0 ) && $this->options->get( 'do_caching_mobile_files', 0 ); } } From f39d61befc31b80f8bc24be32916081e26fc52a0 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 27 Jun 2024 08:54:54 +0100 Subject: [PATCH 02/13] :closes: Change the approach to check for mobile during warm up after installation --#6697 --- .../Media/AboveTheFold/WarmUp/Controller.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php index fc69ea0386..307b9fb244 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php @@ -203,14 +203,13 @@ function ( $link ) use ( $home_url, $reject_uri_pattern ) { * Send link to SaaS to do the warmup. * * @param string $url Url to send. - * @param bool $is_warm_up set to false by default, should be true if request is warm up. * * @return void */ - public function send_to_saas( string $url, bool $is_warm_up = false ) { + public function send_to_saas( string $url ) { $this->api_client->add_to_atf_queue( $url ); - if ( $this->is_mobile( $is_warm_up ) ) { + if ( $this->is_mobile() ) { $this->api_client->add_to_atf_queue( $url, 'mobile' ); } } @@ -236,14 +235,13 @@ public function add_wpr_imagedimensions_query_arg( string $url ): string { } /** - * Check if the current request is for mobile. - * - * @param bool $is_warm_up if check is for warm up or not. + * Check if the mobile cache is set. * * @return bool */ - private function is_mobile( bool $is_warm_up = false ): bool { - if ( $is_warm_up ) { + private function is_mobile(): bool { + $plugin_version = (string) get_rocket_option( 'version', '' ); + if ( ! $plugin_version ) { # We are warming up a fresh installation. Options are not set yet. return true; } From d3616ce770b3eec1fe2e2fc33e8d800e91a2ecc4 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 27 Jun 2024 09:02:12 +0100 Subject: [PATCH 03/13] Fixed lint --- inc/Engine/Media/AboveTheFold/WarmUp/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php index 307b9fb244..9de5deb751 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php @@ -241,7 +241,7 @@ public function add_wpr_imagedimensions_query_arg( string $url ): string { */ private function is_mobile(): bool { $plugin_version = (string) get_rocket_option( 'version', '' ); - if ( ! $plugin_version ) { # We are warming up a fresh installation. Options are not set yet. + if ( ! $plugin_version ) { // We are warming up a fresh installation. Options are not set yet. return true; } From cee12fcc2b8ea7efbb3a2852b81741317dafe6f3 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Thu, 27 Jun 2024 12:05:33 +0100 Subject: [PATCH 04/13] Add error log, add new field to js to cpature full url with parameter --- assets/js/lcp-beacon.js | 2 ++ assets/js/lcp-beacon.min.js | 2 +- assets/js/lcp-beacon.min.js.map | 2 +- inc/Engine/Media/AboveTheFold/AJAX/Controller.php | 14 ++++++++++++++ .../Media/AboveTheFold/Frontend/Controller.php | 6 ++++++ inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php | 1 + 6 files changed, 25 insertions(+), 2 deletions(-) diff --git a/assets/js/lcp-beacon.js b/assets/js/lcp-beacon.js index eb74ebfee5..9fcbc5e029 100644 --- a/assets/js/lcp-beacon.js +++ b/assets/js/lcp-beacon.js @@ -60,6 +60,7 @@ class RocketLcpBeacon { data_check.append('rocket_lcp_nonce', this.config.nonce); data_check.append('url', this.config.url); data_check.append('is_mobile', this.config.is_mobile); + data_check.append('current_url', document.location.href); const lcp_data_response = await fetch(this.config.ajax_url, { method: "POST", @@ -306,6 +307,7 @@ class RocketLcpBeacon { data.append('is_mobile', this.config.is_mobile); data.append('images', JSON.stringify(this.performanceImages)); data.append('status', this._getFinalStatus()); + data.append('current_url', document.location.href); fetch(this.config.ajax_url, { method: "POST", diff --git a/assets/js/lcp-beacon.min.js b/assets/js/lcp-beacon.min.js index 9695b4792f..e56621fcfd 100644 --- a/assets/js/lcp-beacon.min.js +++ b/assets/js/lcp-beacon.min.js @@ -1,2 +1,2 @@ -!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a="function"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage("Bailing out because data is already available"),!1)}_isPageCached(){var e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){var e=new FormData;return e.append("action","rocket_check_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(e=await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{if("img"===e.nodeName.toLowerCase()&&"picture"===e.parentElement.nodeName.toLowerCase())return null;let t;if("picture"===e.nodeName.toLowerCase()){var i=e.querySelector("img");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""};if("img"===t&&e.srcset)i.type="img-srcset",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if("img"===t)i.type="img",i.src=e.src,i.current_src=e.currentSrc;else if("video"===t){i.type="img";var n=e.querySelector("source");i.src=e.poster||(n?n.src:""),i.current_src=i.src}else if("svg"===t)(n=e.querySelector("image"))&&(i.type="img",i.src=n.getAttribute("href")||"",i.current_src=i.src);else if("picture"===t)i.type="picture",n=e.querySelector("img"),i.src=n?n.src:"",i.sources=Array.from(e.querySelectorAll("source")).map(e=>({srcset:e.srcset||"",media:e.media||"",type:e.type||"",sizes:e.sizes||""}));else{if(0===(t=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(e=>"none"!==e)).length)return null;if(n=t[0],i.type="bg-img",n.includes("image-set(")&&(i.type="bg-img-set"),!n||""===n||n.includes("data:image"))return null;e=[...n.matchAll(/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/gi)],i.bg_set=e.map(e=>e[1]?{src:e[1].trim()+(e[2]?" "+e[2].trim():"")}:{}),i.bg_set.every(e=>""===e.src)&&(i.bg_set=e.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:"lcp"}]:(this._logMessage("No LCP candidate found."),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e="img"===t.type||"img-srcset"===t.type||"video"===t.type,i="bg-img"===t.type||"bg-img-set"===t.type||"picture"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return""!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_saveFinalResultIntoDB(){var e=new FormData;e.append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status",this._getFinalStatus()),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-lcp-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);"loading"!==document.readyState?setTimeout(()=>{e.init()},window.rocket_lcp_data.delay):document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)})}}}).run()},{}]},{},[1]); +!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(i=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",i}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a="function"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage("Bailing out because data is already available"),!1)}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("current_url",document.location.href),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),t=!this.config.is_mobile&&(e{if("img"===e.nodeName.toLowerCase()&&"picture"===e.parentElement.nodeName.toLowerCase())return null;let t;if("picture"===e.nodeName.toLowerCase()){const i=e.querySelector("img");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e);return n.map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase();const i={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""};if("img"===t&&e.srcset)i.type="img-srcset",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if("img"===t)i.type="img",i.src=e.src,i.current_src=e.currentSrc;else if("video"===t){i.type="img";var n=e.querySelector("source");i.src=e.poster||(n?n.src:""),i.current_src=i.src}else if("svg"===t){const r=e.querySelector("image");r&&(i.type="img",i.src=r.getAttribute("href")||"",i.current_src=i.src)}else if("picture"===t)i.type="picture",t=e.querySelector("img"),i.src=t?t.src:"",i.sources=Array.from(e.querySelectorAll("source")).map(e=>({srcset:e.srcset||"",media:e.media||"",type:e.type||"",sizes:e.sizes||""}));else{const s=window.getComputedStyle(e,null);if(0===(e=[s.getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(e=>"none"!==e)).length)return null;const o=e[0];if(i.type="bg-img",o.includes("image-set(")&&(i.type="bg-img-set"),!o||""===o||o.includes("data:image"))return null;const c=[...o.matchAll(/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/gi)];i.bg_set=c.map(e=>e[1]?{src:e[1].trim()+(e[2]?" "+e[2].trim():"")}:{}),i.bg_set.every(e=>""===e.src)&&(i.bg_set=c.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo)))return this._logMessage("No LCP candidate found."),void(this.performanceImages=[]);this.performanceImages=[{...e.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:t,elementInfo:e}=e;this._isDuplicateImage(t)||this.performanceImages.push({...e,label:"above-the-fold"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);if(null===t)return!1;var i="img"===t.type||"img-srcset"===t.type||"video"===t.type,e="bg-img"===t.type||"bg-img-set"===t.type||"picture"===t.type;return(i||e)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return""!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_saveFinalResultIntoDB(){const e=new FormData;e.append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status",this._getFinalStatus()),e.append("current_url",document.location.href),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){const e=document.querySelector('[data-name="wpr-lcp-beacon"]');e.setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}):setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}}}).run()},{}]},{},[1]); //# sourceMappingURL=lcp-beacon.min.js.map diff --git a/assets/js/lcp-beacon.min.js.map b/assets/js/lcp-beacon.min.js.map index 4db70f4121..837c03faf5 100644 --- a/assets/js/lcp-beacon.min.js.map +++ b/assets/js/lcp-beacon.min.js.map @@ -1 +1 @@ -{"version":3,"names":[],"mappings":"","sources":["lcp-beacon.min.js"],"sourcesContent":["!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error(\"Cannot find module '\"+t+\"'\")).code=\"MODULE_NOT_FOUND\",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode=\"script_error\",this._logMessage(\"Script Error: \"+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage(\"Bailing out because screen size is not acceptable\"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage(\"Bailing out because data is already available\"),!1)}_isPageCached(){var e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:\"\";return e&&e.includes(\"Debug: cached\")}async _isGeneratedBefore(){var e=new FormData;return e.append(\"action\",\"rocket_check_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),(e=await fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{if(\"img\"===e.nodeName.toLowerCase()&&\"picture\"===e.parentElement.nodeName.toLowerCase())return null;let t;if(\"picture\"===e.nodeName.toLowerCase()){var i=e.querySelector(\"img\");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:\"\",src:\"\",srcset:\"\",sizes:\"\",sources:[],bg_set:[],current_src:\"\"};if(\"img\"===t&&e.srcset)i.type=\"img-srcset\",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if(\"img\"===t)i.type=\"img\",i.src=e.src,i.current_src=e.currentSrc;else if(\"video\"===t){i.type=\"img\";var n=e.querySelector(\"source\");i.src=e.poster||(n?n.src:\"\"),i.current_src=i.src}else if(\"svg\"===t)(n=e.querySelector(\"image\"))&&(i.type=\"img\",i.src=n.getAttribute(\"href\")||\"\",i.current_src=i.src);else if(\"picture\"===t)i.type=\"picture\",n=e.querySelector(\"img\"),i.src=n?n.src:\"\",i.sources=Array.from(e.querySelectorAll(\"source\")).map(e=>({srcset:e.srcset||\"\",media:e.media||\"\",type:e.type||\"\",sizes:e.sizes||\"\"}));else{if(0===(t=[window.getComputedStyle(e,null).getPropertyValue(\"background-image\"),getComputedStyle(e,\":after\").getPropertyValue(\"background-image\"),getComputedStyle(e,\":before\").getPropertyValue(\"background-image\")].filter(e=>\"none\"!==e)).length)return null;if(n=t[0],i.type=\"bg-img\",n.includes(\"image-set(\")&&(i.type=\"bg-img-set\"),!n||\"\"===n||n.includes(\"data:image\"))return null;e=[...n.matchAll(/url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/gi)],i.bg_set=e.map(e=>e[1]?{src:e[1].trim()+(e[2]?\" \"+e[2].trim():\"\")}:{}),i.bg_set.every(e=>\"\"===e.src)&&(i.bg_set=e.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:\"lcp\"}]:(this._logMessage(\"No LCP candidate found.\"),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:\"above-the-fold\"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e=\"img\"===t.type||\"img-srcset\"===t.type||\"video\"===t.type,i=\"bg-img\"===t.type||\"bg-img-set\"===t.type||\"picture\"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return\"\"!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?\"timeout\":\"success\"}_saveFinalResultIntoDB(){var e=new FormData;e.append(\"action\",\"rocket_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"images\",JSON.stringify(this.performanceImages)),e.append(\"status\",this._getFinalStatus()),fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e,headers:{\"wpr-saas-no-intercept\":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name=\"wpr-lcp-beacon\"]').setAttribute(\"beacon-completed\",\"true\"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);\"loading\"!==document.readyState?setTimeout(()=>{e.init()},window.rocket_lcp_data.delay):document.addEventListener(\"DOMContentLoaded\",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)})}}}).run()},{}]},{},[1]);"],"file":"lcp-beacon.min.js"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["lcp-beacon.min.js"],"sourcesContent":["!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(i=new Error(\"Cannot find module '\"+t+\"'\")).code=\"MODULE_NOT_FOUND\",i}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode=\"script_error\",this._logMessage(\"Script Error: \"+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage(\"Bailing out because screen size is not acceptable\"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage(\"Bailing out because data is already available\"),!1)}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:\"\";return e&&e.includes(\"Debug: cached\")}async _isGeneratedBefore(){let e=new FormData;return e.append(\"action\",\"rocket_check_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"current_url\",document.location.href),(await fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),t=!this.config.is_mobile&&(e{if(\"img\"===e.nodeName.toLowerCase()&&\"picture\"===e.parentElement.nodeName.toLowerCase())return null;let t;if(\"picture\"===e.nodeName.toLowerCase()){const i=e.querySelector(\"img\");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e);return n.map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase();const i={type:\"\",src:\"\",srcset:\"\",sizes:\"\",sources:[],bg_set:[],current_src:\"\"};if(\"img\"===t&&e.srcset)i.type=\"img-srcset\",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if(\"img\"===t)i.type=\"img\",i.src=e.src,i.current_src=e.currentSrc;else if(\"video\"===t){i.type=\"img\";var n=e.querySelector(\"source\");i.src=e.poster||(n?n.src:\"\"),i.current_src=i.src}else if(\"svg\"===t){const r=e.querySelector(\"image\");r&&(i.type=\"img\",i.src=r.getAttribute(\"href\")||\"\",i.current_src=i.src)}else if(\"picture\"===t)i.type=\"picture\",t=e.querySelector(\"img\"),i.src=t?t.src:\"\",i.sources=Array.from(e.querySelectorAll(\"source\")).map(e=>({srcset:e.srcset||\"\",media:e.media||\"\",type:e.type||\"\",sizes:e.sizes||\"\"}));else{const s=window.getComputedStyle(e,null);if(0===(e=[s.getPropertyValue(\"background-image\"),getComputedStyle(e,\":after\").getPropertyValue(\"background-image\"),getComputedStyle(e,\":before\").getPropertyValue(\"background-image\")].filter(e=>\"none\"!==e)).length)return null;const o=e[0];if(i.type=\"bg-img\",o.includes(\"image-set(\")&&(i.type=\"bg-img-set\"),!o||\"\"===o||o.includes(\"data:image\"))return null;const c=[...o.matchAll(/url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/gi)];i.bg_set=c.map(e=>e[1]?{src:e[1].trim()+(e[2]?\" \"+e[2].trim():\"\")}:{}),i.bg_set.every(e=>\"\"===e.src)&&(i.bg_set=c.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo)))return this._logMessage(\"No LCP candidate found.\"),void(this.performanceImages=[]);this.performanceImages=[{...e.elementInfo,label:\"lcp\"}]}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:t,elementInfo:e}=e;this._isDuplicateImage(t)||this.performanceImages.push({...e,label:\"above-the-fold\"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);if(null===t)return!1;var i=\"img\"===t.type||\"img-srcset\"===t.type||\"video\"===t.type,e=\"bg-img\"===t.type||\"bg-img-set\"===t.type||\"picture\"===t.type;return(i||e)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return\"\"!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?\"timeout\":\"success\"}_saveFinalResultIntoDB(){const e=new FormData;e.append(\"action\",\"rocket_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"images\",JSON.stringify(this.performanceImages)),e.append(\"status\",this._getFinalStatus()),e.append(\"current_url\",document.location.href),fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e,headers:{\"wpr-saas-no-intercept\":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){const e=document.querySelector('[data-name=\"wpr-lcp-beacon\"]');e.setAttribute(\"beacon-completed\",\"true\"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}):setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}}}).run()},{}]},{},[1]);"],"file":"lcp-beacon.min.js"} \ No newline at end of file diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index 7213182d86..e7119433c6 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -54,6 +54,9 @@ public function add_lcp_data() { $lcp = 'not found'; $viewport = []; + //Testing purpose, will be removed. + $fullUrl = $_POST['current_url'] ?? ''; + error_log( $fullUrl . ' -- add lcp data for device ' . $is_mobile ); /** * Filters the maximum number of ATF images being saved into the database. * @@ -89,6 +92,9 @@ public function add_lcp_data() { $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { + error_log( + $fullUrl . ' -- already exist in db' + ); wp_send_json_error( 'item already in the database' ); return; } @@ -112,6 +118,9 @@ public function add_lcp_data() { wp_send_json_error( 'error when adding the entry to the database' ); return; } + error_log( + $fullUrl . ' -- added to db' + ); wp_send_json_success( $item ); } @@ -245,13 +254,18 @@ public function check_lcp_data() { $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; + $current_url = $_POST['current_url'] ?? ''; + $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { + error_log( 'lcp data exist for -- ' . $current_url . ' on device ' . $is_mobile ); wp_send_json_success( 'data already exists' ); return; } + error_log( 'No lcp data for -- ' . $current_url . ' on device ' . $is_mobile ); + wp_send_json_error( 'data does not exist' ); } } diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index f5bb1dece3..324bd7a0d5 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -75,7 +75,10 @@ public function lcp( $html ): string { $is_mobile = $this->is_mobile(); $row = $this->query->get_row( $url, $is_mobile ); + if ( empty( $row ) ) { + $device = $_GET['device'] ?? 'null'; + error_log('Attempt to insert beacon into '. $url . ' on ' . $device . ' device' ); return $this->inject_beacon( $html, $url, $is_mobile ); } @@ -373,6 +376,9 @@ public function inject_beacon( $html, $url, $is_mobile ): string { return $html; } + //This section is for testing purpose + error_log( 'Beacon script inserted for ' . $url . ' for device -- ' . $is_mobile ); + $default_width_threshold = $is_mobile ? 393 : 1600; $default_height_threshold = $is_mobile ? 830 : 700; /** diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php index 22814b11b6..f6fcba85d4 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php @@ -22,6 +22,7 @@ public function add_to_atf_queue( string $url, $device = 'desktop' ): array { $url = add_query_arg( [ 'wpr_imagedimensions' => 1, + 'device' => $device ], $url ); From fec274c0d76a6e15d19ad66ca22150366c24dd7e Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 14:10:37 +0200 Subject: [PATCH 05/13] refine logs on beacon injection --- inc/Engine/Media/AboveTheFold/Frontend/Controller.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index 324bd7a0d5..64c7c61f77 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -65,7 +65,9 @@ public function __construct( Options_Data $options, ATFQuery $query, Context $co * @return string */ public function lcp( $html ): string { + error_log('Entering lcp... '); if ( ! $this->context->is_allowed() ) { + error_log('Not allowed context for lcp... '); return $html; } @@ -75,13 +77,12 @@ public function lcp( $html ): string { $is_mobile = $this->is_mobile(); $row = $this->query->get_row( $url, $is_mobile ); - + error_log('Attempt to insert beacon into '. $url . ' on mobile? ' . $is_mobile . ' device' ); if ( empty( $row ) ) { - $device = $_GET['device'] ?? 'null'; - error_log('Attempt to insert beacon into '. $url . ' on ' . $device . ' device' ); + error_log('Injecting beacon into '. $url . ' on mobile?' . $is_mobile . ' device' ); return $this->inject_beacon( $html, $url, $is_mobile ); } - + error_log('Not inserting beacon into '. $url . ' on mobile? ' . $is_mobile . ' device' ); if ( ! $row->has_lcp() ) { return $html; } From ec2d8921649bbd3dbf17c8b2d7e6c6946ee4b7f6 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 14:35:42 +0200 Subject: [PATCH 06/13] Logging template_redirect events show that the visits occur before we register our callbacks. --- inc/Engine/Media/ImageDimensions/Subscriber.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 43503c2f6b..374a95363b 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -86,11 +86,16 @@ public function prepare_critical_image_saas_visit( $buffer ) { * @return void */ public function start_image_dimensions_buffer() { + global $wp; + $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); + error_log("Entering start_image_dimensions_buffer for " . $url); if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + error_log("No imagedimentions for start_image_dimensions_buffer for " . $url); return; } if ( ! $this->buffer_tests->can_process_any_buffer() ) { + error_log("Can't process buffer start_image_dimensions_buffer for " . $url); return; } From 263efa518d713ecc283f7871fc82f8b79762b766 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 14:58:54 +0200 Subject: [PATCH 07/13] Make homepage warm_up delayed to after setup --- inc/Engine/Activation/Activation.php | 3 +++ inc/Engine/Media/AboveTheFold/Activation/Activation.php | 2 +- inc/Engine/Media/ImageDimensions/Subscriber.php | 1 + inc/admin/upgrader.php | 6 ++++++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/inc/Engine/Activation/Activation.php b/inc/Engine/Activation/Activation.php index c60153ef48..f7b146b218 100644 --- a/inc/Engine/Activation/Activation.php +++ b/inc/Engine/Activation/Activation.php @@ -103,6 +103,9 @@ public static function activate_plugin() { ] ); + // Signify to rocket_upgrader that we are on a fresh activation. + set_transient('rocket_fresh_activation', true, MINUTE_IN_SECONDS); + /** * Fires after WP Rocket is activated */ diff --git a/inc/Engine/Media/AboveTheFold/Activation/Activation.php b/inc/Engine/Media/AboveTheFold/Activation/Activation.php index 5075a5be25..2577e8c6d7 100644 --- a/inc/Engine/Media/AboveTheFold/Activation/Activation.php +++ b/inc/Engine/Media/AboveTheFold/Activation/Activation.php @@ -37,7 +37,7 @@ public function __construct( Controller $controller, ContextInterface $context ) * Add actions on activation. */ public function activate() { - add_action( 'rocket_after_activation', [ $this, 'warm_up' ] ); + add_action( 'rocket_after_activation_and_setup', [ $this, 'warm_up' ] ); } /** diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 374a95363b..32e542bb0a 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -43,6 +43,7 @@ public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) * @return array */ public static function get_subscribed_events() { + error_log("Registering events for start_image_dimensions_buffer"); return [ 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], diff --git a/inc/admin/upgrader.php b/inc/admin/upgrader.php index 38070cde3c..c180b35fec 100644 --- a/inc/admin/upgrader.php +++ b/inc/admin/upgrader.php @@ -38,6 +38,12 @@ function rocket_upgrader() { update_option( WP_ROCKET_SLUG, $options ); } + // If we just completed an activation + if ( get_transient('rocket_fresh_activation') ) { + delete_transient('rocket_fresh_activation'); + do_action('rocket_after_activation_and_setup'); + } + $page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( From a2d688c47341d727c847ac837e58cf491d9ad1e7 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 15:05:05 +0200 Subject: [PATCH 08/13] Revert "Make homepage warm_up delayed to after setup" This reverts commit 263efa518d713ecc283f7871fc82f8b79762b766. --- inc/Engine/Activation/Activation.php | 3 --- inc/Engine/Media/AboveTheFold/Activation/Activation.php | 2 +- inc/Engine/Media/ImageDimensions/Subscriber.php | 1 - inc/admin/upgrader.php | 6 ------ 4 files changed, 1 insertion(+), 11 deletions(-) diff --git a/inc/Engine/Activation/Activation.php b/inc/Engine/Activation/Activation.php index f7b146b218..c60153ef48 100644 --- a/inc/Engine/Activation/Activation.php +++ b/inc/Engine/Activation/Activation.php @@ -103,9 +103,6 @@ public static function activate_plugin() { ] ); - // Signify to rocket_upgrader that we are on a fresh activation. - set_transient('rocket_fresh_activation', true, MINUTE_IN_SECONDS); - /** * Fires after WP Rocket is activated */ diff --git a/inc/Engine/Media/AboveTheFold/Activation/Activation.php b/inc/Engine/Media/AboveTheFold/Activation/Activation.php index 2577e8c6d7..5075a5be25 100644 --- a/inc/Engine/Media/AboveTheFold/Activation/Activation.php +++ b/inc/Engine/Media/AboveTheFold/Activation/Activation.php @@ -37,7 +37,7 @@ public function __construct( Controller $controller, ContextInterface $context ) * Add actions on activation. */ public function activate() { - add_action( 'rocket_after_activation_and_setup', [ $this, 'warm_up' ] ); + add_action( 'rocket_after_activation', [ $this, 'warm_up' ] ); } /** diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 32e542bb0a..374a95363b 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -43,7 +43,6 @@ public function __construct( ImageDimensions $dimensions, Tests $buffer_tests ) * @return array */ public static function get_subscribed_events() { - error_log("Registering events for start_image_dimensions_buffer"); return [ 'rocket_buffer' => [ 'specify_image_dimensions', 17 ], 'template_redirect' => [ 'start_image_dimensions_buffer', 3 ], diff --git a/inc/admin/upgrader.php b/inc/admin/upgrader.php index c180b35fec..38070cde3c 100644 --- a/inc/admin/upgrader.php +++ b/inc/admin/upgrader.php @@ -38,12 +38,6 @@ function rocket_upgrader() { update_option( WP_ROCKET_SLUG, $options ); } - // If we just completed an activation - if ( get_transient('rocket_fresh_activation') ) { - delete_transient('rocket_fresh_activation'); - do_action('rocket_after_activation_and_setup'); - } - $page = isset( $_GET['page'] ) ? sanitize_key( $_GET['page'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( From 73223dd2d3b4c1ddb2b5953e7b098a0c864942f7 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 15:05:12 +0200 Subject: [PATCH 09/13] Revert "Logging template_redirect events show that the visits occur before we register our callbacks." This reverts commit ec2d8921649bbd3dbf17c8b2d7e6c6946ee4b7f6. --- inc/Engine/Media/ImageDimensions/Subscriber.php | 5 ----- 1 file changed, 5 deletions(-) diff --git a/inc/Engine/Media/ImageDimensions/Subscriber.php b/inc/Engine/Media/ImageDimensions/Subscriber.php index 374a95363b..43503c2f6b 100755 --- a/inc/Engine/Media/ImageDimensions/Subscriber.php +++ b/inc/Engine/Media/ImageDimensions/Subscriber.php @@ -86,16 +86,11 @@ public function prepare_critical_image_saas_visit( $buffer ) { * @return void */ public function start_image_dimensions_buffer() { - global $wp; - $url = untrailingslashit( home_url( add_query_arg( [], $wp->request ) ) ); - error_log("Entering start_image_dimensions_buffer for " . $url); if ( empty( $_GET['wpr_imagedimensions'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended - error_log("No imagedimentions for start_image_dimensions_buffer for " . $url); return; } if ( ! $this->buffer_tests->can_process_any_buffer() ) { - error_log("Can't process buffer start_image_dimensions_buffer for " . $url); return; } From dd2297a5dfdf702f9773a8ad5660c939f93b5b6b Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 15:05:16 +0200 Subject: [PATCH 10/13] Revert "refine logs on beacon injection" This reverts commit fec274c0d76a6e15d19ad66ca22150366c24dd7e. --- inc/Engine/Media/AboveTheFold/Frontend/Controller.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index 64c7c61f77..324bd7a0d5 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -65,9 +65,7 @@ public function __construct( Options_Data $options, ATFQuery $query, Context $co * @return string */ public function lcp( $html ): string { - error_log('Entering lcp... '); if ( ! $this->context->is_allowed() ) { - error_log('Not allowed context for lcp... '); return $html; } @@ -77,12 +75,13 @@ public function lcp( $html ): string { $is_mobile = $this->is_mobile(); $row = $this->query->get_row( $url, $is_mobile ); - error_log('Attempt to insert beacon into '. $url . ' on mobile? ' . $is_mobile . ' device' ); + if ( empty( $row ) ) { - error_log('Injecting beacon into '. $url . ' on mobile?' . $is_mobile . ' device' ); + $device = $_GET['device'] ?? 'null'; + error_log('Attempt to insert beacon into '. $url . ' on ' . $device . ' device' ); return $this->inject_beacon( $html, $url, $is_mobile ); } - error_log('Not inserting beacon into '. $url . ' on mobile? ' . $is_mobile . ' device' ); + if ( ! $row->has_lcp() ) { return $html; } From e41a9826e2c195b02d80661f89e3efea002b2f00 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 15:05:31 +0200 Subject: [PATCH 11/13] Revert "Add error log, add new field to js to cpature full url with parameter" This reverts commit cee12fcc2b8ea7efbb3a2852b81741317dafe6f3. --- assets/js/lcp-beacon.js | 2 -- assets/js/lcp-beacon.min.js | 2 +- assets/js/lcp-beacon.min.js.map | 2 +- inc/Engine/Media/AboveTheFold/AJAX/Controller.php | 14 -------------- .../Media/AboveTheFold/Frontend/Controller.php | 6 ------ inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php | 1 - 6 files changed, 2 insertions(+), 25 deletions(-) diff --git a/assets/js/lcp-beacon.js b/assets/js/lcp-beacon.js index 9fcbc5e029..eb74ebfee5 100644 --- a/assets/js/lcp-beacon.js +++ b/assets/js/lcp-beacon.js @@ -60,7 +60,6 @@ class RocketLcpBeacon { data_check.append('rocket_lcp_nonce', this.config.nonce); data_check.append('url', this.config.url); data_check.append('is_mobile', this.config.is_mobile); - data_check.append('current_url', document.location.href); const lcp_data_response = await fetch(this.config.ajax_url, { method: "POST", @@ -307,7 +306,6 @@ class RocketLcpBeacon { data.append('is_mobile', this.config.is_mobile); data.append('images', JSON.stringify(this.performanceImages)); data.append('status', this._getFinalStatus()); - data.append('current_url', document.location.href); fetch(this.config.ajax_url, { method: "POST", diff --git a/assets/js/lcp-beacon.min.js b/assets/js/lcp-beacon.min.js index e56621fcfd..9695b4792f 100644 --- a/assets/js/lcp-beacon.min.js +++ b/assets/js/lcp-beacon.min.js @@ -1,2 +1,2 @@ -!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(i=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",i}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a="function"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage("Bailing out because data is already available"),!1)}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){let e=new FormData;return e.append("action","rocket_check_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("current_url",document.location.href),(await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),t=!this.config.is_mobile&&(e{if("img"===e.nodeName.toLowerCase()&&"picture"===e.parentElement.nodeName.toLowerCase())return null;let t;if("picture"===e.nodeName.toLowerCase()){const i=e.querySelector("img");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e);return n.map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase();const i={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""};if("img"===t&&e.srcset)i.type="img-srcset",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if("img"===t)i.type="img",i.src=e.src,i.current_src=e.currentSrc;else if("video"===t){i.type="img";var n=e.querySelector("source");i.src=e.poster||(n?n.src:""),i.current_src=i.src}else if("svg"===t){const r=e.querySelector("image");r&&(i.type="img",i.src=r.getAttribute("href")||"",i.current_src=i.src)}else if("picture"===t)i.type="picture",t=e.querySelector("img"),i.src=t?t.src:"",i.sources=Array.from(e.querySelectorAll("source")).map(e=>({srcset:e.srcset||"",media:e.media||"",type:e.type||"",sizes:e.sizes||""}));else{const s=window.getComputedStyle(e,null);if(0===(e=[s.getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(e=>"none"!==e)).length)return null;const o=e[0];if(i.type="bg-img",o.includes("image-set(")&&(i.type="bg-img-set"),!o||""===o||o.includes("data:image"))return null;const c=[...o.matchAll(/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/gi)];i.bg_set=c.map(e=>e[1]?{src:e[1].trim()+(e[2]?" "+e[2].trim():"")}:{}),i.bg_set.every(e=>""===e.src)&&(i.bg_set=c.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo)))return this._logMessage("No LCP candidate found."),void(this.performanceImages=[]);this.performanceImages=[{...e.elementInfo,label:"lcp"}]}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:t,elementInfo:e}=e;this._isDuplicateImage(t)||this.performanceImages.push({...e,label:"above-the-fold"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);if(null===t)return!1;var i="img"===t.type||"img-srcset"===t.type||"video"===t.type,e="bg-img"===t.type||"bg-img-set"===t.type||"picture"===t.type;return(i||e)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return""!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_saveFinalResultIntoDB(){const e=new FormData;e.append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status",this._getFinalStatus()),e.append("current_url",document.location.href),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){const e=document.querySelector('[data-name="wpr-lcp-beacon"]');e.setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);"loading"===document.readyState?document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}):setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}}}).run()},{}]},{},[1]); +!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i="function"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error("Cannot find module '"+t+"'")).code="MODULE_NOT_FOUND",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a="function"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode="script_error",this._logMessage("Script Error: "+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage("Bailing out because screen size is not acceptable"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage("Bailing out because data is already available"),!1)}_isPageCached(){var e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:"";return e&&e.includes("Debug: cached")}async _isGeneratedBefore(){var e=new FormData;return e.append("action","rocket_check_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),(e=await fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{if("img"===e.nodeName.toLowerCase()&&"picture"===e.parentElement.nodeName.toLowerCase())return null;let t;if("picture"===e.nodeName.toLowerCase()){var i=e.querySelector("img");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:"",src:"",srcset:"",sizes:"",sources:[],bg_set:[],current_src:""};if("img"===t&&e.srcset)i.type="img-srcset",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if("img"===t)i.type="img",i.src=e.src,i.current_src=e.currentSrc;else if("video"===t){i.type="img";var n=e.querySelector("source");i.src=e.poster||(n?n.src:""),i.current_src=i.src}else if("svg"===t)(n=e.querySelector("image"))&&(i.type="img",i.src=n.getAttribute("href")||"",i.current_src=i.src);else if("picture"===t)i.type="picture",n=e.querySelector("img"),i.src=n?n.src:"",i.sources=Array.from(e.querySelectorAll("source")).map(e=>({srcset:e.srcset||"",media:e.media||"",type:e.type||"",sizes:e.sizes||""}));else{if(0===(t=[window.getComputedStyle(e,null).getPropertyValue("background-image"),getComputedStyle(e,":after").getPropertyValue("background-image"),getComputedStyle(e,":before").getPropertyValue("background-image")].filter(e=>"none"!==e)).length)return null;if(n=t[0],i.type="bg-img",n.includes("image-set(")&&(i.type="bg-img-set"),!n||""===n||n.includes("data:image"))return null;e=[...n.matchAll(/url\(\s*?['"]?\s*?(.+?)\s*?["']?\s*?\)/gi)],i.bg_set=e.map(e=>e[1]?{src:e[1].trim()+(e[2]?" "+e[2].trim():"")}:{}),i.bg_set.every(e=>""===e.src)&&(i.bg_set=e.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:"lcp"}]:(this._logMessage("No LCP candidate found."),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:"above-the-fold"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e="img"===t.type||"img-srcset"===t.type||"video"===t.type,i="bg-img"===t.type||"bg-img-set"===t.type||"picture"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return""!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?"timeout":"success"}_saveFinalResultIntoDB(){var e=new FormData;e.append("action","rocket_lcp"),e.append("rocket_lcp_nonce",this.config.nonce),e.append("url",this.config.url),e.append("is_mobile",this.config.is_mobile),e.append("images",JSON.stringify(this.performanceImages)),e.append("status",this._getFinalStatus()),fetch(this.config.ajax_url,{method:"POST",credentials:"same-origin",body:e,headers:{"wpr-saas-no-intercept":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name="wpr-lcp-beacon"]').setAttribute("beacon-completed","true"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);"loading"!==document.readyState?setTimeout(()=>{e.init()},window.rocket_lcp_data.delay):document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)})}}}).run()},{}]},{},[1]); //# sourceMappingURL=lcp-beacon.min.js.map diff --git a/assets/js/lcp-beacon.min.js.map b/assets/js/lcp-beacon.min.js.map index 837c03faf5..4db70f4121 100644 --- a/assets/js/lcp-beacon.min.js.map +++ b/assets/js/lcp-beacon.min.js.map @@ -1 +1 @@ -{"version":3,"names":[],"mappings":"","sources":["lcp-beacon.min.js"],"sourcesContent":["!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(i=new Error(\"Cannot find module '\"+t+\"'\")).code=\"MODULE_NOT_FOUND\",i}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode=\"script_error\",this._logMessage(\"Script Error: \"+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage(\"Bailing out because screen size is not acceptable\"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage(\"Bailing out because data is already available\"),!1)}_isPageCached(){const e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:\"\";return e&&e.includes(\"Debug: cached\")}async _isGeneratedBefore(){let e=new FormData;return e.append(\"action\",\"rocket_check_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"current_url\",document.location.href),(await fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),t=!this.config.is_mobile&&(e{if(\"img\"===e.nodeName.toLowerCase()&&\"picture\"===e.parentElement.nodeName.toLowerCase())return null;let t;if(\"picture\"===e.nodeName.toLowerCase()){const i=e.querySelector(\"img\");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e);return n.map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase();const i={type:\"\",src:\"\",srcset:\"\",sizes:\"\",sources:[],bg_set:[],current_src:\"\"};if(\"img\"===t&&e.srcset)i.type=\"img-srcset\",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if(\"img\"===t)i.type=\"img\",i.src=e.src,i.current_src=e.currentSrc;else if(\"video\"===t){i.type=\"img\";var n=e.querySelector(\"source\");i.src=e.poster||(n?n.src:\"\"),i.current_src=i.src}else if(\"svg\"===t){const r=e.querySelector(\"image\");r&&(i.type=\"img\",i.src=r.getAttribute(\"href\")||\"\",i.current_src=i.src)}else if(\"picture\"===t)i.type=\"picture\",t=e.querySelector(\"img\"),i.src=t?t.src:\"\",i.sources=Array.from(e.querySelectorAll(\"source\")).map(e=>({srcset:e.srcset||\"\",media:e.media||\"\",type:e.type||\"\",sizes:e.sizes||\"\"}));else{const s=window.getComputedStyle(e,null);if(0===(e=[s.getPropertyValue(\"background-image\"),getComputedStyle(e,\":after\").getPropertyValue(\"background-image\"),getComputedStyle(e,\":before\").getPropertyValue(\"background-image\")].filter(e=>\"none\"!==e)).length)return null;const o=e[0];if(i.type=\"bg-img\",o.includes(\"image-set(\")&&(i.type=\"bg-img-set\"),!o||\"\"===o||o.includes(\"data:image\"))return null;const c=[...o.matchAll(/url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/gi)];i.bg_set=c.map(e=>e[1]?{src:e[1].trim()+(e[2]?\" \"+e[2].trim():\"\")}:{}),i.bg_set.every(e=>\"\"===e.src)&&(i.bg_set=c.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo)))return this._logMessage(\"No LCP candidate found.\"),void(this.performanceImages=[]);this.performanceImages=[{...e.elementInfo,label:\"lcp\"}]}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:t,elementInfo:e}=e;this._isDuplicateImage(t)||this.performanceImages.push({...e,label:\"above-the-fold\"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);if(null===t)return!1;var i=\"img\"===t.type||\"img-srcset\"===t.type||\"video\"===t.type,e=\"bg-img\"===t.type||\"bg-img-set\"===t.type||\"picture\"===t.type;return(i||e)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return\"\"!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?\"timeout\":\"success\"}_saveFinalResultIntoDB(){const e=new FormData;e.append(\"action\",\"rocket_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"images\",JSON.stringify(this.performanceImages)),e.append(\"status\",this._getFinalStatus()),e.append(\"current_url\",document.location.href),fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e,headers:{\"wpr-saas-no-intercept\":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){const e=document.querySelector('[data-name=\"wpr-lcp-beacon\"]');e.setAttribute(\"beacon-completed\",\"true\"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}):setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)}}}).run()},{}]},{},[1]);"],"file":"lcp-beacon.min.js"} \ No newline at end of file +{"version":3,"names":[],"mappings":"","sources":["lcp-beacon.min.js"],"sourcesContent":["!function n(r,s,o){function c(t,e){if(!s[t]){if(!r[t]){var i=\"function\"==typeof require&&require;if(!e&&i)return i(t,!0);if(a)return a(t,!0);throw(e=new Error(\"Cannot find module '\"+t+\"'\")).code=\"MODULE_NOT_FOUND\",e}i=s[t]={exports:{}},r[t][0].call(i.exports,function(e){return c(r[t][1][e]||e)},i,i.exports,n,r,s,o)}return s[t].exports}for(var a=\"function\"==typeof require&&require,e=0;e{this._handleInfiniteLoop()},1e4);try{var e=this._generateLcpCandidates(1/0);e&&(this._initWithFirstElementWithInfo(e),this._fillATFWithoutDuplications(e))}catch(e){this.errorCode=\"script_error\",this._logMessage(\"Script Error: \"+e)}this._saveFinalResultIntoDB()}else this._finalize()}async _isValidPreconditions(){return this._isNotValidScreensize()?(this._logMessage(\"Bailing out because screen size is not acceptable\"),!1):!this._isPageCached()||!await this._isGeneratedBefore()||(this._logMessage(\"Bailing out because data is already available\"),!1)}_isPageCached(){var e=document.documentElement.nextSibling&&document.documentElement.nextSibling.data?document.documentElement.nextSibling.data:\"\";return e&&e.includes(\"Debug: cached\")}async _isGeneratedBefore(){var e=new FormData;return e.append(\"action\",\"rocket_check_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),(e=await fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e}).then(e=>e.json())).success}_isNotValidScreensize(){var e=window.innerWidth||document.documentElement.clientWidth,t=window.innerHeight||document.documentElement.clientHeight,i=this.config.is_mobile&&(e>this.config.width_threshold||t>this.config.height_threshold),e=!this.config.is_mobile&&(e{if(\"img\"===e.nodeName.toLowerCase()&&\"picture\"===e.parentElement.nodeName.toLowerCase())return null;let t;if(\"picture\"===e.nodeName.toLowerCase()){var i=e.querySelector(\"img\");if(!i)return null;t=i.getBoundingClientRect()}else t=e.getBoundingClientRect();return{element:e,rect:t}}).filter(e=>null!==e).filter(e=>0({item:e,area:this._getElementArea(e.rect),elementInfo:this._getElementInfo(e.element)})).sort((e,t)=>t.area-e.area).slice(0,e).map(e=>({element:e.item.element,elementInfo:e.elementInfo}))}_isIntersecting(e){return 0<=e.bottom&&0<=e.right&&e.top<=(window.innerHeight||document.documentElement.clientHeight)&&e.left<=(window.innerWidth||document.documentElement.clientWidth)}_getElementArea(e){return Math.min(e.width,(window.innerWidth||document.documentElement.clientWidth)-e.left)*Math.min(e.height,(window.innerHeight||document.documentElement.clientHeight)-e.top)}_getElementInfo(e){var t=e.nodeName.toLowerCase(),i={type:\"\",src:\"\",srcset:\"\",sizes:\"\",sources:[],bg_set:[],current_src:\"\"};if(\"img\"===t&&e.srcset)i.type=\"img-srcset\",i.src=e.src,i.srcset=e.srcset,i.sizes=e.sizes,i.current_src=e.currentSrc;else if(\"img\"===t)i.type=\"img\",i.src=e.src,i.current_src=e.currentSrc;else if(\"video\"===t){i.type=\"img\";var n=e.querySelector(\"source\");i.src=e.poster||(n?n.src:\"\"),i.current_src=i.src}else if(\"svg\"===t)(n=e.querySelector(\"image\"))&&(i.type=\"img\",i.src=n.getAttribute(\"href\")||\"\",i.current_src=i.src);else if(\"picture\"===t)i.type=\"picture\",n=e.querySelector(\"img\"),i.src=n?n.src:\"\",i.sources=Array.from(e.querySelectorAll(\"source\")).map(e=>({srcset:e.srcset||\"\",media:e.media||\"\",type:e.type||\"\",sizes:e.sizes||\"\"}));else{if(0===(t=[window.getComputedStyle(e,null).getPropertyValue(\"background-image\"),getComputedStyle(e,\":after\").getPropertyValue(\"background-image\"),getComputedStyle(e,\":before\").getPropertyValue(\"background-image\")].filter(e=>\"none\"!==e)).length)return null;if(n=t[0],i.type=\"bg-img\",n.includes(\"image-set(\")&&(i.type=\"bg-img-set\"),!n||\"\"===n||n.includes(\"data:image\"))return null;e=[...n.matchAll(/url\\(\\s*?['\"]?\\s*?(.+?)\\s*?[\"']?\\s*?\\)/gi)],i.bg_set=e.map(e=>e[1]?{src:e[1].trim()+(e[2]?\" \"+e[2].trim():\"\")}:{}),i.bg_set.every(e=>\"\"===e.src)&&(i.bg_set=e.map(e=>e[1]?{src:e[1].trim()}:{})),0null!==e.elementInfo))?this.performanceImages=[{...e.elementInfo,label:\"lcp\"}]:(this._logMessage(\"No LCP candidate found.\"),this.performanceImages=[])}_fillATFWithoutDuplications(e){e.forEach(e=>{var{element:e,elementInfo:t}=e;this._isDuplicateImage(e)||this.performanceImages.push({...t,label:\"above-the-fold\"})})}_isDuplicateImage(e){const t=this._getElementInfo(e);var i;return null!==t&&(e=\"img\"===t.type||\"img-srcset\"===t.type||\"video\"===t.type,i=\"bg-img\"===t.type||\"bg-img-set\"===t.type||\"picture\"===t.type,e||i)&&this.performanceImages.some(e=>e.src===t.src)}_getFinalStatus(){return\"\"!==this.errorCode?this.errorCode:10<=(new Date-this.scriptTimer)/1e3?\"timeout\":\"success\"}_saveFinalResultIntoDB(){var e=new FormData;e.append(\"action\",\"rocket_lcp\"),e.append(\"rocket_lcp_nonce\",this.config.nonce),e.append(\"url\",this.config.url),e.append(\"is_mobile\",this.config.is_mobile),e.append(\"images\",JSON.stringify(this.performanceImages)),e.append(\"status\",this._getFinalStatus()),fetch(this.config.ajax_url,{method:\"POST\",credentials:\"same-origin\",body:e,headers:{\"wpr-saas-no-intercept\":!0}}).then(e=>e.json()).then(e=>{this._logMessage(e)}).catch(e=>{this._logMessage(e)}).finally(()=>{this._finalize()})}_handleInfiniteLoop(){this._saveFinalResultIntoDB()}_finalize(){document.querySelector('[data-name=\"wpr-lcp-beacon\"]').setAttribute(\"beacon-completed\",\"true\"),clearTimeout(this.infiniteLoopId)}_logMessage(e){this.config.debug&&console.log(e)}static run(){if(window.rocket_lcp_data){const e=new n(window.rocket_lcp_data);\"loading\"!==document.readyState?setTimeout(()=>{e.init()},window.rocket_lcp_data.delay):document.addEventListener(\"DOMContentLoaded\",()=>{setTimeout(()=>{e.init()},window.rocket_lcp_data.delay)})}}}).run()},{}]},{},[1]);"],"file":"lcp-beacon.min.js"} \ No newline at end of file diff --git a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php index e7119433c6..7213182d86 100644 --- a/inc/Engine/Media/AboveTheFold/AJAX/Controller.php +++ b/inc/Engine/Media/AboveTheFold/AJAX/Controller.php @@ -54,9 +54,6 @@ public function add_lcp_data() { $lcp = 'not found'; $viewport = []; - //Testing purpose, will be removed. - $fullUrl = $_POST['current_url'] ?? ''; - error_log( $fullUrl . ' -- add lcp data for device ' . $is_mobile ); /** * Filters the maximum number of ATF images being saved into the database. * @@ -92,9 +89,6 @@ public function add_lcp_data() { $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { - error_log( - $fullUrl . ' -- already exist in db' - ); wp_send_json_error( 'item already in the database' ); return; } @@ -118,9 +112,6 @@ public function add_lcp_data() { wp_send_json_error( 'error when adding the entry to the database' ); return; } - error_log( - $fullUrl . ' -- added to db' - ); wp_send_json_success( $item ); } @@ -254,18 +245,13 @@ public function check_lcp_data() { $url = isset( $_POST['url'] ) ? untrailingslashit( esc_url_raw( wp_unslash( $_POST['url'] ) ) ) : ''; $is_mobile = isset( $_POST['is_mobile'] ) ? filter_var( wp_unslash( $_POST['is_mobile'] ), FILTER_VALIDATE_BOOLEAN ) : false; - $current_url = $_POST['current_url'] ?? ''; - $row = $this->query->get_row( $url, $is_mobile ); if ( ! empty( $row ) ) { - error_log( 'lcp data exist for -- ' . $current_url . ' on device ' . $is_mobile ); wp_send_json_success( 'data already exists' ); return; } - error_log( 'No lcp data for -- ' . $current_url . ' on device ' . $is_mobile ); - wp_send_json_error( 'data does not exist' ); } } diff --git a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php index 324bd7a0d5..f5bb1dece3 100644 --- a/inc/Engine/Media/AboveTheFold/Frontend/Controller.php +++ b/inc/Engine/Media/AboveTheFold/Frontend/Controller.php @@ -75,10 +75,7 @@ public function lcp( $html ): string { $is_mobile = $this->is_mobile(); $row = $this->query->get_row( $url, $is_mobile ); - if ( empty( $row ) ) { - $device = $_GET['device'] ?? 'null'; - error_log('Attempt to insert beacon into '. $url . ' on ' . $device . ' device' ); return $this->inject_beacon( $html, $url, $is_mobile ); } @@ -376,9 +373,6 @@ public function inject_beacon( $html, $url, $is_mobile ): string { return $html; } - //This section is for testing purpose - error_log( 'Beacon script inserted for ' . $url . ' for device -- ' . $is_mobile ); - $default_width_threshold = $is_mobile ? 393 : 1600; $default_height_threshold = $is_mobile ? 830 : 700; /** diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php index f6fcba85d4..22814b11b6 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/APIClient.php @@ -22,7 +22,6 @@ public function add_to_atf_queue( string $url, $device = 'desktop' ): array { $url = add_query_arg( [ 'wpr_imagedimensions' => 1, - 'device' => $device ], $url ); From 7df15529f858b1da9fd3a2127f7b4b96664f99d5 Mon Sep 17 00:00:00 2001 From: Mathieu Lamiot Date: Thu, 27 Jun 2024 15:12:56 +0200 Subject: [PATCH 12/13] Fix additional argument --- inc/Engine/Media/AboveTheFold/WarmUp/Controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php index 9de5deb751..86750d4239 100644 --- a/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php +++ b/inc/Engine/Media/AboveTheFold/WarmUp/Controller.php @@ -75,7 +75,7 @@ public function warm_up_home(): void { return; } - $this->send_to_saas( home_url(), true ); + $this->send_to_saas( home_url() ); $this->queue->add_job_warmup(); } From 918f3c0fa78cf42f23795ea4f4dc194ac5faf784 Mon Sep 17 00:00:00 2001 From: Opeyemi Ibrahim Date: Fri, 28 Jun 2024 14:13:36 +0100 Subject: [PATCH 13/13] Add test for is_mobile method, --closes #6697 --- .../WarmUp/Controller/sendToSass.php | 20 ++++++ .../WarmUp/Controller/sendToSass.php | 69 +++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php create mode 100644 tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php diff --git a/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php new file mode 100644 index 0000000000..5bcc39b952 --- /dev/null +++ b/tests/Fixtures/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php @@ -0,0 +1,20 @@ + [ + 'config' => [ + 'url' => 'http://example.com', + 'device' => 'desktop', + 'get_rocket_option' => 'true' + ], + 'expected' => 'http://example.com', + ], + 'testShouldCallATFQueueTwice' => [ + 'config' => [ + 'device' => 'mobile', + 'url' => 'http://example.com', + 'get_rocket_option' => '' + ], + 'expected' => 'http://example.com/?wpr_imagedimensions=1', + ], +]; diff --git a/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php new file mode 100644 index 0000000000..3d84363cbf --- /dev/null +++ b/tests/Unit/inc/Engine/Media/AboveTheFold/WarmUp/Controller/sendToSass.php @@ -0,0 +1,69 @@ +context = Mockery::mock( ContextInterface::class ); + $this->options = Mockery::mock( Options_Data::class ); + $this->api_client = Mockery::mock( APIClient::class ); + $this->user = Mockery::mock( User::class ); + $this->queue = Mockery::mock( Queue::class ); + $this->controller = new Controller( $this->context, $this->options, $this->api_client, $this->user, $this->queue ); + } + + /** + * @dataProvider configTestData + */ + public function testShouldReturnExpected( $config, $expected ) { + $this->options->shouldReceive('get') + ->with('cache_mobile', 0) + ->andReturn(0); + + if('desktop' === $config['device']) { + Functions\expect( 'get_rocket_option' ) + ->once() + ->with( 'version', '' ) + ->andReturn( true ); + } + + $this->api_client->shouldReceive('add_to_atf_queue') + ->with('http://example.com') + ->once() + ->andReturn([$config['url'], []]); + + if('mobile' === $config['device']) { + Functions\expect( 'get_rocket_option' ) + ->once() + ->with( 'version', '' ) + ->andReturn( '' ); + + $this->api_client->shouldReceive('add_to_atf_queue') + ->with('http://example.com', $config['device']) + ->once() + ->andReturn([$config['url'], []]); + } + + $this->controller->send_to_saas($config['url']); + } +}