diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-07-07 09:43:36 -0600 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-07-07 09:43:36 -0600 |
commit | c04b7bbf6e5efe2e5217b69c9680e4e91bbd6ecd (patch) | |
tree | c7581b9b20b6639e5be2d4c356020feb5e2aa1bf | |
parent | d64f91863af6c22b3af6d5ea5ebfd671f4e83aaa (diff) | |
parent | 81c0d32a049c61b86b2ae57dde1b3db43c3c83b1 (diff) | |
download | servo-c04b7bbf6e5efe2e5217b69c9680e4e91bbd6ecd.tar.gz servo-c04b7bbf6e5efe2e5217b69c9680e4e91bbd6ecd.zip |
Auto merge of #6540 - jdm:devtoolsfix, r=glennw
Make devtools usable once more.
This fixes the panic by rebasing #6189, and also makes cached messages appear once more.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6540)
<!-- Reviewable:end -->
-rw-r--r-- | components/devtools/actors/console.rs | 18 | ||||
-rw-r--r-- | components/devtools/lib.rs | 20 | ||||
-rw-r--r-- | components/devtools_traits/lib.rs | 55 | ||||
-rw-r--r-- | components/script/devtools.rs | 35 |
4 files changed, 81 insertions, 47 deletions
diff --git a/components/devtools/actors/console.rs b/components/devtools/actors/console.rs index ff151be3bb5..b7de253b489 100644 --- a/components/devtools/actors/console.rs +++ b/components/devtools/actors/console.rs @@ -13,6 +13,7 @@ use protocol::JsonPacketStream; use devtools_traits::EvaluateJSReply::{NullValue, VoidValue, NumberValue}; use devtools_traits::EvaluateJSReply::{StringValue, BooleanValue, ActorValue}; use devtools_traits::{CachedConsoleMessageTypes, DevtoolScriptControlMsg, PAGE_ERROR, CONSOLE_API}; +use devtools_traits::CachedConsoleMessage; use msg::constellation_msg::PipelineId; use std::collections::BTreeMap; @@ -21,6 +22,19 @@ use rustc_serialize::json::{self, Json, ToJson}; use std::net::TcpStream; use std::sync::mpsc::{channel, Sender}; +trait EncodableConsoleMessage { + fn encode(&self) -> json::EncodeResult<String>; +} + +impl EncodableConsoleMessage for CachedConsoleMessage { + fn encode(&self) -> json::EncodeResult<String> { + match *self { + CachedConsoleMessage::PageError(ref a) => json::encode(a), + CachedConsoleMessage::ConsoleAPI(ref a) => json::encode(a), + } + } +} + #[derive(RustcEncodable)] struct StartedListenersTraits { customNetworkRequest: bool, @@ -98,7 +112,9 @@ impl Actor for ConsoleActor { self.script_chan.send(DevtoolScriptControlMsg::GetCachedMessages( self.pipeline, message_types, chan)).unwrap(); let messages = try!(port.recv().map_err(|_| ())).into_iter().map(|message| { - json::encode(&message).unwrap().to_json().as_object().unwrap().to_owned() + let json_string = message.encode().unwrap(); + let json = Json::from_str(&json_string).unwrap(); + json.as_object().unwrap().to_owned() }).collect(); let msg = GetCachedMessagesReply { diff --git a/components/devtools/lib.rs b/components/devtools/lib.rs index f0fca1a9b0e..945af8210fc 100644 --- a/components/devtools/lib.rs +++ b/components/devtools/lib.rs @@ -250,7 +250,10 @@ fn run_server(sender: Sender<DevtoolsControlMsg>, id: PipelineId, console_message: ConsoleMessage, actor_pipelines: &HashMap<PipelineId, String>) { - let console_actor_name = find_console_actor(actors.clone(), id, actor_pipelines); + let console_actor_name = match find_console_actor(actors.clone(), id, actor_pipelines) { + Some(name) => name, + None => return, + }; let actors = actors.lock().unwrap(); let console_actor = actors.find::<ConsoleActor>(&console_actor_name); let msg = ConsoleAPICall { @@ -278,12 +281,15 @@ fn run_server(sender: Sender<DevtoolsControlMsg>, fn find_console_actor(actors: Arc<Mutex<ActorRegistry>>, id: PipelineId, - actor_pipelines: &HashMap<PipelineId, String>) -> String { + actor_pipelines: &HashMap<PipelineId, String>) -> Option<String> { let actors = actors.lock().unwrap(); - let ref tab_actor_name = (*actor_pipelines)[&id]; + let tab_actor_name = match (*actor_pipelines).get(&id) { + Some(name) => name, + None => return None, + }; let tab_actor = actors.find::<TabActor>(tab_actor_name); let console_actor_name = tab_actor.console.clone(); - return console_actor_name; + return Some(console_actor_name); } fn handle_network_event(actors: Arc<Mutex<ActorRegistry>>, @@ -294,7 +300,11 @@ fn run_server(sender: Sender<DevtoolsControlMsg>, request_id: String, network_event: NetworkEvent) { - let console_actor_name = find_console_actor(actors.clone(), pipeline_id, actor_pipelines); + let console_actor_name = match find_console_actor(actors.clone(), pipeline_id, + actor_pipelines) { + Some(name) => name, + None => return, + }; let netevent_actor_name = find_network_event_actor(actors.clone(), actor_requests, request_id.clone()); let mut actors = actors.lock().unwrap(); let actor = actors.find_mut::<NetworkEventActor>(&netevent_actor_name); diff --git a/components/devtools_traits/lib.rs b/components/devtools_traits/lib.rs index 5f584347c4f..c989dc05bfe 100644 --- a/components/devtools_traits/lib.rs +++ b/components/devtools_traits/lib.rs @@ -175,32 +175,37 @@ bitflags! { } #[derive(RustcEncodable)] +pub struct PageError { + pub _type: String, + pub errorMessage: String, + pub sourceName: String, + pub lineText: String, + pub lineNumber: u32, + pub columnNumber: u32, + pub category: String, + pub timeStamp: u64, + pub error: bool, + pub warning: bool, + pub exception: bool, + pub strict: bool, + pub private: bool, +} + +#[derive(RustcEncodable)] +pub struct ConsoleAPI { + pub _type: String, + pub level: String, + pub filename: String, + pub lineNumber: u32, + pub functionName: String, + pub timeStamp: u64, + pub private: bool, + pub arguments: Vec<String>, +} + pub enum CachedConsoleMessage { - PageError { - __type__: String, - errorMessage: String, - sourceName: String, - lineText: String, - lineNumber: u32, - columnNumber: u32, - category: String, - timeStamp: u64, - error: bool, - warning: bool, - exception: bool, - strict: bool, - private: bool, - }, - ConsoleAPI { - __type__: String, - level: String, - filename: String, - lineNumber: u32, - functionName: String, - timeStamp: u64, - private: bool, - arguments: Vec<String>, - }, + PageError(PageError), + ConsoleAPI(ConsoleAPI), } #[derive(Clone)] diff --git a/components/script/devtools.rs b/components/script/devtools.rs index ea79a3850a1..f80dfddaa98 100644 --- a/components/script/devtools.rs +++ b/components/script/devtools.rs @@ -4,6 +4,7 @@ use devtools_traits::{CachedConsoleMessage, CachedConsoleMessageTypes, PAGE_ERROR, CONSOLE_API}; use devtools_traits::{EvaluateJSReply, NodeInfo, Modification, TimelineMarker, TimelineMarkerType}; +use devtools_traits::{ConsoleAPI, PageError}; use dom::bindings::conversions::FromJSValConvertible; use dom::bindings::conversions::StringificationBehavior; use dom::bindings::js::Root; @@ -104,23 +105,10 @@ pub fn handle_get_cached_messages(_pipeline_id: PipelineId, //TODO: check the messageTypes against a global Cache for console messages and page exceptions let mut messages = Vec::new(); if message_types.contains(PAGE_ERROR) { - //TODO: do for real - messages.push(CachedConsoleMessage::ConsoleAPI { - __type__: "consoleAPICall".to_owned(), - level: "error".to_owned(), - filename: "http://localhost/~mihai/mozilla/test.html".to_owned(), - lineNumber: 0, - functionName: String::new(), - timeStamp: 0, - private: false, - arguments: Vec::new(), - }) - } - if message_types.contains(CONSOLE_API) { //TODO: make script error reporter pass all reported errors // to devtools and cache them for returning here. - messages.push(CachedConsoleMessage::PageError { - __type__: "pageError".to_owned(), + let msg = PageError { + _type: "PageError".to_owned(), errorMessage: "page error test".to_owned(), sourceName: String::new(), lineText: String::new(), @@ -133,7 +121,22 @@ pub fn handle_get_cached_messages(_pipeline_id: PipelineId, exception: false, strict: false, private: false, - }) + }; + messages.push(CachedConsoleMessage::PageError(msg)); + } + if message_types.contains(CONSOLE_API) { + //TODO: do for real + let msg = ConsoleAPI { + _type: "ConsoleAPI".to_owned(), + level: "error".to_owned(), + filename: "http://localhost/~mihai/mozilla/test.html".to_owned(), + lineNumber: 0, + functionName: String::new(), + timeStamp: 0, + private: false, + arguments: vec!["console error test".to_owned()], + }; + messages.push(CachedConsoleMessage::ConsoleAPI(msg)); } reply.send(messages).unwrap(); } |