summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-18 19:26:37 +0000
committerjam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-04-18 19:26:37 +0000
commitf45c5f3d74273e913c62598fcbde35e20924ab50 (patch)
tree6364e206042679e527802f2214132138a731e826 /chrome/renderer
parent55410d7379f605f828d9845ee1ae8f62c0b0b145 (diff)
downloadchromium_src-f45c5f3d74273e913c62598fcbde35e20924ab50.zip
chromium_src-f45c5f3d74273e913c62598fcbde35e20924ab50.tar.gz
chromium_src-f45c5f3d74273e913c62598fcbde35e20924ab50.tar.bz2
Cleanup of v8 extension stuff. Playback extension is only used in chrome, so move it to chrome\renderer and all of its associated switches to chrome. GC extension is only used by webkit\support, so move it there. The other two profiler extensions aren't used, so remove them.
Review URL: https://chromiumcodereview.appspot.com/10117022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@132841 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc14
-rw-r--r--chrome/renderer/playback_extension.cc48
-rw-r--r--chrome/renderer/playback_extension.h33
3 files changed, 91 insertions, 4 deletions
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 9b9fb6c..cd7a2e9 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -47,6 +47,7 @@
#include "chrome/renderer/net/renderer_net_predictor.h"
#include "chrome/renderer/page_click_tracker.h"
#include "chrome/renderer/page_load_histograms.h"
+#include "chrome/renderer/playback_extension.h"
#include "chrome/renderer/plugins/plugin_placeholder.h"
#include "chrome/renderer/plugins/plugin_uma.h"
#include "chrome/renderer/prerender/prerender_dispatcher.h"
@@ -179,12 +180,17 @@ void ChromeContentRendererClient::RenderThreadStarted() {
if (search_extension)
thread->RegisterExtension(search_extension);
- if (CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableBenchmarking))
+ CommandLine* command_line = CommandLine::ForCurrentProcess();
+ if (command_line->HasSwitch(switches::kEnableBenchmarking))
thread->RegisterExtension(extensions_v8::BenchmarkingExtension::Get());
- if (CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableIPCFuzzing)) {
+ if (command_line->HasSwitch(switches::kPlaybackMode) ||
+ command_line->HasSwitch(switches::kRecordMode) ||
+ command_line->HasSwitch(switches::kNoJsRandomness)) {
+ thread->RegisterExtension(extensions_v8::PlaybackExtension::Get());
+ }
+
+ if (command_line->HasSwitch(switches::kEnableIPCFuzzing)) {
thread->GetChannel()->set_outgoing_message_filter(LoadExternalIPCFuzzer());
}
// chrome:, chrome-devtools:, and chrome-internal: pages should not be
diff --git a/chrome/renderer/playback_extension.cc b/chrome/renderer/playback_extension.cc
new file mode 100644
index 0000000..5f9f017
--- /dev/null
+++ b/chrome/renderer/playback_extension.cc
@@ -0,0 +1,48 @@
+// 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.
+
+#include "chrome/renderer/playback_extension.h"
+
+#include "v8/include/v8.h"
+
+const char kPlaybackExtensionName[] = "v8/PlaybackMode";
+
+namespace extensions_v8 {
+
+v8::Extension* PlaybackExtension::Get() {
+ v8::Extension* extension = new v8::Extension(
+ kPlaybackExtensionName,
+ "(function () {"
+ " var orig_date = Date;"
+ " var x = 0;"
+ " var time_seed = 1204251968254;"
+ " Math.random = function() {"
+ " x += .1;"
+ " return (x % 1);"
+ " };"
+ " Date = function() {"
+ " if (this instanceof Date) {"
+ " switch (arguments.length) {"
+ " case 0: return new orig_date(time_seed += 50);"
+ " case 1: return new orig_date(arguments[0]);"
+ " default: return new orig_date(arguments[0], arguments[1],"
+ " arguments.length >= 3 ? arguments[2] : 1,"
+ " arguments.length >= 4 ? arguments[3] : 0,"
+ " arguments.length >= 5 ? arguments[4] : 0,"
+ " arguments.length >= 6 ? arguments[5] : 0,"
+ " arguments.length >= 7 ? arguments[6] : 0);"
+ " }"
+ " }"
+ " return new Date().toString();"
+ " };"
+ " Date.__proto__ = orig_date;"
+ " Date.prototype.constructor = Date;"
+ " orig_date.now = function() {"
+ " return new Date().getTime();"
+ " };"
+ "})()");
+ return extension;
+}
+
+} // namespace extensions_v8
diff --git a/chrome/renderer/playback_extension.h b/chrome/renderer/playback_extension.h
new file mode 100644
index 0000000..6d2a427
--- /dev/null
+++ b/chrome/renderer/playback_extension.h
@@ -0,0 +1,33 @@
+// 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.
+
+#ifndef CHROME_RENDERER_PLAYBACK_EXTENSION_H_
+#define CHROME_RENDERER_PLAYBACK_EXTENSION_H_
+#pragma once
+
+namespace v8 {
+class Extension;
+}
+
+namespace extensions_v8 {
+
+// Inject code which overrides a few common JS functions for implementing
+// randomness. In order to implement effective record & playback of
+// websites, it is important that the URLs not change. Many popular web
+// based apps use randomness in URLs to unique-ify urls for proxies.
+// Unfortunately, this breaks playback.
+// To work around this, we take the two most common client-side randomness
+// generators and make them constant. They really need to be constant
+// (rather than a constant seed followed by constant change)
+// because the playback mode wants flexibility in how it plays them back
+// and cannot always guarantee that requests for randomness are played back
+// in exactly the same order in which they were recorded.
+class PlaybackExtension {
+ public:
+ static v8::Extension* Get();
+};
+
+} // namespace extensions_v8
+
+#endif // CHROME_RENDERER_PLAYBACK_EXTENSION_H_