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)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::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)        ) {}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      v8::Isolate* isolate,
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      v8::Handle<v8::String> name) OVERRIDE {
49a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    if (name->Equals(v8::String::NewFromUtf8(isolate, "ClearCache"))) {
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return v8::FunctionTemplate::New(isolate, ClearCache);
51a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else if (name->Equals(v8::String::NewFromUtf8(
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   isolate, "ClearHostResolverCache"))) {
53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return v8::FunctionTemplate::New(isolate, ClearHostResolverCache);
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else if (name->Equals(
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   v8::String::NewFromUtf8(isolate, "ClearPredictorCache"))) {
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return v8::FunctionTemplate::New(isolate, ClearPredictorCache);
57a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    } else if (name->Equals(
58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   v8::String::NewFromUtf8(isolate, "CloseConnections"))) {
59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      return v8::FunctionTemplate::New(isolate, CloseConnections);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return v8::Handle<v8::FunctionTemplate>();
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearCache(const v8::FunctionCallbackInfo<v8::Value>& args) {
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(new ChromeViewHostMsg_ClearCache(&rv));
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebCache::clear();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearHostResolverCache(
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_ClearHostResolverCache(&rv));
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void ClearPredictorCache(
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int rv;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_ClearPredictorCache(&rv));
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static void CloseConnections(
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const v8::FunctionCallbackInfo<v8::Value>& args) {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    content::RenderThread::Get()->Send(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new ChromeViewHostMsg_CloseCurrentConnections());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)v8::Extension* NetBenchmarkingExtension::Get() {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return new NetBenchmarkingWrapper();
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions_v8
97