diff options
Diffstat (limited to 'components/net/http_loader.rs')
-rw-r--r-- | components/net/http_loader.rs | 34 |
1 files changed, 20 insertions, 14 deletions
diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 9a028e5ce59..d8344e12502 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -24,7 +24,7 @@ use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::net::Fresh; use hyper::status::{StatusClass, StatusCode}; -use ipc_channel::ipc; +use ipc_channel::ipc::{self, IpcSender}; use log; use mime_classifier::MimeClassifier; use msg::constellation_msg::{PipelineId, ReferrerPolicy}; @@ -32,7 +32,7 @@ use net_traits::ProgressMsg::{Done, Payload}; use net_traits::hosts::replace_hosts; use net_traits::response::HttpsState; use net_traits::{CookieSource, IncludeSubdomains, LoadConsumer, LoadContext, LoadData}; -use net_traits::{Metadata, NetworkError, RequestSource, CustomResponse}; +use net_traits::{Metadata, NetworkError, CustomResponse, CustomResponseMediator}; use openssl; use openssl::ssl::error::{SslError, OpensslError}; use profile_traits::time::{ProfilerCategory, profile, ProfilerChan, TimerMetadata}; @@ -59,6 +59,7 @@ pub fn factory(user_agent: String, http_state: HttpState, devtools_chan: Option<Sender<DevtoolsControlMsg>>, profiler_chan: ProfilerChan, + constellation_chan: Option<IpcSender<CustomResponseMediator>>, connector: Arc<Pool<Connector>>) -> Box<FnBox(LoadData, LoadConsumer, @@ -78,6 +79,7 @@ pub fn factory(user_agent: String, connector, http_state, devtools_chan, + constellation_chan, cancel_listener, user_agent) }) @@ -131,6 +133,7 @@ fn load_for_consumer(load_data: LoadData, connector: Arc<Pool<Connector>>, http_state: HttpState, devtools_chan: Option<Sender<DevtoolsControlMsg>>, + constellation_chan: Option<IpcSender<CustomResponseMediator>>, cancel_listener: CancellationListener, user_agent: String) { let factory = NetworkHttpRequestFactory { @@ -140,7 +143,7 @@ fn load_for_consumer(load_data: LoadData, let ui_provider = TFDProvider; match load(&load_data, &ui_provider, &http_state, devtools_chan, &factory, - user_agent, &cancel_listener) { + user_agent, &cancel_listener, constellation_chan) { Err(error) => { match error.error { LoadErrorType::ConnectionAborted { .. } => unreachable!(), @@ -860,7 +863,8 @@ pub fn load<A, B>(load_data: &LoadData, devtools_chan: Option<Sender<DevtoolsControlMsg>>, request_factory: &HttpRequestFactory<R=A>, user_agent: String, - cancel_listener: &CancellationListener) + cancel_listener: &CancellationListener, + constellation_chan: Option<IpcSender<CustomResponseMediator>>) -> Result<StreamedResponse, LoadError> where A: HttpRequest + 'static, B: UIProvider { let max_redirects = PREFS.get("network.http.redirection-limit").as_i64().unwrap() as u32; let mut iters = 0; @@ -878,17 +882,19 @@ pub fn load<A, B>(load_data: &LoadData, } let (msg_sender, msg_receiver) = ipc::channel().unwrap(); - match load_data.source { - RequestSource::Window(ref sender) | RequestSource::Worker(ref sender) => { - sender.send(msg_sender.clone()).unwrap(); - let received_msg = msg_receiver.recv().unwrap(); - if let Some(custom_response) = received_msg { - let metadata = Metadata::default(doc_url.clone()); - let readable_response = to_readable_response(custom_response); - return StreamedResponse::from_http_response(box readable_response, metadata); - } + let response_mediator = CustomResponseMediator { + response_chan: msg_sender, + load_url: doc_url.clone() + }; + if let Some(sender) = constellation_chan { + let _ = sender.send(response_mediator); + if let Ok(Some(custom_response)) = msg_receiver.try_recv() { + let metadata = Metadata::default(doc_url.clone()); + let readable_response = to_readable_response(custom_response); + return StreamedResponse::from_http_response(box readable_response, metadata); } - RequestSource::None => {} + } else { + debug!("Did not receive a custom response"); } // If the URL is a view-source scheme then the scheme data contains the |