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/browser/extensions/extension_tabs_module.h" | 5 #include "chrome/browser/extensions/extension_tabs_module.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 } | 1216 } |
1217 | 1217 |
1218 tab_contents_ = contents; | 1218 tab_contents_ = contents; |
1219 | 1219 |
1220 // TODO(rafaelw): handle setting remaining tab properties: | 1220 // TODO(rafaelw): handle setting remaining tab properties: |
1221 // -title | 1221 // -title |
1222 // -favIconUrl | 1222 // -favIconUrl |
1223 | 1223 |
1224 // Navigate the tab to a new location if the url is different. | 1224 // Navigate the tab to a new location if the url is different. |
1225 bool is_async = false; | 1225 bool is_async = false; |
1226 if (!UpdateURLIfPresent(update_props, &is_async)) | 1226 if (!UpdateURLIfPresent(update_props, tab_id, &is_async)) |
1227 return false; | 1227 return false; |
1228 | 1228 |
1229 bool active = false; | 1229 bool active = false; |
1230 // TODO(rafaelw): Setting |active| from js doesn't make much sense. | 1230 // TODO(rafaelw): Setting |active| from js doesn't make much sense. |
1231 // Move tab selection management up to window. | 1231 // Move tab selection management up to window. |
1232 if (update_props->HasKey(keys::kSelectedKey)) | 1232 if (update_props->HasKey(keys::kSelectedKey)) |
1233 EXTENSION_FUNCTION_VALIDATE(update_props->GetBoolean( | 1233 EXTENSION_FUNCTION_VALIDATE(update_props->GetBoolean( |
1234 keys::kSelectedKey, &active)); | 1234 keys::kSelectedKey, &active)); |
1235 | 1235 |
1236 // The 'active' property has replaced 'selected'. | 1236 // The 'active' property has replaced 'selected'. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 } | 1280 } |
1281 | 1281 |
1282 if (!is_async) { | 1282 if (!is_async) { |
1283 PopulateResult(); | 1283 PopulateResult(); |
1284 SendResponse(true); | 1284 SendResponse(true); |
1285 } | 1285 } |
1286 return true; | 1286 return true; |
1287 } | 1287 } |
1288 | 1288 |
1289 bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props, | 1289 bool UpdateTabFunction::UpdateURLIfPresent(DictionaryValue* update_props, |
| 1290 int tab_id, |
1290 bool* is_async) { | 1291 bool* is_async) { |
1291 if (!update_props->HasKey(keys::kUrlKey)) | 1292 if (!update_props->HasKey(keys::kUrlKey)) |
1292 return true; | 1293 return true; |
1293 | 1294 |
1294 std::string url_string; | 1295 std::string url_string; |
1295 EXTENSION_FUNCTION_VALIDATE(update_props->GetString( | 1296 EXTENSION_FUNCTION_VALIDATE(update_props->GetString( |
1296 keys::kUrlKey, &url_string)); | 1297 keys::kUrlKey, &url_string)); |
1297 GURL url = ExtensionTabUtil::ResolvePossiblyRelativeURL( | 1298 GURL url = ExtensionTabUtil::ResolvePossiblyRelativeURL( |
1298 url_string, GetExtension()); | 1299 url_string, GetExtension()); |
1299 | 1300 |
1300 if (!url.is_valid()) { | 1301 if (!url.is_valid()) { |
1301 error_ = ExtensionErrorUtils::FormatErrorMessage( | 1302 error_ = ExtensionErrorUtils::FormatErrorMessage( |
1302 keys::kInvalidUrlError, url_string); | 1303 keys::kInvalidUrlError, url_string); |
1303 return false; | 1304 return false; |
1304 } | 1305 } |
1305 | 1306 |
1306 // Don't let the extension crash the browser or renderers. | 1307 // Don't let the extension crash the browser or renderers. |
1307 if (ExtensionTabUtil::IsCrashURL(url)) { | 1308 if (ExtensionTabUtil::IsCrashURL(url)) { |
1308 error_ = keys::kNoCrashBrowserError; | 1309 error_ = keys::kNoCrashBrowserError; |
1309 return false; | 1310 return false; |
1310 } | 1311 } |
1311 | 1312 |
1312 // JavaScript URLs can do the same kinds of things as cross-origin XHR, so | 1313 // JavaScript URLs can do the same kinds of things as cross-origin XHR, so |
1313 // we need to check host permissions before allowing them. | 1314 // we need to check host permissions before allowing them. |
1314 if (url.SchemeIs(chrome::kJavaScriptScheme)) { | 1315 if (url.SchemeIs(chrome::kJavaScriptScheme)) { |
1315 if (!GetExtension()->CanExecuteScriptOnPage( | 1316 if (!GetExtension()->CanExecuteScriptOnPage( |
1316 tab_contents_->web_contents()->GetURL(), NULL, &error_)) { | 1317 tab_contents_->web_contents()->GetURL(), tab_id, NULL, &error_)) { |
1317 return false; | 1318 return false; |
1318 } | 1319 } |
1319 | 1320 |
1320 tab_contents_->extension_tab_helper()->script_executor()->ExecuteScript( | 1321 tab_contents_->extension_tab_helper()->script_executor()->ExecuteScript( |
1321 extension_id(), | 1322 extension_id(), |
1322 ScriptExecutor::JAVASCRIPT, | 1323 ScriptExecutor::JAVASCRIPT, |
1323 url.path(), | 1324 url.path(), |
1324 ScriptExecutor::TOP_FRAME, | 1325 ScriptExecutor::TOP_FRAME, |
1325 UserScript::DOCUMENT_IDLE, | 1326 UserScript::DOCUMENT_IDLE, |
1326 ScriptExecutor::MAIN_WORLD, | 1327 ScriptExecutor::MAIN_WORLD, |
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 | 1620 |
1620 if (options->HasKey(keys::kQualityKey)) { | 1621 if (options->HasKey(keys::kQualityKey)) { |
1621 EXTENSION_FUNCTION_VALIDATE( | 1622 EXTENSION_FUNCTION_VALIDATE( |
1622 options->GetInteger(keys::kQualityKey, &image_quality_)); | 1623 options->GetInteger(keys::kQualityKey, &image_quality_)); |
1623 } | 1624 } |
1624 } | 1625 } |
1625 | 1626 |
1626 // captureVisibleTab() can return an image containing sensitive information | 1627 // captureVisibleTab() can return an image containing sensitive information |
1627 // that the browser would otherwise protect. Ensure the extension has | 1628 // that the browser would otherwise protect. Ensure the extension has |
1628 // permission to do this. | 1629 // permission to do this. |
1629 if (!GetExtension()->CanCaptureVisiblePage(web_contents->GetURL(), &error_)) | 1630 if (!GetExtension()->CanCaptureVisiblePage( |
| 1631 web_contents->GetURL(), |
| 1632 wrapper->extension_tab_helper()->GetTabId(), |
| 1633 &error_)) { |
1630 return false; | 1634 return false; |
| 1635 } |
1631 | 1636 |
1632 RenderViewHost* render_view_host = web_contents->GetRenderViewHost(); | 1637 RenderViewHost* render_view_host = web_contents->GetRenderViewHost(); |
1633 content::RenderWidgetHostView* view = render_view_host->GetView(); | 1638 content::RenderWidgetHostView* view = render_view_host->GetView(); |
1634 if (!view) { | 1639 if (!view) { |
1635 error_ = keys::kInternalVisibleTabCaptureError; | 1640 error_ = keys::kInternalVisibleTabCaptureError; |
1636 return false; | 1641 return false; |
1637 } | 1642 } |
1638 skia::PlatformCanvas* temp_canvas = new skia::PlatformCanvas; | 1643 skia::PlatformCanvas* temp_canvas = new skia::PlatformCanvas; |
1639 render_view_host->CopyFromBackingStore( | 1644 render_view_host->CopyFromBackingStore( |
1640 gfx::Rect(), | 1645 gfx::Rect(), |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1813 // called for every API call the extension made. | 1818 // called for every API call the extension made. |
1814 GotLanguage(language); | 1819 GotLanguage(language); |
1815 } | 1820 } |
1816 | 1821 |
1817 void DetectTabLanguageFunction::GotLanguage(const std::string& language) { | 1822 void DetectTabLanguageFunction::GotLanguage(const std::string& language) { |
1818 result_.reset(Value::CreateStringValue(language.c_str())); | 1823 result_.reset(Value::CreateStringValue(language.c_str())); |
1819 SendResponse(true); | 1824 SendResponse(true); |
1820 | 1825 |
1821 Release(); // Balanced in Run() | 1826 Release(); // Balanced in Run() |
1822 } | 1827 } |
OLD | NEW |