core: Add Log backend, for capturing trace output specific to a movie

This commit is contained in:
Nathan Adams 2020-09-05 18:19:03 +02:00 committed by Mike Welsh
parent 091f04096d
commit de009c7673
11 changed files with 69 additions and 4 deletions

View File

@ -2056,6 +2056,7 @@ impl<'a, 'gc, 'gc_context> Activation<'a, 'gc, 'gc_context> {
} else {
val.coerce_to_string(self)?
};
self.context.log.avm_trace(&out);
log::info!(target: "avm_trace", "{}", out);
Ok(FrameControl::Continue)
}

View File

@ -847,6 +847,7 @@ mod tests {
use crate::backend::audio::NullAudioBackend;
use crate::backend::input::NullInputBackend;
use crate::backend::locale::NullLocaleBackend;
use crate::backend::log::NullLogBackend;
use crate::backend::navigator::NullNavigatorBackend;
use crate::backend::render::NullRenderer;
use crate::backend::storage::MemoryStorageBackend;
@ -897,6 +898,7 @@ mod tests {
navigator: &mut NullNavigatorBackend::new(),
renderer: &mut NullRenderer::new(),
locale: &mut NullLocaleBackend::new(),
log: &mut NullLogBackend::new(),
system_prototypes: avm1.prototypes().clone(),
mouse_hovered_object: None,
mouse_position: &(Twips::new(0), Twips::new(0)),

View File

@ -6,6 +6,7 @@ use crate::avm2::Avm2;
use crate::backend::audio::NullAudioBackend;
use crate::backend::input::NullInputBackend;
use crate::backend::locale::NullLocaleBackend;
use crate::backend::log::NullLogBackend;
use crate::backend::navigator::NullNavigatorBackend;
use crate::backend::render::NullRenderer;
use crate::backend::storage::MemoryStorageBackend;
@ -58,6 +59,7 @@ where
navigator: &mut NullNavigatorBackend::new(),
renderer: &mut NullRenderer::new(),
locale: &mut NullLocaleBackend::new(),
log: &mut NullLogBackend::new(),
system_prototypes: avm1.prototypes().clone(),
mouse_hovered_object: None,
mouse_position: &(Twips::new(0), Twips::new(0)),

View File

@ -1,6 +1,7 @@
pub mod audio;
pub mod input;
pub mod locale;
pub mod log;
pub mod navigator;
pub mod render;
pub mod storage;

22
core/src/backend/log.rs Normal file
View File

@ -0,0 +1,22 @@
pub trait LogBackend {
fn avm_trace(&self, message: &str);
}
/// Logging backend that does nothing.
pub struct NullLogBackend {}
impl NullLogBackend {
pub fn new() -> Self {
Self {}
}
}
impl LogBackend for NullLogBackend {
fn avm_trace(&self, _message: &str) {}
}
impl Default for NullLogBackend {
fn default() -> Self {
NullLogBackend::new()
}
}

View File

@ -6,6 +6,7 @@ use crate::avm1::{Avm1, Object, Timers, Value};
use crate::avm2::Avm2;
use crate::backend::input::InputBackend;
use crate::backend::locale::LocaleBackend;
use crate::backend::log::LogBackend;
use crate::backend::storage::StorageBackend;
use crate::backend::{audio::AudioBackend, navigator::NavigatorBackend, render::RenderBackend};
use crate::display_object::EditText;
@ -72,6 +73,9 @@ pub struct UpdateContext<'a, 'gc, 'gc_context> {
/// The locale backend, used for localisation and personalisation
pub locale: &'a mut dyn LocaleBackend,
/// The logging backend, used for trace output capturing
pub log: &'a mut dyn LogBackend,
/// The RNG, used by the AVM `RandomNumber` opcode, `Math.random(),` and `random()`.
pub rng: &'a mut SmallRng,
@ -185,6 +189,7 @@ impl<'a, 'gc, 'gc_context> UpdateContext<'a, 'gc, 'gc_context> {
navigator: self.navigator,
renderer: self.renderer,
locale: self.locale,
log: self.log,
input: self.input,
storage: self.storage,
rng: self.rng,

View File

@ -8,7 +8,9 @@ use crate::backend::input::{InputBackend, MouseCursor};
use crate::backend::locale::LocaleBackend;
use crate::backend::navigator::{NavigatorBackend, RequestOptions};
use crate::backend::storage::StorageBackend;
use crate::backend::{audio::AudioBackend, render::Letterbox, render::RenderBackend};
use crate::backend::{
audio::AudioBackend, log::LogBackend, render::Letterbox, render::RenderBackend,
};
use crate::context::{ActionQueue, ActionType, RenderContext, UpdateContext};
use crate::display_object::{EditText, MorphShape, MovieClip};
use crate::events::{ButtonKeyCode, ClipEvent, ClipEventResult, KeyCode, PlayerEvent};
@ -123,6 +125,7 @@ type Renderer = Box<dyn RenderBackend>;
type Input = Box<dyn InputBackend>;
type Storage = Box<dyn StorageBackend>;
type Locale = Box<dyn LocaleBackend>;
type Log = Box<dyn LogBackend>;
pub struct Player {
/// The version of the player we're emulating.
@ -147,6 +150,7 @@ pub struct Player {
pub navigator: Navigator,
input: Input,
locale: Locale,
log: Log,
transform_stack: TransformStack,
view_matrix: Matrix,
inverse_view_matrix: Matrix,
@ -197,6 +201,7 @@ impl Player {
input: Input,
storage: Storage,
locale: Locale,
log: Log,
) -> Result<Arc<Mutex<Self>>, Error> {
let fake_movie = Arc::new(SwfMovie::empty(NEWEST_PLAYER_VERSION));
let movie_width = 550;
@ -261,6 +266,7 @@ impl Player {
navigator,
input,
locale,
log,
self_reference: None,
system: SystemProperties::default(),
instance_counter: 0,
@ -1022,6 +1028,7 @@ impl Player {
instance_counter,
storage,
locale,
logging,
needs_render,
) = (
self.player_version,
@ -1040,6 +1047,7 @@ impl Player {
&mut self.instance_counter,
self.storage.deref_mut(),
self.locale.deref_mut(),
self.log.deref_mut(),
&mut self.needs_render,
);
@ -1084,6 +1092,7 @@ impl Player {
instance_counter,
storage,
locale,
log: logging,
shared_objects,
unbound_text_fields,
timers,

View File

@ -5,6 +5,7 @@
use approx::assert_abs_diff_eq;
use log::{Metadata, Record};
use ruffle_core::backend::locale::NullLocaleBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::navigator::{NullExecutor, NullNavigatorBackend};
use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::backend::{
@ -521,6 +522,7 @@ fn run_swf(
Box::new(NullInputBackend::new()),
Box::new(MemoryStorageBackend::default()),
Box::new(NullLocaleBackend::new()),
Box::new(NullLogBackend::new()),
)?;
player.lock().unwrap().set_root_movie(Arc::new(movie));

View File

@ -22,6 +22,7 @@ use std::sync::Arc;
use std::time::Instant;
use crate::storage::DiskStorageBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::tag_utils::SwfMovie;
use std::rc::Rc;
use winit::dpi::{LogicalSize, PhysicalPosition};
@ -168,7 +169,15 @@ fn run_player(
input_path.file_name().unwrap_or_default().as_ref(),
));
let locale = Box::new(locale::DesktopLocaleBackend::new());
let player = Player::new(renderer, audio, navigator, input, storage, locale)?;
let player = Player::new(
renderer,
audio,
navigator,
input,
storage,
locale,
Box::new(NullLogBackend::new()),
)?;
player.lock().unwrap().set_root_movie(Arc::new(movie));
player.lock().unwrap().set_is_playing(true); // Desktop player will auto-play.

View File

@ -5,6 +5,7 @@ use indicatif::{ProgressBar, ProgressStyle};
use ruffle_core::backend::audio::NullAudioBackend;
use ruffle_core::backend::input::NullInputBackend;
use ruffle_core::backend::locale::NullLocaleBackend;
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::navigator::NullNavigatorBackend;
use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::tag_utils::SwfMovie;
@ -89,6 +90,7 @@ fn take_screenshot(
Box::new(NullInputBackend::new()),
Box::new(MemoryStorageBackend::default()),
Box::new(NullLocaleBackend::new()),
Box::new(NullLogBackend::new()),
)?;
player

View File

@ -14,6 +14,7 @@ use crate::{
};
use generational_arena::{Arena, Index};
use js_sys::{Array, Function, Object, Uint8Array};
use ruffle_core::backend::log::NullLogBackend;
use ruffle_core::backend::render::RenderBackend;
use ruffle_core::backend::storage::MemoryStorageBackend;
use ruffle_core::backend::storage::StorageBackend;
@ -231,8 +232,17 @@ impl Ruffle {
})
.unwrap_or_else(|| Box::new(MemoryStorageBackend::default()));
let core =
ruffle_core::Player::new(renderer, audio, navigator, input, local_storage, locale)?;
let log = Box::new(NullLogBackend::new());
let core = ruffle_core::Player::new(
renderer,
audio,
navigator,
input,
local_storage,
locale,
log,
)?;
// Create instance.
let instance = RuffleInstance {