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
3 // found in the LICENSE file.
5 #include "chrome/renderer/chrome_content_renderer_client.h"
7 #include "base/utf_string_conversions.h"
8 #include "googleurl/src/gurl.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "third_party/WebKit/Source/Platform/chromium/public/WebString.h"
11 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebVector.h"
12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h"
13 #include "webkit/plugins/webplugininfo.h"
15 using WebKit::WebPluginParams
;
16 using WebKit::WebString
;
17 using WebKit::WebVector
;
18 using chrome::ChromeContentRendererClient
;
19 using webkit::WebPluginInfo
;
20 using webkit::WebPluginMimeType
;
25 const bool kNaClRestricted
= false;
26 const bool kNaClUnrestricted
= true;
27 const bool kExtensionRestricted
= false;
28 const bool kExtensionUnrestricted
= true;
29 const bool kExtensionNotFromWebStore
= false;
30 const bool kExtensionFromWebStore
= true;
32 const char kNaClMimeType
[] = "application/x-nacl";
34 bool AllowsDevInterfaces(const WebPluginParams
& params
) {
35 for (size_t i
= 0; i
< params
.attributeNames
.size(); ++i
) {
36 if (params
.attributeNames
[i
] == WebString::fromUTF8("@dev"))
42 void AddFakeDevAttribute(WebPluginParams
* params
) {
43 WebVector
<WebString
> names(static_cast<size_t>(1));
44 WebVector
<WebString
> values(static_cast<size_t>(1));
45 names
[0] = WebString::fromUTF8("@dev");
46 values
[0] = WebString();
47 params
->attributeNames
.swap(names
);
48 params
->attributeValues
.swap(values
);
51 void AddContentTypeHandler(WebPluginInfo
* info
,
52 const char* mime_type
,
53 const char* manifest_url
) {
54 WebPluginMimeType mime_type_info
;
55 mime_type_info
.mime_type
= mime_type
;
56 mime_type_info
.additional_param_names
.push_back(UTF8ToUTF16("nacl"));
57 mime_type_info
.additional_param_values
.push_back(
58 UTF8ToUTF16(manifest_url
));
59 info
->mime_types
.push_back(mime_type_info
);
63 typedef testing::Test ChromeContentRendererClientTest
;
65 TEST_F(ChromeContentRendererClientTest
, NaClRestriction
) {
66 // Unknown content types have no NaCl module.
70 ChromeContentRendererClient::GetNaClContentHandlerURL(
71 "application/x-foo", info
));
73 // Known content types have a NaCl module.
76 AddContentTypeHandler(&info
, "application/x-foo", "www.foo.com");
77 EXPECT_EQ(GURL("www.foo.com"),
78 ChromeContentRendererClient::GetNaClContentHandlerURL(
79 "application/x-foo", info
));
81 // --enable-nacl allows all NaCl apps, with 'dev' interfaces.
83 WebPluginParams params
;
84 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
85 GURL(), GURL(), kNaClUnrestricted
, kExtensionRestricted
,
86 kExtensionNotFromWebStore
, ¶ms
));
87 EXPECT_TRUE(AllowsDevInterfaces(params
));
89 // Unrestricted extensions are allowed without --enable-nacl, with 'dev'
92 WebPluginParams params
;
93 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
94 GURL(), GURL(), kNaClRestricted
, kExtensionUnrestricted
,
95 kExtensionNotFromWebStore
, ¶ms
));
96 EXPECT_TRUE(AllowsDevInterfaces(params
));
98 // CWS extensions are allowed without --enable-nacl, without 'dev'
101 WebPluginParams params
;
102 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
103 GURL(), GURL(), kNaClRestricted
, kExtensionRestricted
,
104 kExtensionFromWebStore
, ¶ms
));
105 EXPECT_FALSE(AllowsDevInterfaces(params
));
107 // CWS extensions can't get 'dev' interfaces with --enable-nacl.
109 WebPluginParams params
;
110 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
111 GURL(), GURL(), kNaClUnrestricted
, kExtensionRestricted
,
112 kExtensionFromWebStore
, ¶ms
));
113 EXPECT_FALSE(AllowsDevInterfaces(params
));
115 // CWS extensions can't get 'dev' interfaces by injecting a fake
118 WebPluginParams params
;
119 AddFakeDevAttribute(¶ms
);
120 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
121 GURL(), GURL(), kNaClRestricted
, kExtensionRestricted
,
122 kExtensionFromWebStore
, ¶ms
));
123 EXPECT_FALSE(AllowsDevInterfaces(params
));
125 // The NaCl PDF extension is allowed without --enable-nacl, with 'dev'
128 WebPluginParams params
;
129 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
130 GURL("chrome-extension://acadkphlmlegjaadjagenfimbpphcgnh"),
131 GURL(), kNaClRestricted
, kExtensionRestricted
,
132 kExtensionFromWebStore
, ¶ms
));
133 EXPECT_TRUE(AllowsDevInterfaces(params
));
135 // Whitelisted URLs are allowed without --enable-nacl, without 'dev'
138 WebPluginParams params
;
139 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
140 GURL(), GURL("http://plus.google.com/games"),
141 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
143 EXPECT_FALSE(AllowsDevInterfaces(params
));
144 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
145 GURL(), GURL("https://plus.google.com/games"),
146 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
148 EXPECT_FALSE(AllowsDevInterfaces(params
));
149 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
150 GURL(), GURL("https://plus.google.com/games/209089085730"),
151 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
153 EXPECT_FALSE(AllowsDevInterfaces(params
));
154 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
155 GURL(), GURL("http://plus.sandbox.google.com/games"),
156 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
158 EXPECT_FALSE(AllowsDevInterfaces(params
));
159 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
160 GURL(), GURL("https://plus.sandbox.google.com/games"),
161 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
163 EXPECT_FALSE(AllowsDevInterfaces(params
));
164 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
165 GURL(), GURL("https://plus.google.com/games/209089085730"),
166 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
168 EXPECT_FALSE(AllowsDevInterfaces(params
));
170 // Whitelisted URLs can't get 'dev' interfaces with --enable-nacl.
172 WebPluginParams params
;
173 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
174 GURL(), GURL("https://plus.google.com/games/209089085730"),
175 kNaClUnrestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
177 EXPECT_FALSE(AllowsDevInterfaces(params
));
179 // Whitelisted URLs can't get 'dev' interfaces by injecting a fake
182 WebPluginParams params
;
183 AddFakeDevAttribute(¶ms
);
184 EXPECT_TRUE(ChromeContentRendererClient::IsNaClAllowed(
185 GURL(), GURL("https://plus.google.com/games/209089085730"),
186 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
188 EXPECT_FALSE(AllowsDevInterfaces(params
));
190 // Non-whitelisted URLs are blocked without --enable-nacl.
192 WebPluginParams params
;
193 EXPECT_FALSE(ChromeContentRendererClient::IsNaClAllowed(
194 GURL(), GURL("http://plus.google.com.evil.com/games"),
195 kNaClRestricted
, kExtensionRestricted
, kExtensionNotFromWebStore
,
200 } // namespace chrome