diff options
Diffstat (limited to 'chrome/renderer')
-rw-r--r-- | chrome/renderer/chrome_content_renderer_client.cc | 14 | ||||
-rw-r--r-- | chrome/renderer/playback_extension.cc | 48 | ||||
-rw-r--r-- | chrome/renderer/playback_extension.h | 33 |
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_ |