Index: safari/ext/content.js |
=================================================================== |
--- a/safari/ext/content.js |
+++ b/safari/ext/content.js |
@@ -66,12 +66,15 @@ |
if (!/^https?:/.test(url)) |
return; |
- var type; |
+ var type = "other"; |
+ var eventName = "error"; |
+ |
switch(event.target.localName) |
{ |
case "frame": |
case "iframe": |
type = "sub_frame"; |
+ eventName = "load"; |
break; |
case "img": |
type = "image"; |
@@ -85,12 +88,8 @@ |
break; |
case "link": |
if (/\bstylesheet\b/i.test(event.target.rel)) |
- { |
type = "stylesheet"; |
- break; |
- } |
- default: |
Sebastian Noack
2014/11/22 13:53:46
Sorry for this unrelated change. But now, where th
kzar
2014/11/24 16:54:50
Makes sense to me.
|
- type = "other"; |
+ break; |
} |
if (!safari.self.tab.canLoad( |
@@ -106,14 +105,16 @@ |
event.preventDefault(); |
// Safari doesn't dispatch an "error" event when preventing an element |
- // from loading by cancelling the "beforeload" event. So we have to |
- // dispatch it manually. Otherwise element collapsing wouldn't work. |
- if (type != "sub_frame") |
+ // from loading by cancelling the "beforeload" event. Starting with |
kzar
2014/11/24 16:54:50
Nitpick: This comment doesn't read very well start
Sebastian Noack
2014/11/24 17:13:20
Can you explain why it doesn't read well in your o
kzar
2014/11/25 11:27:33
The part "...it not even dispatches..." would be m
Sebastian Noack
2014/11/25 11:48:38
I used a sligthly modified version of your text. I
kzar
2014/11/25 12:06:53
Cool, reads great
|
+ // Safari 8, it not even dispatches a "load" event for cancelled frames. |
+ // So we have to dispatch it manually. Otherwise, element collapsing |
+ // wouldn't work, and pages that rely on those events break. |
+ if (type != "sub_frame" || parseInt(navigator.userAgent.match(/\bVersion\/(\d+)/)[1], 10) >= 8) |
kzar
2014/11/24 16:54:50
What if the user is using a version < 8, shouldn't
Sebastian Noack
2014/11/24 17:13:20
Yes, and it is. However, error events should only
kzar
2014/11/25 11:27:33
Ah I see, sorry.
|
{ |
setTimeout(function() |
{ |
var evt = document.createEvent("Event"); |
- evt.initEvent("error"); |
+ evt.initEvent(eventName); |
event.target.dispatchEvent(evt); |
}, 0); |
} |