1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_LISTENER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_LISTENER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <list>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/resource_queue.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_registrar.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochnamespace net {
17201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass URLRequest;
18201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch}  // namespace net
19201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Extension;
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass URLPattern;
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct GlobalRequestID;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class handles delaying of resource loads that depend on unloaded user
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// scripts. For each request that comes in, we check if it depends on a user
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// script, and if so, whether that user script is ready; if not, we delay the
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// request.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class lives mostly on the IO thread. It listens on the UI thread for
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// updates to loaded extensions.  It will delete itself on the UI thread after
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// WillShutdownResourceQueue is called (on the IO thread).
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass UserScriptListener
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<UserScriptListener>,
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public ResourceQueueDelegate,
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      public NotificationObserver {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  UserScriptListener();
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ResourceQueueDelegate:
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void Initialize(ResourceQueue* resource_queue);
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual bool ShouldDelayRequest(
42201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      net::URLRequest* request,
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const ResourceDispatcherHostRequestInfo& request_info,
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GlobalRequestID& request_id);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void WillShutdownResourceQueue();
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<UserScriptListener>;
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::list<URLPattern> URLPatterns;
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~UserScriptListener();
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resume any requests that we delayed in order to wait for user scripts.
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartDelayedRequests();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Appends new url patterns to our list, also setting user_scripts_ready_
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to false.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AppendNewURLPatterns(const URLPatterns& new_patterns);
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Replaces our url pattern list. This is only used when patterns have been
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // deleted, so user_scripts_ready_ remains unchanged.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ReplaceURLPatterns(const URLPatterns& patterns);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Cleanup on UI thread.
66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void Cleanup();
67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResourceQueue* resource_queue_;
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A list of every request that we delayed. Will be flushed when user scripts
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // are ready.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::list<GlobalRequestID> DelayedRequests;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DelayedRequests delayed_request_ids_;
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(mpcomplete): the rest of this stuff should really be per-profile, but
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the complexity doesn't seem worth it at this point.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if the user scripts contained in |url_patterns_| are ready for
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // injection.
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool user_scripts_ready_;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A list of URL patterns that have will have user scripts applied to them.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLPatterns url_patterns_;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // --- UI thread:
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper to collect the extension's user script URL patterns in a list and
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // return it.
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void CollectURLPatterns(const Extension* extension, URLPatterns* patterns);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NotificationRegistrar registrar_;
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(UserScriptListener);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_USER_SCRIPT_LISTENER_H_
102