OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/gfx/jpeg_codec.h" | 7 #include "base/gfx/jpeg_codec.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "chrome/browser/browser.h" | 9 #include "chrome/browser/browser.h" |
10 #include "chrome/browser/browser_list.h" | 10 #include "chrome/browser/browser_list.h" |
11 #include "chrome/browser/browser_window.h" | 11 #include "chrome/browser/browser_window.h" |
12 #include "chrome/browser/extensions/extension_function_dispatcher.h" | 12 #include "chrome/browser/extensions/extension_function_dispatcher.h" |
13 #include "chrome/browser/extensions/extension_tabs_module_constants.h" | 13 #include "chrome/browser/extensions/extension_tabs_module_constants.h" |
14 #include "chrome/browser/extensions/extensions_service.h" | 14 #include "chrome/browser/extensions/extensions_service.h" |
15 #include "chrome/browser/profile.h" | 15 #include "chrome/browser/profile.h" |
16 #include "chrome/browser/renderer_host/backing_store.h" | 16 #include "chrome/browser/renderer_host/backing_store.h" |
17 #include "chrome/browser/renderer_host/render_view_host.h" | 17 #include "chrome/browser/renderer_host/render_view_host.h" |
18 #include "chrome/browser/renderer_host/render_view_host_delegate.h" | 18 #include "chrome/browser/renderer_host/render_view_host_delegate.h" |
19 #include "chrome/browser/tab_contents/navigation_entry.h" | 19 #include "chrome/browser/tab_contents/navigation_entry.h" |
20 #include "chrome/browser/tab_contents/tab_contents.h" | 20 #include "chrome/browser/tab_contents/tab_contents.h" |
21 #include "chrome/browser/window_sizer.h" | 21 #include "chrome/browser/window_sizer.h" |
22 #include "chrome/common/extensions/extension.h" | 22 #include "chrome/common/extensions/extension.h" |
23 #include "chrome/common/extensions/extension_error_utils.h" | 23 #include "chrome/common/extensions/extension_error_utils.h" |
| 24 #include "chrome/common/url_constants.h" |
24 #include "net/base/base64.h" | 25 #include "net/base/base64.h" |
25 #include "skia/ext/image_operations.h" | 26 #include "skia/ext/image_operations.h" |
26 #include "skia/ext/platform_canvas.h" | 27 #include "skia/ext/platform_canvas.h" |
27 #include "third_party/skia/include/core/SkBitmap.h" | 28 #include "third_party/skia/include/core/SkBitmap.h" |
28 | 29 |
29 | 30 |
30 namespace keys = extension_tabs_module_constants; | 31 namespace keys = extension_tabs_module_constants; |
31 | 32 |
32 // Forward declare static helper functions defined below. | 33 // Forward declare static helper functions defined below. |
33 | 34 |
34 // |error_message| can optionally be passed in a will be set with an appropriate | 35 // |error_message| can optionally be passed in a will be set with an appropriate |
35 // message if the window cannot be found by id. | 36 // message if the window cannot be found by id. |
36 static Browser* GetBrowserInProfileWithId(Profile* profile, | 37 static Browser* GetBrowserInProfileWithId(Profile* profile, |
37 const int window_id, | 38 const int window_id, |
38 std::string* error_message); | 39 std::string* error_message); |
39 | 40 |
40 // |error_message| can optionally be passed in a will be set with an appropriate | 41 // |error_message| can optionally be passed in a will be set with an appropriate |
41 // message if the tab cannot be found by id. | 42 // message if the tab cannot be found by id. |
42 static bool GetTabById(int tab_id, Profile* profile, Browser** browser, | 43 static bool GetTabById(int tab_id, Profile* profile, Browser** browser, |
43 TabStripModel** tab_strip, | 44 TabStripModel** tab_strip, |
44 TabContents** contents, | 45 TabContents** contents, |
45 int* tab_index, std::string* error_message); | 46 int* tab_index, std::string* error_message); |
46 | 47 |
47 // Construct an absolute path from a relative path. | |
48 static GURL AbsolutePath(Profile* profile, const std::string& extension_id, | |
49 const std::string& relative_url); | |
50 | |
51 int ExtensionTabUtil::GetWindowId(const Browser* browser) { | 48 int ExtensionTabUtil::GetWindowId(const Browser* browser) { |
52 return browser->session_id().id(); | 49 return browser->session_id().id(); |
53 } | 50 } |
54 | 51 |
55 int ExtensionTabUtil::GetTabId(const TabContents* tab_contents) { | 52 int ExtensionTabUtil::GetTabId(const TabContents* tab_contents) { |
56 return tab_contents->controller().session_id().id(); | 53 return tab_contents->controller().session_id().id(); |
57 } | 54 } |
58 | 55 |
59 ExtensionTabUtil::TabStatus ExtensionTabUtil::GetTabStatus( | 56 ExtensionTabUtil::TabStatus ExtensionTabUtil::GetTabStatus( |
60 const TabContents* tab_contents) { | 57 const TabContents* tab_contents) { |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
464 // -favIconUrl | 461 // -favIconUrl |
465 | 462 |
466 std::string url_string; | 463 std::string url_string; |
467 scoped_ptr<GURL> url(new GURL()); | 464 scoped_ptr<GURL> url(new GURL()); |
468 if (args->HasKey(keys::kUrlKey)) { | 465 if (args->HasKey(keys::kUrlKey)) { |
469 EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, | 466 EXTENSION_FUNCTION_VALIDATE(args->GetString(keys::kUrlKey, |
470 &url_string)); | 467 &url_string)); |
471 url.reset(new GURL(url_string)); | 468 url.reset(new GURL(url_string)); |
472 if (!url->is_valid()) { | 469 if (!url->is_valid()) { |
473 // The path as passed in is not valid. Try converting to absolute path. | 470 // The path as passed in is not valid. Try converting to absolute path. |
474 *url = AbsolutePath(profile(), extension_id(), url_string); | 471 *url = GetExtension()->GetResourceURL(url->spec()); |
475 if (!url->is_valid()) { | 472 if (!url->is_valid()) { |
476 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, | 473 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, |
477 url_string); | 474 url_string); |
478 return false; | 475 return false; |
479 } | 476 } |
480 } | 477 } |
481 } | 478 } |
482 | 479 |
483 // Default to foreground for the new tab. The presence of 'selected' property | 480 // Default to foreground for the new tab. The presence of 'selected' property |
484 // will override this default. | 481 // will override this default. |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
551 | 548 |
552 // Navigate the tab to a new location if the url different. | 549 // Navigate the tab to a new location if the url different. |
553 std::string url; | 550 std::string url; |
554 if (update_props->HasKey(keys::kUrlKey)) { | 551 if (update_props->HasKey(keys::kUrlKey)) { |
555 EXTENSION_FUNCTION_VALIDATE(update_props->GetString( | 552 EXTENSION_FUNCTION_VALIDATE(update_props->GetString( |
556 keys::kUrlKey, &url)); | 553 keys::kUrlKey, &url)); |
557 GURL new_gurl(url); | 554 GURL new_gurl(url); |
558 | 555 |
559 if (!new_gurl.is_valid()) { | 556 if (!new_gurl.is_valid()) { |
560 // The path as passed in is not valid. Try converting to absolute path. | 557 // The path as passed in is not valid. Try converting to absolute path. |
561 new_gurl = AbsolutePath(profile(), extension_id(), url); | 558 new_gurl = GetExtension()->GetResourceURL(url); |
562 if (!new_gurl.is_valid()) { | 559 if (!new_gurl.is_valid()) { |
563 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, | 560 error_ = ExtensionErrorUtils::FormatErrorMessage(keys::kInvalidUrlError, |
564 url); | 561 url); |
565 return false; | 562 return false; |
566 } | 563 } |
567 } | 564 } |
568 | 565 |
| 566 // JavaScript URLs can do the same kinds of things as cross-origin XHR, so |
| 567 // we need to check host permissions before allowing them. |
| 568 if (new_gurl.SchemeIs(chrome::kJavaScriptScheme)) { |
| 569 if (!GetExtension()->CanAccessHost(contents->GetURL())) { |
| 570 error_ = ExtensionErrorUtils::FormatErrorMessage( |
| 571 keys::kCannotAccessPageError, contents->GetURL().spec()); |
| 572 return false; |
| 573 } |
| 574 |
| 575 // TODO(aa): How does controller queue URLs? Is there any chance that this |
| 576 // JavaScript URL will end up applying to something other than |
| 577 // controller->GetURL()? |
| 578 } |
| 579 |
569 controller.LoadURL(new_gurl, GURL(), PageTransition::LINK); | 580 controller.LoadURL(new_gurl, GURL(), PageTransition::LINK); |
570 DCHECK_EQ(new_gurl.spec(), contents->GetURL().spec()); | 581 |
| 582 // The URL of a tab contents never actually changes to a JavaScript URL, so |
| 583 // this check only makes sense in other cases. |
| 584 if (!new_gurl.SchemeIs(chrome::kJavaScriptScheme)) |
| 585 DCHECK_EQ(new_gurl.spec(), contents->GetURL().spec()); |
571 } | 586 } |
572 | 587 |
573 bool selected = false; | 588 bool selected = false; |
574 // TODO(rafaelw): Setting |selected| from js doesn't make much sense. | 589 // TODO(rafaelw): Setting |selected| from js doesn't make much sense. |
575 // Move tab selection management up to window. | 590 // Move tab selection management up to window. |
576 if (update_props->HasKey(keys::kSelectedKey)) { | 591 if (update_props->HasKey(keys::kSelectedKey)) { |
577 EXTENSION_FUNCTION_VALIDATE(update_props->GetBoolean( | 592 EXTENSION_FUNCTION_VALIDATE(update_props->GetBoolean( |
578 keys::kSelectedKey, | 593 keys::kSelectedKey, |
579 &selected)); | 594 &selected)); |
580 if (selected && tab_strip->selected_index() != tab_index) { | 595 if (selected && tab_strip->selected_index() != tab_index) { |
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
821 return *browser; | 836 return *browser; |
822 } | 837 } |
823 | 838 |
824 if (error_message) | 839 if (error_message) |
825 *error_message= ExtensionErrorUtils::FormatErrorMessage( | 840 *error_message= ExtensionErrorUtils::FormatErrorMessage( |
826 keys::kWindowNotFoundError, IntToString(window_id)); | 841 keys::kWindowNotFoundError, IntToString(window_id)); |
827 | 842 |
828 return NULL; | 843 return NULL; |
829 } | 844 } |
830 | 845 |
831 static GURL AbsolutePath(Profile* profile, const std::string& extension_id, | |
832 const std::string& relative_url) { | |
833 ExtensionsService* service = profile->GetExtensionsService(); | |
834 Extension* extension = service->GetExtensionById(extension_id); | |
835 return Extension::GetResourceURL(extension->url(), relative_url); | |
836 } | |
837 | |
838 static bool GetTabById(int tab_id, Profile* profile, Browser** browser, | 846 static bool GetTabById(int tab_id, Profile* profile, Browser** browser, |
839 TabStripModel** tab_strip, | 847 TabStripModel** tab_strip, |
840 TabContents** contents, | 848 TabContents** contents, |
841 int* tab_index, | 849 int* tab_index, |
842 std::string* error_message) { | 850 std::string* error_message) { |
843 if (ExtensionTabUtil::GetTabById(tab_id, profile, browser, tab_strip, | 851 if (ExtensionTabUtil::GetTabById(tab_id, profile, browser, tab_strip, |
844 contents, tab_index)) | 852 contents, tab_index)) |
845 return true; | 853 return true; |
846 | 854 |
847 if (error_message) | 855 if (error_message) |
848 *error_message = ExtensionErrorUtils::FormatErrorMessage( | 856 *error_message = ExtensionErrorUtils::FormatErrorMessage( |
849 keys::kTabNotFoundError, IntToString(tab_id)); | 857 keys::kTabNotFoundError, IntToString(tab_id)); |
850 | 858 |
851 return false; | 859 return false; |
852 } | 860 } |
OLD | NEW |