geary/ui/client-web-view.js

119 lines
4.1 KiB
JavaScript
Raw Normal View History

/*
* Copyright 2016 Michael Gratton <mike@vee.net>
*
* This software is licensed under the GNU Lesser General Public License
* (version 2.1 or later). See the COPYING file in this distribution.
*/
/**
* Application logic for ClientWebView and subclasses.
*/
let PageState = function() {
this.init.apply(this, arguments);
};
Re-implement remote image loading management for WebKit2. * src/client/components/client-web-view.vala (ClientWebView): Register for new remoteImageLoadBlocked message from JS. Add new ::remote_image_load_blocked signal to notify when a remote image load was blocked. Add ::allow_remote_image_loading and ::load_remote_images methods to allow th app to manage image loading state. * src/client/conversation-viewer/conversation-email.vala (ConversationEmail): Determine up front whether the message view should load remote images and flag that, rather than passing through the email flag and the contact store. * src/client/conversation-viewer/conversation-message.vala (ConversationMessage): Rmeove contact_store and always_load_remote_images properties and related code, just let the parent email view advise whether remote images should be initially loaded and act accordingly. Look up to ClientWebView signal and methods to handle manual remote image loading management by the user. Remove some obsolete code. * src/client/web-process/web-process-extension.vala (GearyWebExtension): Replace allow_prefix implementation for remote image management with explicit signalling to/from the application via JavaScript. * ui/client-web-view.js: Add a new PageState object, add props and method to implement remote image loading management. * ui/client-web-view-allow-remote-images.js: Monkeypatch to be used when remote images should be loaded by default. * ui/CMakeLists.txt: Include new JS file. * src/client/conversation-viewer/conversation-web-view.vala, src/client/web-process/util-conversation.vala, src/client/web-process/util-webkit.vala: Remove obsolete code.
2016-11-25 16:30:50 +11:00
PageState.prototype = {
init: function() {
this.allowRemoteImages = false;
this.isLoaded = false;
this.hasSelection = false;
this.lastPreferredHeight = 0;
let state = this;
// Coalesce multiple calls to updatePreferredHeight using a
// timeout to avoid the overhead of multiple JS messages sent
// to the app and hence view multiple resizes being queued.
let queueTimeout = null;
let queuePreferredHeightUpdate = function() {
if (queueTimeout != null) {
clearTimeout(queueTimeout);
}
queueTimeout = setTimeout(
function() { state.updatePreferredHeight(); }, 10
);
};
// Queues an update after the DOM has been initially loaded
// and had any changes made to it by derived classes.
document.addEventListener("DOMContentLoaded", function(e) {
state.loaded();
queuePreferredHeightUpdate();
});
// Queues an update when the complete document is loaded.
//
// Note also that the delay introduced here by this last call
// to queuePreferredHeightUpdate when the complete document is
// loaded seems to be important to get an acurate idea of the
// final document size.
window.addEventListener("load", function(e) {
queuePreferredHeightUpdate();
}, true); // load does not bubble
// Queues updates for any STYLE, IMG and other loaded
// elements, hence handles resizing when the user later
// requests remote images loading.
document.addEventListener("load", function(e) {
queuePreferredHeightUpdate();
}, true); // load does not bubble
// Queues an update if the window changes size, e.g. if the
// user resized the window
window.addEventListener("resize", function(e) {
queuePreferredHeightUpdate();
}, false); // load does not bubble
// Queues an update when a transition has completed, e.g. if the
// user resized the window
window.addEventListener("transitionend", function(e) {
queuePreferredHeightUpdate();
}, false); // load does not bubble
},
getPreferredHeight: function() {
return window.document.documentElement.scrollHeight;
},
loaded: function() {
this.isLoaded = true;
window.webkit.messageHandlers.contentLoaded.postMessage(null);
},
Re-implement remote image loading management for WebKit2. * src/client/components/client-web-view.vala (ClientWebView): Register for new remoteImageLoadBlocked message from JS. Add new ::remote_image_load_blocked signal to notify when a remote image load was blocked. Add ::allow_remote_image_loading and ::load_remote_images methods to allow th app to manage image loading state. * src/client/conversation-viewer/conversation-email.vala (ConversationEmail): Determine up front whether the message view should load remote images and flag that, rather than passing through the email flag and the contact store. * src/client/conversation-viewer/conversation-message.vala (ConversationMessage): Rmeove contact_store and always_load_remote_images properties and related code, just let the parent email view advise whether remote images should be initially loaded and act accordingly. Look up to ClientWebView signal and methods to handle manual remote image loading management by the user. Remove some obsolete code. * src/client/web-process/web-process-extension.vala (GearyWebExtension): Replace allow_prefix implementation for remote image management with explicit signalling to/from the application via JavaScript. * ui/client-web-view.js: Add a new PageState object, add props and method to implement remote image loading management. * ui/client-web-view-allow-remote-images.js: Monkeypatch to be used when remote images should be loaded by default. * ui/CMakeLists.txt: Include new JS file. * src/client/conversation-viewer/conversation-web-view.vala, src/client/web-process/util-conversation.vala, src/client/web-process/util-webkit.vala: Remove obsolete code.
2016-11-25 16:30:50 +11:00
loadRemoteImages: function() {
this.allowRemoteImages = true;
let images = document.getElementsByTagName("IMG");
for (let i = 0; i < images.length; i++) {
let img = images.item(i);
let src = img.src;
Re-implement remote image loading management for WebKit2. * src/client/components/client-web-view.vala (ClientWebView): Register for new remoteImageLoadBlocked message from JS. Add new ::remote_image_load_blocked signal to notify when a remote image load was blocked. Add ::allow_remote_image_loading and ::load_remote_images methods to allow th app to manage image loading state. * src/client/conversation-viewer/conversation-email.vala (ConversationEmail): Determine up front whether the message view should load remote images and flag that, rather than passing through the email flag and the contact store. * src/client/conversation-viewer/conversation-message.vala (ConversationMessage): Rmeove contact_store and always_load_remote_images properties and related code, just let the parent email view advise whether remote images should be initially loaded and act accordingly. Look up to ClientWebView signal and methods to handle manual remote image loading management by the user. Remove some obsolete code. * src/client/web-process/web-process-extension.vala (GearyWebExtension): Replace allow_prefix implementation for remote image management with explicit signalling to/from the application via JavaScript. * ui/client-web-view.js: Add a new PageState object, add props and method to implement remote image loading management. * ui/client-web-view-allow-remote-images.js: Monkeypatch to be used when remote images should be loaded by default. * ui/CMakeLists.txt: Include new JS file. * src/client/conversation-viewer/conversation-web-view.vala, src/client/web-process/util-conversation.vala, src/client/web-process/util-webkit.vala: Remove obsolete code.
2016-11-25 16:30:50 +11:00
img.src = "";
img.src = src;
}
},
remoteImageLoadBlocked: function() {
window.webkit.messageHandlers.remoteImageLoadBlocked.postMessage(null);
},
/**
* Sends "preferredHeightChanged" message if it has changed.
*/
updatePreferredHeight: function(height) {
if (height === undefined) {
height = this.getPreferredHeight();
}
let updated = false;
if (height > 0 && height != this.lastPreferredHeight) {
updated = true;
this.lastPreferredHeight = height;
window.webkit.messageHandlers.preferredHeightChanged.postMessage(
height
);
}
return updated;
},
selectionChanged: function() {
let hasSelection = !window.getSelection().isCollapsed;
if (this.hasSelection != hasSelection) {
this.hasSelection = hasSelection;
window.webkit.messageHandlers.selectionChanged.postMessage(hasSelection);
}
Re-implement remote image loading management for WebKit2. * src/client/components/client-web-view.vala (ClientWebView): Register for new remoteImageLoadBlocked message from JS. Add new ::remote_image_load_blocked signal to notify when a remote image load was blocked. Add ::allow_remote_image_loading and ::load_remote_images methods to allow th app to manage image loading state. * src/client/conversation-viewer/conversation-email.vala (ConversationEmail): Determine up front whether the message view should load remote images and flag that, rather than passing through the email flag and the contact store. * src/client/conversation-viewer/conversation-message.vala (ConversationMessage): Rmeove contact_store and always_load_remote_images properties and related code, just let the parent email view advise whether remote images should be initially loaded and act accordingly. Look up to ClientWebView signal and methods to handle manual remote image loading management by the user. Remove some obsolete code. * src/client/web-process/web-process-extension.vala (GearyWebExtension): Replace allow_prefix implementation for remote image management with explicit signalling to/from the application via JavaScript. * ui/client-web-view.js: Add a new PageState object, add props and method to implement remote image loading management. * ui/client-web-view-allow-remote-images.js: Monkeypatch to be used when remote images should be loaded by default. * ui/CMakeLists.txt: Include new JS file. * src/client/conversation-viewer/conversation-web-view.vala, src/client/web-process/util-conversation.vala, src/client/web-process/util-webkit.vala: Remove obsolete code.
2016-11-25 16:30:50 +11:00
}
};