diff options
author | yosin@chromium.org <yosin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 09:24:54 +0000 |
---|---|---|
committer | yosin@chromium.org <yosin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-07 09:24:54 +0000 |
commit | 5d9351118f780b0c6f90e8466d8f334bb289aeca (patch) | |
tree | 256f2f45b90caa81a5917545f75cd5c190375baf /chrome | |
parent | 94851d93dba32d6555cbea703760011c0ad23b84 (diff) | |
download | chromium_src-5d9351118f780b0c6f90e8466d8f334bb289aeca.zip chromium_src-5d9351118f780b0c6f90e8466d8f334bb289aeca.tar.gz chromium_src-5d9351118f780b0c6f90e8466d8f334bb289aeca.tar.bz2 |
* Implement new extension function chrome.tabs.reload.
* Update documentation for chrome.tabs module.
* Change TODO comment to TODO(who) by http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/extension_tabs_module.cc?r1=88703&r2=89083
BUG=91618
TEST=unit test in browser_tests ExtensionApiTest.TabReload
Review URL: http://codereview.chromium.org/7747039
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@99935 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
12 files changed, 526 insertions, 3 deletions
diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index af90c72..79d6fa3 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -147,6 +147,7 @@ void FactoryRegistry::ResetFunctions() { RegisterFunction<CreateTabFunction>(); RegisterFunction<UpdateTabFunction>(); RegisterFunction<MoveTabFunction>(); + RegisterFunction<ReloadTabFunction>(); RegisterFunction<RemoveTabFunction>(); RegisterFunction<DetectTabLanguageFunction>(); RegisterFunction<CaptureVisibleTabFunction>(); diff --git a/chrome/browser/extensions/extension_tabs_apitest.cc b/chrome/browser/extensions/extension_tabs_apitest.cc index 5019c54..1711806 100644 --- a/chrome/browser/extensions/extension_tabs_apitest.cc +++ b/chrome/browser/extensions/extension_tabs_apitest.cc @@ -117,6 +117,11 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, MAYBE_TabOnRemoved) { ASSERT_TRUE(RunExtensionTest("tabs/on_removed")) << message_; } +IN_PROC_BROWSER_TEST_F(ExtensionApiTest, TabReload) { + ASSERT_TRUE(StartTestServer()); + ASSERT_TRUE(RunExtensionTest("tabs/reload")) << message_; +} + // Test is timing out on linux and cros and flaky on others. // See http://crbug.com/83876 #if defined(OS_LINUX) diff --git a/chrome/browser/extensions/extension_tabs_module.cc b/chrome/browser/extensions/extension_tabs_module.cc index a949b4d..dbbfb34 100644 --- a/chrome/browser/extensions/extension_tabs_module.cc +++ b/chrome/browser/extensions/extension_tabs_module.cc @@ -144,7 +144,7 @@ int ExtensionTabUtil::GetWindowId(const Browser* browser) { return browser->session_id().id(); } -// TODO: this function should really take a TabContentsWrapper. +// TODO(sky): this function should really take a TabContentsWrapper. int ExtensionTabUtil::GetTabId(const TabContents* tab_contents) { const TabContentsWrapper* tab = TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); @@ -155,7 +155,7 @@ std::string ExtensionTabUtil::GetTabStatusText(bool is_loading) { return is_loading ? keys::kStatusValueLoading : keys::kStatusValueComplete; } -// TODO: this function should really take a TabContentsWrapper. +// TODO(sky): this function should really take a TabContentsWrapper. int ExtensionTabUtil::GetWindowIdOfTab(const TabContents* tab_contents) { const TabContentsWrapper* tab = TabContentsWrapper::GetCurrentWrapperForContents(tab_contents); @@ -279,7 +279,6 @@ bool ExtensionTabUtil::GetDefaultTab(Browser* browser, int* tab_id) { DCHECK(browser); DCHECK(contents); - DCHECK(tab_id); *contents = browser->GetSelectedTabContentsWrapper(); if (*contents) { @@ -1119,6 +1118,60 @@ bool MoveTabFunction::RunImpl() { return true; } +bool ReloadTabFunction::RunImpl() { + bool bypass_cache = false; + if (HasOptionalArgument(1)) { + DictionaryValue* reload_props = NULL; + EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(1, &reload_props)); + + if (reload_props->HasKey(keys::kBypassCache)) { + EXTENSION_FUNCTION_VALIDATE(reload_props->GetBoolean( + keys::kBypassCache, + &bypass_cache)); + } + } + + TabContentsWrapper* contents = NULL; + + // If |tab_id| is specified, look for it. Otherwise default to selected tab + // in the current window. + Value* tab_value = NULL; + if (HasOptionalArgument(0)) + EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &tab_value)); + + if (tab_value == NULL || tab_value->IsType(Value::TYPE_NULL)) { + Browser* browser = GetCurrentBrowser(); + if (!browser) { + error_ = keys::kNoCurrentWindowError; + return false; + } + + if (!ExtensionTabUtil::GetDefaultTab(browser, &contents, NULL)) + return false; + } else { + int tab_id; + EXTENSION_FUNCTION_VALIDATE(tab_value->GetAsInteger(&tab_id)); + + Browser* browser = NULL; + if (!GetTabById(tab_id, profile(), include_incognito(), + &browser, NULL, &contents, NULL, &error_)) + return false; + } + + TabContents* tab_contents = contents->tab_contents(); + if (tab_contents->showing_interstitial_page()) { + // This does as same as Browser::ReloadInternal. + NavigationEntry* entry = tab_contents->controller().GetActiveEntry(); + GetCurrentBrowser()->OpenURL(entry->url(), GURL(), CURRENT_TAB, + PageTransition::RELOAD); + } else if (bypass_cache) { + tab_contents->controller().ReloadIgnoringCache(true); + } else { + tab_contents->controller().Reload(true); + } + + return true; +} bool RemoveTabFunction::RunImpl() { int tab_id; diff --git a/chrome/browser/extensions/extension_tabs_module.h b/chrome/browser/extensions/extension_tabs_module.h index bef9143..0dd8e3b 100644 --- a/chrome/browser/extensions/extension_tabs_module.h +++ b/chrome/browser/extensions/extension_tabs_module.h @@ -138,6 +138,11 @@ class MoveTabFunction : public SyncExtensionFunction { virtual bool RunImpl() OVERRIDE; DECLARE_EXTENSION_FUNCTION_NAME("tabs.move") }; +class ReloadTabFunction : public SyncExtensionFunction { + virtual ~ReloadTabFunction() {} + virtual bool RunImpl(); + DECLARE_EXTENSION_FUNCTION_NAME("tabs.reload") +}; class RemoveTabFunction : public SyncExtensionFunction { virtual ~RemoveTabFunction() {} virtual bool RunImpl() OVERRIDE; diff --git a/chrome/browser/extensions/extension_tabs_module_constants.cc b/chrome/browser/extensions/extension_tabs_module_constants.cc index 0944ca6..6d469f2 100644 --- a/chrome/browser/extensions/extension_tabs_module_constants.cc +++ b/chrome/browser/extensions/extension_tabs_module_constants.cc @@ -7,6 +7,7 @@ namespace extension_tabs_module_constants { const char kAllFramesKey[] = "allFrames"; +const char kBypassCache[] = "bypassCache"; const char kCodeKey[] = "code"; const char kDrawAttentionKey[] = "drawAttention"; const char kFaviconUrlKey[] = "favIconUrl"; diff --git a/chrome/browser/extensions/extension_tabs_module_constants.h b/chrome/browser/extensions/extension_tabs_module_constants.h index 81fd778..5347af7 100644 --- a/chrome/browser/extensions/extension_tabs_module_constants.h +++ b/chrome/browser/extensions/extension_tabs_module_constants.h @@ -12,6 +12,7 @@ namespace extension_tabs_module_constants { // Keys used in serializing tab data & events. extern const char kAllFramesKey[]; +extern const char kBypassCache[]; extern const char kCodeKey[]; extern const char kDrawAttentionKey[]; extern const char kFaviconUrlKey[]; diff --git a/chrome/common/extensions/api/extension_api.json b/chrome/common/extensions/api/extension_api.json index 04146e5..83a7c75 100644 --- a/chrome/common/extensions/api/extension_api.json +++ b/chrome/common/extensions/api/extension_api.json @@ -1607,6 +1607,27 @@ ] }, { + "name": "reload", + "type": "function", + "description": "Reload a tab.", + "parameters": [ + {"type": "integer", "name": "tabId", "optional": true, "description": "The ID of the tab to reload; defaults to the selected tab of the current window."}, + { + "type": "object", + "name": "reloadProperties", + "optional": true, + "properties": { + "bypassCache": { + "type": "boolean", + "optional": true, + "description": "Whether using any local cache. Default is false." + } + } + }, + {"type": "function", "name": "callback", "optional": true, "parameters": []} + ] + }, + { "name": "remove", "type": "function", "description": "Closes a tab. Note: This function can be used without requesting the 'tabs' permission in the manifest.", diff --git a/chrome/common/extensions/docs/tabs.html b/chrome/common/extensions/docs/tabs.html index c63260b..01198a9 100644 --- a/chrome/common/extensions/docs/tabs.html +++ b/chrome/common/extensions/docs/tabs.html @@ -309,6 +309,8 @@ </li><li> <a href="#method-move">move</a> </li><li> + <a href="#method-reload">reload</a> + </li><li> <a href="#method-remove">remove</a> </li><li> <a href="#method-sendRequest">sendRequest</a> @@ -4523,6 +4525,342 @@ For other examples and for help in viewing the source code, see </div> <!-- /description --> </div><div class="apiItem"> + <a name="method-reload"></a> <!-- method-anchor --> + <h4>reload</h4> + + <div class="summary"><span style="display: none; ">void</span> + <!-- Note: intentionally longer 80 columns --> + <span>chrome.tabs.reload</span>(<span class="optional"><span style="display: none; ">, </span><span>integer</span> + <var><span>tabId</span></var></span><span class="optional"><span>, </span><span>object</span> + <var><span>reloadProperties</span></var></span><span class="optional"><span>, </span><span>function</span> + <var><span>callback</span></var></span>)</div> + + <div class="description"> + <p class="todo" style="display: none; ">Undocumented.</p> + <p>Reload a tab.</p> + + <!-- PARAMETERS --> + <h4>Parameters</h4> + <dl> + <div> + <div> + <dt> + <var>tabId</var> + <em> + + <!-- TYPE --> + <div style="display:inline"> + ( + <span class="optional">optional</span> + <span class="enum" style="display: none; ">enumerated</span> + <span id="typeTemplate"> + <span style="display: none; "> + <a> Type</a> + </span> + <span> + <span style="display: none; "> + array of <span><span></span></span> + </span> + <span>integer</span> + <span style="display: none; "></span> + </span> + </span> + ) + </div> + + </em> + </dt> + <dd class="todo" style="display: none; "> + Undocumented. + </dd> + <dd>The ID of the tab to reload; defaults to the selected tab of the current window.</dd> + <dd style="display: none; "> + This parameter was added in version + <b><span></span></b>. + You must omit this parameter in earlier versions, + and you may omit it in any version. If you require this + parameter, the manifest key + <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> + can ensure that your extension won't be run in an earlier browser version. + </dd> + + <!-- OBJECT PROPERTIES --> + <dd style="display: none; "> + <dl> + <div> + <div> + </div> + </div> + </dl> + </dd> + + <!-- OBJECT METHODS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- OBJECT EVENT FIELDS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- FUNCTION PARAMETERS --> + <dd style="display: none; "> + <div></div> + </dd> + + </div> + </div><div> + <div> + <dt> + <var>reloadProperties</var> + <em> + + <!-- TYPE --> + <div style="display:inline"> + ( + <span class="optional">optional</span> + <span class="enum" style="display: none; ">enumerated</span> + <span id="typeTemplate"> + <span style="display: none; "> + <a> Type</a> + </span> + <span> + <span style="display: none; "> + array of <span><span></span></span> + </span> + <span>object</span> + <span style="display: none; "></span> + </span> + </span> + ) + </div> + + </em> + </dt> + <dd class="todo"> + Undocumented. + </dd> + <dd style="display: none; "> + Description of this parameter from the json schema. + </dd> + <dd style="display: none; "> + This parameter was added in version + <b><span></span></b>. + You must omit this parameter in earlier versions, + and you may omit it in any version. If you require this + parameter, the manifest key + <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> + can ensure that your extension won't be run in an earlier browser version. + </dd> + + <!-- OBJECT PROPERTIES --> + <dd> + <dl> + <div> + <div> + <dt> + <var>bypassCache</var> + <em> + + <!-- TYPE --> + <div style="display:inline"> + ( + <span class="optional">optional</span> + <span class="enum" style="display: none; ">enumerated</span> + <span id="typeTemplate"> + <span style="display: none; "> + <a> Type</a> + </span> + <span> + <span style="display: none; "> + array of <span><span></span></span> + </span> + <span>boolean</span> + <span style="display: none; "></span> + </span> + </span> + ) + </div> + + </em> + </dt> + <dd class="todo" style="display: none; "> + Undocumented. + </dd> + <dd>Whether using any local cache. Default is false.</dd> + <dd style="display: none; "> + This parameter was added in version + <b><span></span></b>. + You must omit this parameter in earlier versions, + and you may omit it in any version. If you require this + parameter, the manifest key + <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> + can ensure that your extension won't be run in an earlier browser version. + </dd> + + <!-- OBJECT PROPERTIES --> + <dd style="display: none; "> + <dl> + <div> + <div> + </div> + </div> + </dl> + </dd> + + <!-- OBJECT METHODS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- OBJECT EVENT FIELDS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- FUNCTION PARAMETERS --> + <dd style="display: none; "> + <div></div> + </dd> + + </div> + </div> + </dl> + </dd> + + <!-- OBJECT METHODS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- OBJECT EVENT FIELDS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- FUNCTION PARAMETERS --> + <dd style="display: none; "> + <div></div> + </dd> + + </div> + </div><div> + <div> + <dt> + <var>callback</var> + <em> + + <!-- TYPE --> + <div style="display:inline"> + ( + <span class="optional">optional</span> + <span class="enum" style="display: none; ">enumerated</span> + <span id="typeTemplate"> + <span style="display: none; "> + <a> Type</a> + </span> + <span> + <span style="display: none; "> + array of <span><span></span></span> + </span> + <span>function</span> + <span style="display: none; "></span> + </span> + </span> + ) + </div> + + </em> + </dt> + <dd class="todo"> + Undocumented. + </dd> + <dd style="display: none; "> + Description of this parameter from the json schema. + </dd> + <dd style="display: none; "> + This parameter was added in version + <b><span></span></b>. + You must omit this parameter in earlier versions, + and you may omit it in any version. If you require this + parameter, the manifest key + <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> + can ensure that your extension won't be run in an earlier browser version. + </dd> + + <!-- OBJECT PROPERTIES --> + <dd style="display: none; "> + <dl> + <div> + <div> + </div> + </div> + </dl> + </dd> + + <!-- OBJECT METHODS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- OBJECT EVENT FIELDS --> + <dd style="display: none; "> + <div></div> + </dd> + + <!-- FUNCTION PARAMETERS --> + <dd style="display: none; "> + <div></div> + </dd> + + </div> + </div> + </dl> + + <!-- RETURNS --> + <h4 style="display: none; ">Returns</h4> + <dl> + <div style="display: none; "> + <div> + </div> + </div> + </dl> + + <!-- CALLBACK --> + <div> + <div> + <h4>Callback function</h4> + <p style="display: none; "> + The callback <em>parameter</em> should specify a function + that looks like this: + </p> + <p> + If you specify the <em>callback</em> parameter, it should + specify a function that looks like this: + </p> + + <!-- Note: intentionally longer 80 columns --> + <pre>function(<span></span>) <span class="subdued">{...}</span>;</pre> + <dl> + <div style="display: none; "> + <div> + </div> + </div> + </dl> + </div> + </div> + + <!-- MIN_VERSION --> + <p style="display: none; "> + This function was added in version <b><span></span></b>. + If you require this function, the manifest key + <a href="manifest.html#minimum_chrome_version">minimum_chrome_version</a> + can ensure that your extension won't be run in an earlier browser version. + </p> + </div> <!-- /description --> + + </div><div class="apiItem"> <a name="method-remove"></a> <!-- method-anchor --> <h4>remove</h4> diff --git a/chrome/test/data/extensions/api_test/tabs/reload/a.html b/chrome/test/data/extensions/api_test/tabs/reload/a.html new file mode 100644 index 0000000..6868fe1 --- /dev/null +++ b/chrome/test/data/extensions/api_test/tabs/reload/a.html @@ -0,0 +1,13 @@ +<html> + <head> + <script> +window.onload = function() { + var href = window.location.href; + chrome.extension.getBackgroundPage().onTabLoad(href); +}; + </script> + </head> + <body> + <h1>A</h1> + </body> +</html>
\ No newline at end of file diff --git a/chrome/test/data/extensions/api_test/tabs/reload/background.html b/chrome/test/data/extensions/api_test/tabs/reload/background.html new file mode 100644 index 0000000..46f4d74 --- /dev/null +++ b/chrome/test/data/extensions/api_test/tabs/reload/background.html @@ -0,0 +1 @@ +<script src="test.js"></script> diff --git a/chrome/test/data/extensions/api_test/tabs/reload/manifest.json b/chrome/test/data/extensions/api_test/tabs/reload/manifest.json new file mode 100644 index 0000000..ee41276 --- /dev/null +++ b/chrome/test/data/extensions/api_test/tabs/reload/manifest.json @@ -0,0 +1,7 @@ +{ + "name": "chrome.tabs test", + "version": "0.1", + "description": "end-to-end browser test for chrome.tabs API getCurrent()", + "background_page": "background.html", + "permissions": ["tabs"] +} diff --git a/chrome/test/data/extensions/api_test/tabs/reload/test.js b/chrome/test/data/extensions/api_test/tabs/reload/test.js new file mode 100644 index 0000000..de15f6f --- /dev/null +++ b/chrome/test/data/extensions/api_test/tabs/reload/test.js @@ -0,0 +1,77 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var assertEq = chrome.test.assertEq; +var callbackPass = chrome.test.callbackPass; + +var myTabId; + +// window.onload in a.html calls this function. +var onTabLoad; + +function pageUrl(letter) { + return chrome.extension.getURL(letter + ".html"); +} + +function withTabOnReload(fn) { + var done = callbackPass(); + onTabLoad = function(url) { + assertEq(pageUrl("a"), url); + done(); + }; + fn(); +} + +var allTests = [ + function testReload1() { + withTabOnReload(function () { + chrome.tabs.reload(); + }); + }, + + function testReload2() { + withTabOnReload(function () { + chrome.tabs.reload(null); + }); + }, + + function testReload2() { + withTabOnReload(function () { + chrome.tabs.reload(myTabId); + }); + }, + + function testReload4() { + withTabOnReload(function () { + chrome.tabs.reload(myTabId, {}); + }); + }, + + function testReload5() { + withTabOnReload(function () { + chrome.tabs.reload(myTabId, {}, callbackPass()); + }); + }, + + function testReload6() { + withTabOnReload(function () { + chrome.tabs.reload(myTabId, { bypassCache: false }, callbackPass()); + }); + }, + + function testReload7() { + withTabOnReload(function () { + chrome.tabs.reload(myTabId, { bypassCache: true }, callbackPass()); + }); + }, +]; + +onTabLoad = function(url) { + chrome.test.runTests(allTests); +}; + +chrome.tabs.create({url: pageUrl("a")}, function(tab) { + myTabId = tab.id; + chrome.tabs.update(myTabId, { selected: true }); +}); |