12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 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 "base/command_line.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
79ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/run_loop.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/synchronization/waitable_event.h"
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
1190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "chrome/browser/extensions/activity_log/activity_log.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prerender/prerender_handle.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/browser/prerender/prerender_manager_factory.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_constants.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/chrome_switches.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/chrome_render_view_host_test_harness.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile.h"
216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/public/browser/web_contents.h"
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "extensions/browser/extension_registry.h"
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/uninstall_reason.h"
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "extensions/common/dom_action_types.h"
26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension_builder.h"
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "sql/statement.h"
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const char kExtensionId[] = "abc";
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kUrlApiCalls[] = {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLButtonElement.formAction", "HTMLEmbedElement.src",
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLFormElement.action",       "HTMLFrameElement.src",
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLHtmlElement.manifest",     "HTMLIFrameElement.src",
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLImageElement.longDesc",    "HTMLImageElement.src",
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLImageElement.lowsrc",      "HTMLInputElement.formAction",
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLInputElement.src",         "HTMLLinkElement.href",
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLMediaElement.src",         "HTMLMediaElement.currentSrc",
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLModElement.cite",          "HTMLObjectElement.data",
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLQuoteElement.cite",        "HTMLScriptElement.src",
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLSourceElement.src",        "HTMLTrackElement.src",
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "HTMLVideoElement.poster"};
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass ActivityLogTest : public ChromeRenderViewHostTestHarness {
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) protected:
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void SetUp() OVERRIDE {
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ChromeRenderViewHostTestHarness::SetUp();
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined OS_CHROMEOS
62868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    test_user_manager_.reset(new chromeos::ScopedTestUserManager());
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine command_line(CommandLine::NO_PROGRAM);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)        switches::kEnableExtensionActivityLogging);
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CommandLine::ForCurrentProcess()->AppendSwitch(
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        switches::kEnableExtensionActivityLogTesting);
69868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    extension_service_ = static_cast<TestExtensionSystem*>(
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        ExtensionSystem::Get(profile()))->CreateExtensionService
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)            (&command_line, base::FilePath(), false);
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    base::RunLoop().RunUntilIdle();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void TearDown() OVERRIDE {
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#if defined OS_CHROMEOS
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    test_user_manager_.reset();
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ChromeRenderViewHostTestHarness::TearDown();
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static void RetrieveActions_LogAndFetchActions0(
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      scoped_ptr<std::vector<scoped_refptr<Action> > > i) {
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(0, static_cast<int>(i->size()));
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static void RetrieveActions_LogAndFetchActions2(
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<std::vector<scoped_refptr<Action> > > i) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_EQ(2, static_cast<int>(i->size()));
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  void SetPolicy(bool log_arguments) {
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ActivityLog* activity_log = ActivityLog::GetInstance(profile());
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if (log_arguments)
9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      activity_log->SetDatabasePolicy(ActivityLogPolicy::POLICY_FULLSTREAM);
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else
9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      activity_log->SetDatabasePolicy(ActivityLogPolicy::POLICY_COUNTS);
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool GetDatabaseEnabled() {
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ActivityLog* activity_log = ActivityLog::GetInstance(profile());
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return activity_log->IsDatabaseEnabled();
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  bool GetWatchdogActive() {
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ActivityLog* activity_log = ActivityLog::GetInstance(profile());
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return activity_log->IsWatchdogAppActive();
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
111868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  static void Arguments_Prerender(
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      scoped_ptr<std::vector<scoped_refptr<Action> > > i) {
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    ASSERT_EQ(1U, i->size());
114868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    scoped_refptr<Action> last = i->front();
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("odlameecjipmbmbejkplpemijjgpljce", last->extension_id());
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ(Action::ACTION_CONTENT_SCRIPT, last->action_type());
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("[\"script\"]",
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              ActivityLogPolicy::Util::Serialize(last->args()));
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("http://www.google.com/", last->SerializePageUrl());
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("{\"prerender\":true}",
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              ActivityLogPolicy::Util::Serialize(last->other()));
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("", last->api_name());
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("", last->page_title());
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("", last->SerializeArgUrl());
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void RetrieveActions_ArgUrlExtraction(
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      scoped_ptr<std::vector<scoped_refptr<Action> > > i) {
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* other = NULL;
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    int dom_verb = -1;
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_EQ(4U, i->size());
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    scoped_refptr<Action> action = i->at(0);
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ("XMLHttpRequest.open", action->api_name());
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ("[\"POST\",\"\\u003Carg_url>\"]",
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              ActivityLogPolicy::Util::Serialize(action->args()));
13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ("http://api.google.com/", action->arg_url().spec());
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Test that the dom_verb field was changed to XHR (from METHOD).  This
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // could be tested on all retrieved XHR actions but it would be redundant,
1418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // so just test once.
1428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    other = action->other();
1438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_TRUE(other);
1448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_TRUE(other->GetInteger(activity_log_constants::kActionDomVerb,
1458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                  &dom_verb));
1468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ASSERT_EQ(DomActionType::XHR, dom_verb);
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    action = i->at(1);
14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ("XMLHttpRequest.open", action->api_name());
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ("[\"POST\",\"\\u003Carg_url>\"]",
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              ActivityLogPolicy::Util::Serialize(action->args()));
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_EQ("http://www.google.com/api/", action->arg_url().spec());
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    action = i->at(2);
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    ASSERT_EQ("XMLHttpRequest.open", action->api_name());
15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ("[\"POST\",\"/api/\"]",
15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)              ActivityLogPolicy::Util::Serialize(action->args()));
15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_FALSE(action->arg_url().is_valid());
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    action = i->at(3);
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    ASSERT_EQ("windows.create", action->api_name());
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ("[{\"url\":\"\\u003Carg_url>\"}]",
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              ActivityLogPolicy::Util::Serialize(action->args()));
16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    ASSERT_EQ("http://www.google.co.uk/", action->arg_url().spec());
165868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  }
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void RetrieveActions_ArgUrlApiCalls(
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_ptr<std::vector<scoped_refptr<Action> > > actions) {
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    size_t api_calls_size = arraysize(kUrlApiCalls);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const base::DictionaryValue* other = NULL;
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    int dom_verb = -1;
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_EQ(api_calls_size, actions->size());
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    for (size_t i = 0; i < actions->size(); i++) {
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      scoped_refptr<Action> action = actions->at(i);
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(kExtensionId, action->extension_id());
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(Action::ACTION_DOM_ACCESS, action->action_type());
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(kUrlApiCalls[i], action->api_name());
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ("[\"\\u003Carg_url>\"]",
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                ActivityLogPolicy::Util::Serialize(action->args()));
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ("http://www.google.co.uk/", action->arg_url().spec());
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      other = action->other();
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(other);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_TRUE(
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          other->GetInteger(activity_log_constants::kActionDomVerb, &dom_verb));
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ASSERT_EQ(DomActionType::SETTER, dom_verb);
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ExtensionService* extension_service_;
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_;
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ActivityLogTest, Construct) {
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(GetDatabaseEnabled());
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_FALSE(GetWatchdogActive());
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(ActivityLogTest, LogAndFetchActions) {
2067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  ActivityLog* activity_log = ActivityLog::GetInstance(profile());
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  scoped_ptr<base::ListValue> args(new base::ListValue());
20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(GetDatabaseEnabled());
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Write some API calls
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_refptr<Action> action = new Action(kExtensionId,
212a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            base::Time::Now(),
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            Action::ACTION_API_CALL,
214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                            "tabs.testMethod");
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  activity_log->LogAction(action);
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  action = new Action(kExtensionId,
217a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      base::Time::Now(),
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      Action::ACTION_DOM_ACCESS,
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                      "document.write");
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  action->set_page_url(GURL("http://www.google.com"));
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  activity_log->LogAction(action);
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  activity_log->GetFilteredActions(
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      kExtensionId,
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Action::ACTION_ANY,
22658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
22758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      0,
230d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(ActivityLogTest::RetrieveActions_LogAndFetchActions2));
231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2337dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTEST_F(ActivityLogTest, LogPrerender) {
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<const Extension> extension =
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionBuilder()
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .SetManifest(DictionaryBuilder()
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       .Set("name", "Test extension")
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       .Set("version", "1.0.0")
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       .Set("manifest_version", 2))
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          .Build();
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  extension_service_->AddExtension(extension.get());
242868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ActivityLog* activity_log = ActivityLog::GetInstance(profile());
24358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ASSERT_TRUE(GetDatabaseEnabled());
244868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  GURL url("http://www.google.com");
245868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
246868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prerender::PrerenderManager* prerender_manager =
247868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      prerender::PrerenderManagerFactory::GetForProfile(
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          Profile::FromBrowserContext(profile()));
249868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  prerender_manager->OnCookieStoreLoaded();
251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const gfx::Size kSize(640, 480);
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scoped_ptr<prerender::PrerenderHandle> prerender_handle(
254868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      prerender_manager->AddPrerenderFromLocalPredictor(
255868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          url,
256ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch          web_contents()->GetController().GetDefaultSessionStorageNamespace(),
257868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)          kSize));
258868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
259868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const std::vector<content::WebContents*> contentses =
260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      prerender_manager->GetAllPrerenderingContents();
261868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_EQ(1U, contentses.size());
262868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  content::WebContents *contents = contentses[0];
263868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_TRUE(prerender_manager->IsWebContentsPrerendering(contents, NULL));
264868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  ScriptExecutionObserver::ExecutingScriptsMap executing_scripts;
266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  executing_scripts[extension->id()].insert("script");
267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  static_cast<ScriptExecutionObserver*>(activity_log)
2696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      ->OnScriptsExecuted(contents, executing_scripts, url);
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  activity_log->GetFilteredActions(
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      extension->id(),
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Action::ACTION_ANY,
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      0,
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(ActivityLogTest::Arguments_Prerender));
279868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
280868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prerender_manager->CancelAllPrerenders();
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(ActivityLogTest, ArgUrlExtraction) {
28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ActivityLog* activity_log = ActivityLog::GetInstance(profile());
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::Time now = base::Time::Now();
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Submit a DOM API call which should have its URL extracted into the arg_url
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // field.
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_refptr<Action> action = new Action(kExtensionId,
29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            now,
29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            Action::ACTION_DOM_ACCESS,
29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            "XMLHttpRequest.open");
29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->set_page_url(GURL("http://www.google.com/"));
29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->mutable_args()->AppendString("POST");
29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->mutable_args()->AppendString("http://api.google.com/");
2988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
2998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                      DomActionType::METHOD);
30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  activity_log->LogAction(action);
30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Submit a DOM API call with a relative URL in the argument, which should be
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // resolved relative to the page URL.
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  action = new Action(kExtensionId,
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      now - base::TimeDelta::FromSeconds(1),
30668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      Action::ACTION_DOM_ACCESS,
30768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      "XMLHttpRequest.open");
30868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->set_page_url(GURL("http://www.google.com/"));
30968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->mutable_args()->AppendString("POST");
31068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action->mutable_args()->AppendString("/api/");
3118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                      DomActionType::METHOD);
31368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  activity_log->LogAction(action);
31468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Submit a DOM API call with a relative URL but no base page URL against
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // which to resolve.
31768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  action = new Action(kExtensionId,
31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                      now - base::TimeDelta::FromSeconds(2),
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      Action::ACTION_DOM_ACCESS,
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      "XMLHttpRequest.open");
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  action->mutable_args()->AppendString("POST");
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  action->mutable_args()->AppendString("/api/");
3238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
3248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                      DomActionType::METHOD);
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  activity_log->LogAction(action);
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Submit an API call with an embedded URL.
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  action = new Action(kExtensionId,
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                      now - base::TimeDelta::FromSeconds(3),
33058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      Action::ACTION_API_CALL,
33158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                      "windows.create");
33258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  action->set_args(
33358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      ListBuilder()
33458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          .Append(DictionaryBuilder().Set("url", "http://www.google.co.uk"))
33558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)          .Build());
33658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  activity_log->LogAction(action);
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
33858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  activity_log->GetFilteredActions(
33958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      kExtensionId,
34058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Action::ACTION_ANY,
34158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
34258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
34358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      "",
344d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      -1,
34558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::Bind(ActivityLogTest::RetrieveActions_ArgUrlExtraction));
34658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
34758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)TEST_F(ActivityLogTest, UninstalledExtension) {
349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_refptr<const Extension> extension =
350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      ExtensionBuilder()
351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          .SetManifest(DictionaryBuilder()
352d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       .Set("name", "Test extension")
353d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       .Set("version", "1.0.0")
354d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                       .Set("manifest_version", 2))
355d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)          .Build();
356d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
357d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ActivityLog* activity_log = ActivityLog::GetInstance(profile());
358d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
359d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(GetDatabaseEnabled());
360d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
361d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Write some API calls
362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_refptr<Action> action = new Action(extension->id(),
363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            base::Time::Now(),
364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            Action::ACTION_API_CALL,
365d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                            "tabs.testMethod");
366d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  activity_log->LogAction(action);
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  action = new Action(extension->id(),
368d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      base::Time::Now(),
369d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      Action::ACTION_DOM_ACCESS,
370d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                      "document.write");
371d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  action->set_page_url(GURL("http://www.google.com"));
372d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  activity_log->OnExtensionUninstalled(
3741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL, extension.get(), extensions::UNINSTALL_REASON_FOR_TESTING);
375d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  activity_log->GetFilteredActions(
376d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      extension->id(),
377d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      Action::ACTION_ANY,
378d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "",
379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "",
380d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      "",
381d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      -1,
382d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      base::Bind(ActivityLogTest::RetrieveActions_LogAndFetchActions0));
383d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
384d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ActivityLogTest, ArgUrlApiCalls) {
3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ActivityLog* activity_log = ActivityLog::GetInstance(profile());
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::ListValue> args(new base::ListValue());
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::Time now = base::Time::Now();
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int api_calls_size = arraysize(kUrlApiCalls);
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<Action> action;
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (int i = 0; i < api_calls_size; i++) {
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    action = new Action(kExtensionId,
3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        now - base::TimeDelta::FromSeconds(i),
3955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        Action::ACTION_DOM_ACCESS,
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        kUrlApiCalls[i]);
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    action->mutable_args()->AppendString("http://www.google.co.uk");
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    action->mutable_other()->SetInteger(activity_log_constants::kActionDomVerb,
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        DomActionType::SETTER);
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    activity_log->LogAction(action);
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  activity_log->GetFilteredActions(
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      kExtensionId,
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      Action::ACTION_ANY,
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "",
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "",
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      "",
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      -1,
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(ActivityLogTest::RetrieveActions_ArgUrlApiCalls));
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
414