| 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 "content/renderer/browser_plugin/browser_plugin.h" | 5 #include "content/renderer/browser_plugin/browser_plugin.h" |
| 6 | 6 |
| 7 #include "base/message_loop.h" | 7 #include "base/message_loop.h" |
| 8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
| 9 #if defined (OS_WIN) | 9 #if defined (OS_WIN) |
| 10 #include "base/sys_info.h" | 10 #include "base/sys_info.h" |
| 11 #endif | 11 #endif |
| 12 #include "base/utf_string_conversions.h" |
| 12 #include "content/common/browser_plugin_messages.h" | 13 #include "content/common/browser_plugin_messages.h" |
| 13 #include "content/public/common/content_client.h" | 14 #include "content/public/common/content_client.h" |
| 14 #include "content/public/renderer/content_renderer_client.h" | 15 #include "content/public/renderer/content_renderer_client.h" |
| 15 #include "content/renderer/browser_plugin/browser_plugin_bindings.h" | 16 #include "content/renderer/browser_plugin/browser_plugin_bindings.h" |
| 16 #include "content/renderer/browser_plugin/browser_plugin_manager.h" | 17 #include "content/renderer/browser_plugin/browser_plugin_manager.h" |
| 17 #include "content/renderer/render_process_impl.h" | 18 #include "content/renderer/render_process_impl.h" |
| 18 #include "content/renderer/render_thread_impl.h" | 19 #include "content/renderer/render_thread_impl.h" |
| 19 #include "skia/ext/platform_canvas.h" | 20 #include "skia/ext/platform_canvas.h" |
| 20 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" | 21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h" |
| 21 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 22 #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 35 using WebKit::WebString; | 36 using WebKit::WebString; |
| 36 using WebKit::WebRect; | 37 using WebKit::WebRect; |
| 37 using WebKit::WebURL; | 38 using WebKit::WebURL; |
| 38 using WebKit::WebVector; | 39 using WebKit::WebVector; |
| 39 | 40 |
| 40 namespace content { | 41 namespace content { |
| 41 | 42 |
| 42 namespace { | 43 namespace { |
| 43 const char kCrashEventName[] = "crash"; | 44 const char kCrashEventName[] = "crash"; |
| 44 const char kNavigationEventName[] = "navigation"; | 45 const char kNavigationEventName[] = "navigation"; |
| 46 const char* kPartitionAttribute = "partition"; |
| 47 const char* kPersistPrefix = "persist:"; |
| 45 const char* kSrcAttribute = "src"; | 48 const char* kSrcAttribute = "src"; |
| 49 |
| 46 } | 50 } |
| 47 | 51 |
| 48 BrowserPlugin::BrowserPlugin( | 52 BrowserPlugin::BrowserPlugin( |
| 49 int instance_id, | 53 int instance_id, |
| 50 RenderViewImpl* render_view, | 54 RenderViewImpl* render_view, |
| 51 WebKit::WebFrame* frame, | 55 WebKit::WebFrame* frame, |
| 52 const WebPluginParams& params) | 56 const WebPluginParams& params) |
| 53 : instance_id_(instance_id), | 57 : instance_id_(instance_id), |
| 54 render_view_(render_view), | 58 render_view_(render_view), |
| 55 container_(NULL), | 59 container_(NULL), |
| 56 damage_buffer_(NULL), | 60 damage_buffer_(NULL), |
| 57 sad_guest_(NULL), | 61 sad_guest_(NULL), |
| 58 guest_crashed_(false), | 62 guest_crashed_(false), |
| 59 resize_pending_(false), | 63 resize_pending_(false), |
| 60 navigate_src_sent_(false), | 64 navigate_src_sent_(false), |
| 61 parent_frame_(frame->identifier()), | 65 parent_frame_(frame->identifier()), |
| 62 process_id_(-1) { | 66 process_id_(-1), |
| 67 persist_storage_(false) { |
| 63 BrowserPluginManager::Get()->AddBrowserPlugin(instance_id, this); | 68 BrowserPluginManager::Get()->AddBrowserPlugin(instance_id, this); |
| 64 bindings_.reset(new BrowserPluginBindings(this)); | 69 bindings_.reset(new BrowserPluginBindings(this)); |
| 65 | 70 |
| 66 std::string src; | 71 ParseAttributes(params); |
| 67 if (ParseSrcAttribute(params, &src)) | |
| 68 SetSrcAttribute(src); | |
| 69 } | 72 } |
| 70 | 73 |
| 71 BrowserPlugin::~BrowserPlugin() { | 74 BrowserPlugin::~BrowserPlugin() { |
| 72 if (damage_buffer_) { | 75 if (damage_buffer_) { |
| 73 RenderProcess::current()->FreeTransportDIB(damage_buffer_); | 76 RenderProcess::current()->FreeTransportDIB(damage_buffer_); |
| 74 damage_buffer_ = NULL; | 77 damage_buffer_ = NULL; |
| 75 } | 78 } |
| 76 RemoveEventListeners(); | 79 RemoveEventListeners(); |
| 77 BrowserPluginManager::Get()->RemoveBrowserPlugin(instance_id_); | 80 BrowserPluginManager::Get()->RemoveBrowserPlugin(instance_id_); |
| 78 BrowserPluginManager::Get()->Send( | 81 BrowserPluginManager::Get()->Send( |
| (...skipping 23 matching lines...) Expand all Loading... |
| 102 instance_id_, | 105 instance_id_, |
| 103 parent_frame_, | 106 parent_frame_, |
| 104 src, | 107 src, |
| 105 gfx::Size(width(), height()))); | 108 gfx::Size(width(), height()))); |
| 106 // Record that we sent a NavigateGuest message to embedder. Once we send | 109 // Record that we sent a NavigateGuest message to embedder. Once we send |
| 107 // such a message, subsequent SetSrcAttribute() calls must always send | 110 // such a message, subsequent SetSrcAttribute() calls must always send |
| 108 // NavigateGuest messages to the embedder (even if |src| is empty), so | 111 // NavigateGuest messages to the embedder (even if |src| is empty), so |
| 109 // resize works correctly for all cases (e.g. The embedder can reset the | 112 // resize works correctly for all cases (e.g. The embedder can reset the |
| 110 // guest's |src| to empty value, resize and then set the |src| to a | 113 // guest's |src| to empty value, resize and then set the |src| to a |
| 111 // non-empty value). | 114 // non-empty value). |
| 115 // Additionally, once this instance has navigated, the storage partition |
| 116 // cannot be changed, so this value is used for enforcing this. |
| 112 navigate_src_sent_ = true; | 117 navigate_src_sent_ = true; |
| 113 } | 118 } |
| 114 src_ = src; | 119 src_ = src; |
| 115 guest_crashed_ = false; | 120 guest_crashed_ = false; |
| 116 } | 121 } |
| 117 | 122 |
| 118 bool BrowserPlugin::ParseSrcAttribute( | 123 std::string BrowserPlugin::GetPartitionAttribute() const { |
| 119 const WebKit::WebPluginParams& params, | 124 std::string value; |
| 120 std::string* src) { | 125 if (persist_storage_) |
| 126 value.append(kPersistPrefix); |
| 127 |
| 128 value.append(storage_partition_id_); |
| 129 return value; |
| 130 } |
| 131 |
| 132 bool BrowserPlugin::SetPartitionAttribute(const std::string& partition_id, |
| 133 std::string& error_message) { |
| 134 if (navigate_src_sent_) { |
| 135 error_message = |
| 136 "The object has already navigated, so its partition cannot be changed."; |
| 137 return false; |
| 138 } |
| 139 |
| 140 std::string input = partition_id; |
| 141 |
| 142 // Since the "persist:" prefix is in ASCII, StartsWith will work fine on |
| 143 // UTF-8 encoded |partition_id|. If the prefix is a match, we can safely |
| 144 // remove the prefix without splicing in the middle of a multi-byte codepoint. |
| 145 // We can use the rest of the string as UTF-8 encoded one. |
| 146 if (StartsWithASCII(input, kPersistPrefix, true)) { |
| 147 size_t index = input.find(":"); |
| 148 CHECK(index != std::string::npos); |
| 149 // It is safe to do index + 1, since we tested for the full prefix above. |
| 150 input = input.substr(index + 1); |
| 151 if (input.empty()) { |
| 152 error_message = "Invalid empty partition attribute."; |
| 153 return false; |
| 154 } |
| 155 persist_storage_ = true; |
| 156 } else { |
| 157 persist_storage_ = false; |
| 158 } |
| 159 |
| 160 storage_partition_id_ = input; |
| 161 return true; |
| 162 } |
| 163 |
| 164 void BrowserPlugin::ParseAttributes(const WebKit::WebPluginParams& params) { |
| 165 std::string src; |
| 166 |
| 121 // Get the src attribute from the attributes vector | 167 // Get the src attribute from the attributes vector |
| 122 for (unsigned i = 0; i < params.attributeNames.size(); ++i) { | 168 for (unsigned i = 0; i < params.attributeNames.size(); ++i) { |
| 123 std::string attributeName = params.attributeNames[i].utf8(); | 169 std::string attributeName = params.attributeNames[i].utf8(); |
| 124 if (LowerCaseEqualsASCII(attributeName, kSrcAttribute)) { | 170 if (LowerCaseEqualsASCII(attributeName, kSrcAttribute)) { |
| 125 *src = params.attributeValues[i].utf8(); | 171 src = params.attributeValues[i].utf8(); |
| 126 return true; | 172 } else if (LowerCaseEqualsASCII(attributeName, kPartitionAttribute)) { |
| 173 std::string error; |
| 174 SetPartitionAttribute(params.attributeValues[i].utf8(), error); |
| 127 } | 175 } |
| 128 } | 176 } |
| 129 return false; | 177 |
| 178 // Set the 'src' attribute last, as it will set the has_navigated_ flag to |
| 179 // true, which prevents changing the 'partition' attribute. |
| 180 if (!src.empty()) |
| 181 SetSrcAttribute(src); |
| 130 } | 182 } |
| 131 | 183 |
| 132 float BrowserPlugin::GetDeviceScaleFactor() const { | 184 float BrowserPlugin::GetDeviceScaleFactor() const { |
| 133 if (!render_view_) | 185 if (!render_view_) |
| 134 return 1.0f; | 186 return 1.0f; |
| 135 return render_view_->GetWebView()->deviceScaleFactor(); | 187 return render_view_->GetWebView()->deviceScaleFactor(); |
| 136 } | 188 } |
| 137 | 189 |
| 138 void BrowserPlugin::RemoveEventListeners() { | 190 void BrowserPlugin::RemoveEventListeners() { |
| 139 EventListenerMap::iterator event_listener_map_iter = | 191 EventListenerMap::iterator event_listener_map_iter = |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 void* notify_data) { | 524 void* notify_data) { |
| 473 } | 525 } |
| 474 | 526 |
| 475 void BrowserPlugin::didFailLoadingFrameRequest( | 527 void BrowserPlugin::didFailLoadingFrameRequest( |
| 476 const WebKit::WebURL& url, | 528 const WebKit::WebURL& url, |
| 477 void* notify_data, | 529 void* notify_data, |
| 478 const WebKit::WebURLError& error) { | 530 const WebKit::WebURLError& error) { |
| 479 } | 531 } |
| 480 | 532 |
| 481 } // namespace content | 533 } // namespace content |
| OLD | NEW |