Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4155)

Unified Diff: chrome/browser/extensions/extension_messages_apitest.cc

Issue 2766263003: Extensions: Only load incognito-enabled extensions in an incognito renderer. (Closed)
Patch Set: Address review Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_messages_apitest.cc
diff --git a/chrome/browser/extensions/extension_messages_apitest.cc b/chrome/browser/extensions/extension_messages_apitest.cc
index 9bee026d46a10953412df31f28efbc67b37d83eb..e4bfe1c06ae50d5a00b5380bc2de7b5c649a089a 100644
--- a/chrome/browser/extensions/extension_messages_apitest.cc
+++ b/chrome/browser/extensions/extension_messages_apitest.cc
@@ -24,6 +24,7 @@
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/extensions/api/messaging/incognito_connectability.h"
#include "chrome/browser/extensions/extension_apitest.h"
+#include "chrome/browser/extensions/extension_util.h"
#include "chrome/browser/extensions/test_extension_dir.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/profiles/profile.h"
@@ -39,8 +40,11 @@
#include "content/public/test/test_utils.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
+#include "extensions/browser/extension_util.h"
#include "extensions/browser/process_manager.h"
+#include "extensions/browser/test_extension_registry_observer.h"
#include "extensions/common/api/runtime.h"
#include "extensions/common/extension_builder.h"
#include "extensions/common/value_builder.h"
@@ -348,17 +352,16 @@ class ExternallyConnectableMessagingTest : public ExtensionApiTest {
}
scoped_refptr<const Extension> LoadChromiumConnectableExtension() {
- scoped_refptr<const Extension> extension =
- LoadExtensionIntoDir(&web_connectable_dir_,
- base::StringPrintf(
- "{"
- " \"name\": \"chromium_connectable\","
- " %s,"
- " \"externally_connectable\": {"
- " \"matches\": [\"*://*.chromium.org:*/*\"]"
- " }"
- "}",
- common_manifest()));
+ scoped_refptr<const Extension> extension = LoadExtensionIntoDir(
+ &web_connectable_dir_extension_,
+ base::StringPrintf("{"
+ " \"name\": \"chromium_connectable\","
+ " %s,"
+ " \"externally_connectable\": {"
+ " \"matches\": [\"*://*.chromium.org:*/*\"]"
+ " }"
+ "}",
+ common_manifest()));
CHECK(extension.get());
return extension;
}
@@ -366,7 +369,7 @@ class ExternallyConnectableMessagingTest : public ExtensionApiTest {
scoped_refptr<const Extension> LoadChromiumConnectableApp(
bool with_event_handlers = true) {
scoped_refptr<const Extension> extension =
- LoadExtensionIntoDir(&web_connectable_dir_,
+ LoadExtensionIntoDir(&web_connectable_dir_app_,
"{"
" \"app\": {"
" \"background\": {"
@@ -509,7 +512,8 @@ class ExternallyConnectableMessagingTest : public ExtensionApiTest {
return result;
}
- TestExtensionDir web_connectable_dir_;
+ TestExtensionDir web_connectable_dir_extension_;
+ TestExtensionDir web_connectable_dir_app_;
TestExtensionDir not_connectable_dir_;
TestExtensionDir tls_channel_id_connectable_dir_;
TestExtensionDir hosted_app_dir_;
@@ -771,10 +775,11 @@ IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
}
IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
- FromIncognitoDenyExtension) {
+ FromIncognitoDenyExtensionAndApp) {
InitializeTestServer();
scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
+ EXPECT_FALSE(util::IsIncognitoEnabled(extension->id(), profile()));
Browser* incognito_browser = OpenURLOffTheRecord(
profile()->GetOffTheRecordProfile(), chromium_org_url());
@@ -783,22 +788,39 @@ IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
->GetActiveWebContents()
->GetMainFrame();
- {
- IncognitoConnectability::ScopedAlertTracker alert_tracker(
- IncognitoConnectability::ScopedAlertTracker::ALWAYS_DENY);
+ IncognitoConnectability::ScopedAlertTracker alert_tracker(
+ IncognitoConnectability::ScopedAlertTracker::ALWAYS_DENY);
- // The alert doesn't show for extensions.
- EXPECT_EQ(COULD_NOT_ESTABLISH_CONNECTION_ERROR,
- CanConnectAndSendMessagesToFrame(
- incognito_frame, extension.get(), NULL));
- EXPECT_EQ(0, alert_tracker.GetAndResetAlertCount());
- }
+ // |extension| won't be loaded in the incognito renderer since it's not
+ // enabled for incognito. Since there is no externally connectible extension
+ // loaded into the incognito renderer, the chrome.runtime API won't be
+ // defined.
+ EXPECT_EQ(NAMESPACE_NOT_DEFINED,
+ CanConnectAndSendMessagesToFrame(incognito_frame, extension.get(),
+ nullptr));
- // Allowing the extension in incognito mode will bypass the deny.
- ExtensionPrefs::Get(profile())->SetIsIncognitoEnabled(extension->id(), true);
- EXPECT_EQ(
- OK,
- CanConnectAndSendMessagesToFrame(incognito_frame, extension.get(), NULL));
+ // Loading a platform app in the renderer should cause the chrome.runtime
+ // bindings to be generated in the renderer. A platform app is always loaded
+ // in the incognito renderer.
+ LoadChromiumConnectableApp();
+ EXPECT_EQ(COULD_NOT_ESTABLISH_CONNECTION_ERROR,
+ CanConnectAndSendMessagesToFrame(incognito_frame, extension.get(),
+ nullptr));
+
+ // Allowing the extension in incognito mode loads the extension in the
+ // incognito renderer, allowing it to receive connections.
+ TestExtensionRegistryObserver observer(
+ ExtensionRegistry::Get(profile()->GetOffTheRecordProfile()),
+ extension->id());
+ util::SetIsIncognitoEnabled(extension->id(),
+ profile()->GetOffTheRecordProfile(), true);
+ const Extension* loaded_extension = observer.WaitForExtensionLoaded();
+ EXPECT_EQ(OK, CanConnectAndSendMessagesToFrame(incognito_frame,
+ loaded_extension, nullptr));
+
+ // No alert is shown for extensions since they support being enabled in
+ // incognito mode.
+ EXPECT_EQ(0, alert_tracker.GetAndResetAlertCount());
}
// Tests connection from incognito tabs when the extension doesn't have an event
@@ -950,6 +972,7 @@ IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
InitializeTestServer();
scoped_refptr<const Extension> extension = LoadChromiumConnectableExtension();
+ EXPECT_FALSE(util::IsIncognitoEnabled(extension->id(), profile()));
Browser* incognito_browser = OpenURLOffTheRecord(
profile()->GetOffTheRecordProfile(), chromium_org_url());
@@ -958,22 +981,32 @@ IN_PROC_BROWSER_TEST_F(ExternallyConnectableMessagingTest,
->GetActiveWebContents()
->GetMainFrame();
- {
- IncognitoConnectability::ScopedAlertTracker alert_tracker(
- IncognitoConnectability::ScopedAlertTracker::ALWAYS_ALLOW);
+ IncognitoConnectability::ScopedAlertTracker alert_tracker(
+ IncognitoConnectability::ScopedAlertTracker::ALWAYS_ALLOW);
- // No alert is shown.
- EXPECT_EQ(COULD_NOT_ESTABLISH_CONNECTION_ERROR,
- CanConnectAndSendMessagesToFrame(
- incognito_frame, extension.get(), NULL));
- EXPECT_EQ(0, alert_tracker.GetAndResetAlertCount());
- }
-
- // Allowing the extension in incognito mode is what allows connections.
- ExtensionPrefs::Get(profile())->SetIsIncognitoEnabled(extension->id(), true);
- EXPECT_EQ(
- OK,
- CanConnectAndSendMessagesToFrame(incognito_frame, extension.get(), NULL));
+ // |extension| won't be loaded in the incognito renderer since it's not
+ // enabled for incognito. Since there is no externally connectible extension
+ // loaded into the incognito renderer, the chrome.runtime API won't be
+ // defined.
+ EXPECT_EQ(NAMESPACE_NOT_DEFINED,
+ CanConnectAndSendMessagesToFrame(incognito_frame, extension.get(),
+ nullptr));
+
+ // Allowing the extension in incognito mode loads the extension in the
+ // incognito renderer, causing the chrome.runtime bindings to be generated in
+ // the renderer and allowing the extension to receive connections.
+ TestExtensionRegistryObserver observer(
+ ExtensionRegistry::Get(profile()->GetOffTheRecordProfile()),
+ extension->id());
+ util::SetIsIncognitoEnabled(extension->id(),
+ profile()->GetOffTheRecordProfile(), true);
+ const Extension* loaded_extension = observer.WaitForExtensionLoaded();
+ EXPECT_EQ(OK, CanConnectAndSendMessagesToFrame(incognito_frame,
+ loaded_extension, nullptr));
+
+ // No alert is shown for extensions which support being enabled in incognito
+ // mode.
+ EXPECT_EQ(0, alert_tracker.GetAndResetAlertCount());
}
// Tests a connection from an iframe within a tab which doesn't have
« no previous file with comments | « chrome/browser/extensions/api/messaging/message_service.cc ('k') | extensions/browser/renderer_startup_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698