summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 22:38:10 +0000
committertessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-18 22:38:10 +0000
commit5a3b61488b8a7e5a175f8519ea15edcdcf2bd502 (patch)
tree0977af9ec1c277b0dfb6de753a71d21217447fc9
parentd259a8ecab95cd657b9c7d413e8bfa3c86d0d4cb (diff)
downloadchromium_src-5a3b61488b8a7e5a175f8519ea15edcdcf2bd502.zip
chromium_src-5a3b61488b8a7e5a175f8519ea15edcdcf2bd502.tar.gz
chromium_src-5a3b61488b8a7e5a175f8519ea15edcdcf2bd502.tar.bz2
Consider @run-at meta data when converting user scripts.
BUG=61856 TEST=try bot, unit_tests, repro in bug Review URL: http://codereview.chromium.org/6597090 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@85828 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/convert_user_script.cc9
-rw-r--r--chrome/browser/extensions/convert_user_script_unittest.cc104
-rw-r--r--chrome/browser/extensions/user_script_master.cc7
-rw-r--r--chrome/test/data/extensions/user_script_run_at_end.user.js13
-rw-r--r--chrome/test/data/extensions/user_script_run_at_idle.user.js13
-rw-r--r--chrome/test/data/extensions/user_script_run_at_start.user.js13
6 files changed, 152 insertions, 7 deletions
diff --git a/chrome/browser/extensions/convert_user_script.cc b/chrome/browser/extensions/convert_user_script.cc
index 2d14eb8..60eb72c 100644
--- a/chrome/browser/extensions/convert_user_script.cc
+++ b/chrome/browser/extensions/convert_user_script.cc
@@ -24,6 +24,7 @@
#include "googleurl/src/gurl.h"
namespace keys = extension_manifest_keys;
+namespace values = extension_manifest_values;
scoped_refptr<Extension> ConvertUserScriptToExtension(
const FilePath& user_script_path, const GURL& original_url,
@@ -126,6 +127,14 @@ scoped_refptr<Extension> ConvertUserScriptToExtension(
content_script->Set(keys::kExcludeGlobs, excludes);
content_script->Set(keys::kJs, js_files);
+ if (script.run_location() == UserScript::DOCUMENT_START)
+ content_script->SetString(keys::kRunAt, values::kRunAtDocumentStart);
+ else if (script.run_location() == UserScript::DOCUMENT_END)
+ content_script->SetString(keys::kRunAt, values::kRunAtDocumentEnd);
+ else if (script.run_location() == UserScript::DOCUMENT_IDLE)
+ // This is the default, but store it just in case we change that.
+ content_script->SetString(keys::kRunAt, values::kRunAtDocumentIdle);
+
ListValue* content_scripts = new ListValue();
content_scripts->Append(content_script);
diff --git a/chrome/browser/extensions/convert_user_script_unittest.cc b/chrome/browser/extensions/convert_user_script_unittest.cc
index 248e3c2..6949af0 100644
--- a/chrome/browser/extensions/convert_user_script_unittest.cc
+++ b/chrome/browser/extensions/convert_user_script_unittest.cc
@@ -8,6 +8,7 @@
#include "base/file_path.h"
#include "base/file_util.h"
#include "base/memory/scoped_ptr.h"
+#include "base/memory/scoped_temp_dir.h"
#include "base/path_service.h"
#include "chrome/browser/extensions/convert_user_script.h"
#include "chrome/common/chrome_paths.h"
@@ -27,6 +28,10 @@ TEST(ExtensionFromUserScript, Basic) {
ASSERT_TRUE(extension.get());
EXPECT_EQ("", error);
+ // Use a temp dir so that the extensions dir will clean itself up.
+ ScopedTempDir ext_dir;
+ EXPECT_TRUE(ext_dir.Set(extension->path()));
+
// Validate generated extension metadata.
EXPECT_EQ("My user script", extension->name());
EXPECT_EQ("2.2.2", extension->VersionString());
@@ -36,6 +41,7 @@ TEST(ExtensionFromUserScript, Basic) {
ASSERT_EQ(1u, extension->content_scripts().size());
const UserScript& script = extension->content_scripts()[0];
+ EXPECT_EQ(UserScript::DOCUMENT_IDLE, script.run_location());
ASSERT_EQ(2u, script.globs().size());
EXPECT_EQ("http://www.google.com/*", script.globs().at(0));
EXPECT_EQ("http://www.yahoo.com/*", script.globs().at(1));
@@ -49,9 +55,6 @@ TEST(ExtensionFromUserScript, Basic) {
extension->path().Append(script.js_scripts()[0].relative_path())));
EXPECT_TRUE(file_util::PathExists(
extension->path().Append(Extension::kManifestFilename)));
-
- // Cleanup
- file_util::Delete(extension->path(), true);
}
TEST(ExtensionFromUserScript, NoMetdata) {
@@ -67,6 +70,10 @@ TEST(ExtensionFromUserScript, NoMetdata) {
ASSERT_TRUE(extension.get());
EXPECT_EQ("", error);
+ // Use a temp dir so that the extensions dir will clean itself up.
+ ScopedTempDir ext_dir;
+ EXPECT_TRUE(ext_dir.Set(extension->path()));
+
// Validate generated extension metadata.
EXPECT_EQ("bar.user.js", extension->name());
EXPECT_EQ("1.0", extension->VersionString());
@@ -88,9 +95,6 @@ TEST(ExtensionFromUserScript, NoMetdata) {
extension->path().Append(script.js_scripts()[0].relative_path())));
EXPECT_TRUE(file_util::PathExists(
extension->path().Append(Extension::kManifestFilename)));
-
- // Cleanup
- file_util::Delete(extension->path(), true);
}
TEST(ExtensionFromUserScript, NotUTF8) {
@@ -107,3 +111,91 @@ TEST(ExtensionFromUserScript, NotUTF8) {
ASSERT_FALSE(extension.get());
EXPECT_EQ("User script must be UTF8 encoded.", error);
}
+
+TEST(ExtensionFromUserScript, RunAtDocumentStart) {
+ FilePath test_file;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_file));
+ test_file = test_file.AppendASCII("extensions")
+ .AppendASCII("user_script_run_at_start.user.js");
+
+ std::string error;
+ scoped_refptr<Extension> extension(ConvertUserScriptToExtension(
+ test_file, GURL("http://www.google.com/foo"), &error));
+
+ ASSERT_TRUE(extension.get());
+ EXPECT_EQ("", error);
+
+ // Use a temp dir so that the extensions dir will clean itself up.
+ ScopedTempDir ext_dir;
+ EXPECT_TRUE(ext_dir.Set(extension->path()));
+
+ // Validate generated extension metadata.
+ EXPECT_EQ("Document Start Test", extension->name());
+ EXPECT_EQ("This script tests document-start", extension->description());
+ EXPECT_EQ("RjmyI7+Gp/YHcW1qnu4xDxkJcL4cV4kTzdCA4BajCbk=",
+ extension->public_key());
+
+ // Validate run location.
+ ASSERT_EQ(1u, extension->content_scripts().size());
+ const UserScript& script = extension->content_scripts()[0];
+ EXPECT_EQ(UserScript::DOCUMENT_START, script.run_location());
+}
+
+TEST(ExtensionFromUserScript, RunAtDocumentEnd) {
+ FilePath test_file;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_file));
+ test_file = test_file.AppendASCII("extensions")
+ .AppendASCII("user_script_run_at_end.user.js");
+
+ std::string error;
+ scoped_refptr<Extension> extension(ConvertUserScriptToExtension(
+ test_file, GURL("http://www.google.com/foo"), &error));
+
+ ASSERT_TRUE(extension.get());
+ EXPECT_EQ("", error);
+
+ // Use a temp dir so that the extensions dir will clean itself up.
+ ScopedTempDir ext_dir;
+ EXPECT_TRUE(ext_dir.Set(extension->path()));
+
+ // Validate generated extension metadata.
+ EXPECT_EQ("Document End Test", extension->name());
+ EXPECT_EQ("This script tests document-end", extension->description());
+ EXPECT_EQ("cpr5i8Mi24FzECV8UJe6tanwlU8SWesZosJ915YISvQ=",
+ extension->public_key());
+
+ // Validate run location.
+ ASSERT_EQ(1u, extension->content_scripts().size());
+ const UserScript& script = extension->content_scripts()[0];
+ EXPECT_EQ(UserScript::DOCUMENT_END, script.run_location());
+}
+
+TEST(ExtensionFromUserScript, RunAtDocumentIdle) {
+ FilePath test_file;
+ ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_file));
+ test_file = test_file.AppendASCII("extensions")
+ .AppendASCII("user_script_run_at_idle.user.js");
+ ASSERT_TRUE(file_util::PathExists(test_file)) << test_file.value();
+
+ std::string error;
+ scoped_refptr<Extension> extension(ConvertUserScriptToExtension(
+ test_file, GURL("http://www.google.com/foo"), &error));
+
+ ASSERT_TRUE(extension.get());
+ EXPECT_EQ("", error);
+
+ // Use a temp dir so that the extensions dir will clean itself up.
+ ScopedTempDir ext_dir;
+ EXPECT_TRUE(ext_dir.Set(extension->path()));
+
+ // Validate generated extension metadata.
+ EXPECT_EQ("Document Idle Test", extension->name());
+ EXPECT_EQ("This script tests document-idle", extension->description());
+ EXPECT_EQ("kHnHKec3O/RKKo5/Iu1hKqe4wQERthL0639isNtsfiY=",
+ extension->public_key());
+
+ // Validate run location.
+ ASSERT_EQ(1u, extension->content_scripts().size());
+ const UserScript& script = extension->content_scripts()[0];
+ EXPECT_EQ(UserScript::DOCUMENT_IDLE, script.run_location());
+}
diff --git a/chrome/browser/extensions/user_script_master.cc b/chrome/browser/extensions/user_script_master.cc
index 1bbab5d..ba772b6 100644
--- a/chrome/browser/extensions/user_script_master.cc
+++ b/chrome/browser/extensions/user_script_master.cc
@@ -70,6 +70,7 @@ bool UserScriptMaster::ScriptReloader::ParseMetadataHeader(
static const base::StringPiece kRunAtDeclaration("// @run-at");
static const base::StringPiece kRunAtDocumentStartValue("document-start");
static const base::StringPiece kRunAtDocumentEndValue("document-end");
+ static const base::StringPiece kRunAtDocumentIdleValue("document-idle");
while (line_start < script_text.length()) {
line_end = script_text.find('\n', line_start);
@@ -116,7 +117,11 @@ bool UserScriptMaster::ScriptReloader::ParseMetadataHeader(
} else if (GetDeclarationValue(line, kRunAtDeclaration, &value)) {
if (value == kRunAtDocumentStartValue)
script->set_run_location(UserScript::DOCUMENT_START);
- else if (value != kRunAtDocumentEndValue)
+ else if (value == kRunAtDocumentEndValue)
+ script->set_run_location(UserScript::DOCUMENT_END);
+ else if (value == kRunAtDocumentIdleValue)
+ script->set_run_location(UserScript::DOCUMENT_IDLE);
+ else
return false;
}
diff --git a/chrome/test/data/extensions/user_script_run_at_end.user.js b/chrome/test/data/extensions/user_script_run_at_end.user.js
new file mode 100644
index 0000000..d3906d5
--- /dev/null
+++ b/chrome/test/data/extensions/user_script_run_at_end.user.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2011 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.
+//
+// ==UserScript==
+// @name Document End Test
+// @namespace test
+// @description This script tests document-end
+// @include *
+// @run-at document-end
+// ==/UserScript==
+
+alert(document.readyState);
diff --git a/chrome/test/data/extensions/user_script_run_at_idle.user.js b/chrome/test/data/extensions/user_script_run_at_idle.user.js
new file mode 100644
index 0000000..301c4a7
--- /dev/null
+++ b/chrome/test/data/extensions/user_script_run_at_idle.user.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2011 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.
+//
+// ==UserScript==
+// @name Document Idle Test
+// @namespace test
+// @description This script tests document-idle
+// @include *
+// @run-at document-idle
+// ==/UserScript==
+
+alert(document.readyState);
diff --git a/chrome/test/data/extensions/user_script_run_at_start.user.js b/chrome/test/data/extensions/user_script_run_at_start.user.js
new file mode 100644
index 0000000..67d32d4
--- /dev/null
+++ b/chrome/test/data/extensions/user_script_run_at_start.user.js
@@ -0,0 +1,13 @@
+// Copyright (c) 2011 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.
+//
+// ==UserScript==
+// @name Document Start Test
+// @namespace test
+// @description This script tests document-start
+// @include *
+// @run-at document-start
+// ==/UserScript==
+
+alert(document.readyState);