Changeset 2899063
- Timestamp:
- 04/14/2023 09:19:44 AM (3 years ago)
- Location:
- visual-regression-tests
- Files:
-
- 7 edited
- 41 copied
-
tags/1.2.4 (copied) (copied from visual-regression-tests/trunk)
-
tags/1.2.4/build/admin.asset.php (copied) (copied from visual-regression-tests/trunk/build/admin.asset.php)
-
tags/1.2.4/build/admin.css (copied) (copied from visual-regression-tests/trunk/build/admin.css)
-
tags/1.2.4/build/admin.js (copied) (copied from visual-regression-tests/trunk/build/admin.js)
-
tags/1.2.4/build/editor.asset.php (copied) (copied from visual-regression-tests/trunk/build/editor.asset.php)
-
tags/1.2.4/build/editor.js (copied) (copied from visual-regression-tests/trunk/build/editor.js)
-
tags/1.2.4/components/admin-header-navigation/_style.scss (copied) (copied from visual-regression-tests/trunk/components/admin-header-navigation/_style.scss)
-
tags/1.2.4/components/admin-notification/_style.scss (copied) (copied from visual-regression-tests/trunk/components/admin-notification/_style.scss)
-
tags/1.2.4/components/admin-notification/index.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/index.php)
-
tags/1.2.4/components/admin-notification/views/admin-notification-connection-failed.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/views/admin-notification-connection-failed.php)
-
tags/1.2.4/components/admin-notification/views/admin-notification-license-added.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/views/admin-notification-license-added.php)
-
tags/1.2.4/components/admin-notification/views/admin-notification-license-not-added.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/views/admin-notification-license-not-added.php)
-
tags/1.2.4/components/admin-notification/views/admin-notification-unlock-more-tests.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/views/admin-notification-unlock-more-tests.php)
-
tags/1.2.4/components/admin-notification/views/admin-notification-urls-mismatch.php (copied) (copied from visual-regression-tests/trunk/components/admin-notification/views/admin-notification-urls-mismatch.php)
-
tags/1.2.4/components/alerts-page/views/alerts-page-edit.php (copied) (copied from visual-regression-tests/trunk/components/alerts-page/views/alerts-page-edit.php)
-
tags/1.2.4/components/alerts-page/views/alerts-page-view.php (copied) (copied from visual-regression-tests/trunk/components/alerts-page/views/alerts-page-view.php)
-
tags/1.2.4/components/metabox-classic-editor (copied) (copied from visual-regression-tests/trunk/components/metabox-classic-editor)
-
tags/1.2.4/components/upgrade-page/_style.scss (copied) (copied from visual-regression-tests/trunk/components/upgrade-page/_style.scss)
-
tags/1.2.4/editor/components/metabox (copied) (copied from visual-regression-tests/trunk/editor/components/metabox)
-
tags/1.2.4/editor/components/metabox-notifications/index.js (copied) (copied from visual-regression-tests/trunk/editor/components/metabox-notifications/index.js)
-
tags/1.2.4/editor/components/metabox/index.js (modified) (7 diffs)
-
tags/1.2.4/editor/plugins/index.js (copied) (copied from visual-regression-tests/trunk/editor/plugins/index.js)
-
tags/1.2.4/includes/features/class-admin.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-admin.php)
-
tags/1.2.4/includes/features/class-alerts-page.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-alerts-page.php)
-
tags/1.2.4/includes/features/class-cron-jobs.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-cron-jobs.php)
-
tags/1.2.4/includes/features/class-email-notifications.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-email-notifications.php)
-
tags/1.2.4/includes/features/class-enqueue-scripts.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-enqueue-scripts.php)
-
tags/1.2.4/includes/features/class-install.php (modified) (3 diffs)
-
tags/1.2.4/includes/features/class-metaboxes.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-metaboxes.php)
-
tags/1.2.4/includes/features/class-service.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-service.php)
-
tags/1.2.4/includes/features/class-settings-page.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-settings-page.php)
-
tags/1.2.4/includes/features/class-subscription.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-subscription.php)
-
tags/1.2.4/includes/features/class-tests-page.php (copied) (copied from visual-regression-tests/trunk/includes/features/class-tests-page.php)
-
tags/1.2.4/includes/list-tables/class-alerts-list-table.php (copied) (copied from visual-regression-tests/trunk/includes/list-tables/class-alerts-list-table.php)
-
tags/1.2.4/includes/list-tables/class-tests-list-table.php (copied) (copied from visual-regression-tests/trunk/includes/list-tables/class-tests-list-table.php)
-
tags/1.2.4/includes/models/class-alert.php (copied) (copied from visual-regression-tests/trunk/includes/models/class-alert.php)
-
tags/1.2.4/includes/models/class-test.php (copied) (copied from visual-regression-tests/trunk/includes/models/class-test.php)
-
tags/1.2.4/includes/rest-api/class-rest-service-controller.php (copied) (copied from visual-regression-tests/trunk/includes/rest-api/class-rest-service-controller.php)
-
tags/1.2.4/includes/rest-api/class-rest-tests-controller.php (copied) (copied from visual-regression-tests/trunk/includes/rest-api/class-rest-tests-controller.php) (4 diffs)
-
tags/1.2.4/languages/visual-regression-tests.pot (copied) (copied from visual-regression-tests/trunk/languages/visual-regression-tests.pot)
-
tags/1.2.4/readme.txt (copied) (copied from visual-regression-tests/trunk/readme.txt) (2 diffs)
-
tags/1.2.4/uninstall.php (copied) (copied from visual-regression-tests/trunk/uninstall.php)
-
tags/1.2.4/visual-regression-tests.php (copied) (copied from visual-regression-tests/trunk/visual-regression-tests.php) (1 diff)
-
trunk/editor/components/metabox/index.js (modified) (7 diffs)
-
trunk/includes/features/class-install.php (modified) (3 diffs)
-
trunk/includes/rest-api/class-rest-tests-controller.php (modified) (4 diffs)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/visual-regression-tests.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
visual-regression-tests/tags/1.2.4/editor/components/metabox/index.js
r2836726 r2899063 28 28 window.vrts_editor_vars.placeholder_image_data_url; 29 29 30 const remainingTests = parseInt( window.vrts_editor_vars.remaining_tests ); 31 const totalTests = parseInt( window.vrts_editor_vars.total_tests ); 30 const [ remainingTests, setRemainingTests ] = useState( 31 parseInt( window.vrts_editor_vars.remaining_tests ) 32 ); 33 const [ totalTests, setTotalTests ] = useState( 34 parseInt( window.vrts_editor_vars.total_tests ) 35 ); 36 32 37 const upgradeUrl = window.vrts_editor_vars.upgrade_url; 33 38 const pluginUrl = window.vrts_editor_vars.plugin_url; … … 45 50 } ); 46 51 47 if ( value === true ) {48 window.vrts_editor_vars.remaining_tests--;49 } else {50 window.vrts_editor_vars.remaining_tests++;51 }52 53 52 dispatch( 'core/editor' ).editPost( { 54 53 meta: { … … 58 57 }; 59 58 59 const { isSavingPost } = select( 'core/editor' ); 60 const [ showResults, setShowResults ] = useState( runTestsValue ); 60 61 const [ isSavingProcess, setSavingProcess ] = useState( false ); 61 const { isSavingPost } = select( 'core/editor' ); 62 const updatePost = async function () { 63 const postId = select( 'core/editor' ).getCurrentPostId(); 64 const testId = await getTestId( postId ); 65 66 if ( true === runTestsIsChecked && null === testId ) { 67 window.vrts_editor_vars.is_new_test = true; 68 window.vrts_editor_vars.has_post_alert = false; 69 window.vrts_editor_vars.test_status = true; 70 } else { 71 window.vrts_editor_vars.is_new_test = false; 72 } 73 74 setTimeout( () => { 75 setRemainingAndTotalTestsFromApi(); 76 }, 2000 ); // Set a delay of 2 seconds, to be sure that the data from api is updated. 77 78 setShowResults( runTestsIsChecked ); 79 }; 80 62 81 subscribe( () => { 63 82 if ( isSavingPost() ) { … … 68 87 } ); 69 88 70 useEffect( async() => {89 useEffect( () => { 71 90 if ( isSavingProcess ) { 72 const postId = select( 'core/editor' ).getCurrentPostId(); 73 const response = await apiFetch( { 91 updatePost(); 92 } 93 }, [ isSavingProcess ] ); 94 95 const getTestId = async ( postId ) => { 96 try { 97 const responseTestId = await apiFetch( { 74 98 path: `/vrts/v1/tests/post/${ postId }`, 75 } ).catch( ( error ) => {76 console.log( error ); // eslint-disable-line no-console77 99 } ); 78 const testId = await response.test_id; 79 80 if ( true === runTestsIsChecked && null === testId ) { 81 window.vrts_editor_vars.is_new_test = true; 82 } else { 83 window.vrts_editor_vars.is_new_test = false; 84 } 85 } 86 }, [ isSavingProcess ] ); 100 const testId = await responseTestId.test_id; 101 return testId; 102 } catch ( error ) { 103 throw error; 104 } 105 }; 106 107 const setRemainingAndTotalTestsFromApi = async () => { 108 const responseRemainingTotalTests = await apiFetch( { 109 path: `/vrts/v1/tests/`, 110 } ).catch( ( error ) => { 111 throw error; 112 } ); 113 const restApiRemainingTests = 114 await responseRemainingTotalTests.remaining_tests; 115 const restApiTotalTests = await responseRemainingTotalTests.total_tests; 116 if ( restApiRemainingTests !== null ) { 117 setRemainingTests( parseInt( restApiRemainingTests ) ); 118 } 119 if ( restApiTotalTests !== null ) { 120 setTotalTests( parseInt( restApiTotalTests ) ); 121 } 122 }; 87 123 88 124 let metaboxNotification = null; 89 125 if ( true === isNewTest ) { 90 126 metaboxNotification = <NotificationNewTestAdded />; 91 } else if ( remainingTests=== 1 ) {127 } else if ( parseInt( remainingTests ) === 1 ) { 92 128 metaboxNotification = ( 93 129 <NotificationUnlockMoreTests … … 97 133 /> 98 134 ); 99 } else if ( remainingTests=== 0 ) {135 } else if ( parseInt( remainingTests ) === 0 ) { 100 136 metaboxNotification = ( 101 137 <NotificationUpgradeRequired upgradeUrl={ upgradeUrl } /> … … 129 165 checked={ runTestsIsChecked } 130 166 onChange={ runTestsOnChange } 131 disabled={ remainingTests === 0 && runTestsIsChecked === false } 167 disabled={ 168 parseInt( remainingTests ) === 0 && ! runTestsIsChecked 169 } 132 170 /> 133 171 134 172 { metaboxNotification } 135 173 136 { runTestsIsChecked&& (174 { showResults && ( 137 175 <> 138 176 <div className="testing-status-wrapper"> … … 164 202 </> 165 203 ) } 166 { runTestsIsChecked&& (204 { showResults && ( 167 205 <Screenshot 168 206 url={ targetScreenshotUrl } -
visual-regression-tests/tags/1.2.4/includes/features/class-install.php
r2829855 r2899063 18 18 register_activation_hook( vrts()->get_plugin_file(), [ $this, 'set_activation_admin_notice_transient' ] ); 19 19 add_action( 'admin_notices', [ $this, 'activation_admin_notice' ] ); 20 21 add_action( 'upgrader_process_complete', [ $this, 'on_upgrade' ], 10, 2 ); 22 add_action( 'vrts_plugin_on_upgrade', [ $this, 'install' ], 10, 2 ); 20 23 } 21 24 … … 31 34 // Direct DB query and no caching are OK to use in this case. 32 35 // @codingStandardsIgnoreStart. 33 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs");36 $blog_ids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); 34 37 // @codingStandardsIgnoreEnd. 35 38 … … 79 82 } 80 83 } 84 85 /** 86 * On upgrade. 87 * 88 * @param object $upgrader WP_Upgrader instance. 89 * @param array $options Array of bulk item update data. 90 */ 91 public function on_upgrade( $upgrader, $options ) { 92 if ( 'update' !== $options['action'] ) { 93 return; 94 } 95 96 if ( 'core' === $options['type'] ) { 97 return; 98 } 99 100 if ( 'plugin' === $options['type'] && isset( $options['plugins'] ) ) { 101 foreach ( $options['plugins'] as $plugin ) { 102 if ( plugin_basename( vrts()->get_plugin_file() ) === $plugin ) { 103 do_action( 'vrts_plugin_on_upgrade' ); 104 } 105 } 106 } 107 } 81 108 } -
visual-regression-tests/tags/1.2.4/includes/rest-api/class-rest-tests-controller.php
r2836726 r2899063 3 3 namespace Vrts\Rest_Api; 4 4 5 use Vrts\Features\Subscription; 5 6 use WP_REST_Request; 6 7 use WP_Error; … … 23 24 */ 24 25 public function register_routes() { 26 register_rest_route($this->namespace, $this->resource_name, [ 27 'methods' => WP_REST_Server::READABLE, 28 'callback' => [ $this, 'tests_remaining_total_callback' ], 29 'permission_callback' => '__return_true', 30 ]); 31 25 32 register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [ 26 33 'methods' => WP_REST_Server::READABLE, … … 31 38 32 39 /** 33 * Gets some data.40 * Gets some tests data. 34 41 * 35 42 * @param WP_REST_Request $request Current request. … … 51 58 } 52 59 } 60 61 /** 62 * Get remaining and total tests. 63 */ 64 public function tests_remaining_total_callback() { 65 66 return rest_ensure_response([ 67 'remaining_tests' => Subscription::get_remaining_tests(), 68 'total_tests' => Subscription::get_total_tests(), 69 ], 200); 70 } 53 71 } -
visual-regression-tests/tags/1.2.4/readme.txt
r2855832 r2899063 3 3 Tags: vrts, visual regression, visual, regression, tests 4 4 Requires at least: 5.0 5 Tested up to: 6. 16 Stable tag: 1.2. 35 Tested up to: 6.2 6 Stable tag: 1.2.4 7 7 Requires PHP: 7.0 8 8 License: GPLv2 or later … … 154 154 == Changelog == 155 155 156 = 1.2.4 = 157 * Fixed an issue that crashes the Gutenberg editor after upgrading to WordPress 6.2 158 * Improved metabox behaviour inside the Gutenberg editor 159 156 160 = 1.2.3 = 157 161 * Fixed tests and alerts search -
visual-regression-tests/tags/1.2.4/visual-regression-tests.php
r2855832 r2899063 4 4 * Plugin URI: https://bleech.de/en/products/visual-regression-tests/ 5 5 * Description: Test your website for unwanted visual changes. Run automatic tests and spot differences. 6 * Version: 1.2. 36 * Version: 1.2.4 7 7 * Requires at least: 5.0 8 8 * Requires PHP: 7.0 -
visual-regression-tests/trunk/editor/components/metabox/index.js
r2836726 r2899063 28 28 window.vrts_editor_vars.placeholder_image_data_url; 29 29 30 const remainingTests = parseInt( window.vrts_editor_vars.remaining_tests ); 31 const totalTests = parseInt( window.vrts_editor_vars.total_tests ); 30 const [ remainingTests, setRemainingTests ] = useState( 31 parseInt( window.vrts_editor_vars.remaining_tests ) 32 ); 33 const [ totalTests, setTotalTests ] = useState( 34 parseInt( window.vrts_editor_vars.total_tests ) 35 ); 36 32 37 const upgradeUrl = window.vrts_editor_vars.upgrade_url; 33 38 const pluginUrl = window.vrts_editor_vars.plugin_url; … … 45 50 } ); 46 51 47 if ( value === true ) {48 window.vrts_editor_vars.remaining_tests--;49 } else {50 window.vrts_editor_vars.remaining_tests++;51 }52 53 52 dispatch( 'core/editor' ).editPost( { 54 53 meta: { … … 58 57 }; 59 58 59 const { isSavingPost } = select( 'core/editor' ); 60 const [ showResults, setShowResults ] = useState( runTestsValue ); 60 61 const [ isSavingProcess, setSavingProcess ] = useState( false ); 61 const { isSavingPost } = select( 'core/editor' ); 62 const updatePost = async function () { 63 const postId = select( 'core/editor' ).getCurrentPostId(); 64 const testId = await getTestId( postId ); 65 66 if ( true === runTestsIsChecked && null === testId ) { 67 window.vrts_editor_vars.is_new_test = true; 68 window.vrts_editor_vars.has_post_alert = false; 69 window.vrts_editor_vars.test_status = true; 70 } else { 71 window.vrts_editor_vars.is_new_test = false; 72 } 73 74 setTimeout( () => { 75 setRemainingAndTotalTestsFromApi(); 76 }, 2000 ); // Set a delay of 2 seconds, to be sure that the data from api is updated. 77 78 setShowResults( runTestsIsChecked ); 79 }; 80 62 81 subscribe( () => { 63 82 if ( isSavingPost() ) { … … 68 87 } ); 69 88 70 useEffect( async() => {89 useEffect( () => { 71 90 if ( isSavingProcess ) { 72 const postId = select( 'core/editor' ).getCurrentPostId(); 73 const response = await apiFetch( { 91 updatePost(); 92 } 93 }, [ isSavingProcess ] ); 94 95 const getTestId = async ( postId ) => { 96 try { 97 const responseTestId = await apiFetch( { 74 98 path: `/vrts/v1/tests/post/${ postId }`, 75 } ).catch( ( error ) => {76 console.log( error ); // eslint-disable-line no-console77 99 } ); 78 const testId = await response.test_id; 79 80 if ( true === runTestsIsChecked && null === testId ) { 81 window.vrts_editor_vars.is_new_test = true; 82 } else { 83 window.vrts_editor_vars.is_new_test = false; 84 } 85 } 86 }, [ isSavingProcess ] ); 100 const testId = await responseTestId.test_id; 101 return testId; 102 } catch ( error ) { 103 throw error; 104 } 105 }; 106 107 const setRemainingAndTotalTestsFromApi = async () => { 108 const responseRemainingTotalTests = await apiFetch( { 109 path: `/vrts/v1/tests/`, 110 } ).catch( ( error ) => { 111 throw error; 112 } ); 113 const restApiRemainingTests = 114 await responseRemainingTotalTests.remaining_tests; 115 const restApiTotalTests = await responseRemainingTotalTests.total_tests; 116 if ( restApiRemainingTests !== null ) { 117 setRemainingTests( parseInt( restApiRemainingTests ) ); 118 } 119 if ( restApiTotalTests !== null ) { 120 setTotalTests( parseInt( restApiTotalTests ) ); 121 } 122 }; 87 123 88 124 let metaboxNotification = null; 89 125 if ( true === isNewTest ) { 90 126 metaboxNotification = <NotificationNewTestAdded />; 91 } else if ( remainingTests=== 1 ) {127 } else if ( parseInt( remainingTests ) === 1 ) { 92 128 metaboxNotification = ( 93 129 <NotificationUnlockMoreTests … … 97 133 /> 98 134 ); 99 } else if ( remainingTests=== 0 ) {135 } else if ( parseInt( remainingTests ) === 0 ) { 100 136 metaboxNotification = ( 101 137 <NotificationUpgradeRequired upgradeUrl={ upgradeUrl } /> … … 129 165 checked={ runTestsIsChecked } 130 166 onChange={ runTestsOnChange } 131 disabled={ remainingTests === 0 && runTestsIsChecked === false } 167 disabled={ 168 parseInt( remainingTests ) === 0 && ! runTestsIsChecked 169 } 132 170 /> 133 171 134 172 { metaboxNotification } 135 173 136 { runTestsIsChecked&& (174 { showResults && ( 137 175 <> 138 176 <div className="testing-status-wrapper"> … … 164 202 </> 165 203 ) } 166 { runTestsIsChecked&& (204 { showResults && ( 167 205 <Screenshot 168 206 url={ targetScreenshotUrl } -
visual-regression-tests/trunk/includes/features/class-install.php
r2829855 r2899063 18 18 register_activation_hook( vrts()->get_plugin_file(), [ $this, 'set_activation_admin_notice_transient' ] ); 19 19 add_action( 'admin_notices', [ $this, 'activation_admin_notice' ] ); 20 21 add_action( 'upgrader_process_complete', [ $this, 'on_upgrade' ], 10, 2 ); 22 add_action( 'vrts_plugin_on_upgrade', [ $this, 'install' ], 10, 2 ); 20 23 } 21 24 … … 31 34 // Direct DB query and no caching are OK to use in this case. 32 35 // @codingStandardsIgnoreStart. 33 $blog_ids = $wpdb->get_col( "SELECT blog_id FROM $wpdb->blogs");36 $blog_ids = $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs"); 34 37 // @codingStandardsIgnoreEnd. 35 38 … … 79 82 } 80 83 } 84 85 /** 86 * On upgrade. 87 * 88 * @param object $upgrader WP_Upgrader instance. 89 * @param array $options Array of bulk item update data. 90 */ 91 public function on_upgrade( $upgrader, $options ) { 92 if ( 'update' !== $options['action'] ) { 93 return; 94 } 95 96 if ( 'core' === $options['type'] ) { 97 return; 98 } 99 100 if ( 'plugin' === $options['type'] && isset( $options['plugins'] ) ) { 101 foreach ( $options['plugins'] as $plugin ) { 102 if ( plugin_basename( vrts()->get_plugin_file() ) === $plugin ) { 103 do_action( 'vrts_plugin_on_upgrade' ); 104 } 105 } 106 } 107 } 81 108 } -
visual-regression-tests/trunk/includes/rest-api/class-rest-tests-controller.php
r2836726 r2899063 3 3 namespace Vrts\Rest_Api; 4 4 5 use Vrts\Features\Subscription; 5 6 use WP_REST_Request; 6 7 use WP_Error; … … 23 24 */ 24 25 public function register_routes() { 26 register_rest_route($this->namespace, $this->resource_name, [ 27 'methods' => WP_REST_Server::READABLE, 28 'callback' => [ $this, 'tests_remaining_total_callback' ], 29 'permission_callback' => '__return_true', 30 ]); 31 25 32 register_rest_route($this->namespace, $this->resource_name . '/post/(?P<post_id>\d+)', [ 26 33 'methods' => WP_REST_Server::READABLE, … … 31 38 32 39 /** 33 * Gets some data.40 * Gets some tests data. 34 41 * 35 42 * @param WP_REST_Request $request Current request. … … 51 58 } 52 59 } 60 61 /** 62 * Get remaining and total tests. 63 */ 64 public function tests_remaining_total_callback() { 65 66 return rest_ensure_response([ 67 'remaining_tests' => Subscription::get_remaining_tests(), 68 'total_tests' => Subscription::get_total_tests(), 69 ], 200); 70 } 53 71 } -
visual-regression-tests/trunk/readme.txt
r2855832 r2899063 3 3 Tags: vrts, visual regression, visual, regression, tests 4 4 Requires at least: 5.0 5 Tested up to: 6. 16 Stable tag: 1.2. 35 Tested up to: 6.2 6 Stable tag: 1.2.4 7 7 Requires PHP: 7.0 8 8 License: GPLv2 or later … … 154 154 == Changelog == 155 155 156 = 1.2.4 = 157 * Fixed an issue that crashes the Gutenberg editor after upgrading to WordPress 6.2 158 * Improved metabox behaviour inside the Gutenberg editor 159 156 160 = 1.2.3 = 157 161 * Fixed tests and alerts search -
visual-regression-tests/trunk/visual-regression-tests.php
r2855832 r2899063 4 4 * Plugin URI: https://bleech.de/en/products/visual-regression-tests/ 5 5 * Description: Test your website for unwanted visual changes. Run automatic tests and spot differences. 6 * Version: 1.2. 36 * Version: 1.2.4 7 7 * Requires at least: 5.0 8 8 * Requires PHP: 7.0
Note: See TracChangeset
for help on using the changeset viewer.