| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/renderer/extensions/extension_helper.h" | 5 #include "chrome/renderer/extensions/extension_helper.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/json/json_string_value_serializer.h" | 10 #include "base/json/json_string_value_serializer.h" |
| 11 #include "base/lazy_instance.h" | 11 #include "base/lazy_instance.h" |
| 12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
| 13 #include "base/utf_string_conversions.h" | 13 #include "base/utf_string_conversions.h" |
| 14 #include "chrome/common/chrome_switches.h" | 14 #include "chrome/common/chrome_switches.h" |
| 15 #include "chrome/common/chrome_view_type.h" | |
| 16 #include "chrome/common/extensions/extension_messages.h" | 15 #include "chrome/common/extensions/extension_messages.h" |
| 17 #include "chrome/common/render_messages.h" | 16 #include "chrome/common/render_messages.h" |
| 18 #include "chrome/common/url_constants.h" | 17 #include "chrome/common/url_constants.h" |
| 18 #include "chrome/common/view_type.h" |
| 19 #include "chrome/renderer/extensions/chrome_v8_context.h" | 19 #include "chrome/renderer/extensions/chrome_v8_context.h" |
| 20 #include "chrome/renderer/extensions/extension_dispatcher.h" | 20 #include "chrome/renderer/extensions/extension_dispatcher.h" |
| 21 #include "chrome/renderer/extensions/miscellaneous_bindings.h" | 21 #include "chrome/renderer/extensions/miscellaneous_bindings.h" |
| 22 #include "chrome/renderer/extensions/user_script_scheduler.h" | 22 #include "chrome/renderer/extensions/user_script_scheduler.h" |
| 23 #include "chrome/renderer/extensions/user_script_slave.h" | 23 #include "chrome/renderer/extensions/user_script_slave.h" |
| 24 #include "content/public/renderer/render_view.h" | 24 #include "content/public/renderer/render_view.h" |
| 25 #include "content/public/renderer/render_view_visitor.h" | 25 #include "content/public/renderer/render_view_visitor.h" |
| 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" | 26 #include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h" |
| 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 27 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 28 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| (...skipping 23 matching lines...) Expand all Loading... |
| 52 LAZY_INSTANCE_INITIALIZER; | 52 LAZY_INSTANCE_INITIALIZER; |
| 53 | 53 |
| 54 // A RenderViewVisitor class that iterates through the set of available | 54 // A RenderViewVisitor class that iterates through the set of available |
| 55 // views, looking for a view of the given type, in the given browser window | 55 // views, looking for a view of the given type, in the given browser window |
| 56 // and within the given extension. | 56 // and within the given extension. |
| 57 // Used to accumulate the list of views associated with an extension. | 57 // Used to accumulate the list of views associated with an extension. |
| 58 class ExtensionViewAccumulator : public content::RenderViewVisitor { | 58 class ExtensionViewAccumulator : public content::RenderViewVisitor { |
| 59 public: | 59 public: |
| 60 ExtensionViewAccumulator(const std::string& extension_id, | 60 ExtensionViewAccumulator(const std::string& extension_id, |
| 61 int browser_window_id, | 61 int browser_window_id, |
| 62 content::ViewType view_type) | 62 chrome::ViewType view_type) |
| 63 : extension_id_(extension_id), | 63 : extension_id_(extension_id), |
| 64 browser_window_id_(browser_window_id), | 64 browser_window_id_(browser_window_id), |
| 65 view_type_(view_type) { | 65 view_type_(view_type) { |
| 66 } | 66 } |
| 67 | 67 |
| 68 std::vector<content::RenderView*> views() { return views_; } | 68 std::vector<content::RenderView*> views() { return views_; } |
| 69 | 69 |
| 70 // Returns false to terminate the iteration. | 70 // Returns false to terminate the iteration. |
| 71 virtual bool Visit(content::RenderView* render_view) { | 71 virtual bool Visit(content::RenderView* render_view) { |
| 72 ExtensionHelper* helper = ExtensionHelper::Get(render_view); | 72 ExtensionHelper* helper = ExtensionHelper::Get(render_view); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 87 | 87 |
| 88 views_.push_back(render_view); | 88 views_.push_back(render_view); |
| 89 | 89 |
| 90 if (view_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) | 90 if (view_type_ == chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) |
| 91 return false; // There can be only one... | 91 return false; // There can be only one... |
| 92 return true; | 92 return true; |
| 93 } | 93 } |
| 94 | 94 |
| 95 private: | 95 private: |
| 96 // Returns true if |type| "isa" |match|. | 96 // Returns true if |type| "isa" |match|. |
| 97 static bool ViewTypeMatches(content::ViewType type, content::ViewType match) { | 97 static bool ViewTypeMatches(chrome::ViewType type, chrome::ViewType match) { |
| 98 if (type == match) | 98 if (type == match) |
| 99 return true; | 99 return true; |
| 100 | 100 |
| 101 // INVALID means match all. | 101 // INVALID means match all. |
| 102 if (match == content::VIEW_TYPE_INVALID) | 102 if (match == chrome::VIEW_TYPE_INVALID) |
| 103 return true; | 103 return true; |
| 104 | 104 |
| 105 return false; | 105 return false; |
| 106 } | 106 } |
| 107 | 107 |
| 108 std::string extension_id_; | 108 std::string extension_id_; |
| 109 int browser_window_id_; | 109 int browser_window_id_; |
| 110 content::ViewType view_type_; | 110 chrome::ViewType view_type_; |
| 111 std::vector<content::RenderView*> views_; | 111 std::vector<content::RenderView*> views_; |
| 112 }; | 112 }; |
| 113 | 113 |
| 114 } | 114 } |
| 115 | 115 |
| 116 // static | 116 // static |
| 117 std::vector<content::RenderView*> ExtensionHelper::GetExtensionViews( | 117 std::vector<content::RenderView*> ExtensionHelper::GetExtensionViews( |
| 118 const std::string& extension_id, | 118 const std::string& extension_id, |
| 119 int browser_window_id, | 119 int browser_window_id, |
| 120 content::ViewType view_type) { | 120 chrome::ViewType view_type) { |
| 121 ExtensionViewAccumulator accumulator( | 121 ExtensionViewAccumulator accumulator( |
| 122 extension_id, browser_window_id, view_type); | 122 extension_id, browser_window_id, view_type); |
| 123 content::RenderView::ForEach(&accumulator); | 123 content::RenderView::ForEach(&accumulator); |
| 124 return accumulator.views(); | 124 return accumulator.views(); |
| 125 } | 125 } |
| 126 | 126 |
| 127 // static | 127 // static |
| 128 content::RenderView* ExtensionHelper::GetBackgroundPage( | 128 content::RenderView* ExtensionHelper::GetBackgroundPage( |
| 129 const std::string& extension_id) { | 129 const std::string& extension_id) { |
| 130 ExtensionViewAccumulator accumulator( | 130 ExtensionViewAccumulator accumulator( |
| 131 extension_id, extension_misc::kUnknownWindowId, | 131 extension_id, extension_misc::kUnknownWindowId, |
| 132 chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); | 132 chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
| 133 content::RenderView::ForEach(&accumulator); | 133 content::RenderView::ForEach(&accumulator); |
| 134 CHECK_LE(accumulator.views().size(), 1u); | 134 CHECK_LE(accumulator.views().size(), 1u); |
| 135 if (accumulator.views().size() == 0) | 135 if (accumulator.views().size() == 0) |
| 136 return NULL; | 136 return NULL; |
| 137 return accumulator.views()[0]; | 137 return accumulator.views()[0]; |
| 138 } | 138 } |
| 139 | 139 |
| 140 ExtensionHelper::ExtensionHelper(content::RenderView* render_view, | 140 ExtensionHelper::ExtensionHelper(content::RenderView* render_view, |
| 141 ExtensionDispatcher* extension_dispatcher) | 141 ExtensionDispatcher* extension_dispatcher) |
| 142 : content::RenderViewObserver(render_view), | 142 : content::RenderViewObserver(render_view), |
| 143 content::RenderViewObserverTracker<ExtensionHelper>(render_view), | 143 content::RenderViewObserverTracker<ExtensionHelper>(render_view), |
| 144 extension_dispatcher_(extension_dispatcher), | 144 extension_dispatcher_(extension_dispatcher), |
| 145 pending_app_icon_requests_(0), | 145 pending_app_icon_requests_(0), |
| 146 view_type_(content::VIEW_TYPE_INVALID), | 146 view_type_(chrome::VIEW_TYPE_INVALID), |
| 147 browser_window_id_(-1) { | 147 browser_window_id_(-1) { |
| 148 } | 148 } |
| 149 | 149 |
| 150 ExtensionHelper::~ExtensionHelper() { | 150 ExtensionHelper::~ExtensionHelper() { |
| 151 } | 151 } |
| 152 | 152 |
| 153 bool ExtensionHelper::InstallWebApplicationUsingDefinitionFile( | 153 bool ExtensionHelper::InstallWebApplicationUsingDefinitionFile( |
| 154 WebFrame* frame, string16* error) { | 154 WebFrame* frame, string16* error) { |
| 155 // There is an issue of drive-by installs with the below implementation. A web | 155 // There is an issue of drive-by installs with the below implementation. A web |
| 156 // site could force a user to install an app by timing the dialog to come up | 156 // site could force a user to install an app by timing the dialog to come up |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 362 if (app_info.icons[i].url.SchemeIs(chrome::kDataScheme)) { | 362 if (app_info.icons[i].url.SchemeIs(chrome::kDataScheme)) { |
| 363 app_info.icons.erase(app_info.icons.begin() + i); | 363 app_info.icons.erase(app_info.icons.begin() + i); |
| 364 --i; | 364 --i; |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 | 367 |
| 368 Send(new ExtensionHostMsg_DidGetApplicationInfo( | 368 Send(new ExtensionHostMsg_DidGetApplicationInfo( |
| 369 routing_id(), page_id, app_info)); | 369 routing_id(), page_id, app_info)); |
| 370 } | 370 } |
| 371 | 371 |
| 372 void ExtensionHelper::OnNotifyRendererViewType(content::ViewType type) { | 372 void ExtensionHelper::OnNotifyRendererViewType(chrome::ViewType type) { |
| 373 view_type_ = type; | 373 view_type_ = type; |
| 374 } | 374 } |
| 375 | 375 |
| 376 void ExtensionHelper::OnUpdateBrowserWindowId(int window_id) { | 376 void ExtensionHelper::OnUpdateBrowserWindowId(int window_id) { |
| 377 browser_window_id_ = window_id; | 377 browser_window_id_ = window_id; |
| 378 } | 378 } |
| 379 | 379 |
| 380 void ExtensionHelper::DidDownloadApplicationDefinition( | 380 void ExtensionHelper::DidDownloadApplicationDefinition( |
| 381 const WebKit::WebURLResponse& response, | 381 const WebKit::WebURLResponse& response, |
| 382 const std::string& data) { | 382 const std::string& data) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 routing_id(), *pending_app_info_)); | 469 routing_id(), *pending_app_info_)); |
| 470 pending_app_info_.reset(NULL); | 470 pending_app_info_.reset(NULL); |
| 471 } | 471 } |
| 472 | 472 |
| 473 void ExtensionHelper::AddErrorToRootConsole(const string16& message) { | 473 void ExtensionHelper::AddErrorToRootConsole(const string16& message) { |
| 474 if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { | 474 if (render_view()->GetWebView() && render_view()->GetWebView()->mainFrame()) { |
| 475 render_view()->GetWebView()->mainFrame()->addMessageToConsole( | 475 render_view()->GetWebView()->mainFrame()->addMessageToConsole( |
| 476 WebConsoleMessage(WebConsoleMessage::LevelError, message)); | 476 WebConsoleMessage(WebConsoleMessage::LevelError, message)); |
| 477 } | 477 } |
| 478 } | 478 } |
| OLD | NEW |