Introduce HtmlProcessor

This commit is contained in:
cketti 2017-04-29 01:45:28 +02:00
parent 0627ff5f87
commit febb7448dd
4 changed files with 57 additions and 47 deletions

View file

@ -10,14 +10,9 @@ import android.content.Context;
import android.support.annotation.Nullable;
import android.support.annotation.VisibleForTesting;
import android.support.annotation.WorkerThread;
import timber.log.Timber;
import com.fsck.k9.Globals;
import com.fsck.k9.K9;
import com.fsck.k9.R;
import com.fsck.k9.mail.internet.MimeUtility;
import com.fsck.k9.message.html.HtmlConverter;
import com.fsck.k9.message.html.HtmlSanitizer;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Flag;
import com.fsck.k9.mail.Message;
@ -28,9 +23,12 @@ import com.fsck.k9.mail.internet.Viewable;
import com.fsck.k9.mail.internet.Viewable.Flowed;
import com.fsck.k9.mailstore.util.FlowedMessageUtils;
import com.fsck.k9.message.extractors.AttachmentInfoExtractor;
import com.fsck.k9.message.html.HtmlConverter;
import com.fsck.k9.message.html.HtmlProcessor;
import com.fsck.k9.ui.crypto.MessageCryptoAnnotations;
import com.fsck.k9.ui.crypto.MessageCryptoSplitter;
import com.fsck.k9.ui.crypto.MessageCryptoSplitter.CryptoMessageParts;
import timber.log.Timber;
import static com.fsck.k9.mail.internet.MimeUtility.getHeaderParameter;
import static com.fsck.k9.mail.internet.Viewable.Alternative;
@ -51,22 +49,22 @@ public class MessageViewInfoExtractor {
private final Context context;
private final AttachmentInfoExtractor attachmentInfoExtractor;
private final HtmlSanitizer htmlSanitizer;
private final HtmlProcessor htmlProcessor;
public static MessageViewInfoExtractor getInstance() {
Context context = Globals.getContext();
AttachmentInfoExtractor attachmentInfoExtractor = AttachmentInfoExtractor.getInstance();
HtmlSanitizer htmlSanitizer = HtmlSanitizer.getInstance();
return new MessageViewInfoExtractor(context, attachmentInfoExtractor, htmlSanitizer);
HtmlProcessor htmlProcessor = HtmlProcessor.newInstance();
return new MessageViewInfoExtractor(context, attachmentInfoExtractor, htmlProcessor);
}
@VisibleForTesting
MessageViewInfoExtractor(Context context, AttachmentInfoExtractor attachmentInfoExtractor,
HtmlSanitizer htmlSanitizer) {
HtmlProcessor htmlProcessor) {
this.context = context;
this.attachmentInfoExtractor = attachmentInfoExtractor;
this.htmlSanitizer = htmlSanitizer;
this.htmlProcessor = htmlProcessor;
}
@WorkerThread
@ -199,8 +197,7 @@ public class MessageViewInfoExtractor {
}
}
String content = HtmlConverter.wrapMessageContent(html);
String sanitizedHtml = htmlSanitizer.sanitize(content);
String sanitizedHtml = htmlProcessor.processForDisplay(html.toString());
return new ViewableExtractedText(text.toString(), sanitizedHtml);
} catch (Exception e) {

View file

@ -0,0 +1,21 @@
package com.fsck.k9.message.html;
public class HtmlProcessor {
private final HtmlSanitizer htmlSanitizer;
public static HtmlProcessor newInstance() {
HtmlSanitizer htmlSanitizer = HtmlSanitizer.getInstance();
return new HtmlProcessor(htmlSanitizer);
}
private HtmlProcessor(HtmlSanitizer htmlSanitizer) {
this.htmlSanitizer = htmlSanitizer;
}
public String processForDisplay(String html) {
String wrappedHtml = HtmlConverter.wrapMessageContent(html);
return htmlSanitizer.sanitize(wrappedHtml);
}
}

View file

@ -12,8 +12,6 @@ import android.app.Application;
import com.fsck.k9.GlobalsHelper;
import com.fsck.k9.K9RobolectricTestRunner;
import com.fsck.k9.message.html.HtmlSanitizer;
import com.fsck.k9.message.html.HtmlSanitizerHelper;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Message.RecipientType;
import com.fsck.k9.mail.MessagingException;
@ -28,14 +26,17 @@ import com.fsck.k9.mail.internet.TextBody;
import com.fsck.k9.mail.internet.Viewable;
import com.fsck.k9.mail.internet.Viewable.MessageHeader;
import com.fsck.k9.mailstore.MessageViewInfoExtractor.ViewableExtractedText;
import com.fsck.k9.message.html.HtmlProcessor;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.robolectric.RuntimeEnvironment;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertSame;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@ -57,10 +58,8 @@ public class MessageViewInfoExtractorTest {
GlobalsHelper.setContext(context);
HtmlSanitizer dummyHtmlSanitizer = HtmlSanitizerHelper.getDummyHtmlSanitizer();
messageViewInfoExtractor = new MessageViewInfoExtractor(context,
null, dummyHtmlSanitizer);
HtmlProcessor htmlProcessor = createFakeHtmlProcessor();
messageViewInfoExtractor = new MessageViewInfoExtractor(context,null, htmlProcessor);
}
@Test
@ -74,11 +73,11 @@ public class MessageViewInfoExtractorTest {
message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/plain; format=flowed");
// Prepare fixture
HtmlSanitizer htmlSanitizer = mock(HtmlSanitizer.class);
HtmlProcessor htmlProcessor = mock(HtmlProcessor.class);
MessageViewInfoExtractor messageViewInfoExtractor =
new MessageViewInfoExtractor(context, null, htmlSanitizer);
new MessageViewInfoExtractor(context, null, htmlProcessor);
String value = "--sanitized html--";
when(htmlSanitizer.sanitize(any(String.class))).thenReturn(value);
when(htmlProcessor.processForDisplay(anyString())).thenReturn(value);
// Extract text
List<Part> outputNonViewableParts = new ArrayList<>();
@ -113,7 +112,7 @@ public class MessageViewInfoExtractorTest {
"</pre>";
assertEquals(expectedText, container.text);
assertEquals(expectedHtml, getHtmlBodyText(container.html));
assertEquals(expectedHtml, container.html);
}
@Test
@ -140,7 +139,7 @@ public class MessageViewInfoExtractorTest {
"</pre>";
assertEquals(expectedText, container.text);
assertEquals(expectedHtml, getHtmlBodyText(container.html));
assertEquals(expectedHtml, container.html);
}
@Test
@ -166,7 +165,7 @@ public class MessageViewInfoExtractorTest {
bodyText;
assertEquals(expectedText, container.text);
assertEquals(expectedHtml, getHtmlBodyText(container.html));
assertEquals(expectedHtml, container.html);
}
@Test
@ -211,7 +210,7 @@ public class MessageViewInfoExtractorTest {
assertEquals(expectedText, container.text);
assertEquals(expectedHtml, getHtmlBodyText(container.html));
assertEquals(expectedHtml, container.html);
}
@Test
@ -229,7 +228,7 @@ public class MessageViewInfoExtractorTest {
// Create message/rfc822 body
MimeMessage innerMessage = new MimeMessage();
innerMessage.addSentDate(new Date(112, 02, 17), false);
innerMessage.addSentDate(new Date(112, 2, 17), false);
innerMessage.setRecipients(RecipientType.TO, new Address[] { new Address("to@example.com") });
innerMessage.setSubject("Subject");
innerMessage.setFrom(new Address("from@example.com"));
@ -290,7 +289,7 @@ public class MessageViewInfoExtractorTest {
"</pre>";
assertEquals(expectedText, container.text);
assertEquals(expectedHtml, getHtmlBodyText(container.html));
assertEquals(expectedHtml, container.html);
}
@Test
@ -355,13 +354,19 @@ public class MessageViewInfoExtractorTest {
ViewableExtractedText firstMessageExtractedText =
messageViewInfoExtractor.extractTextFromViewables(outputViewableParts);
assertEquals(expectedExtractedText, firstMessageExtractedText.text);
assertEquals(expectedHtmlText, getHtmlBodyText(firstMessageExtractedText.html));
assertEquals(expectedHtmlText, firstMessageExtractedText.html);
}
private static String getHtmlBodyText(String htmlText) {
htmlText = htmlText.substring(htmlText.indexOf("<body>") +6);
htmlText = htmlText.substring(0, htmlText.indexOf("</body>"));
return htmlText;
}
HtmlProcessor createFakeHtmlProcessor() {
HtmlProcessor htmlProcessor = mock(HtmlProcessor.class);
when(htmlProcessor.processForDisplay(anyString())).thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return (String) invocation.getArguments()[0];
}
});
return htmlProcessor;
}
}

View file

@ -1,13 +0,0 @@
package com.fsck.k9.message.html;
public class HtmlSanitizerHelper {
public static HtmlSanitizer getDummyHtmlSanitizer() {
return new HtmlSanitizer() {
@Override
public String sanitize(String html) {
return html;
}
};
}
}