| Index: content/renderer/browser_plugin/browser_plugin_browsertest.cc
|
| diff --git a/content/renderer/browser_plugin/browser_plugin_browsertest.cc b/content/renderer/browser_plugin/browser_plugin_browsertest.cc
|
| index 7afdd9a8102c0d1f173f0c5d72d52d93b2981c1e..ba35407cdb33e72a8762a57fe9704b87a9dabcf0 100644
|
| --- a/content/renderer/browser_plugin/browser_plugin_browsertest.cc
|
| +++ b/content/renderer/browser_plugin/browser_plugin_browsertest.cc
|
| @@ -25,6 +25,17 @@ const char kHTMLForBrowserPluginObject[] =
|
| "<object id='browserplugin' width='640px' height='480px'"
|
| " src='foo' type='%s'>";
|
|
|
| +const char kHTMLForSourcelessPluginObject[] =
|
| + "<object id='browserplugin' width='640px' height='480px' type='%s'>";
|
| +
|
| +const char kHTMLForPartitionedPluginObject[] =
|
| + "<object id='browserplugin' width='640px' height='480px'"
|
| + " src='foo' type='%s' partition='someid'>";
|
| +
|
| +const char kHTMLForPartitionedPersistedPluginObject[] =
|
| + "<object id='browserplugin' width='640px' height='480px'"
|
| + " src='foo' type='%s' partition='persist:someid'>";
|
| +
|
| std::string GetHTMLForBrowserPluginObject() {
|
| return StringPrintf(kHTMLForBrowserPluginObject,
|
| content::kBrowserPluginNewMimeType);
|
| @@ -319,4 +330,146 @@ TEST_F(BrowserPluginTest, CustomEvents) {
|
| EXPECT_EQ(kGoogleURL, ExecuteScriptAndReturnString("url"));
|
| }
|
|
|
| +
|
| +// Verify that the 'partition' attribute on the browser plugin is parsed
|
| +// correctly.
|
| +TEST_F(BrowserPluginTest, PartitionAttribute) {
|
| + std::string html = StringPrintf(kHTMLForPartitionedPluginObject,
|
| + content::kBrowserPluginNewMimeType);
|
| + LoadHTML(html.c_str());
|
| + std::string partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ("someid", partition_value.c_str());
|
| +
|
| + html = StringPrintf(kHTMLForPartitionedPersistedPluginObject,
|
| + content::kBrowserPluginNewMimeType);
|
| + LoadHTML(html.c_str());
|
| + partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ("persist:someid", partition_value.c_str());
|
| +
|
| + // Verify that once HTML has defined a source and partition, we cannot change
|
| + // the partition anymore.
|
| + ExecuteJavaScript(
|
| + "try {"
|
| + " document.getElementById('browserplugin').partition = 'foo';"
|
| + " document.title = 'success';"
|
| + "} catch (e) { document.title = e.message; }");
|
| + std::string title = ExecuteScriptAndReturnString("document.title");
|
| + EXPECT_STREQ(
|
| + "The object has already navigated, so its partition cannot be changed.",
|
| + title.c_str());
|
| +
|
| + // Load a browser tag without 'src' defined.
|
| + html = StringPrintf(kHTMLForSourcelessPluginObject,
|
| + content::kBrowserPluginNewMimeType);
|
| + LoadHTML(html.c_str());
|
| +
|
| + // Ensure we don't parse just "persist:" string and return exception.
|
| + ExecuteJavaScript(
|
| + "try {"
|
| + " document.getElementById('browserplugin').partition = 'persist:';"
|
| + " document.title = 'success';"
|
| + "} catch (e) { document.title = e.message; }");
|
| + title = ExecuteScriptAndReturnString("document.title");
|
| + EXPECT_STREQ("Invalid empty partition attribute.", title.c_str());
|
| +
|
| + // Verify we can't set the partition attribute twice.
|
| + ExecuteJavaScript(
|
| + "document.getElementById('browserplugin').partition = 'foo'");
|
| + partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ("foo", partition_value.c_str());
|
| +
|
| + ExecuteJavaScript(
|
| + "try {"
|
| + " document.getElementById('browserplugin').partition = 'bar';"
|
| + " document.title = 'success';"
|
| + "} catch (e) { document.title = e.message; }");
|
| + title = ExecuteScriptAndReturnString("document.title");
|
| + EXPECT_STREQ("The partition attribute has already been set.", title.c_str());
|
| +}
|
| +
|
| +// Test to verify that after the first navigation, the partition attribute
|
| +// cannot be modified.
|
| +TEST_F(BrowserPluginTest, ImmutableAttributesAfterNavigation) {
|
| + std::string html = StringPrintf(kHTMLForSourcelessPluginObject,
|
| + content::kBrowserPluginNewMimeType);
|
| + LoadHTML(html.c_str());
|
| +
|
| + ExecuteJavaScript(
|
| + "document.getElementById('browserplugin').partition = 'storage'");
|
| + std::string partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ("storage", partition_value.c_str());
|
| +
|
| + std::string src_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').src");
|
| + EXPECT_STREQ("", src_value.c_str());
|
| +
|
| + ExecuteJavaScript("document.getElementById('browserplugin').src = 'bar'");
|
| + {
|
| + const IPC::Message* msg =
|
| + browser_plugin_manager()->sink().GetUniqueMessageMatching(
|
| + BrowserPluginHostMsg_NavigateOrCreateGuest::ID);
|
| + ASSERT_TRUE(msg);
|
| +
|
| + int instance_id;
|
| + long long frame_id;
|
| + std::string src;
|
| + BrowserPluginHostMsg_NavigateOrCreateGuest::Read(
|
| + msg,
|
| + &instance_id,
|
| + &frame_id,
|
| + &src);
|
| + EXPECT_STREQ("bar", src.c_str());
|
| + }
|
| +
|
| + // Setting the partition should throw an exception and the value should not
|
| + // change.
|
| + ExecuteJavaScript(
|
| + "try {"
|
| + " document.getElementById('browserplugin').partition = 'someid';"
|
| + " document.title = 'success';"
|
| + "} catch (e) { document.title = e.message; }");
|
| +
|
| + std::string title = ExecuteScriptAndReturnString("document.title");
|
| + EXPECT_STREQ("The object has already navigated.", title.c_str());
|
| +
|
| + partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ("storage", partition_value.c_str());
|
| +}
|
| +
|
| +// Test to ensure that the partition attribute can handle non-ASCII strings.
|
| +// The test uses cyrillic and chinese strings.
|
| +TEST_F(BrowserPluginTest, PartitionAttributeEncoding) {
|
| + std::string html = StringPrintf(kHTMLForSourcelessPluginObject,
|
| + content::kBrowserPluginNewMimeType);
|
| + LoadHTML(html.c_str());
|
| +
|
| + // The cyrillic test string.
|
| + std::string cyrillic("\u0445\u0440\u043E\u043C");
|
| + std::string js("document.getElementById('browserplugin').partition = '");
|
| + js.append(cyrillic).append("'");
|
| +
|
| + ExecuteJavaScript(js.c_str());
|
| + std::string partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ(cyrillic.c_str(), partition_value.c_str());
|
| +
|
| + LoadHTML(html.c_str());
|
| +
|
| + // A random string of chinese characters, not meant to be meaningful.
|
| + std::string chinese("\u94EC\u927B\U00029A72\U00009C61\U00021C56");
|
| + std::string persist = std::string("persist:").append(chinese);
|
| + js = "document.getElementById('browserplugin').partition = '";
|
| + js.append(persist).append("'");
|
| +
|
| + ExecuteJavaScript(js.c_str());
|
| + partition_value = ExecuteScriptAndReturnString(
|
| + "document.getElementById('browserplugin').partition");
|
| + EXPECT_STREQ(persist.c_str(), partition_value.c_str());
|
| +}
|
| +
|
| } // namespace content
|
|
|