Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3447)

Unified Diff: extensions/renderer/script_injection.h

Issue 878513005: Extensions: suspend extension's scripts when V8 is paused (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: extensions/renderer/script_injection.h
diff --git a/extensions/renderer/script_injection.h b/extensions/renderer/script_injection.h
index 9f4691c53345f2554f9386201221b0280f8e9012..5892f5064df89a22b940d23593f1645e241fa894 100644
--- a/extensions/renderer/script_injection.h
+++ b/extensions/renderer/script_injection.h
@@ -7,6 +7,7 @@
#include "base/basictypes.h"
#include "base/macros.h"
+#include "base/memory/scoped_ptr.h"
#include "extensions/common/user_script.h"
#include "extensions/renderer/injection_host.h"
#include "extensions/renderer/script_injector.h"
@@ -15,15 +16,28 @@ struct HostID;
namespace blink {
class WebLocalFrame;
+template<typename T> class WebVector;
+}
+
+namespace v8 {
+class Value;
+template <class T> class Local;
}
namespace extensions {
+class ScriptInjectionManager;
struct ScriptsRunInfo;
// A script wrapper which is aware of whether or not it is allowed to execute,
// and contains the implementation to do so.
class ScriptInjection {
public:
+ enum InjectionResult {
+ INJECTION_FINISHED,
+ INJECTION_BLOCKED,
+ INJECTION_WAITING
+ };
+
// Return the id of the injection host associated with the given world.
static std::string GetHostIdForIsolatedWorld(int world_id);
@@ -37,20 +51,29 @@ class ScriptInjection {
int tab_id);
~ScriptInjection();
- // Try to inject the script at the |current_location|. This returns true if
- // the script has either injected or will never inject (i.e., if the object
- // is done), and false if injection is delayed (either for permission purposes
- // or because |current_location| is not the designated |run_location_|).
- bool TryToInject(UserScript::RunLocation current_location,
- ScriptsRunInfo* scripts_run_info);
+ // Try to inject the script at the |current_location|. This returns
+ // INJECTION_FINISHED if injection has injected or will never inject, returns
+ // INJECTION_BLOCKED if injection is running asynchronously and has not
+ // finished yet, returns INJECTION_WAITING if injections is delayed (either
+ // for permission purposes or because |current_location| is not the designated
+ // |run_location_|).
+ // NOTE: |injection_host| may be NULL, if the injection_host is removed!
Devlin 2015/03/05 16:32:13 Remove |injection_host| comment.
kozy 2015/03/05 21:41:37 Done.
+ InjectionResult TryToInject(UserScript::RunLocation current_location,
+ ScriptsRunInfo* scripts_run_info,
+ ScriptInjectionManager* manager);
// Called when permission for the given injection has been granted.
- // Returns true if the injection ran.
- bool OnPermissionGranted(ScriptsRunInfo* scripts_run_info);
+ // Returns INJECTION_FINISHED if injection has injected or will never inject,
+ // returns INJECTION_BLOCKED if injection is runned asynchronously.
Devlin 2015/03/05 16:32:12 nit: "if the injection is ran asynchronously" (not
kozy 2015/03/05 21:41:37 Done.
+ InjectionResult OnPermissionGranted(ScriptsRunInfo* scripts_run_info);
// Resets the pointer of the injection host when the host is gone.
void OnHostRemoved();
+ // Called when JS injection for the given frame has been completed.
+ void OnJsInjectionCompleted(blink::WebLocalFrame* frame,
+ const blink::WebVector<v8::Local<v8::Value> >&);
Devlin 2015/03/05 16:32:13 nit: assign a name to the vector (e.g., result)
kozy 2015/03/05 21:41:36 Done.
+
// Accessors.
blink::WebLocalFrame* web_frame() const { return web_frame_; }
const HostID& host_id() const { return injection_host_->id(); }
@@ -61,13 +84,15 @@ class ScriptInjection {
// like to inject, or to notify the browser that it is currently injecting.
void SendInjectionMessage(bool request_permission);
- // Injects the script, optionally populating |scripts_run_info|.
- void Inject(ScriptsRunInfo* scripts_run_info);
+ // Injects the script. Returns INJECTION_FINISHED if injection has finished,
+ // otherwise INJECTION_BLOCKED.
+ InjectionResult Inject(ScriptsRunInfo* scripts_run_info);
+
+ // Inject any JS scripts into the |frame|.
+ void InjectJs(blink::WebLocalFrame* frame);
- // Inject any JS scripts into the |frame|, optionally populating
- // |execution_results|.
- void InjectJs(blink::WebLocalFrame* frame,
- base::ListValue* execution_results);
+ // Checks if all scripts have been injected and finished.
+ void TryToFinish();
// Inject any CSS source into the |frame|.
void InjectCss(blink::WebLocalFrame* frame);
@@ -98,6 +123,19 @@ class ScriptInjection {
// or because it will never complete.
bool complete_;
+ // Number of frames in which the injection is running.
+ int running_frames_;
+
+ // Results storage.
+ scoped_ptr<base::ListValue> execution_results_;
+
+ // Flag is true when injections for each frame started.
+ bool all_injections_started_;
+
+ // ScriptInjectionManager::OnInjectionFinished will be called after injection
+ // finished.
+ ScriptInjectionManager* script_injection_manager_;
+
DISALLOW_COPY_AND_ASSIGN(ScriptInjection);
};

Powered by Google App Engine
This is Rietveld 408576698