fix(extensions): set lowest isolated world id (#22212)
* fix(extensions): set lowest isolated world id * refactor: move world IDs into separate header file Several files are including electron_render_frame_observer.h just for the world IDs.
This commit is contained in:
		
					parent
					
						
							
								68c6d53156
							
						
					
				
			
			
				commit
				
					
						8cc0435d9c
					
				
			
		
					 7 changed files with 45 additions and 33 deletions
				
			
		| 
						 | 
				
			
			@ -558,6 +558,7 @@ filenames = {
 | 
			
		|||
    "shell/common/skia_util.h",
 | 
			
		||||
    "shell/common/v8_value_converter.cc",
 | 
			
		||||
    "shell/common/v8_value_converter.h",
 | 
			
		||||
    "shell/common/world_ids.h",
 | 
			
		||||
    "shell/renderer/api/context_bridge/render_frame_context_bridge_store.cc",
 | 
			
		||||
    "shell/renderer/api/context_bridge/render_frame_context_bridge_store.h",
 | 
			
		||||
    "shell/renderer/api/electron_api_context_bridge.cc",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										31
									
								
								shell/common/world_ids.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								shell/common/world_ids.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
// Copyright (c) 2020 Samuel Maddock
 | 
			
		||||
// Use of this source code is governed by the MIT license that can be
 | 
			
		||||
// found in the LICENSE file.
 | 
			
		||||
 | 
			
		||||
#ifndef SHELL_COMMON_WORLD_IDS_H_
 | 
			
		||||
#define SHELL_COMMON_WORLD_IDS_H_
 | 
			
		||||
 | 
			
		||||
#include "third_party/blink/public/platform/web_isolated_world_ids.h"
 | 
			
		||||
 | 
			
		||||
namespace electron {
 | 
			
		||||
 | 
			
		||||
enum WorldIDs : int32_t {
 | 
			
		||||
  MAIN_WORLD_ID = 0,
 | 
			
		||||
 | 
			
		||||
  // Use a high number far away from 0 to not collide with any other world
 | 
			
		||||
  // IDs created internally by Chrome.
 | 
			
		||||
  ISOLATED_WORLD_ID = 999,
 | 
			
		||||
 | 
			
		||||
  // Numbers for isolated worlds for extensions are set in
 | 
			
		||||
  // lib/renderer/content-script-injector.ts, and are greater than or equal to
 | 
			
		||||
  // this number, up to ISOLATED_WORLD_ID_EXTENSIONS_END.
 | 
			
		||||
  ISOLATED_WORLD_ID_EXTENSIONS = 1 << 20,
 | 
			
		||||
 | 
			
		||||
  // Last valid isolated world ID.
 | 
			
		||||
  ISOLATED_WORLD_ID_EXTENSIONS_END =
 | 
			
		||||
      blink::IsolatedWorldId::kEmbedderWorldIdLimit - 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
}  // namespace electron
 | 
			
		||||
 | 
			
		||||
#endif  // SHELL_COMMON_WORLD_IDS_H_
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +20,8 @@
 | 
			
		|||
#include "shell/common/gin_helper/dictionary.h"
 | 
			
		||||
#include "shell/common/gin_helper/promise.h"
 | 
			
		||||
#include "shell/common/node_includes.h"
 | 
			
		||||
#include "shell/common/world_ids.h"
 | 
			
		||||
#include "shell/renderer/api/context_bridge/render_frame_context_bridge_store.h"
 | 
			
		||||
#include "shell/renderer/electron_render_frame_observer.h"
 | 
			
		||||
#include "third_party/blink/public/web/web_local_frame.h"
 | 
			
		||||
 | 
			
		||||
namespace electron {
 | 
			
		||||
| 
						 | 
				
			
			@ -477,7 +477,7 @@ void ExposeAPIInMainWorld(const std::string& key,
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
  v8::Local<v8::Context> isolated_context =
 | 
			
		||||
      frame->WorldScriptContext(args->isolate(), World::ISOLATED_WORLD);
 | 
			
		||||
      frame->WorldScriptContext(args->isolate(), WorldIDs::ISOLATED_WORLD_ID);
 | 
			
		||||
 | 
			
		||||
  v8::Context::Scope main_context_scope(main_context);
 | 
			
		||||
  {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@
 | 
			
		|||
#include "net/grit/net_resources.h"
 | 
			
		||||
#include "services/service_manager/public/cpp/interface_provider.h"
 | 
			
		||||
#include "shell/common/options_switches.h"
 | 
			
		||||
#include "shell/common/world_ids.h"
 | 
			
		||||
#include "third_party/blink/public/platform/web_isolated_world_info.h"
 | 
			
		||||
#include "third_party/blink/public/web/blink.h"
 | 
			
		||||
#include "third_party/blink/public/web/web_document.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -90,8 +91,8 @@ void ElectronRenderFrameObserver::DidInstallConditionalFeatures(
 | 
			
		|||
  }
 | 
			
		||||
 | 
			
		||||
#if !BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
 | 
			
		||||
  if (world_id >= World::ISOLATED_WORLD_EXTENSIONS &&
 | 
			
		||||
      world_id <= World::ISOLATED_WORLD_EXTENSIONS_END) {
 | 
			
		||||
  if (world_id >= WorldIDs::ISOLATED_WORLD_ID_EXTENSIONS &&
 | 
			
		||||
      world_id <= WorldIDs::ISOLATED_WORLD_ID_EXTENSIONS_END) {
 | 
			
		||||
    renderer_client_->SetupExtensionWorldOverrides(context, render_frame_,
 | 
			
		||||
                                                   world_id);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			@ -136,19 +137,19 @@ void ElectronRenderFrameObserver::CreateIsolatedWorldContext() {
 | 
			
		|||
      blink::WebString::FromUTF8("Electron Isolated Context");
 | 
			
		||||
  // Setup document's origin policy in isolated world
 | 
			
		||||
  info.security_origin = frame->GetDocument().GetSecurityOrigin();
 | 
			
		||||
  frame->SetIsolatedWorldInfo(World::ISOLATED_WORLD, info);
 | 
			
		||||
  frame->SetIsolatedWorldInfo(WorldIDs::ISOLATED_WORLD_ID, info);
 | 
			
		||||
 | 
			
		||||
  // Create initial script context in isolated world
 | 
			
		||||
  blink::WebScriptSource source("void 0");
 | 
			
		||||
  frame->ExecuteScriptInIsolatedWorld(World::ISOLATED_WORLD, source);
 | 
			
		||||
  frame->ExecuteScriptInIsolatedWorld(WorldIDs::ISOLATED_WORLD_ID, source);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ElectronRenderFrameObserver::IsMainWorld(int world_id) {
 | 
			
		||||
  return world_id == World::MAIN_WORLD;
 | 
			
		||||
  return world_id == WorldIDs::MAIN_WORLD_ID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ElectronRenderFrameObserver::IsIsolatedWorld(int world_id) {
 | 
			
		||||
  return world_id == World::ISOLATED_WORLD;
 | 
			
		||||
  return world_id == WorldIDs::ISOLATED_WORLD_ID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ElectronRenderFrameObserver::ShouldNotifyClient(int world_id) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,6 @@
 | 
			
		|||
#include "content/public/renderer/render_frame_observer.h"
 | 
			
		||||
#include "ipc/ipc_platform_file.h"
 | 
			
		||||
#include "shell/renderer/renderer_client_base.h"
 | 
			
		||||
#include "third_party/blink/public/platform/web_isolated_world_ids.h"
 | 
			
		||||
#include "third_party/blink/public/web/web_local_frame.h"
 | 
			
		||||
 | 
			
		||||
namespace base {
 | 
			
		||||
| 
						 | 
				
			
			@ -20,23 +19,6 @@ class ListValue;
 | 
			
		|||
 | 
			
		||||
namespace electron {
 | 
			
		||||
 | 
			
		||||
enum World {
 | 
			
		||||
  MAIN_WORLD = 0,
 | 
			
		||||
 | 
			
		||||
  // Use a high number far away from 0 to not collide with any other world
 | 
			
		||||
  // IDs created internally by Chrome.
 | 
			
		||||
  ISOLATED_WORLD = 999,
 | 
			
		||||
 | 
			
		||||
  // Numbers for isolated worlds for extensions are set in
 | 
			
		||||
  // lib/renderer/content-script-injector.ts, and are greater than or equal to
 | 
			
		||||
  // this number, up to ISOLATED_WORLD_EXTENSIONS_END.
 | 
			
		||||
  ISOLATED_WORLD_EXTENSIONS = 1 << 20,
 | 
			
		||||
 | 
			
		||||
  // Last valid isolated world ID.
 | 
			
		||||
  ISOLATED_WORLD_EXTENSIONS_END =
 | 
			
		||||
      blink::IsolatedWorldId::kEmbedderWorldIdLimit - 1
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Helper class to forward the messages to the client.
 | 
			
		||||
class ElectronRenderFrameObserver : public content::RenderFrameObserver {
 | 
			
		||||
 public:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@
 | 
			
		|||
 | 
			
		||||
#include "content/public/renderer/render_thread.h"
 | 
			
		||||
#include "extensions/renderer/dispatcher.h"
 | 
			
		||||
#include "shell/common/world_ids.h"
 | 
			
		||||
#include "shell/renderer/extensions/electron_extensions_dispatcher_delegate.h"
 | 
			
		||||
 | 
			
		||||
namespace electron {
 | 
			
		||||
| 
						 | 
				
			
			@ -24,11 +25,7 @@ bool ElectronExtensionsRendererClient::IsIncognitoProcess() const {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
int ElectronExtensionsRendererClient::GetLowestIsolatedWorldId() const {
 | 
			
		||||
  // app_shell doesn't need to reserve world IDs for anything other than
 | 
			
		||||
  // extensions, so we always return 1. Note that 0 is reserved for the global
 | 
			
		||||
  // world.
 | 
			
		||||
  // TODO(samuelmaddock): skip electron worlds
 | 
			
		||||
  return 10;
 | 
			
		||||
  return WorldIDs::ISOLATED_WORLD_ID_EXTENSIONS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
extensions::Dispatcher* ElectronExtensionsRendererClient::GetDispatcher() {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,11 +24,11 @@
 | 
			
		|||
#include "shell/common/color_util.h"
 | 
			
		||||
#include "shell/common/gin_helper/dictionary.h"
 | 
			
		||||
#include "shell/common/options_switches.h"
 | 
			
		||||
#include "shell/common/world_ids.h"
 | 
			
		||||
#include "shell/renderer/browser_exposed_renderer_interfaces.h"
 | 
			
		||||
#include "shell/renderer/content_settings_observer.h"
 | 
			
		||||
#include "shell/renderer/electron_api_service_impl.h"
 | 
			
		||||
#include "shell/renderer/electron_autofill_agent.h"
 | 
			
		||||
#include "shell/renderer/electron_render_frame_observer.h"
 | 
			
		||||
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
 | 
			
		||||
#include "third_party/blink/public/web/blink.h"
 | 
			
		||||
#include "third_party/blink/public/web/web_custom_element.h"  // NOLINT(build/include_alpha)
 | 
			
		||||
| 
						 | 
				
			
			@ -424,7 +424,7 @@ v8::Local<v8::Context> RendererClientBase::GetContext(
 | 
			
		|||
    blink::WebLocalFrame* frame,
 | 
			
		||||
    v8::Isolate* isolate) const {
 | 
			
		||||
  if (isolated_world())
 | 
			
		||||
    return frame->WorldScriptContext(isolate, World::ISOLATED_WORLD);
 | 
			
		||||
    return frame->WorldScriptContext(isolate, WorldIDs::ISOLATED_WORLD_ID);
 | 
			
		||||
  else
 | 
			
		||||
    return frame->MainWorldScriptContext();
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue