diff options
author | tessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 22:38:10 +0000 |
---|---|---|
committer | tessamac@chromium.org <tessamac@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-18 22:38:10 +0000 |
commit | 5a3b61488b8a7e5a175f8519ea15edcdcf2bd502 (patch) | |
tree | 0977af9ec1c277b0dfb6de753a71d21217447fc9 | |
parent | d259a8ecab95cd657b9c7d413e8bfa3c86d0d4cb (diff) | |
download | chromium_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
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); |