diff --git a/CHANGELOG.md b/CHANGELOG.md index f3fa0d13d..5ee0cd960 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,23 @@ - `prevent-xhr` and `trusted-replace-xhr-response` closure bug on multiple requests [#261](https://github.com/AdguardTeam/Scriptlets/issues/261) -## Unreleased 1.7.x +## v1.7.20 + +### Added + +- `isBlocking()` method for Redirects class +- `file` field for redirect type + +### Fixed + +- Redirects types. + +## v1.7.19 ### Fixed - `prevent-addEventListener` and `log-addEventListener` loosing context when encountering already bound `.addEventListener` +- `google-ima3` conversion ## v1.7.14 diff --git a/README.md b/README.md index 403f1c1e9..a475d7503 100644 --- a/README.md +++ b/README.md @@ -427,6 +427,11 @@ const redirects = new Redirects(rawYaml) */ const redirect = redirect.getRedirect('noopjs'); +/** + * Check if redirect is blocking, e.g. click2load.html + */ +const isBlocking = redirect.isBlocking('click2load.html'); + /** * Redirect - object with following props * { diff --git a/dist/build.txt b/dist/build.txt index 72708e251..6492cbe8f 100644 --- a/dist/build.txt +++ b/dist/build.txt @@ -1 +1 @@ -version=1.7.14 \ No newline at end of file +version=1.7.20 \ No newline at end of file diff --git a/dist/redirects.json b/dist/redirects.json index 5619c0402..cc277e504 100644 --- a/dist/redirects.json +++ b/dist/redirects.json @@ -226,7 +226,10 @@ }, { "title": "google-ima3", - "aliases": [], + "aliases": [ + "ubo-google-ima.js", + "google-ima.js" + ], "isBlocking": false, "contentType": "application/javascript;base64", "content": "IWZ1bmN0aW9uKHNvdXJjZSxhcmdzKXtmdW5jdGlvbiBub29wRnVuYygpe31mdW5jdGlvbiBsb2dNZXNzYWdlKHNvdXJjZSxtZXNzYWdlKXt2YXIgZm9yY2VkPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07KGZvcmNlZHx8c291cmNlLnZlcmJvc2UpJiZjb25zb2xlLmxvZygiIi5jb25jYXQoc291cmNlLm5hbWUsIjogIikuY29uY2F0KG1lc3NhZ2UpKX1jb25zdCB1cGRhdGVkQXJncz1hcmdzP1tdLmNvbmNhdChzb3VyY2UpLmNvbmNhdChhcmdzKTpbc291cmNlXTt0cnl7KGZ1bmN0aW9uKHNvdXJjZSl7dmFyIGltYT17fSxBZERpc3BsYXlDb250YWluZXI9ZnVuY3Rpb24oKXt9O0FkRGlzcGxheUNvbnRhaW5lci5wcm90b3R5cGUuZGVzdHJveT1ub29wRnVuYyxBZERpc3BsYXlDb250YWluZXIucHJvdG90eXBlLmluaXRpYWxpemU9bm9vcEZ1bmM7dmFyIEltYVNka1NldHRpbmdzPWZ1bmN0aW9uKCl7fTtJbWFTZGtTZXR0aW5ncy5Db21wYW5pb25CYWNrZmlsbE1vZGU9e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LEltYVNka1NldHRpbmdzLlZwYWlkTW9kZT17RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn0sSW1hU2RrU2V0dGluZ3MucHJvdG90eXBlPXtjOiEwLGY6e30saTohMSxsOiIiLHA6IiIscjowLHQ6IiIsdjoiIixnZXRDb21wYW5pb25CYWNrZmlsbDpub29wRnVuYyxnZXREaXNhYmxlQ3VzdG9tUGxheWJhY2tGb3JJT1MxMFBsdXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pfSxnZXREaXNhYmxlZEZsYXNoQWRzOmZ1bmN0aW9uKCl7cmV0dXJuITB9LGdldEZlYXR1cmVGbGFnczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZ9LGdldExvY2FsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmx9LGdldE51bVJlZGlyZWN0czpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJ9LGdldFBsYXllclR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50fSxnZXRQbGF5ZXJWZXJzaW9uOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudn0sZ2V0UHBpZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB9LGdldFZwYWlkTW9kZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLkN9LGlzQ29va2llc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jfSxpc1ZwYWlkQWRhcHRlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLk19LHNldENvbXBhbmlvbkJhY2tmaWxsOm5vb3BGdW5jLHNldEF1dG9QbGF5QWRCcmVha3M6ZnVuY3Rpb24oYSl7dGhpcy5LPWF9LHNldENvb2tpZXNFbmFibGVkOmZ1bmN0aW9uKGMpe3RoaXMuYz0hIWN9LHNldERpc2FibGVDdXN0b21QbGF5YmFja0ZvcklPUzEwUGx1czpmdW5jdGlvbihpKXt0aGlzLmk9ISFpfSxzZXREaXNhYmxlRmxhc2hBZHM6bm9vcEZ1bmMsc2V0RmVhdHVyZUZsYWdzOmZ1bmN0aW9uKGYpe3RoaXMuZj0hIWZ9LHNldElzVnBhaWRBZGFwdGVyOmZ1bmN0aW9uKGEpe3RoaXMuTT1hfSxzZXRMb2NhbGU6ZnVuY3Rpb24obCl7dGhpcy5sPSEhbH0sc2V0TnVtUmVkaXJlY3RzOmZ1bmN0aW9uKHIpe3RoaXMucj0hIXJ9LHNldFBhZ2VDb3JyZWxhdG9yOmZ1bmN0aW9uKGEpe3RoaXMuUj1hfSxzZXRQbGF5ZXJUeXBlOmZ1bmN0aW9uKHQpe3RoaXMudD0hIXR9LHNldFBsYXllclZlcnNpb246ZnVuY3Rpb24odil7dGhpcy52PSEhdn0sc2V0UHBpZDpmdW5jdGlvbihwKXt0aGlzLnA9ISFwfSxzZXRWcGFpZE1vZGU6ZnVuY3Rpb24oYSl7dGhpcy5DPWF9LHNldFNlc3Npb25JZDpub29wRnVuYyxzZXRTdHJlYW1Db3JyZWxhdG9yOm5vb3BGdW5jLHNldFZwYWlkQWxsb3dlZDpub29wRnVuYyxDb21wYW5pb25CYWNrZmlsbE1vZGU6e0FMV0FZUzoiYWx3YXlzIixPTl9NQVNURVJfQUQ6Im9uX21hc3Rlcl9hZCJ9LFZwYWlkTW9kZTp7RElTQUJMRUQ6MCxFTkFCTEVEOjEsSU5TRUNVUkU6Mn19O3ZhciBFdmVudEhhbmRsZXI9ZnVuY3Rpb24oKXt0aGlzLmxpc3RlbmVycz1uZXcgTWFwLHRoaXMuX2Rpc3BhdGNoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbGlzdGVuZXJzPXRoaXMubGlzdGVuZXJzLmdldChlLnR5cGUpfHxbXSxfaT0wLF9BcnJheSRmcm9tPUFycmF5LmZyb20obGlzdGVuZXJzKTtfaTxfQXJyYXkkZnJvbS5sZW5ndGg7X2krKyl7dmFyIGxpc3RlbmVyPV9BcnJheSRmcm9tW19pXTt0cnl7bGlzdGVuZXIoZSl9Y2F0Y2gocil7bG9nTWVzc2FnZShzb3VyY2Uscil9fX0sdGhpcy5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsYyl7dGhpcy5saXN0ZW5lcnMuaGFzKHQpfHx0aGlzLmxpc3RlbmVycy5zZXQodCxuZXcgU2V0KSx0aGlzLmxpc3RlbmVycy5nZXQodCkuYWRkKGMpfSx0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxjKXt2YXIgX3RoaXMkbGlzdGVuZXJzJGdldDtudWxsPT09KF90aGlzJGxpc3RlbmVycyRnZXQ9dGhpcy5saXN0ZW5lcnMuZ2V0KHQpKXx8dm9pZCAwPT09X3RoaXMkbGlzdGVuZXJzJGdldHx8X3RoaXMkbGlzdGVuZXJzJGdldC5kZWxldGUoYyl9fSxBZHNNYW5hZ2VyPW5ldyBFdmVudEhhbmRsZXI7QWRzTWFuYWdlci52b2x1bWU9MSxBZHNNYW5hZ2VyLmNvbGxhcHNlPW5vb3BGdW5jLEFkc01hbmFnZXIuY29uZmlndXJlQWRzTWFuYWdlcj1ub29wRnVuYyxBZHNNYW5hZ2VyLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTWFuYWdlci5kaXNjYXJkQWRCcmVhaz1ub29wRnVuYyxBZHNNYW5hZ2VyLmV4cGFuZD1ub29wRnVuYyxBZHNNYW5hZ2VyLmZvY3VzPW5vb3BGdW5jLEFkc01hbmFnZXIuZ2V0QWRTa2lwcGFibGVTdGF0ZT1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLmdldEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVyblswXX0sQWRzTWFuYWdlci5nZXRDdXJyZW50QWQ9ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxBZHNNYW5hZ2VyLmdldEN1cnJlbnRBZEN1ZVBvaW50cz1mdW5jdGlvbigpe3JldHVybltdfSxBZHNNYW5hZ2VyLmdldFJlbWFpbmluZ1RpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sQWRzTWFuYWdlci5nZXRWb2x1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52b2x1bWV9LEFkc01hbmFnZXIuaW5pdD1ub29wRnVuYyxBZHNNYW5hZ2VyLmlzQ3VzdG9tQ2xpY2tUcmFja2luZ1VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sQWRzTWFuYWdlci5pc0N1c3RvbVBsYXliYWNrVXNlZD1mdW5jdGlvbigpe3JldHVybiExfSxBZHNNYW5hZ2VyLnBhdXNlPW5vb3BGdW5jLEFkc01hbmFnZXIucmVxdWVzdE5leHRBZEJyZWFrPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzaXplPW5vb3BGdW5jLEFkc01hbmFnZXIucmVzdW1lPW5vb3BGdW5jLEFkc01hbmFnZXIuc2V0Vm9sdW1lPWZ1bmN0aW9uKHYpe3RoaXMudm9sdW1lPXZ9LEFkc01hbmFnZXIuc2tpcD1ub29wRnVuYyxBZHNNYW5hZ2VyLnN0YXJ0PWZ1bmN0aW9uKCl7Zm9yKHZhciBfaTI9MCxfYXJyPVtBZEV2ZW50LlR5cGUuQUxMX0FEU19DT01QTEVURUQsQWRFdmVudC5UeXBlLkNPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRF07X2kyPF9hcnIubGVuZ3RoO19pMisrKXt2YXIgdHlwZT1fYXJyW19pMl07dHJ5e3RoaXMuX2Rpc3BhdGNoKG5ldyBpbWEuQWRFdmVudCh0eXBlKSl9Y2F0Y2goZSl7bG9nTWVzc2FnZShzb3VyY2UsZSl9fX0sQWRzTWFuYWdlci5zdG9wPW5vb3BGdW5jLEFkc01hbmFnZXIudXBkYXRlQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmM7dmFyIG1hbmFnZXI9T2JqZWN0LmNyZWF0ZShBZHNNYW5hZ2VyKSxBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ9ZnVuY3Rpb24odHlwZSxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dGhpcy50eXBlPXR5cGUsdGhpcy5hZHNSZXF1ZXN0PWFkc1JlcXVlc3QsdGhpcy51c2VyUmVxdWVzdENvbnRleHQ9dXNlclJlcXVlc3RDb250ZXh0fTtBZHNNYW5hZ2VyTG9hZGVkRXZlbnQucHJvdG90eXBlPXtnZXRBZHNNYW5hZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIG1hbmFnZXJ9LGdldFVzZXJSZXF1ZXN0Q29udGV4dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnVzZXJSZXF1ZXN0Q29udGV4dD90aGlzLnVzZXJSZXF1ZXN0Q29udGV4dDp7fX19LEFkc01hbmFnZXJMb2FkZWRFdmVudC5UeXBlPXtBRFNfTUFOQUdFUl9MT0FERUQ6ImFkc01hbmFnZXJMb2FkZWQifTt2YXIgQWRzTG9hZGVyPUV2ZW50SGFuZGxlcjtBZHNMb2FkZXIucHJvdG90eXBlLnNldHRpbmdzPW5ldyBJbWFTZGtTZXR0aW5ncyxBZHNMb2FkZXIucHJvdG90eXBlLmNvbnRlbnRDb21wbGV0ZT1ub29wRnVuYyxBZHNMb2FkZXIucHJvdG90eXBlLmRlc3Ryb3k9bm9vcEZ1bmMsQWRzTG9hZGVyLnByb3RvdHlwZS5nZXRTZXR0aW5ncz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNldHRpbmdzfSxBZHNMb2FkZXIucHJvdG90eXBlLmdldFZlcnNpb249ZnVuY3Rpb24oKXtyZXR1cm4iMy40NTMuMCJ9LEFkc0xvYWRlci5wcm90b3R5cGUucmVxdWVzdEFkcz1mdW5jdGlvbihhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCl7dmFyIF90aGlzPXRoaXM7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe3ZhciBBRFNfTUFOQUdFUl9MT0FERUQ9QWRzTWFuYWdlckxvYWRlZEV2ZW50LlR5cGUuQURTX01BTkFHRVJfTE9BREVELGV2ZW50PW5ldyBpbWEuQWRzTWFuYWdlckxvYWRlZEV2ZW50KEFEU19NQU5BR0VSX0xPQURFRCxhZHNSZXF1ZXN0LHVzZXJSZXF1ZXN0Q29udGV4dCk7X3RoaXMuX2Rpc3BhdGNoKGV2ZW50KX0pKTt2YXIgZT1uZXcgaW1hLkFkRXJyb3IoImFkUGxheUVycm9yIiwxMjA1LDEyMDUsIlRoZSBicm93c2VyIHByZXZlbnRlZCBwbGF5YmFjayBpbml0aWF0ZWQgd2l0aG91dCB1c2VyIGludGVyYWN0aW9uLiIsYWRzUmVxdWVzdCx1c2VyUmVxdWVzdENvbnRleHQpO3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtfdGhpcy5fZGlzcGF0Y2gobmV3IGltYS5BZEVycm9yRXZlbnQoZSkpfSkpfTt2YXIgQWRzUmVuZGVyaW5nU2V0dGluZ3M9bm9vcEZ1bmMsQWRzUmVxdWVzdD1mdW5jdGlvbigpe307QWRzUmVxdWVzdC5wcm90b3R5cGU9e3NldEFkV2lsbEF1dG9QbGF5Om5vb3BGdW5jLHNldEFkV2lsbFBsYXlNdXRlZDpub29wRnVuYyxzZXRDb250aW51b3VzUGxheWJhY2s6bm9vcEZ1bmN9O3ZhciBBZFBvZEluZm89ZnVuY3Rpb24oKXt9O0FkUG9kSW5mby5wcm90b3R5cGU9e2dldEFkUG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0SXNCdW1wZXI6ZnVuY3Rpb24oKXtyZXR1cm4hMX0sZ2V0TWF4RHVyYXRpb246ZnVuY3Rpb24oKXtyZXR1cm4tMX0sZ2V0UG9kSW5kZXg6ZnVuY3Rpb24oKXtyZXR1cm4gMX0sZ2V0VGltZU9mZnNldDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUb3RhbEFkczpmdW5jdGlvbigpe3JldHVybiAxfX07dmFyIEFkPWZ1bmN0aW9uKCl7fTtBZC5wcm90b3R5cGU9e3BpOm5ldyBBZFBvZEluZm8sZ2V0QWRJZDpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZFBvZEluZm86ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waX0sZ2V0QWRTeXN0ZW06ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QWR2ZXJ0aXNlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0QXBpRnJhbWV3b3JrOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldENvbXBhbmlvbkFkczpmdW5jdGlvbigpe3JldHVybltdfSxnZXRDb250ZW50VHlwZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRDcmVhdGl2ZUFkSWQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0RGVhbElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldERlc2NyaXB0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIDguNX0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldE1lZGlhVXJsOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9LGdldE1pblN1Z2dlc3RlZER1cmF0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuLTJ9LGdldFNraXBUaW1lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuLTF9LGdldFN1cnZleVVybDpmdW5jdGlvbigpe3JldHVybiBudWxsfSxnZXRUaXRsZTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRUcmFmZmlja2luZ1BhcmFtZXRlcnNTdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0VWlFbGVtZW50czpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFVuaXZlcnNhbEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiJ1bmtub3duIn0sZ2V0VW5pdmVyc2FsQWRJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRVbml2ZXJzYWxBZElkVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4idW5rbm93biJ9LGdldFZhc3RNZWRpYUJpdHJhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sZ2V0VmFzdE1lZGlhSGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFZhc3RNZWRpYVdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFdyYXBwZXJBZElkczpmdW5jdGlvbigpe3JldHVyblsiIl19LGdldFdyYXBwZXJBZFN5c3RlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxnZXRXcmFwcGVyQ3JlYXRpdmVJZHM6ZnVuY3Rpb24oKXtyZXR1cm5bIiJdfSxpc0xpbmVhcjpmdW5jdGlvbigpe3JldHVybiEwfSxpc1NraXBwYWJsZTpmdW5jdGlvbigpe3JldHVybiEwfX07dmFyIENvbXBhbmlvbkFkPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZC5wcm90b3R5cGU9e2dldEFkU2xvdElkOmZ1bmN0aW9uKCl7cmV0dXJuIiJ9LGdldENvbnRlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0Q29udGVudFR5cGU6ZnVuY3Rpb24oKXtyZXR1cm4iIn0sZ2V0SGVpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIDF9LGdldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDF9fTt2YXIgQWRFcnJvcj1mdW5jdGlvbih0eXBlLGNvZGUsdmFzdCxtZXNzYWdlLGFkc1JlcXVlc3QsdXNlclJlcXVlc3RDb250ZXh0KXt0aGlzLmVycm9yQ29kZT1jb2RlLHRoaXMubWVzc2FnZT1tZXNzYWdlLHRoaXMudHlwZT10eXBlLHRoaXMuYWRzUmVxdWVzdD1hZHNSZXF1ZXN0LHRoaXMudXNlclJlcXVlc3RDb250ZXh0PXVzZXJSZXF1ZXN0Q29udGV4dCx0aGlzLmdldEVycm9yQ29kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVycm9yQ29kZX0sdGhpcy5nZXRJbm5lckVycm9yPWZ1bmN0aW9uKCl7fSx0aGlzLmdldE1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tZXNzYWdlfSx0aGlzLmdldFR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50eXBlfSx0aGlzLmdldFZhc3RFcnJvckNvZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YXN0RXJyb3JDb2RlfSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIkFkRXJyb3IgIi5jb25jYXQodGhpcy5lcnJvckNvZGUsIjogIikuY29uY2F0KHRoaXMubWVzc2FnZSl9fTtBZEVycm9yLkVycm9yQ29kZT17fSxBZEVycm9yLlR5cGU9e307dmFyIGN1cnJlbnRBZD1mdW5jdGlvbigpe3RyeXtmb3IodmFyIF9pMz0wLF9PYmplY3QkdmFsdWVzPU9iamVjdC52YWx1ZXMod2luZG93LnZpZGlibGUuX2dldENvbnRleHRzKCkpO19pMzxfT2JqZWN0JHZhbHVlcy5sZW5ndGg7X2kzKyspe3ZhciBfY3R4JGdldFBsYXllcixfY3R4JGdldFBsYXllciRkaXY7aWYobnVsbCE9PShfY3R4JGdldFBsYXllcj1fT2JqZWN0JHZhbHVlc1tfaTNdLmdldFBsYXllcigpKSYmdm9pZCAwIT09X2N0eCRnZXRQbGF5ZXImJm51bGwhPT0oX2N0eCRnZXRQbGF5ZXIkZGl2PV9jdHgkZ2V0UGxheWVyLmRpdikmJnZvaWQgMCE9PV9jdHgkZ2V0UGxheWVyJGRpdiYmX2N0eCRnZXRQbGF5ZXIkZGl2LmlubmVySFRNTC5pbmNsdWRlcygid3d3LmVuZ2FkZ2V0LmNvbSIpKXJldHVybiEwfX1jYXRjaChlKXt9cmV0dXJuITF9KCk/dm9pZCAwOm5ldyBBZCxBZEV2ZW50PWZ1bmN0aW9uKHR5cGUpe3RoaXMudHlwZT10eXBlfTtBZEV2ZW50LnByb3RvdHlwZT17Z2V0QWQ6ZnVuY3Rpb24oKXtyZXR1cm4gY3VycmVudEFkfSxnZXRBZERhdGE6ZnVuY3Rpb24oKXt9fSxBZEV2ZW50LlR5cGU9e0FEX0JSRUFLX1JFQURZOiJhZEJyZWFrUmVhZHkiLEFEX0JVRkZFUklORzoiYWRCdWZmZXJpbmciLEFEX0NBTl9QTEFZOiJhZENhblBsYXkiLEFEX01FVEFEQVRBOiJhZE1ldGFkYXRhIixBRF9QUk9HUkVTUzoiYWRQcm9ncmVzcyIsQUxMX0FEU19DT01QTEVURUQ6ImFsbEFkc0NvbXBsZXRlZCIsQ0xJQ0s6ImNsaWNrIixDT01QTEVURToiY29tcGxldGUiLENPTlRFTlRfUEFVU0VfUkVRVUVTVEVEOiJjb250ZW50UGF1c2VSZXF1ZXN0ZWQiLENPTlRFTlRfUkVTVU1FX1JFUVVFU1RFRDoiY29udGVudFJlc3VtZVJlcXVlc3RlZCIsRFVSQVRJT05fQ0hBTkdFOiJkdXJhdGlvbkNoYW5nZSIsRVhQQU5ERURfQ0hBTkdFRDoiZXhwYW5kZWRDaGFuZ2VkIixGSVJTVF9RVUFSVElMRToiZmlyc3RRdWFydGlsZSIsSU1QUkVTU0lPTjoiaW1wcmVzc2lvbiIsSU5URVJBQ1RJT046ImludGVyYWN0aW9uIixMSU5FQVJfQ0hBTkdFOiJsaW5lYXJDaGFuZ2UiLExJTkVBUl9DSEFOR0VEOiJsaW5lYXJDaGFuZ2VkIixMT0FERUQ6ImxvYWRlZCIsTE9HOiJsb2ciLE1JRFBPSU5UOiJtaWRwb2ludCIsUEFVU0VEOiJwYXVzZSIsUkVTVU1FRDoicmVzdW1lIixTS0lQUEFCTEVfU1RBVEVfQ0hBTkdFRDoic2tpcHBhYmxlU3RhdGVDaGFuZ2VkIixTS0lQUEVEOiJza2lwIixTVEFSVEVEOiJzdGFydCIsVEhJUkRfUVVBUlRJTEU6InRoaXJkUXVhcnRpbGUiLFVTRVJfQ0xPU0U6InVzZXJDbG9zZSIsVklERU9fQ0xJQ0tFRDoidmlkZW9DbGlja2VkIixWSURFT19JQ09OX0NMSUNLRUQ6InZpZGVvSWNvbkNsaWNrZWQiLFZJRVdBQkxFX0lNUFJFU1NJT046InZpZXdhYmxlX2ltcHJlc3Npb24iLFZPTFVNRV9DSEFOR0VEOiJ2b2x1bWVDaGFuZ2UiLFZPTFVNRV9NVVRFRDoibXV0ZSJ9O3ZhciBBZEVycm9yRXZlbnQ9ZnVuY3Rpb24oZXJyb3Ipe3RoaXMuZXJyb3I9ZXJyb3IsdGhpcy50eXBlPSJhZEVycm9yIix0aGlzLmdldEVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3J9LHRoaXMuZ2V0VXNlclJlcXVlc3RDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIF90aGlzJGVycm9yO3JldHVybiBudWxsIT09KF90aGlzJGVycm9yPXRoaXMuZXJyb3IpJiZ2b2lkIDAhPT1fdGhpcyRlcnJvciYmX3RoaXMkZXJyb3IudXNlclJlcXVlc3RDb250ZXh0P3RoaXMuZXJyb3IudXNlclJlcXVlc3RDb250ZXh0Ont9fX07QWRFcnJvckV2ZW50LlR5cGU9e0FEX0VSUk9SOiJhZEVycm9yIn07dmFyIEN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudD1mdW5jdGlvbigpe307Q3VzdG9tQ29udGVudExvYWRlZEV2ZW50LlR5cGU9e0NVU1RPTV9DT05URU5UX0xPQURFRDoiZGVwcmVjYXRlZC1ldmVudCJ9O3ZhciBDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzPWZ1bmN0aW9uKCl7fTtDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLkNyZWF0aXZlVHlwZT17QUxMOiJBbGwiLEZMQVNIOiJGbGFzaCIsSU1BR0U6IkltYWdlIn0sQ29tcGFuaW9uQWRTZWxlY3Rpb25TZXR0aW5ncy5SZXNvdXJjZVR5cGU9e0FMTDoiQWxsIixIVE1MOiJIdG1sIixJRlJBTUU6IklGcmFtZSIsU1RBVElDOiJTdGF0aWMifSxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzLlNpemVDcml0ZXJpYT17SUdOT1JFOiJJZ25vcmVTaXplIixTRUxFQ1RfRVhBQ1RfTUFUQ0g6IlNlbGVjdEV4YWN0TWF0Y2giLFNFTEVDVF9ORUFSX01BVENIOiJTZWxlY3ROZWFyTWF0Y2gifTt2YXIgQWRDdWVQb2ludHM9ZnVuY3Rpb24oKXt9O0FkQ3VlUG9pbnRzLnByb3RvdHlwZT17Z2V0Q3VlUG9pbnRzOmZ1bmN0aW9uKCl7cmV0dXJuW119LGdldEFkSWRSZWdpc3RyeTpmdW5jdGlvbigpe3JldHVybiIifSxnZXRBZElzVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIn19O3ZhciBBZFByb2dyZXNzRGF0YT1ub29wRnVuYztPYmplY3QuYXNzaWduKGltYSx7QWRDdWVQb2ludHM6QWRDdWVQb2ludHMsQWREaXNwbGF5Q29udGFpbmVyOkFkRGlzcGxheUNvbnRhaW5lcixBZEVycm9yOkFkRXJyb3IsQWRFcnJvckV2ZW50OkFkRXJyb3JFdmVudCxBZEV2ZW50OkFkRXZlbnQsQWRQb2RJbmZvOkFkUG9kSW5mbyxBZFByb2dyZXNzRGF0YTpBZFByb2dyZXNzRGF0YSxBZHNMb2FkZXI6QWRzTG9hZGVyLEFkc01hbmFnZXI6bWFuYWdlcixBZHNNYW5hZ2VyTG9hZGVkRXZlbnQ6QWRzTWFuYWdlckxvYWRlZEV2ZW50LEFkc1JlbmRlcmluZ1NldHRpbmdzOkFkc1JlbmRlcmluZ1NldHRpbmdzLEFkc1JlcXVlc3Q6QWRzUmVxdWVzdCxDb21wYW5pb25BZDpDb21wYW5pb25BZCxDb21wYW5pb25BZFNlbGVjdGlvblNldHRpbmdzOkNvbXBhbmlvbkFkU2VsZWN0aW9uU2V0dGluZ3MsQ3VzdG9tQ29udGVudExvYWRlZEV2ZW50OkN1c3RvbUNvbnRlbnRMb2FkZWRFdmVudCxncHRQcm94eUluc3RhbmNlOnt9LEltYVNka1NldHRpbmdzOkltYVNka1NldHRpbmdzLE9taWRBY2Nlc3NNb2RlOntET01BSU46ImRvbWFpbiIsRlVMTDoiZnVsbCIsTElNSVRFRDoibGltaXRlZCJ9LHNldHRpbmdzOm5ldyBJbWFTZGtTZXR0aW5ncyxVaUVsZW1lbnRzOntBRF9BVFRSSUJVVElPTjoiYWRBdHRyaWJ1dGlvbiIsQ09VTlRET1dOOiJjb3VudGRvd24ifSxVbml2ZXJzYWxBZElkSW5mbzpmdW5jdGlvbigpe30sVkVSU0lPTjoiMy40NTMuMCIsVmlld01vZGU6e0ZVTExTQ1JFRU46ImZ1bGxzY3JlZW4iLE5PUk1BTDoibm9ybWFsIn19KSx3aW5kb3cuZ29vZ2xlfHwod2luZG93Lmdvb2dsZT17fSksd2luZG93Lmdvb2dsZS5pbWE9aW1hLGZ1bmN0aW9uKHNvdXJjZSl7aWYoITA9PT1zb3VyY2UudmVyYm9zZSl7dHJ5e3ZhciBsb2c9Y29uc29sZS5sb2cuYmluZChjb25zb2xlKSx0cmFjZT1jb25zb2xlLnRyYWNlLmJpbmQoY29uc29sZSkscHJlZml4PXNvdXJjZS5ydWxlVGV4dHx8IiI7aWYoc291cmNlLmRvbWFpbk5hbWUpe3ZhciBydWxlU3RhcnRJbmRleCxBR19TQ1JJUFRMRVRfTUFSS0VSPSIjJSMvLyIsVUJPX1NDUklQVExFVF9NQVJLRVI9IiMjK2pzIjtzb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKT4tMT9ydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihBR19TQ1JJUFRMRVRfTUFSS0VSKTpzb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUik+LTEmJihydWxlU3RhcnRJbmRleD1zb3VyY2UucnVsZVRleHQuaW5kZXhPZihVQk9fU0NSSVBUTEVUX01BUktFUikpO3ZhciBydWxlUGFydD1zb3VyY2UucnVsZVRleHQuc2xpY2UocnVsZVN0YXJ0SW5kZXgpO3ByZWZpeD0iIi5jb25jYXQoc291cmNlLmRvbWFpbk5hbWUpLmNvbmNhdChydWxlUGFydCl9bG9nKCIiLmNvbmNhdChwcmVmaXgsIiB0cmFjZSBzdGFydCIpKSx0cmFjZSYmdHJhY2UoKSxsb2coIiIuY29uY2F0KHByZWZpeCwiIHRyYWNlIGVuZCIpKX1jYXRjaChlKXt9ImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5fX2RlYnVnJiZ3aW5kb3cuX19kZWJ1Zyhzb3VyY2UpfX0oc291cmNlKX0pLmFwcGx5KHRoaXMsdXBkYXRlZEFyZ3MpfWNhdGNoKGUpe2NvbnNvbGUubG9nKGUpfX0oe25hbWU6Imdvb2dsZS1pbWEzIixhcmdzOltdfSxbXSk7" diff --git a/dist/redirects.yml b/dist/redirects.yml index 465f04b2c..bfbc24ef2 100644 --- a/dist/redirects.yml +++ b/dist/redirects.yml @@ -1,6 +1,6 @@ # # AdGuard Scriptlets (Redirects Source) -# Version 1.7.14 +# Version 1.7.20 # - title: 1x1-transparent.gif description: |- @@ -1428,7 +1428,9 @@ - title: google-ima3 comment: Mocks the IMA SDK of Google. - aliases: [] + aliases: + - ubo-google-ima.js + - google-ima.js contentType: application/javascript content: |- (function(source, args) { diff --git a/dist/scriptlets.corelibs.json b/dist/scriptlets.corelibs.json index 5ae3c7334..c3b96d017 100644 --- a/dist/scriptlets.corelibs.json +++ b/dist/scriptlets.corelibs.json @@ -1,5 +1,5 @@ { - "version": "1.7.14", + "version": "1.7.20", "scriptlets": [ { "names": [ @@ -132,7 +132,7 @@ "ubo-addEventListener-defuser", "ubo-aeld" ], - "scriptlet": "function preventAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function toRegExp(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",DEFAULT_VALUE=\".?\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(DEFAULT_VALUE);if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,typeSearch,listenerSearch){var typeSearchRegexp=toRegExp(typeSearch),listenerSearchRegexp=toRegExp(listenerSearch),nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var _this$constructor,shouldPrevent=!1;if(validateType(type)&&validateListener(listener)&&(shouldPrevent=typeSearchRegexp.test(type.toString())&&listenerSearchRegexp.test(listenerToString(listener))),!shouldPrevent){var context=this;this&&\"Window\"===(null===(_this$constructor=this.constructor)||void 0===_this$constructor?void 0:_this$constructor.name)&&this!==window&&(context=window);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(context,[type,listener].concat(args))}hit(source)}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -165,7 +165,7 @@ "ubo-addEventListener-logger", "ubo-aell" ], - "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(this,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function logAddEventListener(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function validateType(type){return void 0!==type}function validateListener(listener){return void 0!==listener&&(\"function\"==typeof listener||\"object\"==typeof listener&&null!==listener&&\"function\"==typeof listener.handleEvent)}function listenerToString(listener){return\"function\"==typeof listener?listener.toString():listener.handleEvent.toString()}function convertTypeToString(value){return void 0===value?\"undefined\":\"object\"==typeof value?null===value?\"null\":objectToString(value):value.toString()}function logMessage(source,message){var forced=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(forced||source.verbose)&&console.log(\"\".concat(source.name,\": \").concat(message))}function objectToString(obj){return function(obj){return 0===Object.keys(obj).length&&!obj.prototype}(obj)?\"{}\":(object=obj,keys=Object.keys(object),entries=[],keys.forEach((function(key){return entries.push([key,object[key]])})),entries).map((function(pair){var key=pair[0],value=pair[1],recordValueStr=value;return value instanceof Object&&(recordValueStr=\"{ \".concat(objectToString(value),\" }\")),\"\".concat(key,':\"').concat(recordValueStr,'\"')})).join(\" \");var object,keys,entries}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source){var nativeAddEventListener=window.EventTarget.prototype.addEventListener;function addEventListenerWrapper(type,listener){var _this$constructor;if(validateType(type)&&validateListener(listener)){var _message='addEventListener(\"'.concat(type,'\", ').concat(listenerToString(listener),\")\");logMessage(source,_message,!0),hit(source)}var message=\"Invalid event type or listener passed to addEventListener:\\ntype: \".concat(convertTypeToString(type),\"\\nlistener: \").concat(convertTypeToString(listener));logMessage(source,message,!0);var context=this;this&&\"Window\"===(null===(_this$constructor=this.constructor)||void 0===_this$constructor?void 0:_this$constructor.name)&&this!==window&&(context=window);for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return nativeAddEventListener.apply(context,[type,listener].concat(args))}var descriptor={configurable:!0,set:function(){},get:function(){return addEventListenerWrapper}};Object.defineProperty(window.EventTarget.prototype,\"addEventListener\",descriptor),Object.defineProperty(window,\"addEventListener\",descriptor),Object.defineProperty(document,\"addEventListener\",descriptor)}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ @@ -444,7 +444,7 @@ "names": [ "prevent-element-src-loading" ], - "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"mock\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"function\"==typeof thisArg.getAttribute&&\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" + "scriptlet": "function preventElementSrcLoading(source,args){function hit(source){if(!0===source.verbose){try{var log=console.log.bind(console),trace=console.trace.bind(console),prefix=source.ruleText||\"\";if(source.domainName){var ruleStartIndex;source.ruleText.indexOf(\"#%#//\")>-1?ruleStartIndex=source.ruleText.indexOf(\"#%#//\"):source.ruleText.indexOf(\"##+js\")>-1&&(ruleStartIndex=source.ruleText.indexOf(\"##+js\"));var rulePart=source.ruleText.slice(ruleStartIndex);prefix=\"\".concat(source.domainName).concat(rulePart)}log(\"\".concat(prefix,\" trace start\")),trace&&trace(),log(\"\".concat(prefix,\" trace end\"))}catch(e){}\"function\"==typeof window.__debug&&window.__debug(source)}}function safeGetDescriptor(obj,prop){var descriptor=Object.getOwnPropertyDescriptor(obj,prop);return descriptor&&descriptor.configurable?descriptor:null}function noopFunc(){}var updatedArgs=args?[].concat(source).concat(args):[source];try{(function(source,tagName,match){if(\"undefined\"!=typeof Proxy&&\"undefined\"!=typeof Reflect){var instance,policy,srcMockData={script:\"data:text/javascript;base64,KCk9Pnt9\",img:\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",iframe:\"data:text/html;base64, PGRpdj48L2Rpdj4=\"};if(\"script\"===tagName)instance=HTMLScriptElement;else if(\"img\"===tagName)instance=HTMLImageElement;else{if(\"iframe\"!==tagName)return;instance=HTMLIFrameElement}window.trustedTypes&&\"function\"==typeof window.trustedTypes.createPolicy&&(policy=window.trustedTypes.createPolicy(\"AGPolicy\",{createScriptURL:function(arg){return arg}}));var searchRegexp=function(){var input=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"\",FORWARD_SLASH=\"/\";if(\"\"===input)return new RegExp(\".?\");if(input[0]===FORWARD_SLASH&&input[input.length-1]===FORWARD_SLASH)return new RegExp(input.slice(1,-1));var escaped=input.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\");return new RegExp(escaped)}(match),setMatchedAttribute=function(elem){return elem.setAttribute(source.name,\"matched\")},setAttributeHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var nodeName=thisArg.nodeName.toLowerCase(),attrName=args[0].toLowerCase(),attrValue=args[1];return\"src\"===attrName&&tagName.toLowerCase()===nodeName&&srcMockData[nodeName]&&searchRegexp.test(attrValue)?(hit(source),setMatchedAttribute(thisArg),Reflect.apply(target,thisArg,[attrName,srcMockData[nodeName]])):Reflect.apply(target,thisArg,args)}};instance.prototype.setAttribute=new Proxy(Element.prototype.setAttribute,setAttributeHandler);var origSrcDescriptor=safeGetDescriptor(instance.prototype,\"src\");if(origSrcDescriptor){Object.defineProperty(instance.prototype,\"src\",{enumerable:!0,configurable:!0,get:function(){return origSrcDescriptor.get.call(this)},set:function(urlValue){var nodeName=this.nodeName.toLowerCase();if(tagName.toLowerCase()!==nodeName||!srcMockData[nodeName]||!searchRegexp.test(urlValue))return origSrcDescriptor.set.call(this,urlValue),!0;if(policy&&urlValue instanceof TrustedScriptURL){var trustedSrc=policy.createScriptURL(urlValue);return origSrcDescriptor.set.call(this,trustedSrc),void hit(source)}setMatchedAttribute(this),origSrcDescriptor.set.call(this,srcMockData[nodeName]),hit(source)}});var origOnerrorDescriptor=safeGetDescriptor(HTMLElement.prototype,\"onerror\");if(origOnerrorDescriptor){Object.defineProperty(HTMLElement.prototype,\"onerror\",{enumerable:!0,configurable:!0,get:function(){return origOnerrorDescriptor.get.call(this)},set:function(cb){return\"matched\"===this.getAttribute(source.name)?(origOnerrorDescriptor.set.call(this,noopFunc),!0):(origOnerrorDescriptor.set.call(this,cb),!0)}});var addEventListenerHandler={apply:function(target,thisArg,args){if(!args[0]||!args[1])return Reflect.apply(target,thisArg,args);var eventName=args[0];return\"function\"==typeof thisArg.getAttribute&&\"matched\"===thisArg.getAttribute(source.name)&&\"error\"===eventName?Reflect.apply(target,thisArg,[eventName,noopFunc]):Reflect.apply(target,thisArg,args)}};EventTarget.prototype.addEventListener=new Proxy(EventTarget.prototype.addEventListener,addEventListenerHandler)}}}}).apply(this,updatedArgs)}catch(e){console.log(e)}}" }, { "names": [ diff --git a/dist/scriptlets.js b/dist/scriptlets.js index fcf4e4200..6cc3c1d57 100644 --- a/dist/scriptlets.js +++ b/dist/scriptlets.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.14 + * Version 1.7.20 */ (function () { @@ -1584,7 +1584,7 @@ } /** - * Generate random six symbols id + * Generate random seven symbols id */ function randomId() { return Math.random().toString(36).slice(2, 9); @@ -3439,6 +3439,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -3447,10 +3448,17 @@ hit(source); return undefined; } + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -3619,6 +3627,7 @@ function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -3628,10 +3637,17 @@ // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -6265,7 +6281,13 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy('mock', { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: function createScriptURL(arg) { return arg; } @@ -7357,7 +7379,8 @@ adg: 'googletagservices-gpt', ubo: 'googletagservices_gpt.js' }, { - adg: 'google-ima3' + adg: 'google-ima3', + ubo: 'google-ima.js' }, { adg: 'gemius' }, { @@ -10044,7 +10067,11 @@ window.google.ima = ima; hit(source); } - GoogleIma3.names = ['google-ima3']; + GoogleIma3.names = ['google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js']; GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ @@ -13491,6 +13518,7 @@ * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -13518,7 +13546,7 @@ /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ createClass(Redirects, [{ key: "getRedirect", @@ -13540,6 +13568,21 @@ return aliases.indexOf(title) > -1; }); } + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + }, { + key: "isBlocking", + value: function isBlocking(title) { + var redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } }]); return Redirects; }(); @@ -13604,6 +13647,8 @@ "ubo-googletagmanager_gtm.js": "google-analytics.js", "googletagmanager_gtm.js": "google-analytics.js", "google-ima3": "google-ima3.js", + "ubo-google-ima.js": "google-ima3.js", + "google-ima.js": "google-ima3.js", "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", @@ -15934,6 +15979,7 @@ function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -15941,10 +15987,14 @@ } var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16498,6 +16548,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -16506,10 +16557,14 @@ hit(source); return undefined; } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16807,7 +16862,7 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy("mock", { + policy = window.trustedTypes.createPolicy("AGPolicy", { createScriptURL: function createScriptURL(arg) { return arg; } diff --git a/dist/umd/scriptlets.d.ts b/dist/umd/scriptlets.d.ts index 148196c69..c1be2a8e8 100644 --- a/dist/umd/scriptlets.d.ts +++ b/dist/umd/scriptlets.d.ts @@ -64,6 +64,11 @@ declare module '@adguard/scriptlets' { */ contentType: string; + /** + * Filename of the redirect. + */ + file: string; + /** * If it's new type of redirects, i.e. click2load */ @@ -81,6 +86,7 @@ declare module '@adguard/scriptlets' { class Redirects { constructor(rawYaml: string); getRedirect(title: string): Redirect; + isBlocking(title: string): boolean; } /** @@ -117,7 +123,7 @@ declare module '@adguard/scriptlets' { /** * Object with redirects titles in the keys and RedirectSources */ - Redirects: Redirects; + Redirects: typeof Redirects; /** * Returns filename with extension for requested alias diff --git a/dist/umd/scriptlets.umd.js b/dist/umd/scriptlets.umd.js index 5aa51a875..6fa8e8632 100644 --- a/dist/umd/scriptlets.umd.js +++ b/dist/umd/scriptlets.umd.js @@ -1,7 +1,7 @@ /** * AdGuard Scriptlets - * Version 1.7.14 + * Version 1.7.20 */ (function (factory) { @@ -1586,7 +1586,7 @@ } /** - * Generate random six symbols id + * Generate random seven symbols id */ function randomId() { return Math.random().toString(36).slice(2, 9); @@ -3441,6 +3441,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -3449,10 +3450,17 @@ hit(source); return undefined; } + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -3621,6 +3629,7 @@ function logAddEventListener$1(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = "addEventListener(\"".concat(type, "\", ").concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -3630,10 +3639,17 @@ // logging while debugging var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + + // Avoid illegal invocations due to lost context + // https://github.com/AdguardTeam/Scriptlets/issues/271 + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === 'Window' && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -6267,7 +6283,13 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === 'function'; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy('mock', { + // The name for the trusted-types policy should only be 'AGPolicy',because corelibs can + // allow our policy if the server has restricted the creation of a trusted-types policy with + // the directive 'Content-Security-Policy: trusted-types ;`. + // If such a header is presented in the server response, corelibs adds permission to create + // the 'AGPolicy' policy with the 'allow-duplicates' option to prevent errors. + // See AG-18204 for details. + policy = window.trustedTypes.createPolicy('AGPolicy', { createScriptURL: function createScriptURL(arg) { return arg; } @@ -7359,7 +7381,8 @@ adg: 'googletagservices-gpt', ubo: 'googletagservices_gpt.js' }, { - adg: 'google-ima3' + adg: 'google-ima3', + ubo: 'google-ima.js' }, { adg: 'gemius' }, { @@ -10046,7 +10069,11 @@ window.google.ima = ima; hit(source); } - GoogleIma3.names = ['google-ima3']; + GoogleIma3.names = ['google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js']; GoogleIma3.injections = [hit, noopFunc, logMessage]; /* eslint-disable func-names, no-underscore-dangle */ @@ -13493,6 +13520,7 @@ * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -13520,7 +13548,7 @@ /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ createClass(Redirects, [{ key: "getRedirect", @@ -13542,6 +13570,21 @@ return aliases.indexOf(title) > -1; }); } + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + }, { + key: "isBlocking", + value: function isBlocking(title) { + var redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } }]); return Redirects; }(); @@ -13606,6 +13649,8 @@ "ubo-googletagmanager_gtm.js": "google-analytics.js", "googletagmanager_gtm.js": "google-analytics.js", "google-ima3": "google-ima3.js", + "ubo-google-ima.js": "google-ima3.js", + "google-ima.js": "google-ima3.js", "googlesyndication-adsbygoogle": "googlesyndication-adsbygoogle.js", "ubo-googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", "googlesyndication_adsbygoogle.js": "googlesyndication-adsbygoogle.js", @@ -15936,6 +15981,7 @@ function logAddEventListener(source) { var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; if (validateType(type) && validateListener(listener)) { var _message = 'addEventListener("'.concat(type, '", ').concat(listenerToString(listener), ")"); logMessage(source, _message, true); @@ -15943,10 +15989,14 @@ } var message = "Invalid event type or listener passed to addEventListener:\ntype: ".concat(convertTypeToString(type), "\nlistener: ").concat(convertTypeToString(listener)); logMessage(source, message, true); + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16500,6 +16550,7 @@ var listenerSearchRegexp = toRegExp(listenerSearch); var nativeAddEventListener = window.EventTarget.prototype.addEventListener; function addEventListenerWrapper(type, listener) { + var _this$constructor; var shouldPrevent = false; if (validateType(type) && validateListener(listener)) { shouldPrevent = typeSearchRegexp.test(type.toString()) && listenerSearchRegexp.test(listenerToString(listener)); @@ -16508,10 +16559,14 @@ hit(source); return undefined; } + var context = this; + if (this && ((_this$constructor = this.constructor) === null || _this$constructor === void 0 ? void 0 : _this$constructor.name) === "Window" && this !== window) { + context = window; + } for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { args[_key - 2] = arguments[_key]; } - return nativeAddEventListener.apply(this, [type, listener].concat(args)); + return nativeAddEventListener.apply(context, [type, listener].concat(args)); } var descriptor = { configurable: true, @@ -16809,7 +16864,7 @@ var hasTrustedTypes = window.trustedTypes && typeof window.trustedTypes.createPolicy === "function"; var policy; if (hasTrustedTypes) { - policy = window.trustedTypes.createPolicy("mock", { + policy = window.trustedTypes.createPolicy("AGPolicy", { createScriptURL: function createScriptURL(arg) { return arg; } diff --git a/scripts/compatibility-table.json b/scripts/compatibility-table.json index 3082fabd8..0172bf512 100644 --- a/scripts/compatibility-table.json +++ b/scripts/compatibility-table.json @@ -295,6 +295,10 @@ "adg": "google-analytics-ga", "ubo": "google-analytics_ga.js" }, + { + "adg": "google-ima3", + "ubo": "google-ima.js" + }, { "adg": "googlesyndication-adsbygoogle", "ubo": "googlesyndication_adsbygoogle.js" @@ -444,9 +448,6 @@ { "ubo": "mxpnl_mixpanel.js" }, - { - "ubo": "google-ima.js" - }, { "ubo": "noop-0.5s.mp3" } diff --git a/src/helpers/compatibility-redirects.js b/src/helpers/compatibility-redirects.js index 6fc846200..a02088194 100644 --- a/src/helpers/compatibility-redirects.js +++ b/src/helpers/compatibility-redirects.js @@ -82,6 +82,7 @@ const redirects = [ }, { adg: 'google-ima3', + ubo: 'google-ima.js', }, { adg: 'gemius', diff --git a/src/redirects/google-ima3.js b/src/redirects/google-ima3.js index 792f1c4e6..90b06e1f0 100644 --- a/src/redirects/google-ima3.js +++ b/src/redirects/google-ima3.js @@ -478,7 +478,13 @@ export function GoogleIma3(source) { hit(source); } -GoogleIma3.names = ['google-ima3']; +GoogleIma3.names = [ + 'google-ima3', + // prefixed name + 'ubo-google-ima.js', + // original ubo name + 'google-ima.js', +]; GoogleIma3.injections = [ hit, diff --git a/src/redirects/redirects.js b/src/redirects/redirects.js index a1972ea4e..91435155a 100644 --- a/src/redirects/redirects.js +++ b/src/redirects/redirects.js @@ -14,6 +14,7 @@ import jsYaml from 'js-yaml'; * @property {string} comment * @property {string} content * @property {string} contentType + * @property {string} file * @property {boolean} [isBlocking] * @property {string} [sha] */ @@ -44,7 +45,7 @@ class Redirects { /** * Returns redirect source object * @param {string} title - * @return {Redirect} + * @return {Redirect|undefined} Found redirect source object, or `undefined` if not found. */ getRedirect(title) { if (Object.prototype.hasOwnProperty.call(this.redirects, title)) { @@ -62,6 +63,20 @@ class Redirects { return aliases.indexOf(title) > -1; }); } + + /** + * Checks if redirect is blocking like click2load.html + * @param {string} title Title of the redirect. + * @returns True if redirect is blocking otherwise returns `false` even if redirect name is + * unknown. + */ + isBlocking(title) { + const redirect = this.redirects[title]; + if (redirect) { + return !!redirect.isBlocking; + } + return false; + } } export default Redirects; diff --git a/tests/lib-tests/index.test.js b/tests/lib-tests/index.test.js index d36386554..6866b77b9 100644 --- a/tests/lib-tests/index.test.js +++ b/tests/lib-tests/index.test.js @@ -418,6 +418,10 @@ test('Test REDIRECT converting - UBO -> ADG', (assert) => { uboRule = '||g9g.eu^*fa.js$script,redirect=fuckadblock.js-3.2.0'; expectedAdgRule = '||g9g.eu^*fa.js$script,redirect=prevent-fab-3.2.0'; assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); + + uboRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima.js,domain=example.org'; + expectedAdgRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima3,domain=example.org'; + assert.strictEqual(convertRedirectToAdg(uboRule), expectedAdgRule); }); test('Test REDIRECT-RULE converting - UBO -> ADG', (assert) => { @@ -559,6 +563,10 @@ test('Test REDIRECT converting - ADG -> UBO', (assert) => { new RegExp('Unable to convert for uBO'), // specific error matcher 'no TYPES to specify, ABSENT_SOURCE_TYPE_REPLACEMENT should be updated', ); + + adgRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima3,domain=example.org'; + expectedUboRule = '||imasdk.googleapis.com/js/sdkloader/ima3.js$script,important,redirect=google-ima.js,domain=example.org'; + assert.strictEqual(convertAdgRedirectToUbo(adgRule), expectedUboRule); }); test('Test REDIRECT-RULE converting - ADG -> UBO', (assert) => { diff --git a/tests/redirects/google-ima3.test.js b/tests/redirects/google-ima3.test.js index 12971cb2e..23f7a8a34 100644 --- a/tests/redirects/google-ima3.test.js +++ b/tests/redirects/google-ima3.test.js @@ -18,6 +18,24 @@ const afterEach = () => { module(name, { beforeEach, afterEach }); +test('Checking if alias name works', (assert) => { + const adgParams = { + name, + engine: 'test', + verbose: true, + }; + const uboParams = { + name: 'ubo-google-ima.js', + engine: 'test', + verbose: true, + }; + + const codeByAdgParams = window.scriptlets.redirects.getCode(adgParams); + const codeByUboParams = window.scriptlets.redirects.getCode(uboParams); + + assert.strictEqual(codeByAdgParams, codeByUboParams, 'ubo name - ok'); +}); + test('Ima mocked', (assert) => { assert.expect(28); diff --git a/types/scriptlets.d.ts b/types/scriptlets.d.ts index 148196c69..c1be2a8e8 100644 --- a/types/scriptlets.d.ts +++ b/types/scriptlets.d.ts @@ -64,6 +64,11 @@ declare module '@adguard/scriptlets' { */ contentType: string; + /** + * Filename of the redirect. + */ + file: string; + /** * If it's new type of redirects, i.e. click2load */ @@ -81,6 +86,7 @@ declare module '@adguard/scriptlets' { class Redirects { constructor(rawYaml: string); getRedirect(title: string): Redirect; + isBlocking(title: string): boolean; } /** @@ -117,7 +123,7 @@ declare module '@adguard/scriptlets' { /** * Object with redirects titles in the keys and RedirectSources */ - Redirects: Redirects; + Redirects: typeof Redirects; /** * Returns filename with extension for requested alias diff --git a/wiki/compatibility-table.md b/wiki/compatibility-table.md index 18b155ffa..bbdc5dfa1 100644 --- a/wiki/compatibility-table.md +++ b/wiki/compatibility-table.md @@ -91,6 +91,7 @@ | [fingerprint3js](../wiki/about-redirects.md#fingerprint3js) | fingerprint3.js | | | [google-analytics](../wiki/about-redirects.md#google-analytics) | google-analytics_analytics.js | | | [google-analytics-ga](../wiki/about-redirects.md#google-analytics-ga) | google-analytics_ga.js | | +| [google-ima3](../wiki/about-redirects.md#google-ima3) | google-ima.js | | | [googlesyndication-adsbygoogle](../wiki/about-redirects.md#googlesyndication-adsbygoogle) | googlesyndication_adsbygoogle.js | | | [googletagservices-gpt](../wiki/about-redirects.md#googletagservices-gpt) | googletagservices_gpt.js | | | [gemius](../wiki/about-redirects.md#gemius) | | | @@ -133,5 +134,4 @@ | | window.open-defuser.js | | | | noeval.js | | | | mxpnl_mixpanel.js | | -| | google-ima.js | | | | noop-0.5s.mp3 | |