summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
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_