1 /* 2 * Copyright (C) 2012 Google Inc. 3 * Licensed to The Android Open Source Project. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.android.mail.ui; 19 20 import android.test.AndroidTestCase; 21 import android.test.suitebuilder.annotation.SmallTest; 22 23 import com.android.mail.ui.HtmlConversationTemplates; 24 25 import junit.framework.ComparisonFailure; 26 27 public class ImgSrcReplacementTest extends AndroidTestCase { 28 29 private static void replace(final String input, final String expectedOutput) { 30 assertEquals(expectedOutput, HtmlConversationTemplates.replaceAbsoluteImgUrls(input)); 31 } 32 33 @SmallTest 34 public void testSimple() { 35 replace( 36 "<img src=\"http://google.com/favicon.ico\">", 37 "<img src='data:' blocked-src=\"http://google.com/favicon.ico\">" 38 ); 39 } 40 41 @SmallTest 42 public void testSimpleSingleQuotes() { 43 replace( 44 "<img src='http://google.com/favicon.ico'>", 45 "<img src='data:' blocked-src='http://google.com/favicon.ico'>" 46 ); 47 } 48 49 @SmallTest 50 public void testSimpleNoQuotes() { 51 replace( 52 "<img src=http://google.com/favicon.ico>", 53 "<img src='data:' blocked-src=http://google.com/favicon.ico>" 54 ); 55 } 56 57 @SmallTest 58 public void testWithElementId() { 59 replace( 60 "<img id=\"foo\" src=\"http://google.com/favicon.ico\">", 61 "<img id=\"foo\" src='data:' blocked-src=\"http://google.com/favicon.ico\">" 62 ); 63 } 64 65 @SmallTest 66 public void testWithElementIdAndAltAttr() { 67 replace( 68 "<img id=\"foo\" src=\"http://google.com/favicon.ico\" alt='foo'>", 69 "<img id=\"foo\" src='data:' blocked-src=\"http://google.com/favicon.ico\" alt='foo'>" 70 ); 71 } 72 73 @SmallTest 74 public void testHttps() { 75 replace( 76 "<img src=\"https://google.com/favicon.ico\">", 77 "<img src='data:' blocked-src=\"https://google.com/favicon.ico\">" 78 ); 79 } 80 81 @SmallTest 82 public void testRelativeUrl() { 83 // should not modify 84 replace( 85 "<img src=\"?foo1234\">", 86 "<img src=\"?foo1234\">" 87 ); 88 } 89 90 @SmallTest 91 public void testNoSrcAttr() { 92 // should not modify 93 replace( 94 "<img id='foo' width='500' alt='foo'>", 95 "<img id='foo' width='500' alt='foo'>" 96 ); 97 } 98 99 @SmallTest 100 public void testSrcElsewhere() { 101 replace( 102 "<img id='foo' width='500' src='http://google.com' alt='foo'> src=httplawl", 103 "<img id='foo' width='500' src='data:' blocked-src='http://google.com' alt='foo'> src=httplawl" 104 ); 105 } 106 107 @SmallTest 108 public void testWithInnerWhitespace() { 109 replace( 110 "< img src = \"http://google.com/favicon.ico\" >", 111 "< img src='data:' blocked-src = \"http://google.com/favicon.ico\" >" 112 ); 113 } 114 115 @SmallTest 116 public void testValueWithTheWordSrc() { 117 replace( 118 "<img src=\"http://google.com/foo?src=http%3A%2F%2Fgoogle.com\">", 119 "<img src='data:' blocked-src=\"http://google.com/foo?src=http%3A%2F%2Fgoogle.com\">" 120 ); 121 } 122 123 @SmallTest 124 public void testWithOtherAttrsAndValueWithTheWordSrc() { 125 replace( 126 "<img id='src' src=\"http://google.com/foo?src=http%3A%2F%2Fgoogle.com\">", 127 "<img id='src' src='data:' blocked-src=\"http://google.com/foo?src=http%3A%2F%2Fgoogle.com\">" 128 ); 129 } 130 131 public void testValueWithTheWordSrcAndASpace() { 132 // Doesn't work, but this is not likely to be common. 133 // For a regex to handle this properly, it would have to avoid matching on attribute values, 134 // maybe by counting quotes. 135 try { 136 replace( 137 "<img src=\"http://google.com/foo? src=http%3A%2F%2Fgoogle.com\">", 138 "<img src='data:' blocked-src=\"http://google.com/foo? src=http%3A%2F%2Fgoogle.com\">" 139 ); 140 } catch (ComparisonFailure fail) { 141 System.out.println("passing known broken case"); 142 } 143 } 144 145 } 146