user_script_listener.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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