Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1272)

Side by Side Diff: content/renderer/browser_plugin/browser_plugin_browsertest.cc

Issue 10928237: Add support for parsing a 'partition' attribute on the <browser> tag. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moving to UTF-8 encoded strings and added test for multibyte characters. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "content/renderer/browser_plugin/browser_plugin_browsertest.h" 5 #include "content/renderer/browser_plugin/browser_plugin_browsertest.h"
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/path_service.h" 9 #include "base/path_service.h"
10 #include "content/common/browser_plugin_messages.h" 10 #include "content/common/browser_plugin_messages.h"
11 #include "content/public/common/content_constants.h" 11 #include "content/public/common/content_constants.h"
12 #include "content/renderer/browser_plugin/browser_plugin.h" 12 #include "content/renderer/browser_plugin/browser_plugin.h"
13 #include "content/renderer/browser_plugin/mock_browser_plugin.h" 13 #include "content/renderer/browser_plugin/mock_browser_plugin.h"
14 #include "content/renderer/browser_plugin/mock_browser_plugin_manager.h" 14 #include "content/renderer/browser_plugin/mock_browser_plugin_manager.h"
15 #include "content/renderer/render_thread_impl.h" 15 #include "content/renderer/render_thread_impl.h"
16 #include "content/renderer/renderer_webkitplatformsupport_impl.h" 16 #include "content/renderer/renderer_webkitplatformsupport_impl.h"
17 #include "content/shell/shell_main_delegate.h" 17 #include "content/shell/shell_main_delegate.h"
18 #include "skia/ext/platform_canvas.h" 18 #include "skia/ext/platform_canvas.h"
19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h" 19 #include "third_party/WebKit/Source/WebKit/chromium/public/WebCursorInfo.h"
20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h"
21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h" 21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebScriptSource.h"
22 22
23 namespace { 23 namespace {
24 const char kHTMLForBrowserPluginObject[] = 24 const char kHTMLForBrowserPluginObject[] =
25 "<object id='browserplugin' width='640px' height='480px'" 25 "<object id='browserplugin' width='640px' height='480px'"
26 " src='foo' type='%s'>"; 26 " src='foo' type='%s'>";
27 27
28 const char kHTMLForSourcelessPluginObject[] =
29 "<object id='browserplugin' width='640px' height='480px' type='%s'>";
30
31 const char kHTMLForPartitionedPluginObject[] =
32 "<object id='browserplugin' width='640px' height='480px'"
33 " src='foo' type='%s' partition='someid'>";
34
35 const char kHTMLForPartitionedPersistedPluginObject[] =
36 "<object id='browserplugin' width='640px' height='480px'"
37 " src='foo' type='%s' partition='persist:someid'>";
Charlie Reis 2012/09/18 22:09:33 Is it also worth testing one with a partition and
nasko 2012/09/18 22:56:20 If you agree with my comment about setting partiti
38
28 std::string GetHTMLForBrowserPluginObject() { 39 std::string GetHTMLForBrowserPluginObject() {
29 return StringPrintf(kHTMLForBrowserPluginObject, 40 return StringPrintf(kHTMLForBrowserPluginObject,
30 content::kBrowserPluginNewMimeType); 41 content::kBrowserPluginNewMimeType);
31 } 42 }
32 43
33 } 44 }
34 45
35 namespace content { 46 namespace content {
36 47
37 BrowserPluginTest::BrowserPluginTest() {} 48 BrowserPluginTest::BrowserPluginTest() {}
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 browser_plugin->DidNavigate(GURL(kGoogleURL)); 323 browser_plugin->DidNavigate(GURL(kGoogleURL));
313 EXPECT_EQ(kGoogleURL, ExecuteScriptAndReturnString("url")); 324 EXPECT_EQ(kGoogleURL, ExecuteScriptAndReturnString("url"));
314 325
315 ExecuteJavaScript(kRemoveEventListener); 326 ExecuteJavaScript(kRemoveEventListener);
316 browser_plugin->DidNavigate(GURL(kGoogleNewsURL)); 327 browser_plugin->DidNavigate(GURL(kGoogleNewsURL));
317 // The URL variable should not change because we've removed the event 328 // The URL variable should not change because we've removed the event
318 // listener. 329 // listener.
319 EXPECT_EQ(kGoogleURL, ExecuteScriptAndReturnString("url")); 330 EXPECT_EQ(kGoogleURL, ExecuteScriptAndReturnString("url"));
320 } 331 }
321 332
333
334 // Verify that the 'partition' attribute on the browser plugin is parsed
335 // correctly.
336 TEST_F(BrowserPluginTest, PartitionAttribute) {
337 std::string html = StringPrintf(kHTMLForPartitionedPluginObject,
338 content::kBrowserPluginNewMimeType);
339 LoadHTML(html.c_str());
340 std::string partition_value = ExecuteScriptAndReturnString(
341 "document.getElementById('browserplugin').partition");
342 EXPECT_STREQ("someid", partition_value.c_str());
343
344 html = StringPrintf(kHTMLForPartitionedPersistedPluginObject,
345 content::kBrowserPluginNewMimeType);
346 LoadHTML(html.c_str());
347 partition_value = ExecuteScriptAndReturnString(
348 "document.getElementById('browserplugin').partition");
349 EXPECT_STREQ("persist:someid", partition_value.c_str());
350
351 // Verify that once HTML has defined a source and partition, we cannot change
352 // the partition anymore.
353 ExecuteJavaScript(
354 "try {"
355 " document.getElementById('browserplugin').partition = 'foo';"
356 " document.title = 'success';"
357 "} catch (e) { document.title = e.message; }");
358 std::string title = ExecuteScriptAndReturnString("document.title");
359 EXPECT_STREQ("The object has already navigated.", title.c_str());
360
361 // Load a browser tag without 'src' defined.
362 html = StringPrintf(kHTMLForSourcelessPluginObject,
363 content::kBrowserPluginNewMimeType);
364 LoadHTML(html.c_str());
365
366 // Ensure we don't parse just "persist:" string and return exception.
367 ExecuteJavaScript(
368 "try {"
369 " document.getElementById('browserplugin').partition = 'persist:';"
370 " document.title = 'success';"
371 "} catch (e) { document.title = e.message; }");
372 title = ExecuteScriptAndReturnString("document.title");
373 EXPECT_STREQ("Invalid partition attribute.", title.c_str());
374
375 // Verify we can't set the partition attribute twice.
376 ExecuteJavaScript(
377 "document.getElementById('browserplugin').partition = 'foo'");
378 partition_value = ExecuteScriptAndReturnString(
379 "document.getElementById('browserplugin').partition");
380 EXPECT_STREQ("foo", partition_value.c_str());
381
382 ExecuteJavaScript(
383 "try {"
384 " document.getElementById('browserplugin').partition = 'bar';"
385 " document.title = 'success';"
386 "} catch (e) { document.title = e.message; }");
387 title = ExecuteScriptAndReturnString("document.title");
388 EXPECT_STREQ("The partition attribute has already been set.", title.c_str());
389 }
390
391 // Test to verify that after the first navigation, the partition attribute
392 // cannot be modified.
393 TEST_F(BrowserPluginTest, ImmutableAttributesAfterNavigation) {
394 std::string html = StringPrintf(kHTMLForSourcelessPluginObject,
395 content::kBrowserPluginNewMimeType);
396 LoadHTML(html.c_str());
397
398 ExecuteJavaScript(
399 "document.getElementById('browserplugin').partition = 'storage'");
400 std::string partition_value = ExecuteScriptAndReturnString(
401 "document.getElementById('browserplugin').partition");
402 EXPECT_STREQ("storage", partition_value.c_str());
403
404 std::string src_value = ExecuteScriptAndReturnString(
405 "document.getElementById('browserplugin').src");
406 EXPECT_STREQ("", src_value.c_str());
407
408 ExecuteJavaScript("document.getElementById('browserplugin').src = 'bar'");
409 {
410 const IPC::Message* msg =
411 browser_plugin_manager()->sink().GetUniqueMessageMatching(
412 BrowserPluginHostMsg_NavigateOrCreateGuest::ID);
413 ASSERT_TRUE(msg);
414
415 int instance_id;
416 long long frame_id;
417 std::string src;
418 BrowserPluginHostMsg_NavigateOrCreateGuest::Read(
419 msg,
420 &instance_id,
421 &frame_id,
422 &src);
423 EXPECT_STREQ("bar", src.c_str());
424 }
425
426 // Setting the partition should throw an exception and the value should not
427 // change.
428 ExecuteJavaScript(
429 "try {"
430 " document.getElementById('browserplugin').partition = 'someid';"
431 " document.title = 'success';"
432 "} catch (e) { document.title = e.message; }");
433
434 std::string title = ExecuteScriptAndReturnString("document.title");
435 EXPECT_STREQ("The object has already navigated.", title.c_str());
436
437 partition_value = ExecuteScriptAndReturnString(
438 "document.getElementById('browserplugin').partition");
439 EXPECT_STREQ("storage", partition_value.c_str());
440 }
441
442 // Test to ensure that the partition attribute can handle non-ASCII strings.
443 // The test uses cyrillic and chinese strings.
444 TEST_F(BrowserPluginTest, PartitionAttributeEncoding) {
445 std::string html = StringPrintf(kHTMLForSourcelessPluginObject,
446 content::kBrowserPluginNewMimeType);
447 LoadHTML(html.c_str());
448
449 // The cyrillic test string.
450 std::string cyrillic("\u0445\u0440\u043E\u043C");
451 std::string js("document.getElementById('browserplugin').partition = '");
452 js.append(cyrillic).append("'");
453
454 ExecuteJavaScript(js.c_str());
455 std::string partition_value = ExecuteScriptAndReturnString(
456 "document.getElementById('browserplugin').partition");
457 EXPECT_STREQ(cyrillic.c_str(), partition_value.c_str());
458
459 LoadHTML(html.c_str());
460
461 // A random string of chinese characters, not meant to be meaningful.
462 std::string chinese("\u94EC\u927B\U00029A72\U00009C61\U00021C56");
463 std::string persist = std::string("persist:").append(chinese);
464 js = "document.getElementById('browserplugin').partition = '";
465 js.append(persist).append("'");
466
467 ExecuteJavaScript(js.c_str());
468 partition_value = ExecuteScriptAndReturnString(
469 "document.getElementById('browserplugin').partition");
470 EXPECT_STREQ(persist.c_str(), partition_value.c_str());
471 }
472
322 } // namespace content 473 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698