diff options
Diffstat (limited to 'extensions/renderer/user_script_scheduler.h')
-rw-r--r-- | extensions/renderer/user_script_scheduler.h | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/extensions/renderer/user_script_scheduler.h b/extensions/renderer/user_script_scheduler.h new file mode 100644 index 0000000..4e8a45b --- /dev/null +++ b/extensions/renderer/user_script_scheduler.h @@ -0,0 +1,95 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef EXTENSIONS_RENDERER_USER_SCRIPT_SCHEDULER_H_ +#define EXTENSIONS_RENDERER_USER_SCRIPT_SCHEDULER_H_ + +#include <map> +#include <queue> + +#include "base/memory/linked_ptr.h" +#include "base/memory/weak_ptr.h" +#include "extensions/common/user_script.h" + +class RenderView; +struct ExtensionMsg_ExecuteCode_Params; + +namespace blink { +class WebFrame; +} + +namespace extensions { +class Dispatcher; + +// Implements support for injecting scripts at different times in the document +// loading process. The different possible time are described in +// UserScript::RunLocation. +// +// Currently, determining idleness is simple: it is whichever of the following +// happens first: +// +// a) When the initial DOM for a page is complete + kUserScriptIdleTimeout, +// b) or when the page has completely loaded including all subresources. +// +// The intent of this mechanism is to prevent user scripts from slowing down +// fast pages (run after load), while still allowing them to run relatively +// timely for pages with lots of slow subresources. +// +// NOTE: this class does not inherit from RenderViewObserver on purpose. The +// reason is that this object is per frame, and a frame can move across +// RenderViews thanks to adoptNode. So we have each RenderView's +// ExtensionHelper proxy these calls to the renderer process' Dispatcher, +// which contains the mapping from WebFrame to us. +class UserScriptScheduler { + public: + UserScriptScheduler(blink::WebFrame* frame, Dispatcher* dispatcher); + ~UserScriptScheduler(); + + void ExecuteCode(const ExtensionMsg_ExecuteCode_Params& params); + void DidCreateDocumentElement(); + void DidFinishDocumentLoad(); + void DidFinishLoad(); + void DidStartProvisionalLoad(); + + private: + typedef + std::queue<linked_ptr<ExtensionMsg_ExecuteCode_Params> > + ExecutionQueue; + + // Run user scripts, except if they've already run for this frame, or the + // frame has been destroyed. + void MaybeRun(); + + // Backend for the IPC Message ExecuteCode in addition to being used + // internally. + void ExecuteCodeImpl(const ExtensionMsg_ExecuteCode_Params& params); + + // Get all child frames of parent_frame, returned by frames_vector. + bool GetAllChildFrames(blink::WebFrame* parent_frame, + std::vector<blink::WebFrame*>* frames_vector) const; + + // Call to signify thet the idle timeout has expired. + void IdleTimeout(); + + base::WeakPtrFactory<UserScriptScheduler> weak_factory_; + + // The Frame we will run scripts in. + blink::WebFrame* frame_; + + // The current location in the document loading process. + // Will be UserScript::UNDEFINED if it is before any scripts should be run. + UserScript::RunLocation current_location_; + + // Whether we have already run the idle scripts. + bool has_run_idle_; + + // This is only used if we're for the main frame. + std::map<UserScript::RunLocation, ExecutionQueue> pending_execution_map_; + + Dispatcher* dispatcher_; +}; + +} // namespace extensions + +#endif // EXTENSIONS_RENDERER_USER_SCRIPT_SCHEDULER_H_ |