mirror of
https://github.com/servo/servo.git
synced 2025-09-30 00:29:14 +01:00
script: Move FontContext
from Window
to GlobalScope
(#38918)
This change makes it so that every `GlobalScope` can contain an optional `FontContext`. This will be necessary for every `GlobalScope` that accesses canvas. Currently, `FontContext` is created and accessed via the canvas worker thread, but this means that web fonts are not available to canvas. This change will eventually make it possible for canvas to share web fonts with the `Document` that owns them. Testing: This should not change behavior and is thus covered by existing tests. Signed-off-by: Martin Robinson <mrobinson@igalia.com>
This commit is contained in:
parent
909ceee830
commit
4f68508624
18 changed files with 281 additions and 193 deletions
|
@ -18,6 +18,7 @@ use constellation_traits::{
|
|||
ScopeThings, ServiceWorkerManagerFactory, ServiceWorkerMsg,
|
||||
};
|
||||
use crossbeam_channel::{Receiver, RecvError, Sender, select, unbounded};
|
||||
use fonts::FontContext;
|
||||
use ipc_channel::ipc::{self, IpcSender};
|
||||
use ipc_channel::router::ROUTER;
|
||||
use net_traits::{CoreResourceMsg, CustomResponseMediator};
|
||||
|
@ -223,6 +224,8 @@ pub struct ServiceWorkerManager {
|
|||
own_port: Receiver<ServiceWorkerMsg>,
|
||||
// to receive resource messages
|
||||
resource_receiver: Receiver<CustomResponseMediator>,
|
||||
/// A shared [`FontContext`] to use for all service workers spawned by this [`ServiceWorkerManager`].
|
||||
font_context: Arc<FontContext>,
|
||||
}
|
||||
|
||||
impl ServiceWorkerManager {
|
||||
|
@ -231,6 +234,7 @@ impl ServiceWorkerManager {
|
|||
from_constellation_receiver: Receiver<ServiceWorkerMsg>,
|
||||
resource_port: Receiver<CustomResponseMediator>,
|
||||
constellation_sender: IpcSender<SWManagerMsg>,
|
||||
font_context: Arc<FontContext>,
|
||||
) -> ServiceWorkerManager {
|
||||
// Install a pipeline-namespace in the current thread.
|
||||
PipelineNamespace::auto_install();
|
||||
|
@ -241,6 +245,7 @@ impl ServiceWorkerManager {
|
|||
own_port: from_constellation_receiver,
|
||||
resource_receiver: resource_port,
|
||||
_constellation_sender: constellation_sender,
|
||||
font_context,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -406,8 +411,12 @@ impl ServiceWorkerManager {
|
|||
|
||||
// Very roughly steps 5 to 18.
|
||||
// TODO: implement all steps precisely.
|
||||
let (new_worker, join_handle, control_sender, context, closing) =
|
||||
update_serviceworker(self.own_sender.clone(), job.scope_url.clone(), scope_things);
|
||||
let (new_worker, join_handle, control_sender, context, closing) = update_serviceworker(
|
||||
self.own_sender.clone(),
|
||||
job.scope_url.clone(),
|
||||
scope_things,
|
||||
self.font_context.clone(),
|
||||
);
|
||||
|
||||
// Since we've just started the worker thread, ensure we can shut it down later.
|
||||
registration.note_worker_thread(join_handle, control_sender, context, closing);
|
||||
|
@ -446,6 +455,7 @@ fn update_serviceworker(
|
|||
own_sender: IpcSender<ServiceWorkerMsg>,
|
||||
scope_url: ServoUrl,
|
||||
scope_things: ScopeThings,
|
||||
font_context: Arc<FontContext>,
|
||||
) -> (
|
||||
ServiceWorker,
|
||||
JoinHandle<()>,
|
||||
|
@ -471,6 +481,7 @@ fn update_serviceworker(
|
|||
control_receiver,
|
||||
context_sender,
|
||||
closing.clone(),
|
||||
font_context,
|
||||
);
|
||||
|
||||
let context = context_receiver
|
||||
|
@ -491,21 +502,33 @@ impl ServiceWorkerManagerFactory for ServiceWorkerManager {
|
|||
let (resource_chan, resource_port) = ipc::channel().unwrap();
|
||||
|
||||
let SWManagerSenders {
|
||||
resource_sender,
|
||||
resource_threads,
|
||||
own_sender,
|
||||
receiver,
|
||||
swmanager_sender: constellation_sender,
|
||||
system_font_service_sender,
|
||||
compositor_api,
|
||||
} = sw_senders;
|
||||
|
||||
let from_constellation = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(receiver);
|
||||
let resource_port = ROUTER.route_ipc_receiver_to_new_crossbeam_receiver(resource_port);
|
||||
let _ = resource_sender.send(CoreResourceMsg::NetworkMediator(resource_chan, origin));
|
||||
let _ = resource_threads
|
||||
.core_thread
|
||||
.send(CoreResourceMsg::NetworkMediator(resource_chan, origin));
|
||||
|
||||
let font_context = Arc::new(FontContext::new(
|
||||
Arc::new(system_font_service_sender.to_proxy()),
|
||||
compositor_api,
|
||||
resource_threads,
|
||||
));
|
||||
|
||||
let swmanager_thread = move || {
|
||||
ServiceWorkerManager::new(
|
||||
own_sender,
|
||||
from_constellation,
|
||||
resource_port,
|
||||
constellation_sender,
|
||||
font_context,
|
||||
)
|
||||
.handle_message()
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue