Propagate AVM locals to `NavigationBackend`.

This commit is contained in:
David Wendt 2019-09-02 21:49:36 -04:00 committed by Mike Welsh
parent 130d9736bc
commit eb1b474528
2 changed files with 35 additions and 3 deletions

View File

@ -1,5 +1,6 @@
use crate::avm1::globals::create_globals; use crate::avm1::globals::create_globals;
use crate::avm1::object::Object; use crate::avm1::object::Object;
use crate::backend::navigator::NavigationMethod;
use crate::prelude::*; use crate::prelude::*;
use gc_arena::{GcCell, MutationContext}; use gc_arena::{GcCell, MutationContext};
@ -56,6 +57,20 @@ impl<'gc> Avm1<'gc> {
} }
} }
/// Convert the current locals pool into a set of form values.
///
/// This is necessary to support form submission from Flash via a couple of
/// legacy methods, such as the `ActionGetURL2` opcode or `getURL` function.
pub fn locals_into_form_values(&self) -> HashMap<String, String> {
let mut form_values = HashMap::new();
for (k, v) in self.locals.iter() {
form_values.insert(k.clone(), v.clone().into_string());
}
form_values
}
pub fn do_action( pub fn do_action(
&mut self, &mut self,
context: &mut ActionContext<'_, 'gc, '_>, context: &mut ActionContext<'_, 'gc, '_>,
@ -622,7 +637,7 @@ impl<'gc> Avm1<'gc> {
fn action_get_url_2( fn action_get_url_2(
&mut self, &mut self,
context: &mut ActionContext, context: &mut ActionContext,
_method: swf::avm1::types::SendVarsMethod, swf_method: swf::avm1::types::SendVarsMethod,
is_target_sprite: bool, is_target_sprite: bool,
is_load_vars: bool, is_load_vars: bool,
) -> Result<(), Error> { ) -> Result<(), Error> {
@ -637,11 +652,16 @@ impl<'gc> Avm1<'gc> {
} }
if is_load_vars { if is_load_vars {
log::warn!("Loading AVM locals into forms is not yet implemented"); log::warn!("Reading AVM locals from forms is not yet implemented");
return Ok(()); //maybe error? return Ok(()); //maybe error?
} }
context.navigator.navigate_to_url(url, Some(target), None); let vars = match NavigationMethod::from_send_vars_method(swf_method) {
Some(method) => Some((method, self.locals_into_form_values())),
None => None
};
context.navigator.navigate_to_url(url, Some(target), vars);
Ok(()) Ok(())
} }

View File

@ -1,6 +1,7 @@
//! Browser-related platform functions //! Browser-related platform functions
use std::collections::HashMap; use std::collections::HashMap;
use swf::avm1::types::SendVarsMethod;
/// Enumerates all possible navigation methods. /// Enumerates all possible navigation methods.
pub enum NavigationMethod { pub enum NavigationMethod {
@ -11,6 +12,17 @@ pub enum NavigationMethod {
POST POST
} }
impl NavigationMethod {
/// Convert an SWF method enum into a NavigationMethod.
pub fn from_send_vars_method(s: SendVarsMethod) -> Option<Self> {
match s {
SendVarsMethod::None => None,
SendVarsMethod::Get => Some(Self::GET),
SendVarsMethod::Post => Some(Self::POST),
}
}
}
/// A backend interacting with a browser environment. /// A backend interacting with a browser environment.
pub trait NavigatorBackend { pub trait NavigatorBackend {
/// Cause a browser navigation to a given URL. /// Cause a browser navigation to a given URL.