| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h" | 5 #include "chrome/common/extensions/manifest_tests/extension_manifest_test.h" |
| 6 | 6 |
| 7 #include "base/string_number_conversions.h" | 7 #include "base/string_number_conversions.h" |
| 8 #include "base/utf_string_conversions.h" | 8 #include "base/utf_string_conversions.h" |
| 9 #include "chrome/common/extensions/extension_manifest_constants.h" | 9 #include "chrome/common/extensions/extension_manifest_constants.h" |
| 10 #include "extensions/common/error_utils.h" | 10 #include "extensions/common/error_utils.h" |
| 11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 12 #include "webkit/glue/web_intent_service_data.h" | |
| 13 | 12 |
| 14 using extensions::ErrorUtils; | 13 using extensions::ErrorUtils; |
| 15 using extensions::Extension; | 14 using extensions::Extension; |
| 16 | 15 |
| 17 namespace errors = extension_manifest_errors; | 16 namespace errors = extension_manifest_errors; |
| 18 | 17 |
| 19 TEST_F(ExtensionManifestTest, WebAccessibleResources) { | 18 TEST_F(ExtensionManifestTest, WebAccessibleResources) { |
| 20 // Manifest version 2 with web accessible resources specified. | 19 // Manifest version 2 with web accessible resources specified. |
| 21 scoped_refptr<Extension> extension1( | 20 scoped_refptr<Extension> extension1( |
| 22 LoadAndExpectSuccess("web_accessible_resources_1.json")); | 21 LoadAndExpectSuccess("web_accessible_resources_1.json")); |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 EXPECT_TRUE(extension4->IsResourceWebAccessible("none")); | 59 EXPECT_TRUE(extension4->IsResourceWebAccessible("none")); |
| 61 | 60 |
| 62 EXPECT_TRUE(extension5->IsResourceWebAccessible("anything")); | 61 EXPECT_TRUE(extension5->IsResourceWebAccessible("anything")); |
| 63 EXPECT_TRUE(extension5->IsResourceWebAccessible("path/anything")); | 62 EXPECT_TRUE(extension5->IsResourceWebAccessible("path/anything")); |
| 64 | 63 |
| 65 EXPECT_TRUE(extension6->IsResourceWebAccessible("path/anything.ext")); | 64 EXPECT_TRUE(extension6->IsResourceWebAccessible("path/anything.ext")); |
| 66 EXPECT_FALSE(extension6->IsResourceWebAccessible("anything.ext")); | 65 EXPECT_FALSE(extension6->IsResourceWebAccessible("anything.ext")); |
| 67 EXPECT_FALSE(extension6->IsResourceWebAccessible("path/anything.badext")); | 66 EXPECT_FALSE(extension6->IsResourceWebAccessible("path/anything.badext")); |
| 68 } | 67 } |
| 69 | 68 |
| 70 TEST_F(ExtensionManifestTest, WebIntents) { | |
| 71 Testcase testcases[] = { | |
| 72 Testcase("intent_invalid_1.json", errors::kInvalidIntents), | |
| 73 Testcase("intent_invalid_2.json", errors::kInvalidIntent), | |
| 74 Testcase("intent_invalid_3.json", errors::kInvalidIntentHref), | |
| 75 Testcase("intent_invalid_4.json", errors::kInvalidIntentDisposition), | |
| 76 Testcase("intent_invalid_5.json", errors::kInvalidIntentType), | |
| 77 Testcase("intent_invalid_6.json", errors::kInvalidIntentTitle), | |
| 78 Testcase("intent_invalid_packaged_app.json", errors::kCannotAccessPage), | |
| 79 Testcase("intent_invalid_href_and_path.json", | |
| 80 errors::kInvalidIntentHrefOldAndNewKey), | |
| 81 Testcase("intent_invalid_multi_href.json", errors::kInvalidIntent) | |
| 82 }; | |
| 83 RunTestcases(testcases, arraysize(testcases), | |
| 84 EXPECT_TYPE_ERROR); | |
| 85 | |
| 86 scoped_refptr<Extension> extension( | |
| 87 LoadAndExpectSuccess("intent_valid.json")); | |
| 88 ASSERT_TRUE(extension.get() != NULL); | |
| 89 | |
| 90 ASSERT_EQ(1u, extension->intents_services().size()); | |
| 91 EXPECT_EQ("image/png", UTF16ToUTF8(extension->intents_services()[0].type)); | |
| 92 EXPECT_EQ("http://webintents.org/share", | |
| 93 UTF16ToUTF8(extension->intents_services()[0].action)); | |
| 94 EXPECT_EQ("chrome-extension", | |
| 95 extension->intents_services()[0].service_url.scheme()); | |
| 96 EXPECT_EQ("/services/share", | |
| 97 extension->intents_services()[0].service_url.path()); | |
| 98 EXPECT_EQ("Sample Sharing Intent", | |
| 99 UTF16ToUTF8(extension->intents_services()[0].title)); | |
| 100 EXPECT_EQ(webkit_glue::WebIntentServiceData::DISPOSITION_INLINE, | |
| 101 extension->intents_services()[0].disposition); | |
| 102 | |
| 103 // Verify that optional fields are filled with defaults. | |
| 104 extension = LoadAndExpectSuccess("intent_valid_minimal.json"); | |
| 105 ASSERT_TRUE(extension.get() != NULL); | |
| 106 | |
| 107 ASSERT_EQ(1u, extension->intents_services().size()); | |
| 108 EXPECT_EQ("*", UTF16ToUTF8(extension->intents_services()[0].type)); | |
| 109 EXPECT_EQ("http://webintents.org/share", | |
| 110 UTF16ToUTF8(extension->intents_services()[0].action)); | |
| 111 EXPECT_EQ("", UTF16ToUTF8(extension->intents_services()[0].title)); | |
| 112 EXPECT_EQ(webkit_glue::WebIntentServiceData::DISPOSITION_WINDOW, | |
| 113 extension->intents_services()[0].disposition); | |
| 114 | |
| 115 // Make sure we support href instead of path. | |
| 116 extension = LoadAndExpectSuccess("intent_valid_using_href.json"); | |
| 117 ASSERT_TRUE(extension.get() != NULL); | |
| 118 ASSERT_EQ(1u, extension->intents_services().size()); | |
| 119 EXPECT_EQ("/services/share", | |
| 120 extension->intents_services()[0].service_url.path()); | |
| 121 } | |
| 122 | |
| 123 TEST_F(ExtensionManifestTest, WebIntentsWithMultipleMimeTypes) { | |
| 124 scoped_refptr<Extension> extension( | |
| 125 LoadAndExpectSuccess("intent_valid_multitype.json")); | |
| 126 ASSERT_TRUE(extension.get() != NULL); | |
| 127 | |
| 128 ASSERT_EQ(2u, extension->intents_services().size()); | |
| 129 | |
| 130 // One registration with multiple types generates a separate service for | |
| 131 // each MIME type. | |
| 132 for (int i = 0; i < 2; ++i) { | |
| 133 EXPECT_EQ("http://webintents.org/share", | |
| 134 UTF16ToUTF8(extension->intents_services()[i].action)); | |
| 135 EXPECT_EQ("chrome-extension", | |
| 136 extension->intents_services()[i].service_url.scheme()); | |
| 137 EXPECT_EQ("/services/share", | |
| 138 extension->intents_services()[i].service_url.path()); | |
| 139 EXPECT_EQ("Sample Sharing Intent", | |
| 140 UTF16ToUTF8(extension->intents_services()[i].title)); | |
| 141 EXPECT_EQ(webkit_glue::WebIntentServiceData::DISPOSITION_INLINE, | |
| 142 extension->intents_services()[i].disposition); | |
| 143 } | |
| 144 EXPECT_EQ("image/jpeg", UTF16ToUTF8(extension->intents_services()[0].type)); | |
| 145 EXPECT_EQ("image/bmp", UTF16ToUTF8(extension->intents_services()[1].type)); | |
| 146 | |
| 147 LoadAndExpectError("intent_invalid_type_element.json", | |
| 148 extension_manifest_errors::kInvalidIntentTypeElement); | |
| 149 } | |
| 150 | |
| 151 TEST_F(ExtensionManifestTest, WebIntentsInHostedApps) { | |
| 152 Testcase testcases[] = { | |
| 153 Testcase("intent_invalid_hosted_app_1.json", | |
| 154 errors::kInvalidIntentPageInHostedApp), | |
| 155 Testcase("intent_invalid_hosted_app_2.json", | |
| 156 errors::kInvalidIntentPageInHostedApp), | |
| 157 Testcase("intent_invalid_hosted_app_3.json", | |
| 158 errors::kInvalidIntentPageInHostedApp) | |
| 159 }; | |
| 160 RunTestcases(testcases, arraysize(testcases), | |
| 161 EXPECT_TYPE_ERROR); | |
| 162 | |
| 163 scoped_refptr<Extension> extension( | |
| 164 LoadAndExpectSuccess("intent_valid_hosted_app.json")); | |
| 165 ASSERT_TRUE(extension.get() != NULL); | |
| 166 | |
| 167 ASSERT_EQ(3u, extension->intents_services().size()); | |
| 168 | |
| 169 EXPECT_EQ("http://www.cfp.com/intents/edit.html", | |
| 170 extension->intents_services()[0].service_url.spec()); | |
| 171 EXPECT_EQ("http://www.cloudfilepicker.com/", | |
| 172 extension->intents_services()[1].service_url.spec()); | |
| 173 EXPECT_EQ("http://www.cloudfilepicker.com/intents/share.html", | |
| 174 extension->intents_services()[2].service_url.spec()); | |
| 175 } | |
| 176 | |
| 177 TEST_F(ExtensionManifestTest, WebIntentsMultiHref) { | |
| 178 scoped_refptr<Extension> extension( | |
| 179 LoadAndExpectSuccess("intent_valid_multi_href.json")); | |
| 180 ASSERT_TRUE(extension.get() != NULL); | |
| 181 ASSERT_EQ(2u, extension->intents_services().size()); | |
| 182 | |
| 183 const std::vector<webkit_glue::WebIntentServiceData> &intents = | |
| 184 extension->intents_services(); | |
| 185 | |
| 186 EXPECT_EQ("chrome-extension", intents[0].service_url.scheme()); | |
| 187 EXPECT_EQ("/services/sharelink.html",intents[0].service_url.path()); | |
| 188 EXPECT_EQ("text/uri-list",UTF16ToUTF8(intents[0].type)); | |
| 189 | |
| 190 EXPECT_EQ("chrome-extension", intents[1].service_url.scheme()); | |
| 191 EXPECT_EQ("/services/shareimage.html",intents[1].service_url.path()); | |
| 192 EXPECT_EQ("image/*",UTF16ToUTF8(intents[1].type)); | |
| 193 } | |
| 194 | |
| 195 TEST_F(ExtensionManifestTest, WebIntentsBlankHref) { | |
| 196 LoadAndExpectError("intent_invalid_blank_action_extension.json", | |
| 197 errors::kInvalidIntentHrefEmpty); | |
| 198 | |
| 199 scoped_refptr<Extension> extension( | |
| 200 LoadAndExpectSuccess("intent_valid_blank_action_hosted.json")); | |
| 201 ASSERT_TRUE(extension.get() != NULL); | |
| 202 ASSERT_EQ(1u, extension->intents_services().size()); | |
| 203 EXPECT_EQ("http://www.cloudfilepicker.com/", | |
| 204 extension->intents_services()[0].service_url.spec()); | |
| 205 | |
| 206 extension = LoadAndExpectSuccess("intent_valid_blank_action_packaged.json"); | |
| 207 ASSERT_TRUE(extension.get() != NULL); | |
| 208 ASSERT_EQ(1u, extension->intents_services().size()); | |
| 209 EXPECT_EQ("chrome-extension", | |
| 210 extension->intents_services()[0].service_url.scheme()); | |
| 211 EXPECT_EQ("/main.html",extension->intents_services()[0].service_url.path()); | |
| 212 } | |
| 213 | |
| 214 TEST_F(ExtensionManifestTest, AppWebUrls) { | 69 TEST_F(ExtensionManifestTest, AppWebUrls) { |
| 215 Testcase testcases[] = { | 70 Testcase testcases[] = { |
| 216 Testcase("web_urls_wrong_type.json", errors::kInvalidWebURLs), | 71 Testcase("web_urls_wrong_type.json", errors::kInvalidWebURLs), |
| 217 Testcase("web_urls_invalid_1.json", | 72 Testcase("web_urls_invalid_1.json", |
| 218 ErrorUtils::FormatErrorMessage( | 73 ErrorUtils::FormatErrorMessage( |
| 219 errors::kInvalidWebURL, | 74 errors::kInvalidWebURL, |
| 220 base::IntToString(0), | 75 base::IntToString(0), |
| 221 errors::kExpectString)), | 76 errors::kExpectString)), |
| 222 Testcase("web_urls_invalid_2.json", | 77 Testcase("web_urls_invalid_2.json", |
| 223 ErrorUtils::FormatErrorMessage( | 78 ErrorUtils::FormatErrorMessage( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 245 EXPECT_TYPE_ERROR); | 100 EXPECT_TYPE_ERROR); |
| 246 | 101 |
| 247 LoadAndExpectSuccess("web_urls_has_port.json"); | 102 LoadAndExpectSuccess("web_urls_has_port.json"); |
| 248 | 103 |
| 249 scoped_refptr<Extension> extension( | 104 scoped_refptr<Extension> extension( |
| 250 LoadAndExpectSuccess("web_urls_default.json")); | 105 LoadAndExpectSuccess("web_urls_default.json")); |
| 251 ASSERT_EQ(1u, extension->web_extent().patterns().size()); | 106 ASSERT_EQ(1u, extension->web_extent().patterns().size()); |
| 252 EXPECT_EQ("*://www.google.com/*", | 107 EXPECT_EQ("*://www.google.com/*", |
| 253 extension->web_extent().patterns().begin()->GetAsString()); | 108 extension->web_extent().patterns().begin()->GetAsString()); |
| 254 } | 109 } |
| OLD | NEW |