Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / extensions / renderer / script_injection.h
1 // Copyright 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 #ifndef EXTENSIONS_RENDERER_SCRIPT_INJECTION_H_
6 #define EXTENSIONS_RENDERER_SCRIPT_INJECTION_H_
7
8 #include "base/basictypes.h"
9 #include "base/macros.h"
10 #include "extensions/common/user_script.h"
11 #include "extensions/renderer/script_injector.h"
12
13 namespace blink {
14 class WebFrame;
15 }
16
17 namespace extensions {
18 class Extension;
19 struct ScriptsRunInfo;
20
21 // A script wrapper which is aware of whether or not it is allowed to execute,
22 // and contains the implementation to do so.
23 class ScriptInjection {
24  public:
25   // Return the id of the extension associated with the given world.
26   static std::string GetExtensionIdForIsolatedWorld(int world_id);
27
28   // Remove the isolated world associated with the given extension.
29   static void RemoveIsolatedWorld(const std::string& extension_id);
30
31   ScriptInjection(scoped_ptr<ScriptInjector> injector,
32                   blink::WebFrame* web_frame,
33                   const std::string& extension_id,
34                   UserScript::RunLocation run_location,
35                   int tab_id);
36   ~ScriptInjection();
37
38   // Try to inject the script at the |current_location|. This returns true if
39   // the script has either injected or will never inject (i.e., if the object
40   // is done), and false if injection is delayed (either for permission purposes
41   // or because |current_location| is not the designated |run_location_|).
42   // NOTE: |extension| may be NULL, if the extension is removed!
43   bool TryToInject(UserScript::RunLocation current_location,
44                    const Extension* extension,
45                    ScriptsRunInfo* scripts_run_info);
46
47   // Called when permission for the given injection has been granted.
48   // Returns true if the injection ran.
49   bool OnPermissionGranted(const Extension* extension,
50                            ScriptsRunInfo* scripts_run_info);
51
52   // Accessors.
53   blink::WebFrame* web_frame() const { return web_frame_; }
54   const std::string& extension_id() const { return extension_id_; }
55   int64 request_id() const { return request_id_; }
56
57  private:
58   // Send a message to the browser requesting permission to execute.
59   void RequestPermission();
60
61   // Injects the script, optionally populating |scripts_run_info|.
62   void Inject(const Extension* extension, ScriptsRunInfo* scripts_run_info);
63
64   // Inject any JS scripts into the |frame|, optionally populating
65   // |execution_results|.
66   void InjectJs(const Extension* extension,
67                 blink::WebFrame* frame,
68                 base::ListValue* execution_results);
69
70   // Inject any CSS source into the |frame|.
71   void InjectCss(blink::WebFrame* frame);
72
73   // Notify that we will not inject, and mark it as acknowledged.
74   void NotifyWillNotInject(ScriptInjector::InjectFailureReason reason);
75
76   // The injector for this injection.
77   scoped_ptr<ScriptInjector> injector_;
78
79   // The (main) WebFrame into which this should inject the script.
80   blink::WebFrame* web_frame_;
81
82   // The id of the associated extension.
83   std::string extension_id_;
84
85   // The location in the document load at which we inject the script.
86   UserScript::RunLocation run_location_;
87
88   // The tab id associated with the frame.
89   int tab_id_;
90
91   // This injection's request id. This will be -1 unless the injection is
92   // currently waiting on permission.
93   int64 request_id_;
94
95   // Whether or not the injection is complete, either via injecting the script
96   // or because it will never complete.
97   bool complete_;
98
99   DISALLOW_COPY_AND_ASSIGN(ScriptInjection);
100 };
101
102 }  // namespace extensions
103
104 #endif  // EXTENSIONS_RENDERER_SCRIPT_INJECTION_H_