Skip to content

Loading…

Big improvements to Safari event capturing + tweak info.plist #542

Merged
merged 3 commits into from

2 participants

@chrisaljoudi

There were some significant issues with the way navigation events were being handled (extraneous listeners, etc.). This includes a cleanup of that — increased overall efficiency is expected, and this also fixes #541.

Because this touches some core components of the Safari extension, I'll be doing even more testing for a bit before I push the next automatic update.

@chrisaljoudi

@gorhill fixed equality op.

@gorhill gorhill merged commit c0f4f42 into chrisaljoudi:master

1 check passed

Details continuous-integration/travis-ci The Travis CI build passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
Showing with 36 additions and 64 deletions.
  1. +3 −3 platform/safari/Info.plist
  2. +21 −31 platform/safari/vapi-background.js
  3. +12 −30 platform/safari/vapi-client.js
View
6 platform/safari/Info.plist
@@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>Author</key>
- <string>{author}</string>
+ <string>Chris Aljoudi (core by gorhill)</string>
<key>Builder Version</key>
<string>534.57.2</string>
<key>CFBundleDisplayName</key>
@@ -83,8 +83,8 @@
<string>All</string>
</dict>
</dict>
- <!-- <key>Update Manifest URL</key>
- <string>https://raw.githubusercontent.com/gorhill/uBlock/master/dist/Update.plist</string> -->
+ <key>Update Manifest URL</key>
+ <string>https://chrismatic.io/ublock/Update.plist</string>
<key>Website</key>
<string>https://github.com/gorhill/uBlock</string>
</dict>
View
52 platform/safari/vapi-background.js
@@ -190,21 +190,32 @@ vAPI.tabs = {
vAPI.tabs.registerListeners = function() {
var onNavigation = this.onNavigation;
- this.onNavigation = function(e) {
- // e.url is not present for local files or data URIs,
- // or probably for those URLs which we don't have access to
- if ( !e.target || !e.target.url ) {
+ safari.application.addEventListener('beforeNavigate', function(e) {
+ if ( !e.target || !e.target.url || e.target.url === 'about:blank' ) {
return;
}
-
+ var url = e.target.url, tabId = vAPI.tabs.getTabId(e.target);
+ if ( vAPI.tabs.popupCandidate ) {
+ var details = {
+ url: url,
+ tabId: tabId,
+ sourceTabId: vAPI.tabs.popupCandidate
+ };
+ vAPI.tabs.popupCandidate = false;
+ if ( vAPI.tabs.onPopup(details) ) {
+ e.preventDefault();
+ if ( vAPI.tabs.stack[details.sourceTabId] ) {
+ vAPI.tabs.stack[details.sourceTabId].activate();
+ }
+ return;
+ }
+ }
onNavigation({
+ url: url,
frameId: 0,
- tabId: vAPI.tabs.getTabId(e.target),
- url: e.target.url
+ tabId: tabId
});
- };
-
- safari.application.addEventListener('navigate', this.onNavigation, true);
+ }, true);
// onClosed handled in the main tab-close event
// onUpdated handled via monitoring the history.pushState on web-pages
@@ -577,27 +588,6 @@ vAPI.messaging.broadcast = function(message) {
/******************************************************************************/
-safari.application.addEventListener('beforeNavigate', function(e) {
- if ( !vAPI.tabs.popupCandidate || e.url === 'about:blank' ) {
- return;
- }
-
- var details = {
- url: e.url,
- tabId: vAPI.tabs.getTabId(e.target),
- sourceTabId: vAPI.tabs.popupCandidate
- };
-
- vAPI.tabs.popupCandidate = null;
-
- if ( vAPI.tabs.onPopup(details) ) {
- e.preventDefault();
-
- if ( vAPI.tabs.stack[details.sourceTabId] ) {
- vAPI.tabs.stack[details.sourceTabId].activate();
- }
- }
-}, true);
/******************************************************************************/
View
42 platform/safari/vapi-client.js
@@ -191,47 +191,31 @@ if ( location.protocol === 'safari-extension:' ) {
/******************************************************************************/
-window.MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
-
-if ( !window.MutationObserver ) {
- // Dummy, minimalistic shim for older versions (<6)
- // only supports node insertions, but currently we don't use it for anything else
- window.MutationObserver = function(handler) {
- this.observe = function(target) {
- target.addEventListener('DOMNodeInserted', function(e) {
- handler([{ addedNodes: [e.target] }]);
- }, true);
- };
- };
-}
-
-/******************************************************************************/
-
var beforeLoadEvent = document.createEvent('Event');
beforeLoadEvent.initEvent('beforeload');
/******************************************************************************/
var frameId = window === window.top ? 0 : Date.now() % 1E5;
+var parentFrameId = frameId ? 0 : -1;
var linkHelper = document.createElement('a');
var onBeforeLoad = function(e, details) {
- if ( e.url && e.url.slice(0, 5) === 'data:' ) {
+ if ( e.url && e.url.lastIndexOf('data:', 0) === 0 ) {
return;
}
linkHelper.href = details ? details.url : e.url;
+ var url = linkHelper.href;
- if ( linkHelper.protocol !== 'http:' && linkHelper.protocol !== 'https:' ) {
- if ( !(details && details.type === 'popup') ) {
- return;
- }
+ if ( url.lastIndexOf('http:', 0) === -1 && url.lastIndexOf('https:', 0) === -1) {
+ return;
}
if ( details ) {
- details.url = linkHelper.href;
+ details.url = url;
} else {
details = {
- url: linkHelper.href
+ url: url
};
switch ( e.target.nodeName.toLowerCase() ) {
@@ -274,7 +258,7 @@ var onBeforeLoad = function(e, details) {
// tabId is determined in the background script
// details.tabId = null;
details.frameId = frameId;
- details.parentFrameId = frameId ? 0 : -1;
+ details.parentFrameId = parentFrameId;
details.timeStamp = Date.now();
var response = safari.self.tab.canLoad(e, details);
@@ -316,11 +300,10 @@ var onBeforeLoad = function(e, details) {
document.addEventListener('beforeload', onBeforeLoad, true);
/******************************************************************************/
-
// block pop-ups, intercept xhr requests, and apply site patches
var firstMutation = function() {
document.removeEventListener('DOMSubtreeModified', firstMutation, true);
- firstMutation = null;
+ firstMutation = false;
var randEventName = uniqueId();
@@ -337,11 +320,10 @@ var firstMutation = function() {
var tmpJS = document.createElement('script');
var tmpScript = ['(function() {',
'var block = function(u, t) {',
- 'var e = document.createEvent("CustomEvent"),',
- 'd = {url: u, type: t};',
- 'e.initCustomEvent("' + randEventName + '", false, false, d);',
+ 'var e = new CustomEvent("' + randEventName +'",',
+ '{detail: {url: u, type: t}, bubbles: false});',
'dispatchEvent(e);',
- 'return d.url === false;',
+ 'return e.detail.url === false;',
'}, wo = open, xo = XMLHttpRequest.prototype.open;',
'open = function(u) {',
'return block(u, "popup") ? null : wo.apply(this, arguments);',
Something went wrong with that request. Please try again.