summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authoryosin@chromium.org <yosin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 09:24:54 +0000
committeryosin@chromium.org <yosin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-07 09:24:54 +0000
commit5d9351118f780b0c6f90e8466d8f334bb289aeca (patch)
tree256f2f45b90caa81a5917545f75cd5c190375baf /chrome
parent94851d93dba32d6555cbea703760011c0ad23b84 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/extensions/extension_function_dispatcher.cc1
-rw-r--r--chrome/browser/extensions/extension_tabs_apitest.cc5
-rw-r--r--chrome/browser/extensions/extension_tabs_module.cc59
-rw-r--r--chrome/browser/extensions/extension_tabs_module.h5
-rw-r--r--chrome/browser/extensions/extension_tabs_module_constants.cc1
-rw-r--r--chrome/browser/extensions/extension_tabs_module_constants.h1
-rw-r--r--chrome/common/extensions/api/extension_api.json21
-rw-r--r--chrome/common/extensions/docs/tabs.html338
-rw-r--r--chrome/test/data/extensions/api_test/tabs/reload/a.html13
-rw-r--r--chrome/test/data/extensions/api_test/tabs/reload/background.html1
-rw-r--r--chrome/test/data/extensions/api_test/tabs/reload/manifest.json7
-rw-r--r--chrome/test/data/extensions/api_test/tabs/reload/test.js77
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 });
+});