| Index: chrome/renderer/user_script_slave_unittest.cc
|
| ===================================================================
|
| --- chrome/renderer/user_script_slave_unittest.cc (revision 0)
|
| +++ chrome/renderer/user_script_slave_unittest.cc (revision 0)
|
| @@ -0,0 +1,177 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/renderer/user_script_slave.h"
|
| +
|
| +#include "base/pickle.h"
|
| +#include "base/scoped_ptr.h"
|
| +#include "base/shared_memory.h"
|
| +#include "base/string_piece.h"
|
| +#include "chrome/common/extensions/user_script.h"
|
| +#include "chrome/common/ipc_test_sink.h"
|
| +#include "chrome/common/render_messages.h"
|
| +#include "chrome/renderer/mock_render_thread.h"
|
| +#include "chrome/renderer/render_thread.h"
|
| +#include "ipc/ipc_message.h"
|
| +#include "ipc/ipc_sync_message.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +typedef std::vector<UserScript::File> FileList;
|
| +typedef std::vector<UserScript*> UserScripts;
|
| +
|
| +// Valid extension id.
|
| +const char* const kExtensionId = "nanifionbniojdbjhimhbiajcfajnjde";
|
| +// JS script.
|
| +const char* const kJsScript =
|
| + "var x = { 'id': '__MSG_@@extension_id__'};";
|
| +// CSS style.
|
| +const char* const kCssScript =
|
| + "div {url(chrome-extension://__MSG_@@extension_id__/icon.png);}";
|
| +const char* const kCssScriptWithReplacedMessage =
|
| + "div {url(chrome-extension://nanifionbniojdbjhimhbiajcfajnjde/icon.png);}";
|
| +
|
| +class UserScriptSlaveTest : public testing::Test {
|
| + public:
|
| + UserScriptSlaveTest()
|
| + : shared_memory_(NULL) {
|
| + }
|
| +
|
| + virtual void SetUp() {
|
| + message_sender_.reset(new MockRenderThread());
|
| + user_script_slave_.reset(new UserScriptSlave(message_sender_.get()));
|
| + }
|
| +
|
| + virtual void TearDown() {
|
| + shared_memory_.release();
|
| + }
|
| +
|
| + UserScripts GetUserScripts() {
|
| + return user_script_slave_->scripts_;
|
| + }
|
| +
|
| + protected:
|
| + // Create user script with given extension id.
|
| + void CreateUserScript(const std::string extension_id) {
|
| + // Extension id can be empty.
|
| + user_script_.set_extension_id(extension_id);
|
| +
|
| + // Add js script.
|
| + FileList& js_scripts = user_script_.js_scripts();
|
| + UserScript::File js_script;
|
| + js_script.set_content(base::StringPiece(kJsScript, strlen(kJsScript)));
|
| + js_scripts.push_back(js_script);
|
| +
|
| + // Add css script.
|
| + FileList& css_scripts = user_script_.css_scripts();
|
| + UserScript::File css_script;
|
| + css_script.set_content(base::StringPiece(kCssScript, strlen(kCssScript)));
|
| + css_scripts.push_back(css_script);
|
| + }
|
| +
|
| + // Serializes the UserScript object and stores it in the shared memory.
|
| + bool Serialize(const UserScript& script) {
|
| + Pickle pickle;
|
| + pickle.WriteSize(1);
|
| + script.Pickle(&pickle);
|
| + for (size_t j = 0; j < script.js_scripts().size(); j++) {
|
| + base::StringPiece contents = script.js_scripts()[j].GetContent();
|
| + pickle.WriteData(contents.data(), contents.length());
|
| + }
|
| + for (size_t j = 0; j < script.css_scripts().size(); j++) {
|
| + base::StringPiece contents = script.css_scripts()[j].GetContent();
|
| + pickle.WriteData(contents.data(), contents.length());
|
| + }
|
| +
|
| + // Create the shared memory object.
|
| + shared_memory_.reset(new base::SharedMemory());
|
| +
|
| + if (!shared_memory_->Create(std::wstring(), // anonymous
|
| + false, // read-only
|
| + false, // open existing
|
| + pickle.size()))
|
| + return false;
|
| +
|
| + // Map into our process.
|
| + if (!shared_memory_->Map(pickle.size()))
|
| + return false;
|
| +
|
| + // Copy the pickle to shared memory.
|
| + memcpy(shared_memory_->memory(), pickle.data(), pickle.size());
|
| + return true;
|
| + }
|
| +
|
| + // User script slave we are testing.
|
| + scoped_ptr<UserScriptSlave> user_script_slave_;
|
| +
|
| + // IPC message sender.
|
| + scoped_ptr<MockRenderThread> message_sender_;
|
| +
|
| + // User script that has css and js files.
|
| + UserScript user_script_;
|
| +
|
| + // Shared memory object used to pass user scripts from browser to renderer.
|
| + scoped_ptr<base::SharedMemory> shared_memory_;
|
| +};
|
| +
|
| +TEST_F(UserScriptSlaveTest, MessagesNotReplacedIfScriptDoesntHaveCssScript) {
|
| + CreateUserScript(kExtensionId);
|
| + user_script_.css_scripts().clear();
|
| +
|
| + ASSERT_TRUE(Serialize(user_script_));
|
| + ASSERT_TRUE(user_script_slave_->UpdateScripts(
|
| + shared_memory_->handle(), false));
|
| +
|
| + UserScripts scripts = GetUserScripts();
|
| + ASSERT_EQ(1U, scripts.size());
|
| + ASSERT_EQ(1U, scripts[0]->js_scripts().size());
|
| + EXPECT_EQ(0U, scripts[0]->css_scripts().size());
|
| +
|
| + EXPECT_EQ(scripts[0]->js_scripts()[0].GetContent(), kJsScript);
|
| +
|
| + // Send was not called to fetch the messages in this case, since we don't
|
| + // have the css scripts.
|
| + EXPECT_EQ(0U, message_sender_->sink().message_count());
|
| +}
|
| +
|
| +TEST_F(UserScriptSlaveTest, MessagesNotReplacedIfScriptDoesntHaveExtensionId) {
|
| + CreateUserScript("");
|
| + ASSERT_TRUE(Serialize(user_script_));
|
| + ASSERT_TRUE(user_script_slave_->UpdateScripts(
|
| + shared_memory_->handle(), false));
|
| +
|
| + UserScripts scripts = GetUserScripts();
|
| + ASSERT_EQ(1U, scripts.size());
|
| + ASSERT_EQ(1U, scripts[0]->js_scripts().size());
|
| + ASSERT_EQ(1U, scripts[0]->css_scripts().size());
|
| +
|
| + EXPECT_EQ(scripts[0]->js_scripts()[0].GetContent(), kJsScript);
|
| + EXPECT_EQ(scripts[0]->css_scripts()[0].GetContent(), kCssScript);
|
| +
|
| + // Send was not called to fetch the messages in this case, since we don't
|
| + // have the extension id.
|
| + EXPECT_EQ(0U, message_sender_->sink().message_count());
|
| +}
|
| +
|
| +TEST_F(UserScriptSlaveTest, MessagesAreReplacedIfScriptHasExtensionId) {
|
| + CreateUserScript(kExtensionId);
|
| + ASSERT_TRUE(Serialize(user_script_));
|
| + ASSERT_TRUE(user_script_slave_->UpdateScripts(
|
| + shared_memory_->handle(), false));
|
| +
|
| + UserScripts scripts = GetUserScripts();
|
| + ASSERT_EQ(1U, scripts.size());
|
| + ASSERT_EQ(1U, scripts[0]->js_scripts().size());
|
| + ASSERT_EQ(1U, scripts[0]->css_scripts().size());
|
| +
|
| + // JS scripts should stay the same.
|
| + EXPECT_STREQ(scripts[0]->js_scripts()[0].GetContent().data(), kJsScript);
|
| + // We expect only CSS scripts to change.
|
| + EXPECT_STREQ(scripts[0]->css_scripts()[0].GetContent().data(),
|
| + kCssScriptWithReplacedMessage);
|
| +
|
| + // Send gets always gets called if there is an extension id and css script.
|
| + ASSERT_EQ(1U, message_sender_->sink().message_count());
|
| + EXPECT_TRUE(message_sender_->sink().GetFirstMessageMatching(
|
| + ViewHostMsg_GetExtensionMessageBundle::ID));
|
| +}
|
|
|
| Property changes on: chrome\renderer\user_script_slave_unittest.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|