1// Copyright (c) 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/extensions/api/web_request/chrome_extension_web_request_event_router_delegate.h"
6
7#include "base/bind.h"
8#include "base/bind_helpers.h"
9#include "base/strings/string_number_conversions.h"
10#include "base/strings/string_util.h"
11#include "base/strings/utf_string_conversions.h"
12#include "chrome/browser/extensions/activity_log/activity_action_constants.h"
13#include "chrome/browser/extensions/activity_log/activity_log.h"
14#include "chrome/browser/extensions/extension_renderer_state.h"
15#include "content/public/browser/resource_request_info.h"
16#include "extensions/browser/api/activity_log/web_request_constants.h"
17#include "extensions/browser/api/web_request/web_request_api.h"
18#include "extensions/browser/api/web_request/web_request_api_constants.h"
19#include "extensions/browser/api/web_request/web_request_api_helpers.h"
20#include "net/url_request/url_request.h"
21
22namespace activitylog = activity_log_web_request_constants;
23namespace helpers = extension_web_request_api_helpers;
24namespace keys = extension_web_request_api_constants;
25
26namespace {
27
28void ExtractExtraRequestDetailsInternal(
29    net::URLRequest* request, int* tab_id, int* window_id) {
30  if (!request->GetUserData(NULL))
31    return;
32
33  const content::ResourceRequestInfo* info =
34      content::ResourceRequestInfo::ForRequest(request);
35  ExtensionRendererState::GetInstance()->GetTabAndWindowId(
36      info, tab_id, window_id);
37}
38
39}  // namespace
40
41ChromeExtensionWebRequestEventRouterDelegate::
42    ChromeExtensionWebRequestEventRouterDelegate(){
43}
44
45ChromeExtensionWebRequestEventRouterDelegate::
46    ~ChromeExtensionWebRequestEventRouterDelegate() {
47}
48
49void ChromeExtensionWebRequestEventRouterDelegate::LogExtensionActivity(
50    content::BrowserContext* browser_context,
51    bool is_incognito,
52    const std::string& extension_id,
53    const GURL& url,
54    const std::string& api_call,
55    scoped_ptr<base::DictionaryValue> details) {
56  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
57  if (!extensions::ExtensionsBrowserClient::Get()->IsValidContext(
58      browser_context))
59    return;
60
61  scoped_refptr<extensions::Action> action =
62      new extensions::Action(extension_id,
63                              base::Time::Now(),
64                              extensions::Action::ACTION_WEB_REQUEST,
65                              api_call);
66  action->set_page_url(url);
67  action->set_page_incognito(is_incognito);
68  action->mutable_other()->Set(activity_log_constants::kActionWebRequest,
69                               details.release());
70  extensions::ActivityLog::GetInstance(browser_context)->LogAction(action);
71}
72
73void ChromeExtensionWebRequestEventRouterDelegate::ExtractExtraRequestDetails(
74   net::URLRequest* request, base::DictionaryValue* out) {
75  int tab_id = -1;
76  int window_id = -1;
77  ExtractExtraRequestDetailsInternal(request, &tab_id, &window_id);
78  out->SetInteger(keys::kTabIdKey, tab_id);
79}
80
81bool
82ChromeExtensionWebRequestEventRouterDelegate::OnGetMatchingListenersImplCheck(
83    int filter_tab_id, int filter_window_id, net::URLRequest* request) {
84  int tab_id = -1;
85  int window_id = -1;
86  ExtractExtraRequestDetailsInternal(request, &tab_id, &window_id);
87  if (filter_tab_id != -1 && tab_id != filter_tab_id)
88    return true;
89  if (filter_window_id != -1 && window_id != filter_window_id)
90    return true;
91  return false;
92}
93