Go to the documentation of this file.
19package org.sleuthkit.autopsy.contentviewers;
21import java.io.IOException;
22import java.io.StringReader;
24import java.util.logging.Level;
25import org.sleuthkit.autopsy.coreutils.Logger;
26import javafx.application.Platform;
27import javafx.beans.value.ChangeListener;
28import javafx.beans.value.ObservableValue;
29import javafx.concurrent.Worker;
30import javafx.scene.web.WebView;
31import javafx.embed.swing.JFXPanel;
32import javafx.scene.Scene;
33import net.htmlparser.jericho.Attribute;
34import net.htmlparser.jericho.OutputDocument;
35import net.htmlparser.jericho.Source;
36import org.openide.util.NbBundle.Messages;
37import org.w3c.dom.Document;
38import org.w3c.dom.NodeList;
39import org.w3c.dom.events.EventTarget;
44@SuppressWarnings(
"PMD.SingularField")
45public final class
HtmlPanel extends javax.swing.JPanel {
49 private static final String
TEXT_TYPE =
"text/plain";
50 private final JFXPanel
jfxPanel =
new JFXPanel();
59 Platform.runLater(() -> {
62 webView.setContextMenuEnabled(
false);
64 webView.getEngine().setJavaScriptEnabled(
false);
66 webView.getEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener<Worker.State>() {
68 public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
69 if (newValue == Worker.State.SUCCEEDED) {
74 Scene scene =
new Scene(
webView);
95 Platform.runLater(() -> {
109 String returnString =
"";
111 Source source =
new Source(
new StringReader(htmlInString));
112 OutputDocument document =
new OutputDocument(source);
114 source.getAllTags().stream().filter((tag) -> (tag.toString().contains(
"background-image"))).forEachOrdered((tag) -> {
115 document.remove(tag);
118 source.getAllElements(
"img").forEach((element) -> {
119 document.remove(element.getAllTags());
122 source.getAllElements(
"frame").forEach((element) -> {
123 document.remove(element.getAllTags());
126 source.getAllElements(
"iframe").forEach((element) -> {
127 document.remove(element.getAllTags());
130 source.getAllElements(
"picture").forEach((element) -> {
131 document.remove(element.getAllTags());
134 source.getAllElements(
"svg").forEach((element) -> {
135 document.remove(element.getAllTags());
138 source.getAllElements(
"audio").forEach((element) -> {
139 document.remove(element.getAllTags());
142 source.getAllElements(
"video").forEach((element) -> {
143 document.remove(element.getAllTags());
146 source.getAllElements(
"track").forEach((element) -> {
147 document.remove(element.getAllTags());
150 source.getAllElements(
"embed").forEach((element) -> {
151 document.remove(element.getAllTags());
154 source.getAllElements(
"link").forEach((element) -> {
155 document.remove(element.getAllTags());
158 List<Attribute> attributesToRemove = source.getURIAttributes();
159 document.remove(attributesToRemove);
160 returnString = document.toString();
161 }
catch (IOException ex) {
162 logger.log(Level.WARNING,
"Unable to read html for cleaning out URI elements with Jericho", ex);
171 "HtmlPanel_showImagesToggleButton_show=Download Images",
172 "HtmlPanel_showImagesToggleButton_hide=Hide Images",
173 "Html_text_display_error=The HTML text cannot be displayed, it may not be correctly formed HTML.",})
179 Platform.runLater(() -> {
184 Platform.runLater(() -> {
189 }
catch (Exception ignored) {
190 Platform.runLater(() -> {
191 webView.getEngine().loadContent(Bundle.Html_text_display_error(),
TEXT_TYPE);
202 @SuppressWarnings(
"unchecked")
209 org.openide.awt.Mnemonics.setLocalizedText(
showImagesToggleButton, org.openide.util.NbBundle.getMessage(
HtmlPanel.class,
"HtmlPanel.showImagesToggleButton.text"));
211 public void actionPerformed(java.awt.event.ActionEvent evt) {
212 showImagesToggleButtonActionPerformed(evt);
216 htmlJPanel.setLayout(
new java.awt.BorderLayout());
218 javax.swing.GroupLayout
layout =
new javax.swing.GroupLayout(
this);
220 layout.setHorizontalGroup(
221 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
222 .addGroup(
layout.createSequentialGroup()
223 .addComponent(showImagesToggleButton)
224 .addGap(0, 75, Short.MAX_VALUE))
225 .addComponent(htmlJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
228 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
229 .addGroup(
layout.createSequentialGroup()
230 .addComponent(showImagesToggleButton)
231 .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
232 .addComponent(htmlJPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 33, Short.MAX_VALUE))
245 Platform.runLater(() -> {
246 Document document =
webView.getEngine().getDocument();
247 if (document !=
null) {
248 NodeList nodeList = document.getElementsByTagName(
"a");
249 for (
int i = 0; i < nodeList.getLength(); i++) {
250 ((EventTarget) nodeList.item(i)).addEventListener(
"click", (evt) -> {
251 evt.preventDefault();
252 evt.stopPropagation();
void showImagesToggleButtonActionPerformed(java.awt.event.ActionEvent evt)
static final String TEXT_TYPE
static final long serialVersionUID
void setHtmlText(String htmlText)
javax.swing.JToggleButton showImagesToggleButton
static final Logger logger
javax.swing.JPanel htmlJPanel
String cleanseHTML(String htmlInString)
synchronized static Logger getLogger(String name)
Copyright © 2012-2024 Sleuth Kit Labs. Generated on:
This work is licensed under a
Creative Commons Attribution-Share Alike 3.0 United States License.