12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/renderer/net_benchmarking_extension.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/benchmarking_messages.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/renderer/render_thread.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebCache.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "v8/include/v8.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebCache;
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kNetBenchmarkingExtensionName[] = "v8/NetBenchmarking";
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions_v8 {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class NetBenchmarkingWrapper : public v8::Extension {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NetBenchmarkingWrapper() :
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      v8::Extension(kNetBenchmarkingExtensionName,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "if (typeof(chrome) == 'undefined') {"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  chrome = {};"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "if (typeof(chrome.benchmarking) == 'undefined') {"
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  chrome.benchmarking = {};"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "chrome.benchmarking.clearCache = function() {"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  native function ClearCache();"
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  ClearCache();"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "chrome.benchmarking.clearHostResolverCache = function() {"
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  native function ClearHostResolverCache();"
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  ClearHostResolverCache();"
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "chrome.benchmarking.clearPredictorCache = function() {"
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  native function ClearPredictorCache();"
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  ClearPredictorCache();"
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "chrome.benchmarking.closeConnections = function() {"
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  native function CloseConnections();"
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  CloseConnections();"
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "chrome.benchmarking.enableSpdy = function(name) {"
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  native function EnableSpdy();"
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "  EnableSpdy(name);"
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        "};"
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        ) {}
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunction(
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      v8::Handle<v8::String> name) OVERRIDE {
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (name->Equals(v8::String::New("ClearCache"))) {
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return v8::FunctionTemplate::New(ClearCache);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (name->Equals(v8::String::New("ClearHostResolverCache"))) {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return v8::FunctionTemplate::New(ClearHostResolverCache);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (name->Equals(v8::String::New("ClearPredictorCache"))) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return v8::FunctionTemplate::New(ClearPredictorCache);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (name->Equals(v8::String::New("EnableSpdy"))) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return v8::FunctionTemplate::New(EnableSpdy);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    } else if (name->Equals(v8::String::New("CloseConnections"))) {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return v8::FunctionTemplate::New(CloseConnections);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return v8::Handle<v8::FunctionTemplate>();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearCache(const v8::FunctionCallbackInfo<v8::Value>& args) {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(new ChromeViewHostMsg_ClearCache(&rv));
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebCache::clear();
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearHostResolverCache(
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_ClearHostResolverCache(&rv));
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearPredictorCache(
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_ClearPredictorCache(&rv));
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void CloseConnections(
887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_CloseCurrentConnections());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void EnableSpdy(const v8::FunctionCallbackInfo<v8::Value>& args) {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (!args.Length() || !args[0]->IsBoolean())
957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      return;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(new ChromeViewHostMsg_EnableSpdy(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        args[0]->BooleanValue()));
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)v8::Extension* NetBenchmarkingExtension::Get() {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new NetBenchmarkingWrapper();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions_v8
107