Merge pull request #4549 from Rob--W/crx-pdf-embed-object
<object> / <embed> support in Chrome / Opera
This commit is contained in:
commit
6d330250da
@ -25,15 +25,108 @@ function getViewerURL(pdf_url) {
|
||||
return VIEWER_URL + '?file=' + encodeURIComponent(pdf_url);
|
||||
}
|
||||
|
||||
document.addEventListener('beforeload', function(event) {
|
||||
var elem = event.target;
|
||||
if (elem.nodeName.toUpperCase() !== 'EMBED') {
|
||||
// (un)prefixed property names
|
||||
var createShadowRoot, shadowRoot;
|
||||
if (typeof Element.prototype.createShadowRoot !== 'undefined') {
|
||||
// Chrome 35+
|
||||
createShadowRoot = 'createShadowRoot';
|
||||
shadowRoot = 'shadowRoot';
|
||||
} else if (typeof Element.prototype.webkitCreateShadowRoot !== 'undefined') {
|
||||
// Chrome 25 - 34
|
||||
createShadowRoot = 'webkitCreateShadowRoot';
|
||||
shadowRoot = 'webkitShadowRoot';
|
||||
try {
|
||||
document.createElement('embed').webkitCreateShadowRoot();
|
||||
} catch (e) {
|
||||
// Only supported since Chrome 33.
|
||||
createShadowRoot = shadowRoot = '';
|
||||
}
|
||||
}
|
||||
|
||||
// Only observe the document if we can make use of Shadow DOM.
|
||||
if (createShadowRoot) {
|
||||
if ('animation' in document.documentElement.style) {
|
||||
document.addEventListener('animationstart', onAnimationStart, true);
|
||||
} else {
|
||||
document.addEventListener('webkitAnimationStart', onAnimationStart, true);
|
||||
}
|
||||
}
|
||||
|
||||
function onAnimationStart(event) {
|
||||
if (event.animationName === 'pdfjs-detected-object-or-embed') {
|
||||
watchObjectOrEmbed(event.target);
|
||||
}
|
||||
}
|
||||
|
||||
// Called for every <object> or <embed> element in the page.
|
||||
// It does not trigger any Mutation observers, but it may modify the
|
||||
// shadow DOM rooted under the given element.
|
||||
// Calling this function multiple times for the same element is safe, i.e.
|
||||
// it has no side effects.
|
||||
function watchObjectOrEmbed(elem) {
|
||||
var mimeType = elem.type;
|
||||
if (mimeType && 'application/pdf' !== mimeType.toLowerCase()) {
|
||||
return;
|
||||
}
|
||||
if (!/^application\/pdf$/i.test(elem.type)) {
|
||||
// <embed src> <object data>
|
||||
var srcAttribute = 'src' in elem ? 'src' : 'data';
|
||||
var path = elem[srcAttribute];
|
||||
if (!mimeType && !/\.pdf($|[?#])/i.test(path)) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
elem.type = 'text/html';
|
||||
elem.src = getViewerURL(elem.src);
|
||||
}, true);
|
||||
|
||||
if (elem[shadowRoot]) {
|
||||
// If the element already has a shadow root, assume that we've already
|
||||
// seen this element.
|
||||
return;
|
||||
}
|
||||
elem[createShadowRoot]();
|
||||
|
||||
function updateViewerFrame() {
|
||||
var path = elem[srcAttribute];
|
||||
if (!path) {
|
||||
elem[shadowRoot].textContent = '';
|
||||
} else {
|
||||
elem[shadowRoot].innerHTML =
|
||||
// Set display: inline-block; to the host element (<embed>/<object>) to
|
||||
// ensure that the dimensions defined on the host element are applied to
|
||||
// the iframe (http://crbug.com/358648).
|
||||
// The styles are declared in the shadow DOM to allow page authors to
|
||||
// override these styles (e.g. .style.display = 'none';).
|
||||
'<style>\n' +
|
||||
// Chrome 35+
|
||||
':host { display: inline-block; }\n' +
|
||||
// Chrome 33 and 34 (not 35+ because of http://crbug.com/351248)
|
||||
'*:not(style):not(iframe) { display: inline-block; }\n' +
|
||||
'iframe { width: 100%; height: 100%; border: 0; }\n' +
|
||||
'</style>' +
|
||||
'<iframe allowfullscreen></iframe>';
|
||||
elem[shadowRoot].lastChild.src = getEmbeddedViewerURL(path);
|
||||
}
|
||||
}
|
||||
|
||||
updateViewerFrame();
|
||||
|
||||
// Watch for page-initiated changes of the src/data attribute.
|
||||
var srcObserver = new MutationObserver(updateViewerFrame);
|
||||
srcObserver.observe(elem, {
|
||||
attributes: true,
|
||||
childList: false,
|
||||
characterData: false,
|
||||
attributeFilter: [srcAttribute]
|
||||
});
|
||||
}
|
||||
|
||||
// Get the viewer URL, provided that the path is a valid URL.
|
||||
function getEmbeddedViewerURL(path) {
|
||||
var fragment = /^([^#]*)(#.*)?$/.exec(path);
|
||||
path = fragment[1];
|
||||
fragment = fragment[2] || '';
|
||||
|
||||
// Resolve relative path to document.
|
||||
var a = document.createElement('a');
|
||||
a.href = document.baseURI;
|
||||
a.href = path;
|
||||
path = a.href;
|
||||
return getViewerURL(path) + fragment;
|
||||
}
|
||||
|
13
extensions/chromium/contentstyle.css
Normal file
13
extensions/chromium/contentstyle.css
Normal file
@ -0,0 +1,13 @@
|
||||
/**
|
||||
* Detect creation of <embed> and <object> tags.
|
||||
*/
|
||||
@-webkit-keyframes pdfjs-detected-object-or-embed { from {} }
|
||||
@keyframes pdfjs-detected-object-or-embed { from {} }
|
||||
object, embed {
|
||||
-webkit-animation-delay: 0s !important;
|
||||
-webkit-animation-name: pdfjs-detected-object-or-embed !important;
|
||||
-webkit-animation-play-state: running !important;
|
||||
animation-delay: 0s !important;
|
||||
animation-name: pdfjs-detected-object-or-embed !important;
|
||||
animation-play-state: running !important;
|
||||
}
|
@ -25,6 +25,8 @@
|
||||
"file://*/*"
|
||||
],
|
||||
"run_at": "document_start",
|
||||
"all_frames": true,
|
||||
"css": ["contentstyle.css"],
|
||||
"js": ["contentscript.js"]
|
||||
}],
|
||||
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
|
||||
|
Loading…
Reference in New Issue
Block a user