diff options
author | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-14 20:51:06 +0000 |
---|---|---|
committer | finnur@chromium.org <finnur@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-05-14 20:51:06 +0000 |
commit | 3c0e906cf98d0af11a67dc9c44ba2b93a2bba80a (patch) | |
tree | 03c2db0824ba31d49435eac174786f881b8b9eaa /chrome | |
parent | 81f9c1b7db09b078ea3b4cd59e7d444485327ed5 (diff) | |
download | chromium_src-3c0e906cf98d0af11a67dc9c44ba2b93a2bba80a.zip chromium_src-3c0e906cf98d0af11a67dc9c44ba2b93a2bba80a.tar.gz chromium_src-3c0e906cf98d0af11a67dc9c44ba2b93a2bba80a.tar.bz2 |
Extend the chrome.tabs API to allow relative paths.
BUG=None
TEST=In an extension, use chrome.tabs.create(...) to create a tab using a relative path ("foo/bar.html"). It should resolve that path by prepending the extension path ("chrome-extension://0000000000000000000000000000000000000042/foo/bar.html).
Review URL: http://codereview.chromium.org/113374
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16098 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/browser/extensions/extension_tabs_module.cc | 31 |
1 files changed, 26 insertions, 5 deletions
diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index 782bfe8..82a2770 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -7,8 +7,10 @@ #include "base/string_util.h" #include "chrome/browser/browser.h" #include "chrome/browser/browser_list.h" +#include "chrome/browser/extensions/extension.h" #include "chrome/browser/extensions/extension_error_utils.h" #include "chrome/browser/extensions/extension_function_dispatcher.h" +#include "chrome/browser/extensions/extensions_service.h" #include "chrome/browser/renderer_host/render_view_host_delegate.h" #include "chrome/browser/tab_contents/navigation_entry.h" @@ -58,6 +60,10 @@ static bool GetTabById(int tab_id, Profile* profile, Browser** browser, TabContents** contents, int* tab_index, std::string* error_message); +// Construct an absolute path from a relative path. +static GURL AbsolutePath(Profile* profile, std::string extension_id, + std::string relative_url); + // ExtensionTabUtil int ExtensionTabUtil::GetWindowId(const Browser* browser) { return browser->session_id().id(); @@ -385,9 +391,13 @@ bool CreateTabFunction::RunImpl() { EXTENSION_FUNCTION_VALIDATE(args->GetString(kUrlKey, &url_string)); url.reset(new GURL(url_string)); if (!url->is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage(kInvalidUrlError, - url_string); - return false; + // The path as passed in is not valid. Try converting to absolute path. + *url = AbsolutePath(profile(), extension_id(), url_string); + if (!url->is_valid()) { + error_ = ExtensionErrorUtils::FormatErrorMessage(kInvalidUrlError, + url_string); + return false; + } } } @@ -466,8 +476,12 @@ bool UpdateTabFunction::RunImpl() { GURL new_gurl(url); if (!new_gurl.is_valid()) { - error_ = ExtensionErrorUtils::FormatErrorMessage(kInvalidUrlError, url); - return false; + // The path as passed in is not valid. Try converting to absolute path. + new_gurl = AbsolutePath(profile(), extension_id(), url); + if (!new_gurl.is_valid()) { + error_ = ExtensionErrorUtils::FormatErrorMessage(kInvalidUrlError, url); + return false; + } } controller.LoadURL(new_gurl, GURL(), PageTransition::LINK); @@ -617,6 +631,13 @@ static Browser* GetBrowserInProfileWithId(Profile* profile, return NULL; } +static GURL AbsolutePath(Profile* profile, std::string extension_id, + std::string relative_url) { + ExtensionsService* service = profile->GetExtensionsService(); + Extension* extension = service->GetExtensionByID(extension_id); + return Extension::GetResourceURL(extension->url(), relative_url); +} + static bool GetTabById(int tab_id, Profile* profile, Browser** browser, TabStripModel** tab_strip, TabContents** contents, |