From c37a345dc9f4dda6ea29c42f96f6c7201c42cbac Mon Sep 17 00:00:00 2001 From: chansuke Date: Tue, 18 Sep 2018 23:24:15 +0900 Subject: Format script component --- components/script/dom/abstractworker.rs | 6 +- components/script/dom/abstractworkerglobalscope.rs | 37 +- components/script/dom/activation.rs | 50 +- components/script/dom/attr.rs | 55 +- components/script/dom/audiobuffersourcenode.rs | 6 +- components/script/dom/audiocontext.rs | 5 +- components/script/dom/audiodestinationnode.rs | 4 +- components/script/dom/audiolistener.rs | 12 +- components/script/dom/audionode.rs | 45 +- components/script/dom/audioparam.rs | 82 +- components/script/dom/audioscheduledsourcenode.rs | 7 +- components/script/dom/baseaudiocontext.rs | 34 +- components/script/dom/beforeunloadevent.rs | 21 +- components/script/dom/bindings/callback.rs | 41 +- components/script/dom/bindings/cell.rs | 7 +- components/script/dom/bindings/constant.rs | 17 +- components/script/dom/bindings/conversions.rs | 171 ++- components/script/dom/bindings/error.rs | 58 +- components/script/dom/bindings/htmlconstructor.rs | 288 ++-- components/script/dom/bindings/inheritance.rs | 11 +- components/script/dom/bindings/interface.rs | 304 ++-- components/script/dom/bindings/iterable.rs | 65 +- components/script/dom/bindings/mozmap.rs | 45 +- components/script/dom/bindings/namespace.rs | 15 +- components/script/dom/bindings/num.rs | 6 +- components/script/dom/bindings/proxyhandler.rs | 97 +- components/script/dom/bindings/refcounted.rs | 36 +- components/script/dom/bindings/reflector.rs | 21 +- components/script/dom/bindings/root.rs | 74 +- components/script/dom/bindings/settings_stack.rs | 46 +- components/script/dom/bindings/str.rs | 91 +- components/script/dom/bindings/structuredclone.rs | 245 +-- components/script/dom/bindings/trace.rs | 119 +- components/script/dom/bindings/utils.rs | 251 +-- components/script/dom/bindings/weakref.rs | 36 +- components/script/dom/bindings/xmlname.rs | 23 +- components/script/dom/blob.rs | 136 +- components/script/dom/bluetooth.rs | 285 ++-- components/script/dom/bluetoothadvertisingevent.rs | 71 +- .../dom/bluetoothcharacteristicproperties.rs | 52 +- components/script/dom/bluetoothdevice.rs | 195 ++- components/script/dom/bluetoothpermissionresult.rs | 44 +- .../dom/bluetoothremotegattcharacteristic.rs | 114 +- .../script/dom/bluetoothremotegattdescriptor.rs | 61 +- components/script/dom/bluetoothremotegattserver.rs | 47 +- .../script/dom/bluetoothremotegattservice.rs | 107 +- components/script/dom/bluetoothuuid.rs | 550 +++++-- components/script/dom/canvasgradient.rs | 44 +- components/script/dom/canvaspattern.rs | 43 +- components/script/dom/canvasrenderingcontext2d.rs | 718 +++++---- components/script/dom/channelmergernode.rs | 24 +- components/script/dom/characterdata.rs | 52 +- components/script/dom/client.rs | 12 +- components/script/dom/closeevent.rs | 55 +- components/script/dom/comment.rs | 8 +- components/script/dom/compositionevent.rs | 58 +- components/script/dom/console.rs | 18 +- components/script/dom/create.rs | 335 ++-- components/script/dom/crypto.rs | 15 +- components/script/dom/cssconditionrule.rs | 6 +- components/script/dom/cssfontfacerule.rs | 29 +- components/script/dom/cssgroupingrule.rs | 16 +- components/script/dom/cssimportrule.rs | 28 +- components/script/dom/csskeyframerule.rs | 29 +- components/script/dom/csskeyframesrule.rs | 59 +- components/script/dom/cssmediarule.rs | 34 +- components/script/dom/cssnamespacerule.rs | 36 +- components/script/dom/cssrule.rs | 40 +- components/script/dom/cssrulelist.rs | 82 +- components/script/dom/cssstyledeclaration.rs | 136 +- components/script/dom/cssstylerule.rs | 43 +- components/script/dom/cssstylesheet.rs | 51 +- components/script/dom/cssstylevalue.rs | 4 +- components/script/dom/csssupportsrule.rs | 29 +- components/script/dom/cssviewportrule.rs | 28 +- components/script/dom/customelementregistry.rs | 598 +++++--- components/script/dom/customevent.rs | 68 +- .../script/dom/dedicatedworkerglobalscope.rs | 392 ++--- components/script/dom/dissimilaroriginlocation.rs | 8 +- components/script/dom/dissimilaroriginwindow.rs | 25 +- components/script/dom/document.rs | 1503 ++++++++++-------- components/script/dom/documentfragment.rs | 27 +- components/script/dom/documenttype.rs | 32 +- components/script/dom/domexception.rs | 23 +- components/script/dom/domimplementation.rs | 125 +- components/script/dom/dommatrix.rs | 55 +- components/script/dom/dommatrixreadonly.rs | 212 ++- components/script/dom/domparser.rs | 82 +- components/script/dom/dompoint.rs | 13 +- components/script/dom/dompointreadonly.rs | 21 +- components/script/dom/domquad.rs | 115 +- components/script/dom/domrect.rs | 21 +- components/script/dom/domrectreadonly.rs | 34 +- components/script/dom/domstringmap.rs | 14 +- components/script/dom/domtokenlist.rs | 45 +- components/script/dom/element.rs | 1288 +++++++++------- components/script/dom/errorevent.rs | 62 +- components/script/dom/event.rs | 91 +- components/script/dom/eventsource.rs | 143 +- components/script/dom/eventtarget.rs | 373 ++--- components/script/dom/extendableevent.rs | 35 +- components/script/dom/extendablemessageevent.rs | 52 +- components/script/dom/file.rs | 66 +- components/script/dom/filelist.rs | 14 +- components/script/dom/filereader.rs | 3 +- components/script/dom/focusevent.rs | 59 +- components/script/dom/formdata.rs | 127 +- components/script/dom/gainnode.rs | 13 +- components/script/dom/gamepad.rs | 46 +- components/script/dom/gamepadbutton.rs | 8 +- components/script/dom/gamepadbuttonlist.rs | 19 +- components/script/dom/gamepadevent.rs | 55 +- components/script/dom/gamepadlist.rs | 24 +- components/script/dom/globalscope.rs | 96 +- components/script/dom/hashchangeevent.rs | 54 +- components/script/dom/headers.rs | 111 +- components/script/dom/history.rs | 116 +- components/script/dom/htmlanchorelement.rs | 138 +- components/script/dom/htmlareaelement.rs | 149 +- components/script/dom/htmlaudioelement.rs | 31 +- components/script/dom/htmlbaseelement.rs | 42 +- components/script/dom/htmlbodyelement.rs | 103 +- components/script/dom/htmlbrelement.rs | 24 +- components/script/dom/htmlbuttonelement.rs | 133 +- components/script/dom/htmlcanvaselement.rs | 134 +- components/script/dom/htmlcollection.rs | 128 +- components/script/dom/htmldataelement.rs | 28 +- components/script/dom/htmldatalistelement.rs | 31 +- components/script/dom/htmldetailselement.rs | 33 +- components/script/dom/htmldialogelement.rs | 37 +- components/script/dom/htmldirectoryelement.rs | 31 +- components/script/dom/htmldivelement.rs | 28 +- components/script/dom/htmldlistelement.rs | 29 +- components/script/dom/htmlelement.rs | 259 ++-- components/script/dom/htmlembedelement.rs | 28 +- components/script/dom/htmlfieldsetelement.rs | 69 +- components/script/dom/htmlfontelement.rs | 40 +- .../script/dom/htmlformcontrolscollection.rs | 45 +- components/script/dom/htmlformelement.rs | 668 ++++---- components/script/dom/htmlframeelement.rs | 28 +- components/script/dom/htmlframesetelement.rs | 31 +- components/script/dom/htmlheadelement.rs | 42 +- components/script/dom/htmlheadingelement.rs | 33 +- components/script/dom/htmlhrelement.rs | 30 +- components/script/dom/htmlhtmlelement.rs | 26 +- components/script/dom/htmliframeelement.rs | 193 ++- components/script/dom/htmlimageelement.rs | 652 ++++---- components/script/dom/htmlinputelement.rs | 711 +++++---- components/script/dom/htmllabelelement.rs | 91 +- components/script/dom/htmllegendelement.rs | 37 +- components/script/dom/htmllielement.rs | 29 +- components/script/dom/htmllinkelement.rs | 108 +- components/script/dom/htmlmapelement.rs | 31 +- components/script/dom/htmlmediaelement.rs | 166 +- components/script/dom/htmlmetaelement.rs | 49 +- components/script/dom/htmlmeterelement.rs | 30 +- components/script/dom/htmlmodelement.rs | 29 +- components/script/dom/htmlobjectelement.rs | 39 +- components/script/dom/htmlolistelement.rs | 28 +- components/script/dom/htmloptgroupelement.rs | 45 +- components/script/dom/htmloptionelement.rs | 65 +- components/script/dom/htmloptionscollection.rs | 50 +- components/script/dom/htmloutputelement.rs | 29 +- components/script/dom/htmlparagraphelement.rs | 31 +- components/script/dom/htmlparamelement.rs | 31 +- components/script/dom/htmlpictureelement.rs | 29 +- components/script/dom/htmlpreelement.rs | 27 +- components/script/dom/htmlprogresselement.rs | 29 +- components/script/dom/htmlquoteelement.rs | 29 +- components/script/dom/htmlscriptelement.rs | 225 ++- components/script/dom/htmlselectelement.rs | 121 +- components/script/dom/htmlsourceelement.rs | 32 +- components/script/dom/htmlspanelement.rs | 26 +- components/script/dom/htmlstyleelement.rs | 61 +- components/script/dom/htmltablecaptionelement.rs | 31 +- components/script/dom/htmltablecellelement.rs | 26 +- components/script/dom/htmltablecolelement.rs | 29 +- components/script/dom/htmltabledatacellelement.rs | 22 +- components/script/dom/htmltableelement.rs | 215 +-- .../script/dom/htmltableheadercellelement.rs | 29 +- components/script/dom/htmltablerowelement.rs | 47 +- components/script/dom/htmltablesectionelement.rs | 40 +- components/script/dom/htmltemplateelement.rs | 49 +- components/script/dom/htmltextareaelement.rs | 176 ++- components/script/dom/htmltimeelement.rs | 22 +- components/script/dom/htmltitleelement.rs | 26 +- components/script/dom/htmltrackelement.rs | 26 +- components/script/dom/htmlulistelement.rs | 28 +- components/script/dom/htmlunknownelement.rs | 31 +- components/script/dom/htmlvideoelement.rs | 29 +- components/script/dom/imagedata.rs | 46 +- components/script/dom/inputevent.rs | 64 +- components/script/dom/keyboardevent.rs | 226 +-- components/script/dom/location.rs | 18 +- components/script/dom/macros.rs | 5 +- components/script/dom/mediaerror.rs | 8 +- components/script/dom/medialist.rs | 35 +- components/script/dom/mediaquerylist.rs | 17 +- components/script/dom/mediaquerylistevent.rs | 42 +- components/script/dom/messageevent.rs | 71 +- components/script/dom/mimetypearray.rs | 10 +- components/script/dom/mouseevent.rs | 70 +- components/script/dom/mutationobserver.rs | 128 +- components/script/dom/mutationrecord.rs | 41 +- components/script/dom/namednodemap.rs | 37 +- components/script/dom/navigator.rs | 25 +- components/script/dom/node.rs | 1000 +++++++----- components/script/dom/nodeiterator.rs | 42 +- components/script/dom/nodelist.rs | 91 +- components/script/dom/offlineaudiocontext.rs | 33 +- components/script/dom/oscillatornode.rs | 13 +- components/script/dom/pagetransitionevent.rs | 42 +- components/script/dom/paintrenderingcontext2d.rs | 89 +- components/script/dom/paintsize.rs | 11 +- components/script/dom/paintworkletglobalscope.rs | 295 ++-- components/script/dom/pannernode.rs | 94 +- components/script/dom/performance.rs | 228 ++- components/script/dom/performanceentry.rs | 22 +- components/script/dom/performancemark.rs | 4 +- components/script/dom/performancemeasure.rs | 4 +- components/script/dom/performanceobserver.rs | 42 +- .../script/dom/performanceobserverentrylist.rs | 31 +- components/script/dom/performancepainttiming.rs | 27 +- components/script/dom/performancetiming.rs | 31 +- components/script/dom/permissions.rs | 184 ++- components/script/dom/permissionstatus.rs | 8 +- components/script/dom/pluginarray.rs | 13 +- components/script/dom/popstateevent.rs | 46 +- components/script/dom/processinginstruction.rs | 22 +- components/script/dom/progressevent.rs | 56 +- components/script/dom/promise.rs | 87 +- components/script/dom/promisenativehandler.rs | 23 +- components/script/dom/radionodelist.rs | 25 +- components/script/dom/range.rs | 386 ++--- components/script/dom/request.rs | 209 +-- components/script/dom/response.rs | 75 +- components/script/dom/screen.rs | 28 +- components/script/dom/serviceworker.rs | 38 +- components/script/dom/serviceworkercontainer.rs | 38 +- components/script/dom/serviceworkerglobalscope.rs | 313 ++-- components/script/dom/serviceworkerregistration.rs | 35 +- components/script/dom/servoparser/async_html.rs | 397 +++-- components/script/dom/servoparser/html.rs | 133 +- components/script/dom/servoparser/mod.rs | 317 ++-- components/script/dom/servoparser/xml.rs | 8 +- components/script/dom/storage.rs | 97 +- components/script/dom/storageevent.rs | 81 +- components/script/dom/stylepropertymapreadonly.rs | 27 +- components/script/dom/stylesheet.rs | 30 +- components/script/dom/stylesheetlist.rs | 15 +- components/script/dom/svgelement.rs | 12 +- components/script/dom/svggraphicselement.rs | 26 +- components/script/dom/svgsvgelement.rs | 42 +- components/script/dom/testbinding.rs | 557 +++++-- components/script/dom/testbindingiterable.rs | 24 +- components/script/dom/testbindingpairiterable.rs | 28 +- components/script/dom/testbindingproxy.rs | 31 +- components/script/dom/testrunner.rs | 22 +- components/script/dom/testworklet.rs | 9 +- components/script/dom/testworkletglobalscope.rs | 32 +- components/script/dom/text.rs | 30 +- components/script/dom/textcontrol.rs | 35 +- components/script/dom/textdecoder.rs | 72 +- components/script/dom/textencoder.rs | 12 +- components/script/dom/touch.rs | 40 +- components/script/dom/touchevent.rs | 69 +- components/script/dom/touchlist.rs | 11 +- components/script/dom/transitionevent.rs | 26 +- components/script/dom/treewalker.rs | 165 +- components/script/dom/uievent.rs | 66 +- components/script/dom/url.rs | 44 +- components/script/dom/urlsearchparams.rs | 43 +- components/script/dom/userscripts.rs | 12 +- components/script/dom/validation.rs | 8 +- components/script/dom/validitystate.rs | 15 +- components/script/dom/virtualmethods.rs | 104 +- components/script/dom/vr.rs | 82 +- components/script/dom/vrdisplay.rs | 226 +-- components/script/dom/vrdisplaycapabilities.rs | 23 +- components/script/dom/vrdisplayevent.rs | 85 +- components/script/dom/vreyeparameters.rs | 16 +- components/script/dom/vrfieldofview.rs | 12 +- components/script/dom/vrframedata.rs | 20 +- components/script/dom/vrpose.rs | 58 +- components/script/dom/vrstageparameters.rs | 22 +- components/script/dom/webgl2renderingcontext.rs | 373 +++-- .../webgl_extensions/ext/angleinstancedarrays.rs | 14 +- .../dom/webgl_extensions/ext/extblendminmax.rs | 4 +- .../webgl_extensions/ext/extshadertexturelod.rs | 4 +- .../ext/exttexturefilteranisotropic.rs | 8 +- .../webgl_extensions/ext/oeselementindexuint.rs | 4 +- .../webgl_extensions/ext/oesstandardderivatives.rs | 16 +- .../dom/webgl_extensions/ext/oestexturefloat.rs | 29 +- .../webgl_extensions/ext/oestexturefloatlinear.rs | 11 +- .../webgl_extensions/ext/oestexturehalffloat.rs | 24 +- .../ext/oestexturehalffloatlinear.rs | 16 +- .../webgl_extensions/ext/oesvertexarrayobject.rs | 16 +- .../script/dom/webgl_extensions/extension.rs | 7 +- .../script/dom/webgl_extensions/extensions.rs | 205 ++- components/script/dom/webgl_extensions/mod.rs | 20 +- components/script/dom/webgl_extensions/wrapper.rs | 32 +- .../script/dom/webgl_validations/tex_image_2d.rs | 122 +- components/script/dom/webgl_validations/types.rs | 4 +- components/script/dom/webglactiveinfo.rs | 2 +- components/script/dom/webglbuffer.rs | 22 +- components/script/dom/webglcontextevent.rs | 46 +- components/script/dom/webglframebuffer.rs | 208 ++- components/script/dom/webglprogram.rs | 81 +- components/script/dom/webglrenderbuffer.rs | 18 +- components/script/dom/webglrenderingcontext.rs | 1617 ++++++++++++-------- components/script/dom/webglshader.rs | 25 +- .../script/dom/webglshaderprecisionformat.rs | 17 +- components/script/dom/webgltexture.rs | 128 +- components/script/dom/webgluniformlocation.rs | 8 +- components/script/dom/webglvertexarrayobjectoes.rs | 28 +- components/script/dom/websocket.rs | 191 ++- components/script/dom/window.rs | 555 ++++--- components/script/dom/windowproxy.rs | 425 ++--- components/script/dom/worker.rs | 57 +- components/script/dom/workerglobalscope.rs | 150 +- components/script/dom/workerlocation.rs | 8 +- components/script/dom/workernavigator.rs | 11 +- components/script/dom/worklet.rs | 187 ++- components/script/dom/workletglobalscope.rs | 47 +- components/script/dom/xmldocument.rs | 83 +- components/script/dom/xmlhttprequest.rs | 424 ++--- components/script/dom/xmlhttprequesteventtarget.rs | 2 +- components/script/dom/xmlhttprequestupload.rs | 10 +- 328 files changed, 19087 insertions(+), 12524 deletions(-) (limited to 'components/script/dom') diff --git a/components/script/dom/abstractworker.rs b/components/script/dom/abstractworker.rs index 9a72316810b..2038ff62476 100644 --- a/components/script/dom/abstractworker.rs +++ b/components/script/dom/abstractworker.rs @@ -12,7 +12,7 @@ pub enum WorkerScriptMsg { /// Common variants associated with the script messages Common(CommonScriptMsg), /// Message sent through Worker.postMessage - DOMMessage(StructuredCloneData) + DOMMessage(StructuredCloneData), } pub struct SimpleWorkerErrorHandler { @@ -21,8 +21,6 @@ pub struct SimpleWorkerErrorHandler { impl SimpleWorkerErrorHandler { pub fn new(addr: Trusted) -> SimpleWorkerErrorHandler { - SimpleWorkerErrorHandler { - addr: addr - } + SimpleWorkerErrorHandler { addr: addr } } } diff --git a/components/script/dom/abstractworkerglobalscope.rs b/components/script/dom/abstractworkerglobalscope.rs index e3e6fbcf813..051469520ec 100644 --- a/components/script/dom/abstractworkerglobalscope.rs +++ b/components/script/dom/abstractworkerglobalscope.rs @@ -25,7 +25,10 @@ pub struct SendableWorkerScriptChan { impl ScriptChan for SendableWorkerScriptChan { fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { - let msg = DedicatedWorkerScriptMsg::CommonWorker(self.worker.clone(), WorkerScriptMsg::Common(msg)); + let msg = DedicatedWorkerScriptMsg::CommonWorker( + self.worker.clone(), + WorkerScriptMsg::Common(msg), + ); self.sender.send(msg).map_err(|_| ()) } @@ -48,10 +51,11 @@ pub struct WorkerThreadWorkerChan { impl ScriptChan for WorkerThreadWorkerChan { fn send(&self, msg: CommonScriptMsg) -> Result<(), ()> { - let msg = DedicatedWorkerScriptMsg::CommonWorker(self.worker.clone(), WorkerScriptMsg::Common(msg)); - self.sender - .send(msg) - .map_err(|_| ()) + let msg = DedicatedWorkerScriptMsg::CommonWorker( + self.worker.clone(), + WorkerScriptMsg::Common(msg), + ); + self.sender.send(msg).map_err(|_| ()) } fn clone(&self) -> Box { @@ -67,7 +71,7 @@ impl ScriptPort for Receiver { let common_msg = match self.recv() { Some(DedicatedWorkerScriptMsg::CommonWorker(_worker, common_msg)) => common_msg, None => return Err(()), - Some(DedicatedWorkerScriptMsg::WakeUp) => panic!("unexpected worker event message!") + Some(DedicatedWorkerScriptMsg::WakeUp) => panic!("unexpected worker event message!"), }; match common_msg { WorkerScriptMsg::Common(script_msg) => Ok(script_msg), @@ -90,14 +94,17 @@ pub trait WorkerEventLoopMethods { } // https://html.spec.whatwg.org/multipage/#worker-event-loop -pub fn run_worker_event_loop(worker_scope: &T, - worker: Option<&TrustedWorkerAddress>) -where +pub fn run_worker_event_loop( + worker_scope: &T, + worker: Option<&TrustedWorkerAddress>, +) where TimerMsg: Send, WorkerMsg: QueuedTaskConversion + Send, - T: WorkerEventLoopMethods - + DerivedFrom + DerivedFrom - + DomObject { + T: WorkerEventLoopMethods + + DerivedFrom + + DerivedFrom + + DomObject, +{ let scope = worker_scope.upcast::(); let timer_event_port = worker_scope.timer_event_port(); let devtools_port = match scope.from_devtools_sender() { @@ -140,8 +147,10 @@ where // Step 6 let _ar = match worker { Some(worker) => worker_scope.handle_worker_post_event(worker), - None => None + None => None, }; - worker_scope.upcast::().perform_a_microtask_checkpoint(); + worker_scope + .upcast::() + .perform_a_microtask_checkpoint(); } } diff --git a/components/script/dom/activation.rs b/components/script/dom/activation.rs index 029e77ed449..9498f17bf17 100644 --- a/components/script/dom/activation.rs +++ b/components/script/dom/activation.rs @@ -56,12 +56,14 @@ pub enum ActivationSource { } // https://html.spec.whatwg.org/multipage/#run-synthetic-click-activation-steps -pub fn synthetic_click_activation(element: &Element, - ctrl_key: bool, - shift_key: bool, - alt_key: bool, - meta_key: bool, - source: ActivationSource) { +pub fn synthetic_click_activation( + element: &Element, + ctrl_key: bool, + shift_key: bool, + alt_key: bool, + meta_key: bool, + source: ActivationSource, +) { // Step 1 if element.click_in_progress() { return; @@ -78,23 +80,25 @@ pub fn synthetic_click_activation(element: &Element, // https://html.spec.whatwg.org/multipage/#fire-a-synthetic-mouse-event let win = window_from_node(element); let target = element.upcast::(); - let mouse = MouseEvent::new(&win, - DOMString::from("click"), - EventBubbles::DoesNotBubble, - EventCancelable::NotCancelable, - Some(&win), - 1, - 0, - 0, - 0, - 0, - ctrl_key, - shift_key, - alt_key, - meta_key, - 0, - None, - None); + let mouse = MouseEvent::new( + &win, + DOMString::from("click"), + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable, + Some(&win), + 1, + 0, + 0, + 0, + 0, + ctrl_key, + shift_key, + alt_key, + meta_key, + 0, + None, + None, + ); let event = mouse.upcast::(); if source == ActivationSource::FromClick { event.set_trusted(false); diff --git a/components/script/dom/attr.rs b/components/script/dom/attr.rs index 333b2ae413e..e14dadec1a0 100644 --- a/components/script/dom/attr.rs +++ b/components/script/dom/attr.rs @@ -36,13 +36,14 @@ pub struct Attr { } impl Attr { - fn new_inherited(local_name: LocalName, - value: AttrValue, - name: LocalName, - namespace: Namespace, - prefix: Option, - owner: Option<&Element>) - -> Attr { + fn new_inherited( + local_name: LocalName, + value: AttrValue, + name: LocalName, + namespace: Namespace, + prefix: Option, + owner: Option<&Element>, + ) -> Attr { Attr { reflector_: Reflector::new(), identifier: AttrIdentifier { @@ -56,25 +57,21 @@ impl Attr { } } - pub fn new(window: &Window, - local_name: LocalName, - value: AttrValue, - name: LocalName, - namespace: Namespace, - prefix: Option, - owner: Option<&Element>) - -> DomRoot { + pub fn new( + window: &Window, + local_name: LocalName, + value: AttrValue, + name: LocalName, + namespace: Namespace, + prefix: Option, + owner: Option<&Element>, + ) -> DomRoot { reflect_dom_object( Box::new(Attr::new_inherited( - local_name, - value, - name, - namespace, - prefix, - owner + local_name, value, name, namespace, prefix, owner, )), window, - AttrBinding::Wrap + AttrBinding::Wrap, ) } @@ -110,9 +107,7 @@ impl AttrMethods for Attr { // https://dom.spec.whatwg.org/#dom-attr-value fn SetValue(&self, value: DOMString) { if let Some(owner) = self.owner() { - let value = owner.parse_attribute(&self.identifier.namespace, - self.local_name(), - value); + let value = owner.parse_attribute(&self.identifier.namespace, self.local_name(), value); self.set_value(value, &owner); } else { *self.value.borrow_mut() = AttrValue::String(value.into()); @@ -175,7 +170,6 @@ impl AttrMethods for Attr { } } - impl Attr { pub fn set_value(&self, mut value: AttrValue, owner: &Element) { let name = self.local_name().clone(); @@ -191,7 +185,12 @@ impl Attr { MutationObserver::queue_a_mutation_record(owner.upcast::(), mutation); if owner.get_custom_element_definition().is_some() { - let reaction = CallbackReaction::AttributeChanged(name, Some(old_value), Some(new_value), namespace); + let reaction = CallbackReaction::AttributeChanged( + name, + Some(old_value), + Some(new_value), + namespace, + ); ScriptThread::enqueue_callback_reaction(owner, reaction, None); } @@ -229,7 +228,7 @@ impl Attr { (Some(old), None) => { // Already gone from the list of attributes of old owner. assert!(old.get_attribute(&ns, &self.identifier.local_name).r() != Some(self)) - } + }, (Some(old), Some(new)) => assert_eq!(&*old, new), _ => {}, } diff --git a/components/script/dom/audiobuffersourcenode.rs b/components/script/dom/audiobuffersourcenode.rs index e2056535386..b534acead44 100644 --- a/components/script/dom/audiobuffersourcenode.rs +++ b/components/script/dom/audiobuffersourcenode.rs @@ -98,7 +98,11 @@ impl AudioBufferSourceNode { options: &AudioBufferSourceOptions, ) -> Fallible> { let node = AudioBufferSourceNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window, AudioBufferSourceNodeBinding::Wrap)) + Ok(reflect_dom_object( + Box::new(node), + window, + AudioBufferSourceNodeBinding::Wrap, + )) } pub fn Constructor( diff --git a/components/script/dom/audiocontext.rs b/components/script/dom/audiocontext.rs index 519a73972a5..eef971fcba5 100644 --- a/components/script/dom/audiocontext.rs +++ b/components/script/dom/audiocontext.rs @@ -36,9 +36,8 @@ impl AudioContext { // https://webaudio.github.io/web-audio-api/#AudioContext-constructors fn new_inherited(options: &AudioContextOptions) -> AudioContext { // Steps 1-3. - let context = BaseAudioContext::new_inherited( - BaseAudioContextOptions::AudioContext(options.into()), - ); + let context = + BaseAudioContext::new_inherited(BaseAudioContextOptions::AudioContext(options.into())); // Step 4.1. let latency_hint = options.latencyHint; diff --git a/components/script/dom/audiodestinationnode.rs b/components/script/dom/audiodestinationnode.rs index eb3f0873156..4c394919671 100644 --- a/components/script/dom/audiodestinationnode.rs +++ b/components/script/dom/audiodestinationnode.rs @@ -22,8 +22,8 @@ impl AudioDestinationNode { context: &BaseAudioContext, options: &AudioNodeOptions, ) -> AudioDestinationNode { - let node_options = options.unwrap_or(2, ChannelCountMode::Max, - ChannelInterpretation::Speakers); + let node_options = + options.unwrap_or(2, ChannelCountMode::Max, ChannelInterpretation::Speakers); AudioDestinationNode { node: AudioNode::new_inherited_for_id( context.destination_node(), diff --git a/components/script/dom/audiolistener.rs b/components/script/dom/audiolistener.rs index bf6c9b20d44..0287816f921 100644 --- a/components/script/dom/audiolistener.rs +++ b/components/script/dom/audiolistener.rs @@ -28,10 +28,7 @@ pub struct AudioListener { } impl AudioListener { - fn new_inherited( - window: &Window, - context: &BaseAudioContext, - ) -> AudioListener { + fn new_inherited(window: &Window, context: &BaseAudioContext) -> AudioListener { let node = context.listener(); let position_x = AudioParam::new( @@ -90,7 +87,7 @@ impl AudioListener { node, ParamType::Forward(ParamDir::Z), AutomationRate::A_rate, - -1., // default value + -1., // default value f32::MIN, // min value f32::MAX, // max value ); @@ -139,10 +136,7 @@ impl AudioListener { } #[allow(unrooted_must_root)] - pub fn new( - window: &Window, - context: &BaseAudioContext, - ) -> DomRoot { + pub fn new(window: &Window, context: &BaseAudioContext) -> DomRoot { let node = AudioListener::new_inherited(window, context); reflect_dom_object(Box::new(node), window, AudioListenerBinding::Wrap) } diff --git a/components/script/dom/audionode.rs b/components/script/dom/audionode.rs index db0d5668b17..e227f7282ff 100644 --- a/components/script/dom/audionode.rs +++ b/components/script/dom/audionode.rs @@ -36,7 +36,6 @@ pub struct AudioNode { channel_interpretation: Cell, } - impl AudioNode { pub fn new_inherited( node_type: AudioNodeInit, @@ -54,7 +53,13 @@ impl AudioNode { interpretation: options.interpretation.into(), }; let node_id = context.audio_context_impl().create_node(node_type, ch); - Ok(AudioNode::new_inherited_for_id(node_id, context, options, number_of_inputs, number_of_outputs)) + Ok(AudioNode::new_inherited_for_id( + node_id, + context, + options, + number_of_inputs, + number_of_outputs, + )) } pub fn new_inherited_for_id( @@ -177,8 +182,7 @@ impl AudioNodeMethods for AudioNode { fn Disconnect_____(&self, param: &AudioParam) -> ErrorResult { self.context .audio_context_impl() - .disconnect_to(self.node_id(), - param.node_id().param(param.param_type())); + .disconnect_to(self.node_id(), param.node_id().param(param.param_type())); Ok(()) } @@ -186,8 +190,10 @@ impl AudioNodeMethods for AudioNode { fn Disconnect______(&self, param: &AudioParam, out: u32) -> ErrorResult { self.context .audio_context_impl() - .disconnect_output_between_to(self.node_id().output(out), - param.node_id().param(param.param_type())); + .disconnect_output_between_to( + self.node_id().output(out), + param.node_id().param(param.param_type()), + ); Ok(()) } @@ -223,14 +229,14 @@ impl AudioNodeMethods for AudioNode { }, EventTargetTypeId::AudioNode(AudioNodeTypeId::PannerNode) => { if value > 2 { - return Err(Error::NotSupported) + return Err(Error::NotSupported); } - } + }, EventTargetTypeId::AudioNode(AudioNodeTypeId::ChannelMergerNode) => { if value != 1 { - return Err(Error::InvalidState) + return Err(Error::InvalidState); } - } + }, // XXX We do not support any of the other AudioNodes with // constraints yet. Add more cases here as we add support // for new AudioNodes. @@ -266,14 +272,14 @@ impl AudioNodeMethods for AudioNode { }, EventTargetTypeId::AudioNode(AudioNodeTypeId::PannerNode) => { if value == ChannelCountMode::Max { - return Err(Error::NotSupported) + return Err(Error::NotSupported); } - } + }, EventTargetTypeId::AudioNode(AudioNodeTypeId::ChannelMergerNode) => { if value != ChannelCountMode::Explicit { - return Err(Error::InvalidState) + return Err(Error::InvalidState); } - } + }, // XXX We do not support any of the other AudioNodes with // constraints yet. Add more cases here as we add support // for new AudioNodes. @@ -321,14 +327,17 @@ impl From for ServoMediaChannelInterpretation { } } - impl AudioNodeOptions { - pub fn unwrap_or(&self, count: u32, mode: ChannelCountMode, - interpretation: ChannelInterpretation) -> UnwrappedAudioNodeOptions { + pub fn unwrap_or( + &self, + count: u32, + mode: ChannelCountMode, + interpretation: ChannelInterpretation, + ) -> UnwrappedAudioNodeOptions { UnwrappedAudioNodeOptions { count: self.channelCount.unwrap_or(count), mode: self.channelCountMode.unwrap_or(mode), - interpretation: self.channelInterpretation.unwrap_or(interpretation) + interpretation: self.channelInterpretation.unwrap_or(interpretation), } } } diff --git a/components/script/dom/audioparam.rs b/components/script/dom/audioparam.rs index db73619180f..40826790cbf 100644 --- a/components/script/dom/audioparam.rs +++ b/components/script/dom/audioparam.rs @@ -76,7 +76,9 @@ impl AudioParam { } fn message_node(&self, message: AudioNodeMessage) { - self.context.audio_context_impl().message_node(self.node, message); + self.context + .audio_context_impl() + .message_node(self.node, message); } pub fn context(&self) -> &BaseAudioContext { @@ -101,25 +103,25 @@ impl AudioParamMethods for AudioParam { // https://webaudio.github.io/web-audio-api/#dom-audioparam-automationrate fn SetAutomationRate(&self, automation_rate: AutomationRate) { self.automation_rate.set(automation_rate); - self.message_node( - AudioNodeMessage::SetParamRate(self.param, automation_rate.into()) - ); + self.message_node(AudioNodeMessage::SetParamRate( + self.param, + automation_rate.into(), + )); } // https://webaudio.github.io/web-audio-api/#dom-audioparam-value fn Value(&self) -> Finite { let (tx, rx) = mpsc::channel(); - self.message_node( - AudioNodeMessage::GetParamValue(self.param, tx) - ); + self.message_node(AudioNodeMessage::GetParamValue(self.param, tx)); Finite::wrap(rx.recv().unwrap()) } // https://webaudio.github.io/web-audio-api/#dom-audioparam-value fn SetValue(&self, value: Finite) { - self.message_node( - AudioNodeMessage::SetParam(self.param, UserAutomationEvent::SetValue(*value)), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::SetValue(*value), + )); } // https://webaudio.github.io/web-audio-api/#dom-audioparam-defaultvalue @@ -139,12 +141,10 @@ impl AudioParamMethods for AudioParam { // https://webaudio.github.io/web-audio-api/#dom-audioparam-setvalueattime fn SetValueAtTime(&self, value: Finite, start_time: Finite) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::SetValueAtTime(*value, *start_time), - ) - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::SetValueAtTime(*value, *start_time), + )); DomRoot::from_ref(self) } @@ -154,12 +154,10 @@ impl AudioParamMethods for AudioParam { value: Finite, end_time: Finite, ) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::RampToValueAtTime(RampKind::Linear, *value, *end_time), - ), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::RampToValueAtTime(RampKind::Linear, *value, *end_time), + )); DomRoot::from_ref(self) } @@ -169,12 +167,10 @@ impl AudioParamMethods for AudioParam { value: Finite, end_time: Finite, ) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::RampToValueAtTime(RampKind::Exponential, *value, *end_time), - ), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::RampToValueAtTime(RampKind::Exponential, *value, *end_time), + )); DomRoot::from_ref(self) } @@ -185,34 +181,28 @@ impl AudioParamMethods for AudioParam { start_time: Finite, time_constant: Finite, ) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::SetTargetAtTime(*target, *start_time, (*time_constant).into()), - ), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::SetTargetAtTime(*target, *start_time, (*time_constant).into()), + )); DomRoot::from_ref(self) } // https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelscheduledvalues fn CancelScheduledValues(&self, cancel_time: Finite) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::CancelScheduledValues(*cancel_time), - ), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::CancelScheduledValues(*cancel_time), + )); DomRoot::from_ref(self) } // https://webaudio.github.io/web-audio-api/#dom-audioparam-cancelandholdattime fn CancelAndHoldAtTime(&self, cancel_time: Finite) -> DomRoot { - self.message_node( - AudioNodeMessage::SetParam( - self.param, - UserAutomationEvent::CancelAndHoldAtTime(*cancel_time), - ), - ); + self.message_node(AudioNodeMessage::SetParam( + self.param, + UserAutomationEvent::CancelAndHoldAtTime(*cancel_time), + )); DomRoot::from_ref(self) } } diff --git a/components/script/dom/audioscheduledsourcenode.rs b/components/script/dom/audioscheduledsourcenode.rs index 972d709ba69..cd913897cad 100644 --- a/components/script/dom/audioscheduledsourcenode.rs +++ b/components/script/dom/audioscheduledsourcenode.rs @@ -84,9 +84,10 @@ impl AudioScheduledSourceNodeMethods for AudioScheduledSourceNode { ); }); - self.node().message( - AudioNodeMessage::AudioScheduledSourceNode( - AudioScheduledSourceNodeMessage::RegisterOnEndedCallback(callback))); + self.node() + .message(AudioNodeMessage::AudioScheduledSourceNode( + AudioScheduledSourceNodeMessage::RegisterOnEndedCallback(callback), + )); self.started.set(true); self.node diff --git a/components/script/dom/baseaudiocontext.rs b/components/script/dom/baseaudiocontext.rs index 514a51f113b..f539f81bc4e 100644 --- a/components/script/dom/baseaudiocontext.rs +++ b/components/script/dom/baseaudiocontext.rs @@ -98,14 +98,16 @@ impl BaseAudioContext { pub fn new_inherited(options: BaseAudioContextOptions) -> BaseAudioContext { let (sample_rate, channel_count) = match options { BaseAudioContextOptions::AudioContext(ref opt) => (opt.sample_rate, 2), - BaseAudioContextOptions::OfflineAudioContext(ref opt) => (opt.sample_rate, opt.channels), + BaseAudioContextOptions::OfflineAudioContext(ref opt) => { + (opt.sample_rate, opt.channels) + }, }; let context = BaseAudioContext { eventtarget: EventTarget::new_inherited(), audio_context_impl: ServoMedia::get() - .unwrap() - .create_audio_context(options.into()), + .unwrap() + .create_audio_context(options.into()), destination: Default::default(), listener: Default::default(), in_flight_resume_promises_queue: Default::default(), @@ -312,9 +314,7 @@ impl BaseAudioContextMethods for BaseAudioContext { fn Listener(&self) -> DomRoot { let global = self.global(); let window = global.as_window(); - self.listener.or_init(|| { - AudioListener::new(&window, self) - }) + self.listener.or_init(|| AudioListener::new(&window, self)) } /// https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-onstatechange @@ -425,12 +425,10 @@ impl BaseAudioContextMethods for BaseAudioContext { .lock() .unwrap() .resize(channel_count as usize, Vec::new()); - }) - .progress(move |buffer, channel| { + }).progress(move |buffer, channel| { let mut decoded_audio = decoded_audio_.lock().unwrap(); decoded_audio[(channel - 1) as usize].extend_from_slice((*buffer).as_ref()); - }) - .eos(move || { + }).eos(move || { let _ = task_source.queue_with_canceller( task!(audio_decode_eos: move || { let this = this.root(); @@ -456,8 +454,7 @@ impl BaseAudioContextMethods for BaseAudioContext { }), &canceller, ); - }) - .error(move || { + }).error(move || { let _ = task_source_.queue_with_canceller( task!(audio_decode_eos: move || { let this = this_.root(); @@ -473,8 +470,7 @@ impl BaseAudioContextMethods for BaseAudioContext { }), &canceller_, ); - }) - .build(); + }).build(); self.audio_context_impl .decode_audio_data(audio_data, callbacks); } else { @@ -491,10 +487,12 @@ impl BaseAudioContextMethods for BaseAudioContext { impl From for AudioContextOptions { fn from(options: BaseAudioContextOptions) -> Self { match options { - BaseAudioContextOptions::AudioContext(options) => - AudioContextOptions::RealTimeAudioContext(options), - BaseAudioContextOptions::OfflineAudioContext(options) => - AudioContextOptions::OfflineAudioContext(options), + BaseAudioContextOptions::AudioContext(options) => { + AudioContextOptions::RealTimeAudioContext(options) + }, + BaseAudioContextOptions::OfflineAudioContext(options) => { + AudioContextOptions::OfflineAudioContext(options) + }, } } } diff --git a/components/script/dom/beforeunloadevent.rs b/components/script/dom/beforeunloadevent.rs index bd7fc05daac..43f37a117e4 100644 --- a/components/script/dom/beforeunloadevent.rs +++ b/components/script/dom/beforeunloadevent.rs @@ -33,20 +33,23 @@ impl BeforeUnloadEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(BeforeUnloadEvent::new_inherited()), - window, - BeforeUnloadEventBinding::Wrap) + reflect_dom_object( + Box::new(BeforeUnloadEvent::new_inherited()), + window, + BeforeUnloadEventBinding::Wrap, + ) } - pub fn new(window: &Window, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) -> DomRoot { + pub fn new( + window: &Window, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) -> DomRoot { let ev = BeforeUnloadEvent::new_uninitialized(window); { let event = ev.upcast::(); - event.init_event(type_, bool::from(bubbles), - bool::from(cancelable)); + event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); } ev } diff --git a/components/script/dom/bindings/callback.rs b/components/script/dom/bindings/callback.rs index 6b4d7cd981a..ddc11ce25da 100644 --- a/components/script/dom/bindings/callback.rs +++ b/components/script/dom/bindings/callback.rs @@ -53,7 +53,7 @@ pub struct CallbackObject { /// /// ["callback context"]: https://heycam.github.io/webidl/#dfn-callback-context /// [sometimes]: https://github.com/whatwg/html/issues/2248 - incumbent: Option> + incumbent: Option>, } impl Default for CallbackObject { @@ -81,8 +81,11 @@ impl CallbackObject { unsafe fn init(&mut self, cx: *mut JSContext, callback: *mut JSObject) { self.callback.set(callback); self.permanent_js_root.set(ObjectValue(callback)); - assert!(AddRawValueRoot(cx, self.permanent_js_root.get_unsafe(), - b"CallbackObject::root\n".as_c_char_ptr())); + assert!(AddRawValueRoot( + cx, + self.permanent_js_root.get_unsafe(), + b"CallbackObject::root\n".as_c_char_ptr() + )); } } @@ -94,7 +97,6 @@ impl Drop for CallbackObject { RemoveRawValueRoot(cx, self.permanent_js_root.get_unsafe()); } } - } impl PartialEq for CallbackObject { @@ -103,7 +105,6 @@ impl PartialEq for CallbackObject { } } - /// A trait to be implemented by concrete IDL callback function and /// callback interface types. pub trait CallbackContainer { @@ -124,7 +125,6 @@ pub trait CallbackContainer { } } - /// A common base class for representing IDL callback function types. #[derive(JSTraceable, PartialEq)] #[must_root] @@ -153,9 +153,6 @@ impl CallbackFunction { } } - - - /// A common base class for representing IDL callback interface types. #[derive(JSTraceable, PartialEq)] #[must_root] @@ -194,19 +191,22 @@ impl CallbackInterface { } if !callable.is_object() || !IsCallable(callable.to_object()) { - return Err(Error::Type(format!("The value of the {} property is not callable", - name))); + return Err(Error::Type(format!( + "The value of the {} property is not callable", + name + ))); } } Ok(callable.get()) } } - /// Wraps the reflector for `p` into the compartment of `cx`. -pub fn wrap_call_this_object(cx: *mut JSContext, - p: &T, - mut rval: MutableHandleObject) { +pub fn wrap_call_this_object( + cx: *mut JSContext, + p: &T, + mut rval: MutableHandleObject, +) { rval.set(p.reflector().get_jsobject().get()); assert!(!rval.get().is_null()); @@ -217,7 +217,6 @@ pub fn wrap_call_this_object(cx: *mut JSContext, } } - /// A class that performs whatever setup we need to safely make a call while /// this class is on the stack. After `new` returns, the call is safe to make. pub struct CallSetup { @@ -241,9 +240,7 @@ pub struct CallSetup { impl CallSetup { /// Performs the setup needed to make a call. #[allow(unrooted_must_root)] - pub fn new(callback: &T, - handling: ExceptionHandling) - -> CallSetup { + pub fn new(callback: &T, handling: ExceptionHandling) -> CallSetup { let global = unsafe { GlobalScope::from_object(callback.callback()) }; let cx = global.get_cx(); @@ -270,8 +267,10 @@ impl Drop for CallSetup { unsafe { JS_LeaveCompartment(self.cx, self.old_compartment); if self.handling == ExceptionHandling::Report { - let _ac = JSAutoCompartment::new(self.cx, - self.exception_global.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new( + self.cx, + self.exception_global.reflector().get_jsobject().get(), + ); report_pending_exception(self.cx, true); } drop(self.incumbent_script.take()); diff --git a/components/script/dom/bindings/cell.rs b/components/script/dom/bindings/cell.rs index c40885866b5..02c538f0506 100644 --- a/components/script/dom/bindings/cell.rs +++ b/components/script/dom/bindings/cell.rs @@ -55,7 +55,6 @@ impl DomRefCell { } } - /// Immutably borrows the wrapped value. /// /// The borrow lasts until the returned `Ref` exits scope. Multiple @@ -67,7 +66,8 @@ impl DomRefCell { /// /// Panics if the value is currently mutably borrowed. pub fn borrow(&self) -> Ref { - self.try_borrow().expect("DomRefCell already mutably borrowed") + self.try_borrow() + .expect("DomRefCell already mutably borrowed") } /// Mutably borrows the wrapped value. @@ -81,7 +81,8 @@ impl DomRefCell { /// /// Panics if the value is currently borrowed. pub fn borrow_mut(&self) -> RefMut { - self.try_borrow_mut().expect("DomRefCell already borrowed") + self.try_borrow_mut() + .expect("DomRefCell already borrowed") } /// Attempts to immutably borrow the wrapped value. diff --git a/components/script/dom/bindings/constant.rs b/components/script/dom/bindings/constant.rs index b30247f887b..0329d106132 100644 --- a/components/script/dom/bindings/constant.rs +++ b/components/script/dom/bindings/constant.rs @@ -51,16 +51,15 @@ impl ConstantSpec { /// Defines constants on `obj`. /// Fails on JSAPI failure. -pub unsafe fn define_constants( - cx: *mut JSContext, - obj: HandleObject, - constants: &[ConstantSpec]) { +pub unsafe fn define_constants(cx: *mut JSContext, obj: HandleObject, constants: &[ConstantSpec]) { for spec in constants { rooted!(in(cx) let value = spec.get_value()); - assert!(JS_DefineProperty(cx, - obj, - spec.name.as_ptr() as *const libc::c_char, - value.handle(), - (JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT) as u32)); + assert!(JS_DefineProperty( + cx, + obj, + spec.name.as_ptr() as *const libc::c_char, + value.handle(), + (JSPROP_ENUMERATE | JSPROP_READONLY | JSPROP_PERMANENT) as u32 + )); } } diff --git a/components/script/dom/bindings/conversions.rs b/components/script/dom/bindings/conversions.rs index 0576298d49d..4f848ea97d7 100644 --- a/components/script/dom/bindings/conversions.rs +++ b/components/script/dom/bindings/conversions.rs @@ -69,8 +69,10 @@ pub trait IDLInterface { } /// A trait to mark an IDL interface as deriving from another one. -#[cfg_attr(feature = "unstable", - rustc_on_unimplemented = "The IDL interface `{Self}` is not derived from `{T}`.")] +#[cfg_attr( + feature = "unstable", + rustc_on_unimplemented = "The IDL interface `{Self}` is not derived from `{T}`." +)] pub trait DerivedFrom: Castable {} impl ToJSValConvertible for Finite { @@ -81,20 +83,21 @@ impl ToJSValConvertible for Finite { } } -impl> FromJSValConvertible for Finite { +impl> FromJSValConvertible for Finite { type Config = (); - unsafe fn from_jsval(cx: *mut JSContext, - value: HandleValue, - option: ()) - -> Result>, ()> { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + option: (), + ) -> Result>, ()> { let result = match FromJSValConvertible::from_jsval(cx, value, option)? { ConversionResult::Success(v) => v, ConversionResult::Failure(error) => { // FIXME(emilio): Why throwing instead of propagating the error? throw_type_error(cx, &error); return Err(()); - } + }, }; match Finite::new(result) { Some(v) => Ok(ConversionResult::Success(v)), @@ -106,13 +109,14 @@ impl> FromJSValConvertible for Finite } } -impl FromJSValConvertible for DomRoot { +impl FromJSValConvertible for DomRoot { type Config = (); - unsafe fn from_jsval(_cx: *mut JSContext, - value: HandleValue, - _config: Self::Config) - -> Result>, ()> { + unsafe fn from_jsval( + _cx: *mut JSContext, + value: HandleValue, + _config: Self::Config, + ) -> Result>, ()> { Ok(match root_from_handlevalue(value) { Ok(result) => ConversionResult::Success(result), Err(()) => ConversionResult::Failure("value is not an object".into()), @@ -129,19 +133,21 @@ impl ToJSValConvertible for RootedTraceable } impl FromJSValConvertible for RootedTraceableBox> - where - T: FromJSValConvertible + js::rust::GCMethods + Copy, - Heap: JSTraceable + Default +where + T: FromJSValConvertible + js::rust::GCMethods + Copy, + Heap: JSTraceable + Default, { type Config = T::Config; - unsafe fn from_jsval(cx: *mut JSContext, - value: HandleValue, - config: Self::Config) - -> Result, ()> { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + config: Self::Config, + ) -> Result, ()> { T::from_jsval(cx, value, config).map(|result| match result { - ConversionResult::Success(inner) => - ConversionResult::Success(RootedTraceableBox::from_box(Heap::boxed(inner))), + ConversionResult::Success(inner) => { + ConversionResult::Success(RootedTraceableBox::from_box(Heap::boxed(inner))) + }, ConversionResult::Failure(msg) => ConversionResult::Failure(msg), }) } @@ -190,12 +196,12 @@ impl ToJSValConvertible for DOMString { // https://heycam.github.io/webidl/#es-DOMString impl FromJSValConvertible for DOMString { type Config = StringificationBehavior; - unsafe fn from_jsval(cx: *mut JSContext, - value: HandleValue, - null_behavior: StringificationBehavior) - -> Result, ()> { - if null_behavior == StringificationBehavior::Empty && - value.get().is_null() { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + null_behavior: StringificationBehavior, + ) -> Result, ()> { + if null_behavior == StringificationBehavior::Empty && value.get().is_null() { Ok(ConversionResult::Success(DOMString::new())) } else { let jsstr = ToString(cx, value); @@ -231,16 +237,19 @@ pub unsafe fn jsstring_to_str(cx: *mut JSContext, s: *mut JSString) -> DOMString "Found an unpaired surrogate in a DOM string. \ If you see this in real web content, \ please comment on https://github.com/servo/servo/issues/6564" - } + }; } if opts::get().replace_surrogates { error!(message!()); s.push('\u{FFFD}'); } else { - panic!(concat!(message!(), " Use `-Z replace-surrogates` \ - on the command line to make this non-fatal.")); + panic!(concat!( + message!(), + " Use `-Z replace-surrogates` \ + on the command line to make this non-fatal." + )); } - } + }, } } s @@ -250,8 +259,11 @@ pub unsafe fn jsstring_to_str(cx: *mut JSContext, s: *mut JSString) -> DOMString // http://heycam.github.io/webidl/#es-USVString impl FromJSValConvertible for USVString { type Config = (); - unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, _: ()) - -> Result, ()> { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + _: (), + ) -> Result, ()> { let jsstr = ToString(cx, value); if jsstr.is_null() { debug!("ToString failed"); @@ -260,23 +272,28 @@ impl FromJSValConvertible for USVString { let latin1 = JS_StringHasLatin1Chars(jsstr); if latin1 { // FIXME(ajeffrey): Convert directly from DOMString to USVString - return Ok(ConversionResult::Success( - USVString(String::from(jsstring_to_str(cx, jsstr))))); + return Ok(ConversionResult::Success(USVString(String::from( + jsstring_to_str(cx, jsstr), + )))); } let mut length = 0; let chars = JS_GetTwoByteStringCharsAndLength(cx, ptr::null(), jsstr, &mut length); assert!(!chars.is_null()); let char_vec = slice::from_raw_parts(chars as *const u16, length as usize); - Ok(ConversionResult::Success(USVString(String::from_utf16_lossy(char_vec)))) + Ok(ConversionResult::Success(USVString( + String::from_utf16_lossy(char_vec), + ))) } } // http://heycam.github.io/webidl/#es-ByteString impl ToJSValConvertible for ByteString { unsafe fn to_jsval(&self, cx: *mut JSContext, mut rval: MutableHandleValue) { - let jsstr = JS_NewStringCopyN(cx, - self.as_ptr() as *const libc::c_char, - self.len() as libc::size_t); + let jsstr = JS_NewStringCopyN( + cx, + self.as_ptr() as *const libc::c_char, + self.len() as libc::size_t, + ); if jsstr.is_null() { panic!("JS_NewStringCopyN failed"); } @@ -287,10 +304,11 @@ impl ToJSValConvertible for ByteString { // http://heycam.github.io/webidl/#es-ByteString impl FromJSValConvertible for ByteString { type Config = (); - unsafe fn from_jsval(cx: *mut JSContext, - value: HandleValue, - _option: ()) - -> Result, ()> { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + _option: (), + ) -> Result, ()> { let string = ToString(cx, value); if string.is_null() { debug!("ToString failed"); @@ -304,7 +322,9 @@ impl FromJSValConvertible for ByteString { assert!(!chars.is_null()); let char_slice = slice::from_raw_parts(chars as *mut u8, length as usize); - return Ok(ConversionResult::Success(ByteString::new(char_slice.to_vec()))); + return Ok(ConversionResult::Success(ByteString::new( + char_slice.to_vec(), + ))); } let mut length = 0; @@ -315,13 +335,13 @@ impl FromJSValConvertible for ByteString { throw_type_error(cx, "Invalid ByteString"); Err(()) } else { - Ok(ConversionResult::Success( - ByteString::new(char_vec.iter().map(|&c| c as u8).collect()))) + Ok(ConversionResult::Success(ByteString::new( + char_vec.iter().map(|&c| c as u8).collect(), + ))) } } } - impl ToJSValConvertible for Reflector { unsafe fn to_jsval(&self, cx: *mut JSContext, mut rval: MutableHandleValue) { let obj = self.get_jsobject().get(); @@ -389,10 +409,12 @@ pub unsafe fn get_dom_class(obj: *mut JSObject) -> Result<&'static DOMClass, ()> /// not an object for a DOM object of the given type (as defined by the /// proto_id and proto_depth). #[inline] -pub unsafe fn private_from_proto_check(mut obj: *mut JSObject, - proto_check: F) - -> Result<*const libc::c_void, ()> - where F: Fn(&'static DOMClass) -> bool +pub unsafe fn private_from_proto_check( + mut obj: *mut JSObject, + proto_check: F, +) -> Result<*const libc::c_void, ()> +where + F: Fn(&'static DOMClass) -> bool, { let dom_class = get_dom_class(obj).or_else(|_| { if IsWrapper(obj) { @@ -423,11 +445,10 @@ pub unsafe fn private_from_proto_check(mut obj: *mut JSObject, /// Get a `*const T` for a DOM object accessible from a `JSObject`. pub fn native_from_object(obj: *mut JSObject) -> Result<*const T, ()> - where T: DomObject + IDLInterface +where + T: DomObject + IDLInterface, { - unsafe { - private_from_proto_check(obj, T::derives).map(|ptr| ptr as *const T) - } + unsafe { private_from_proto_check(obj, T::derives).map(|ptr| ptr as *const T) } } /// Get a `DomRoot` for the given DOM object, unwrapping any wrapper @@ -437,7 +458,8 @@ pub fn native_from_object(obj: *mut JSObject) -> Result<*const T, ()> /// not a reflector for a DOM object of the given type (as defined by the /// proto_id and proto_depth). pub fn root_from_object(obj: *mut JSObject) -> Result, ()> - where T: DomObject + IDLInterface +where + T: DomObject + IDLInterface, { native_from_object(obj).map(|ptr| unsafe { DomRoot::from_ref(&*ptr) }) } @@ -445,7 +467,8 @@ pub fn root_from_object(obj: *mut JSObject) -> Result, ()> /// Get a `*const T` for a DOM object accessible from a `HandleValue`. /// Caller is responsible for throwing a JS exception if needed in case of error. pub fn native_from_handlevalue(v: HandleValue) -> Result<*const T, ()> - where T: DomObject + IDLInterface +where + T: DomObject + IDLInterface, { if !v.get().is_object() { return Err(()); @@ -456,7 +479,8 @@ pub fn native_from_handlevalue(v: HandleValue) -> Result<*const T, ()> /// Get a `DomRoot` for a DOM object accessible from a `HandleValue`. /// Caller is responsible for throwing a JS exception if needed in case of error. pub fn root_from_handlevalue(v: HandleValue) -> Result, ()> - where T: DomObject + IDLInterface +where + T: DomObject + IDLInterface, { if !v.get().is_object() { return Err(()); @@ -466,7 +490,8 @@ pub fn root_from_handlevalue(v: HandleValue) -> Result, ()> /// Get a `DomRoot` for a DOM object accessible from a `HandleObject`. pub fn root_from_handleobject(obj: HandleObject) -> Result, ()> - where T: DomObject + IDLInterface +where + T: DomObject + IDLInterface, { root_from_object(obj.get()) } @@ -487,12 +512,12 @@ pub unsafe fn is_array_like(cx: *mut JSContext, value: HandleValue) -> bool { } /// Get a property from a JS object. -pub unsafe fn get_property_jsval(cx: *mut JSContext, - object: HandleObject, - name: &str, - mut rval: MutableHandleValue) - -> Fallible<()> -{ +pub unsafe fn get_property_jsval( + cx: *mut JSContext, + object: HandleObject, + name: &str, + mut rval: MutableHandleValue, +) -> Fallible<()> { rval.set(UndefinedValue()); let cname = match ffi::CString::new(name) { Ok(cname) => cname, @@ -506,12 +531,14 @@ pub unsafe fn get_property_jsval(cx: *mut JSContext, } /// Get a property from a JS object, and convert it to a Rust value. -pub unsafe fn get_property(cx: *mut JSContext, - object: HandleObject, - name: &str, - option: T::Config) - -> Fallible> where - T: FromJSValConvertible +pub unsafe fn get_property( + cx: *mut JSContext, + object: HandleObject, + name: &str, + option: T::Config, +) -> Fallible> +where + T: FromJSValConvertible, { debug!("Getting property {}.", name); rooted!(in(cx) let mut result = UndefinedValue()); diff --git a/components/script/dom/bindings/error.rs b/components/script/dom/bindings/error.rs index 7c68de0df18..ce045b2c9d3 100644 --- a/components/script/dom/bindings/error.rs +++ b/components/script/dom/bindings/error.rs @@ -126,7 +126,7 @@ pub unsafe fn throw_dom_exception(cx: *mut JSContext, global: &GlobalScope, resu Error::JSFailed => { assert!(JS_IsExceptionPending(cx)); return; - } + }, }; assert!(!JS_IsExceptionPending(cx)); @@ -149,8 +149,7 @@ pub struct ErrorInfo { } impl ErrorInfo { - unsafe fn from_native_error(cx: *mut JSContext, object: HandleObject) - -> Option { + unsafe fn from_native_error(cx: *mut JSContext, object: HandleObject) -> Option { let report = JS_ErrorFromException(cx, object); if report.is_null() { return None; @@ -205,7 +204,9 @@ impl ErrorInfo { /// The `dispatch_event` argument is temporary and non-standard; passing false /// prevents dispatching the `error` event. pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) { - if !JS_IsExceptionPending(cx) { return; } + if !JS_IsExceptionPending(cx) { + return; + } rooted!(in(cx) let mut value = UndefinedValue()); if !JS_GetPendingException(cx, value.handle_mut()) { @@ -219,23 +220,19 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) rooted!(in(cx) let object = value.to_object()); ErrorInfo::from_native_error(cx, object.handle()) .or_else(|| ErrorInfo::from_dom_exception(object.handle())) - .unwrap_or_else(|| { - ErrorInfo { - message: format!("uncaught exception: unknown (can't convert to string)"), - filename: String::new(), - lineno: 0, - column: 0, - } + .unwrap_or_else(|| ErrorInfo { + message: format!("uncaught exception: unknown (can't convert to string)"), + filename: String::new(), + lineno: 0, + column: 0, }) } else { match USVString::from_jsval(cx, value.handle(), ()) { - Ok(ConversionResult::Success(USVString(string))) => { - ErrorInfo { - message: format!("uncaught exception: {}", string), - filename: String::new(), - lineno: 0, - column: 0, - } + Ok(ConversionResult::Success(USVString(string))) => ErrorInfo { + message: format!("uncaught exception: {}", string), + filename: String::new(), + lineno: 0, + column: 0, }, _ => { panic!("Uncaught exception: failed to stringify primitive"); @@ -243,15 +240,13 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) } }; - error!("Error at {}:{}:{} {}", - error_info.filename, - error_info.lineno, - error_info.column, - error_info.message); + error!( + "Error at {}:{}:{} {}", + error_info.filename, error_info.lineno, error_info.column, error_info.message + ); if dispatch_event { - GlobalScope::from_context(cx) - .report_an_error(error_info, value.handle()); + GlobalScope::from_context(cx).report_an_error(error_info, value.handle()); } } @@ -259,14 +254,21 @@ pub unsafe fn report_pending_exception(cx: *mut JSContext, dispatch_event: bool) /// given DOM type. pub unsafe fn throw_invalid_this(cx: *mut JSContext, proto_id: u16) { debug_assert!(!JS_IsExceptionPending(cx)); - let error = format!("\"this\" object does not implement interface {}.", - proto_id_to_name(proto_id)); + let error = format!( + "\"this\" object does not implement interface {}.", + proto_id_to_name(proto_id) + ); throw_type_error(cx, &error); } impl Error { /// Convert this error value to a JS value, consuming it in the process. - pub unsafe fn to_jsval(self, cx: *mut JSContext, global: &GlobalScope, rval: MutableHandleValue) { + pub unsafe fn to_jsval( + self, + cx: *mut JSContext, + global: &GlobalScope, + rval: MutableHandleValue, + ) { assert!(!JS_IsExceptionPending(cx)); throw_dom_exception(cx, global, self); assert!(JS_IsExceptionPending(cx)); diff --git a/components/script/dom/bindings/htmlconstructor.rs b/components/script/dom/bindings/htmlconstructor.rs index 1b89d3f7669..7cbac28398f 100644 --- a/components/script/dom/bindings/htmlconstructor.rs +++ b/components/script/dom/bindings/htmlconstructor.rs @@ -89,7 +89,9 @@ use std::ptr; // https://html.spec.whatwg.org/multipage/#htmlconstructor pub unsafe fn html_constructor(window: &Window, call_args: &CallArgs) -> Fallible> - where T: DerivedFrom { +where + T: DerivedFrom, +{ let document = window.Document(); // Step 1 @@ -101,7 +103,11 @@ pub unsafe fn html_constructor(window: &Window, call_args: &CallArgs) -> Fall rooted!(in(window.get_cx()) let new_target = call_args.new_target().to_object()); let definition = match registry.lookup_definition_by_constructor(new_target.handle()) { Some(definition) => definition, - None => return Err(Error::Type("No custom element definition found for new.target".to_owned())), + None => { + return Err(Error::Type( + "No custom element definition found for new.target".to_owned(), + )) + }, }; rooted!(in(window.get_cx()) let callee = UnwrapObject(call_args.callee(), 1)); @@ -119,18 +125,25 @@ pub unsafe fn html_constructor(window: &Window, call_args: &CallArgs) -> Fall // Since this element is autonomous, its active function object must be the HTMLElement // Retrieve the constructor object for HTMLElement - HTMLElementBinding::GetConstructorObject(window.get_cx(), global_object.handle(), constructor.handle_mut()); - + HTMLElementBinding::GetConstructorObject( + window.get_cx(), + global_object.handle(), + constructor.handle_mut(), + ); } else { // Step 5 - get_constructor_object_from_local_name(definition.local_name.clone(), - window.get_cx(), - global_object.handle(), - constructor.handle_mut()); + get_constructor_object_from_local_name( + definition.local_name.clone(), + window.get_cx(), + global_object.handle(), + constructor.handle_mut(), + ); } // Callee must be the same as the element interface's constructor object. if constructor.get() != callee.get() { - return Err(Error::Type("Custom element does not extend the proper interface".to_owned())); + return Err(Error::Type( + "Custom element does not extend the proper interface".to_owned(), + )); } } @@ -176,11 +189,12 @@ pub unsafe fn html_constructor(window: &Window, call_args: &CallArgs) -> Fall /// Returns the constructor object for the element associated with the given local name. /// This list should only include elements marked with the [HTMLConstructor] extended attribute. -pub fn get_constructor_object_from_local_name(name: LocalName, - cx: *mut JSContext, - global: HandleObject, - rval: MutableHandleObject) - -> bool { +pub fn get_constructor_object_from_local_name( + name: LocalName, + cx: *mut JSContext, + global: HandleObject, + rval: MutableHandleObject, +) -> bool { macro_rules! get_constructor( ($binding:ident) => ({ unsafe { $binding::GetConstructorObject(cx, global, rval); } @@ -189,131 +203,131 @@ pub fn get_constructor_object_from_local_name(name: LocalName, ); match name { - local_name!("a") => get_constructor!(HTMLAnchorElementBinding), - local_name!("abbr") => get_constructor!(HTMLElementBinding), - local_name!("acronym") => get_constructor!(HTMLElementBinding), - local_name!("address") => get_constructor!(HTMLElementBinding), - local_name!("area") => get_constructor!(HTMLAreaElementBinding), - local_name!("article") => get_constructor!(HTMLElementBinding), - local_name!("aside") => get_constructor!(HTMLElementBinding), - local_name!("audio") => get_constructor!(HTMLAudioElementBinding), - local_name!("b") => get_constructor!(HTMLElementBinding), - local_name!("base") => get_constructor!(HTMLBaseElementBinding), - local_name!("bdi") => get_constructor!(HTMLElementBinding), - local_name!("bdo") => get_constructor!(HTMLElementBinding), - local_name!("big") => get_constructor!(HTMLElementBinding), + local_name!("a") => get_constructor!(HTMLAnchorElementBinding), + local_name!("abbr") => get_constructor!(HTMLElementBinding), + local_name!("acronym") => get_constructor!(HTMLElementBinding), + local_name!("address") => get_constructor!(HTMLElementBinding), + local_name!("area") => get_constructor!(HTMLAreaElementBinding), + local_name!("article") => get_constructor!(HTMLElementBinding), + local_name!("aside") => get_constructor!(HTMLElementBinding), + local_name!("audio") => get_constructor!(HTMLAudioElementBinding), + local_name!("b") => get_constructor!(HTMLElementBinding), + local_name!("base") => get_constructor!(HTMLBaseElementBinding), + local_name!("bdi") => get_constructor!(HTMLElementBinding), + local_name!("bdo") => get_constructor!(HTMLElementBinding), + local_name!("big") => get_constructor!(HTMLElementBinding), local_name!("blockquote") => get_constructor!(HTMLQuoteElementBinding), - local_name!("body") => get_constructor!(HTMLBodyElementBinding), - local_name!("br") => get_constructor!(HTMLBRElementBinding), - local_name!("button") => get_constructor!(HTMLButtonElementBinding), - local_name!("canvas") => get_constructor!(HTMLCanvasElementBinding), - local_name!("caption") => get_constructor!(HTMLTableCaptionElementBinding), - local_name!("center") => get_constructor!(HTMLElementBinding), - local_name!("cite") => get_constructor!(HTMLElementBinding), - local_name!("code") => get_constructor!(HTMLElementBinding), - local_name!("col") => get_constructor!(HTMLTableColElementBinding), - local_name!("colgroup") => get_constructor!(HTMLTableColElementBinding), - local_name!("data") => get_constructor!(HTMLDataElementBinding), - local_name!("datalist") => get_constructor!(HTMLDataListElementBinding), - local_name!("dd") => get_constructor!(HTMLElementBinding), - local_name!("del") => get_constructor!(HTMLModElementBinding), - local_name!("details") => get_constructor!(HTMLDetailsElementBinding), - local_name!("dfn") => get_constructor!(HTMLElementBinding), - local_name!("dialog") => get_constructor!(HTMLDialogElementBinding), - local_name!("dir") => get_constructor!(HTMLDirectoryElementBinding), - local_name!("div") => get_constructor!(HTMLDivElementBinding), - local_name!("dl") => get_constructor!(HTMLDListElementBinding), - local_name!("dt") => get_constructor!(HTMLElementBinding), - local_name!("em") => get_constructor!(HTMLElementBinding), - local_name!("embed") => get_constructor!(HTMLEmbedElementBinding), - local_name!("fieldset") => get_constructor!(HTMLFieldSetElementBinding), + local_name!("body") => get_constructor!(HTMLBodyElementBinding), + local_name!("br") => get_constructor!(HTMLBRElementBinding), + local_name!("button") => get_constructor!(HTMLButtonElementBinding), + local_name!("canvas") => get_constructor!(HTMLCanvasElementBinding), + local_name!("caption") => get_constructor!(HTMLTableCaptionElementBinding), + local_name!("center") => get_constructor!(HTMLElementBinding), + local_name!("cite") => get_constructor!(HTMLElementBinding), + local_name!("code") => get_constructor!(HTMLElementBinding), + local_name!("col") => get_constructor!(HTMLTableColElementBinding), + local_name!("colgroup") => get_constructor!(HTMLTableColElementBinding), + local_name!("data") => get_constructor!(HTMLDataElementBinding), + local_name!("datalist") => get_constructor!(HTMLDataListElementBinding), + local_name!("dd") => get_constructor!(HTMLElementBinding), + local_name!("del") => get_constructor!(HTMLModElementBinding), + local_name!("details") => get_constructor!(HTMLDetailsElementBinding), + local_name!("dfn") => get_constructor!(HTMLElementBinding), + local_name!("dialog") => get_constructor!(HTMLDialogElementBinding), + local_name!("dir") => get_constructor!(HTMLDirectoryElementBinding), + local_name!("div") => get_constructor!(HTMLDivElementBinding), + local_name!("dl") => get_constructor!(HTMLDListElementBinding), + local_name!("dt") => get_constructor!(HTMLElementBinding), + local_name!("em") => get_constructor!(HTMLElementBinding), + local_name!("embed") => get_constructor!(HTMLEmbedElementBinding), + local_name!("fieldset") => get_constructor!(HTMLFieldSetElementBinding), local_name!("figcaption") => get_constructor!(HTMLElementBinding), - local_name!("figure") => get_constructor!(HTMLElementBinding), - local_name!("font") => get_constructor!(HTMLFontElementBinding), - local_name!("footer") => get_constructor!(HTMLElementBinding), - local_name!("form") => get_constructor!(HTMLFormElementBinding), - local_name!("frame") => get_constructor!(HTMLFrameElementBinding), - local_name!("frameset") => get_constructor!(HTMLFrameSetElementBinding), - local_name!("h1") => get_constructor!(HTMLHeadingElementBinding), - local_name!("h2") => get_constructor!(HTMLHeadingElementBinding), - local_name!("h3") => get_constructor!(HTMLHeadingElementBinding), - local_name!("h4") => get_constructor!(HTMLHeadingElementBinding), - local_name!("h5") => get_constructor!(HTMLHeadingElementBinding), - local_name!("h6") => get_constructor!(HTMLHeadingElementBinding), - local_name!("head") => get_constructor!(HTMLHeadElementBinding), - local_name!("header") => get_constructor!(HTMLElementBinding), - local_name!("hgroup") => get_constructor!(HTMLElementBinding), - local_name!("hr") => get_constructor!(HTMLHRElementBinding), - local_name!("html") => get_constructor!(HTMLHtmlElementBinding), - local_name!("i") => get_constructor!(HTMLElementBinding), - local_name!("iframe") => get_constructor!(HTMLIFrameElementBinding), - local_name!("img") => get_constructor!(HTMLImageElementBinding), - local_name!("input") => get_constructor!(HTMLInputElementBinding), - local_name!("ins") => get_constructor!(HTMLModElementBinding), - local_name!("kbd") => get_constructor!(HTMLElementBinding), - local_name!("label") => get_constructor!(HTMLLabelElementBinding), - local_name!("legend") => get_constructor!(HTMLLegendElementBinding), - local_name!("li") => get_constructor!(HTMLLIElementBinding), - local_name!("link") => get_constructor!(HTMLLinkElementBinding), - local_name!("listing") => get_constructor!(HTMLPreElementBinding), - local_name!("main") => get_constructor!(HTMLElementBinding), - local_name!("map") => get_constructor!(HTMLMapElementBinding), - local_name!("mark") => get_constructor!(HTMLElementBinding), - local_name!("marquee") => get_constructor!(HTMLElementBinding), - local_name!("meta") => get_constructor!(HTMLMetaElementBinding), - local_name!("meter") => get_constructor!(HTMLMeterElementBinding), - local_name!("nav") => get_constructor!(HTMLElementBinding), - local_name!("nobr") => get_constructor!(HTMLElementBinding), - local_name!("noframes") => get_constructor!(HTMLElementBinding), - local_name!("noscript") => get_constructor!(HTMLElementBinding), - local_name!("object") => get_constructor!(HTMLObjectElementBinding), - local_name!("ol") => get_constructor!(HTMLOListElementBinding), - local_name!("optgroup") => get_constructor!(HTMLOptGroupElementBinding), - local_name!("option") => get_constructor!(HTMLOptionElementBinding), - local_name!("output") => get_constructor!(HTMLOutputElementBinding), - local_name!("p") => get_constructor!(HTMLParagraphElementBinding), - local_name!("param") => get_constructor!(HTMLParamElementBinding), - local_name!("plaintext") => get_constructor!(HTMLPreElementBinding), - local_name!("pre") => get_constructor!(HTMLPreElementBinding), - local_name!("progress") => get_constructor!(HTMLProgressElementBinding), - local_name!("q") => get_constructor!(HTMLQuoteElementBinding), - local_name!("rp") => get_constructor!(HTMLElementBinding), - local_name!("rt") => get_constructor!(HTMLElementBinding), - local_name!("ruby") => get_constructor!(HTMLElementBinding), - local_name!("s") => get_constructor!(HTMLElementBinding), - local_name!("samp") => get_constructor!(HTMLElementBinding), - local_name!("script") => get_constructor!(HTMLScriptElementBinding), - local_name!("section") => get_constructor!(HTMLElementBinding), - local_name!("select") => get_constructor!(HTMLSelectElementBinding), - local_name!("small") => get_constructor!(HTMLElementBinding), - local_name!("source") => get_constructor!(HTMLSourceElementBinding), - local_name!("span") => get_constructor!(HTMLSpanElementBinding), - local_name!("strike") => get_constructor!(HTMLElementBinding), - local_name!("strong") => get_constructor!(HTMLElementBinding), - local_name!("style") => get_constructor!(HTMLStyleElementBinding), - local_name!("sub") => get_constructor!(HTMLElementBinding), - local_name!("summary") => get_constructor!(HTMLElementBinding), - local_name!("sup") => get_constructor!(HTMLElementBinding), - local_name!("table") => get_constructor!(HTMLTableElementBinding), - local_name!("tbody") => get_constructor!(HTMLTableSectionElementBinding), - local_name!("td") => get_constructor!(HTMLTableDataCellElementBinding), - local_name!("template") => get_constructor!(HTMLTemplateElementBinding), - local_name!("textarea") => get_constructor!(HTMLTextAreaElementBinding), - local_name!("tfoot") => get_constructor!(HTMLTableSectionElementBinding), - local_name!("th") => get_constructor!(HTMLTableHeaderCellElementBinding), - local_name!("thead") => get_constructor!(HTMLTableSectionElementBinding), - local_name!("time") => get_constructor!(HTMLTimeElementBinding), - local_name!("title") => get_constructor!(HTMLTitleElementBinding), - local_name!("tr") => get_constructor!(HTMLTableRowElementBinding), - local_name!("tt") => get_constructor!(HTMLElementBinding), - local_name!("track") => get_constructor!(HTMLTrackElementBinding), - local_name!("u") => get_constructor!(HTMLElementBinding), - local_name!("ul") => get_constructor!(HTMLUListElementBinding), - local_name!("var") => get_constructor!(HTMLElementBinding), - local_name!("video") => get_constructor!(HTMLVideoElementBinding), - local_name!("wbr") => get_constructor!(HTMLElementBinding), - local_name!("xmp") => get_constructor!(HTMLPreElementBinding), - _ => false, + local_name!("figure") => get_constructor!(HTMLElementBinding), + local_name!("font") => get_constructor!(HTMLFontElementBinding), + local_name!("footer") => get_constructor!(HTMLElementBinding), + local_name!("form") => get_constructor!(HTMLFormElementBinding), + local_name!("frame") => get_constructor!(HTMLFrameElementBinding), + local_name!("frameset") => get_constructor!(HTMLFrameSetElementBinding), + local_name!("h1") => get_constructor!(HTMLHeadingElementBinding), + local_name!("h2") => get_constructor!(HTMLHeadingElementBinding), + local_name!("h3") => get_constructor!(HTMLHeadingElementBinding), + local_name!("h4") => get_constructor!(HTMLHeadingElementBinding), + local_name!("h5") => get_constructor!(HTMLHeadingElementBinding), + local_name!("h6") => get_constructor!(HTMLHeadingElementBinding), + local_name!("head") => get_constructor!(HTMLHeadElementBinding), + local_name!("header") => get_constructor!(HTMLElementBinding), + local_name!("hgroup") => get_constructor!(HTMLElementBinding), + local_name!("hr") => get_constructor!(HTMLHRElementBinding), + local_name!("html") => get_constructor!(HTMLHtmlElementBinding), + local_name!("i") => get_constructor!(HTMLElementBinding), + local_name!("iframe") => get_constructor!(HTMLIFrameElementBinding), + local_name!("img") => get_constructor!(HTMLImageElementBinding), + local_name!("input") => get_constructor!(HTMLInputElementBinding), + local_name!("ins") => get_constructor!(HTMLModElementBinding), + local_name!("kbd") => get_constructor!(HTMLElementBinding), + local_name!("label") => get_constructor!(HTMLLabelElementBinding), + local_name!("legend") => get_constructor!(HTMLLegendElementBinding), + local_name!("li") => get_constructor!(HTMLLIElementBinding), + local_name!("link") => get_constructor!(HTMLLinkElementBinding), + local_name!("listing") => get_constructor!(HTMLPreElementBinding), + local_name!("main") => get_constructor!(HTMLElementBinding), + local_name!("map") => get_constructor!(HTMLMapElementBinding), + local_name!("mark") => get_constructor!(HTMLElementBinding), + local_name!("marquee") => get_constructor!(HTMLElementBinding), + local_name!("meta") => get_constructor!(HTMLMetaElementBinding), + local_name!("meter") => get_constructor!(HTMLMeterElementBinding), + local_name!("nav") => get_constructor!(HTMLElementBinding), + local_name!("nobr") => get_constructor!(HTMLElementBinding), + local_name!("noframes") => get_constructor!(HTMLElementBinding), + local_name!("noscript") => get_constructor!(HTMLElementBinding), + local_name!("object") => get_constructor!(HTMLObjectElementBinding), + local_name!("ol") => get_constructor!(HTMLOListElementBinding), + local_name!("optgroup") => get_constructor!(HTMLOptGroupElementBinding), + local_name!("option") => get_constructor!(HTMLOptionElementBinding), + local_name!("output") => get_constructor!(HTMLOutputElementBinding), + local_name!("p") => get_constructor!(HTMLParagraphElementBinding), + local_name!("param") => get_constructor!(HTMLParamElementBinding), + local_name!("plaintext") => get_constructor!(HTMLPreElementBinding), + local_name!("pre") => get_constructor!(HTMLPreElementBinding), + local_name!("progress") => get_constructor!(HTMLProgressElementBinding), + local_name!("q") => get_constructor!(HTMLQuoteElementBinding), + local_name!("rp") => get_constructor!(HTMLElementBinding), + local_name!("rt") => get_constructor!(HTMLElementBinding), + local_name!("ruby") => get_constructor!(HTMLElementBinding), + local_name!("s") => get_constructor!(HTMLElementBinding), + local_name!("samp") => get_constructor!(HTMLElementBinding), + local_name!("script") => get_constructor!(HTMLScriptElementBinding), + local_name!("section") => get_constructor!(HTMLElementBinding), + local_name!("select") => get_constructor!(HTMLSelectElementBinding), + local_name!("small") => get_constructor!(HTMLElementBinding), + local_name!("source") => get_constructor!(HTMLSourceElementBinding), + local_name!("span") => get_constructor!(HTMLSpanElementBinding), + local_name!("strike") => get_constructor!(HTMLElementBinding), + local_name!("strong") => get_constructor!(HTMLElementBinding), + local_name!("style") => get_constructor!(HTMLStyleElementBinding), + local_name!("sub") => get_constructor!(HTMLElementBinding), + local_name!("summary") => get_constructor!(HTMLElementBinding), + local_name!("sup") => get_constructor!(HTMLElementBinding), + local_name!("table") => get_constructor!(HTMLTableElementBinding), + local_name!("tbody") => get_constructor!(HTMLTableSectionElementBinding), + local_name!("td") => get_constructor!(HTMLTableDataCellElementBinding), + local_name!("template") => get_constructor!(HTMLTemplateElementBinding), + local_name!("textarea") => get_constructor!(HTMLTextAreaElementBinding), + local_name!("tfoot") => get_constructor!(HTMLTableSectionElementBinding), + local_name!("th") => get_constructor!(HTMLTableHeaderCellElementBinding), + local_name!("thead") => get_constructor!(HTMLTableSectionElementBinding), + local_name!("time") => get_constructor!(HTMLTimeElementBinding), + local_name!("title") => get_constructor!(HTMLTitleElementBinding), + local_name!("tr") => get_constructor!(HTMLTableRowElementBinding), + local_name!("tt") => get_constructor!(HTMLElementBinding), + local_name!("track") => get_constructor!(HTMLTrackElementBinding), + local_name!("u") => get_constructor!(HTMLElementBinding), + local_name!("ul") => get_constructor!(HTMLUListElementBinding), + local_name!("var") => get_constructor!(HTMLElementBinding), + local_name!("video") => get_constructor!(HTMLVideoElementBinding), + local_name!("wbr") => get_constructor!(HTMLElementBinding), + local_name!("xmp") => get_constructor!(HTMLPreElementBinding), + _ => false, } } diff --git a/components/script/dom/bindings/inheritance.rs b/components/script/dom/bindings/inheritance.rs index c017a806b6e..eaf394e594d 100644 --- a/components/script/dom/bindings/inheritance.rs +++ b/components/script/dom/bindings/inheritance.rs @@ -16,7 +16,8 @@ use std::mem; pub trait Castable: IDLInterface + DomObject + Sized { /// Check whether a DOM object implements one of its deriving interfaces. fn is(&self) -> bool - where T: DerivedFrom + where + T: DerivedFrom, { let class = unsafe { get_dom_class(self.reflector().get_jsobject().get()).unwrap() }; T::derives(class) @@ -24,15 +25,17 @@ pub trait Castable: IDLInterface + DomObject + Sized { /// Cast a DOM object upwards to one of the interfaces it derives from. fn upcast(&self) -> &T - where T: Castable, - Self: DerivedFrom + where + T: Castable, + Self: DerivedFrom, { unsafe { mem::transmute(self) } } /// Cast a DOM object downwards to one of the interfaces it might implement. fn downcast(&self) -> Option<&T> - where T: DerivedFrom + where + T: DerivedFrom, { if self.is::() { Some(unsafe { mem::transmute(self) }) diff --git a/components/script/dom/bindings/interface.rs b/components/script/dom/bindings/interface.rs index 60fb712b831..210e9ae5576 100644 --- a/components/script/dom/bindings/interface.rs +++ b/components/script/dom/bindings/interface.rs @@ -52,11 +52,12 @@ unsafe impl Sync for NonCallbackInterfaceObjectClass {} impl NonCallbackInterfaceObjectClass { /// Create a new `NonCallbackInterfaceObjectClass` structure. - pub const fn new(constructor_behavior: &'static InterfaceConstructorBehavior, - string_rep: &'static [u8], - proto_id: PrototypeList::ID, - proto_depth: u16) - -> NonCallbackInterfaceObjectClass { + pub const fn new( + constructor_behavior: &'static InterfaceConstructorBehavior, + string_rep: &'static [u8], + proto_id: PrototypeList::ID, + proto_depth: u16, + ) -> NonCallbackInterfaceObjectClass { NonCallbackInterfaceObjectClass { class: Class { name: b"Function\0" as *const _ as *const libc::c_char, @@ -74,9 +75,7 @@ impl NonCallbackInterfaceObjectClass { /// cast own reference to `JSClass` reference pub fn as_jsclass(&self) -> &JSClass { - unsafe { - &*(self as *const _ as *const JSClass) - } + unsafe { &*(self as *const _ as *const JSClass) } } } @@ -124,27 +123,29 @@ impl InterfaceConstructorBehavior { } /// A trace hook. -pub type TraceHook = - unsafe extern "C" fn(trc: *mut JSTracer, obj: *mut JSObject); +pub type TraceHook = unsafe extern "C" fn(trc: *mut JSTracer, obj: *mut JSObject); /// Create a global object with the given class. pub unsafe fn create_global_object( - cx: *mut JSContext, - class: &'static JSClass, - private: *const libc::c_void, - trace: TraceHook, - mut rval: MutableHandleObject) { + cx: *mut JSContext, + class: &'static JSClass, + private: *const libc::c_void, + trace: TraceHook, + mut rval: MutableHandleObject, +) { assert!(rval.is_null()); let mut options = CompartmentOptions::default(); options.creationOptions_.traceGlobal_ = Some(trace); options.creationOptions_.sharedMemoryAndAtomics_ = true; - rval.set(JS_NewGlobalObject(cx, - class, - ptr::null_mut(), - OnNewGlobalHookOption::DontFireOnNewGlobalHook, - &options)); + rval.set(JS_NewGlobalObject( + cx, + class, + ptr::null_mut(), + OnNewGlobalHookOption::DontFireOnNewGlobalHook, + &options, + )); assert!(!rval.is_null()); // Initialize the reserved slots before doing anything that can GC, to @@ -162,11 +163,12 @@ pub unsafe fn create_global_object( /// Create and define the interface object of a callback interface. pub unsafe fn create_callback_interface_object( - cx: *mut JSContext, - global: HandleObject, - constants: &[Guard<&[ConstantSpec]>], - name: &[u8], - mut rval: MutableHandleObject) { + cx: *mut JSContext, + global: HandleObject, + constants: &[Guard<&[ConstantSpec]>], + name: &[u8], + mut rval: MutableHandleObject, +) { assert!(!constants.is_empty()); rval.set(JS_NewObject(cx, ptr::null())); assert!(!rval.is_null()); @@ -177,15 +179,24 @@ pub unsafe fn create_callback_interface_object( /// Create the interface prototype object of a non-callback interface. pub unsafe fn create_interface_prototype_object( - cx: *mut JSContext, - proto: HandleObject, - class: &'static JSClass, - regular_methods: &[Guard<&'static [JSFunctionSpec]>], - regular_properties: &[Guard<&'static [JSPropertySpec]>], - constants: &[Guard<&[ConstantSpec]>], - unscopable_names: &[&[u8]], - rval: MutableHandleObject) { - create_object(cx, proto, class, regular_methods, regular_properties, constants, rval); + cx: *mut JSContext, + proto: HandleObject, + class: &'static JSClass, + regular_methods: &[Guard<&'static [JSFunctionSpec]>], + regular_properties: &[Guard<&'static [JSPropertySpec]>], + constants: &[Guard<&[ConstantSpec]>], + unscopable_names: &[&[u8]], + rval: MutableHandleObject, +) { + create_object( + cx, + proto, + class, + regular_methods, + regular_properties, + constants, + rval, + ); if !unscopable_names.is_empty() { rooted!(in(cx) let mut unscopable_obj = ptr::null_mut::()); @@ -196,32 +207,43 @@ pub unsafe fn create_interface_prototype_object( rooted!(in(cx) let unscopable_id = RUST_SYMBOL_TO_JSID(unscopable_symbol)); assert!(JS_DefinePropertyById4( - cx, rval.handle(), unscopable_id.handle(), unscopable_obj.handle(), - JSPROP_READONLY as u32)) + cx, + rval.handle(), + unscopable_id.handle(), + unscopable_obj.handle(), + JSPROP_READONLY as u32 + )) } } /// Create and define the interface object of a non-callback interface. pub unsafe fn create_noncallback_interface_object( - cx: *mut JSContext, - global: HandleObject, - proto: HandleObject, - class: &'static NonCallbackInterfaceObjectClass, - static_methods: &[Guard<&'static [JSFunctionSpec]>], - static_properties: &[Guard<&'static [JSPropertySpec]>], - constants: &[Guard<&[ConstantSpec]>], - interface_prototype_object: HandleObject, - name: &[u8], - length: u32, - rval: MutableHandleObject) { - create_object(cx, - proto, - class.as_jsclass(), - static_methods, - static_properties, - constants, - rval); - assert!(JS_LinkConstructorAndPrototype(cx, rval.handle(), interface_prototype_object)); + cx: *mut JSContext, + global: HandleObject, + proto: HandleObject, + class: &'static NonCallbackInterfaceObjectClass, + static_methods: &[Guard<&'static [JSFunctionSpec]>], + static_properties: &[Guard<&'static [JSPropertySpec]>], + constants: &[Guard<&[ConstantSpec]>], + interface_prototype_object: HandleObject, + name: &[u8], + length: u32, + rval: MutableHandleObject, +) { + create_object( + cx, + proto, + class.as_jsclass(), + static_methods, + static_properties, + constants, + rval, + ); + assert!(JS_LinkConstructorAndPrototype( + cx, + rval.handle(), + interface_prototype_object + )); define_name(cx, rval.handle(), name); define_length(cx, rval.handle(), i32::try_from(length).expect("overflow")); define_on_global_object(cx, global, name, rval.handle()); @@ -229,29 +251,34 @@ pub unsafe fn create_noncallback_interface_object( /// Create and define the named constructors of a non-callback interface. pub unsafe fn create_named_constructors( - cx: *mut JSContext, - global: HandleObject, - named_constructors: &[(ConstructorClassHook, &[u8], u32)], - interface_prototype_object: HandleObject) { + cx: *mut JSContext, + global: HandleObject, + named_constructors: &[(ConstructorClassHook, &[u8], u32)], + interface_prototype_object: HandleObject, +) { rooted!(in(cx) let mut constructor = ptr::null_mut::()); for &(native, name, arity) in named_constructors { assert_eq!(*name.last().unwrap(), b'\0'); - let fun = JS_NewFunction(cx, - Some(native), - arity, - JSFUN_CONSTRUCTOR, - name.as_ptr() as *const libc::c_char); + let fun = JS_NewFunction( + cx, + Some(native), + arity, + JSFUN_CONSTRUCTOR, + name.as_ptr() as *const libc::c_char, + ); assert!(!fun.is_null()); constructor.set(JS_GetFunctionObject(fun)); assert!(!constructor.is_null()); - assert!(JS_DefineProperty2(cx, - constructor.handle(), - b"prototype\0".as_ptr() as *const libc::c_char, - interface_prototype_object, - (JSPROP_PERMANENT | JSPROP_READONLY) as u32)); + assert!(JS_DefineProperty2( + cx, + constructor.handle(), + b"prototype\0".as_ptr() as *const libc::c_char, + interface_prototype_object, + (JSPROP_PERMANENT | JSPROP_READONLY) as u32 + )); define_on_global_object(cx, global, name, constructor.handle()); } @@ -259,13 +286,14 @@ pub unsafe fn create_named_constructors( /// Create a new object with a unique type. pub unsafe fn create_object( - cx: *mut JSContext, - proto: HandleObject, - class: &'static JSClass, - methods: &[Guard<&'static [JSFunctionSpec]>], - properties: &[Guard<&'static [JSPropertySpec]>], - constants: &[Guard<&[ConstantSpec]>], - mut rval: MutableHandleObject) { + cx: *mut JSContext, + proto: HandleObject, + class: &'static JSClass, + methods: &[Guard<&'static [JSFunctionSpec]>], + properties: &[Guard<&'static [JSPropertySpec]>], + constants: &[Guard<&[ConstantSpec]>], + mut rval: MutableHandleObject, +) { rval.set(JS_NewObjectWithUniqueType(cx, class, proto)); assert!(!rval.is_null()); define_guarded_methods(cx, rval.handle(), methods); @@ -275,9 +303,10 @@ pub unsafe fn create_object( /// Conditionally define constants on an object. pub unsafe fn define_guarded_constants( - cx: *mut JSContext, - obj: HandleObject, - constants: &[Guard<&[ConstantSpec]>]) { + cx: *mut JSContext, + obj: HandleObject, + constants: &[Guard<&[ConstantSpec]>], +) { for guard in constants { if let Some(specs) = guard.expose(cx, obj) { define_constants(cx, obj, specs); @@ -287,9 +316,10 @@ pub unsafe fn define_guarded_constants( /// Conditionally define methods on an object. pub unsafe fn define_guarded_methods( - cx: *mut JSContext, - obj: HandleObject, - methods: &[Guard<&'static [JSFunctionSpec]>]) { + cx: *mut JSContext, + obj: HandleObject, + methods: &[Guard<&'static [JSFunctionSpec]>], +) { for guard in methods { if let Some(specs) = guard.expose(cx, obj) { define_methods(cx, obj, specs).unwrap(); @@ -299,9 +329,10 @@ pub unsafe fn define_guarded_methods( /// Conditionally define properties on an object. pub unsafe fn define_guarded_properties( - cx: *mut JSContext, - obj: HandleObject, - properties: &[Guard<&'static [JSPropertySpec]>]) { + cx: *mut JSContext, + obj: HandleObject, + properties: &[Guard<&'static [JSPropertySpec]>], +) { for guard in properties { if let Some(specs) = guard.expose(cx, obj) { define_properties(cx, obj, specs).unwrap(); @@ -320,16 +351,19 @@ pub unsafe fn is_exposed_in(object: HandleObject, globals: Globals) -> bool { /// Define a property with a given name on the global object. Should be called /// through the resolve hook. pub unsafe fn define_on_global_object( - cx: *mut JSContext, - global: HandleObject, - name: &[u8], - obj: HandleObject) { + cx: *mut JSContext, + global: HandleObject, + name: &[u8], + obj: HandleObject, +) { assert_eq!(*name.last().unwrap(), b'\0'); - assert!(JS_DefineProperty2(cx, - global, - name.as_ptr() as *const libc::c_char, - obj, - JSPROP_RESOLVING)); + assert!(JS_DefineProperty2( + cx, + global, + name.as_ptr() as *const libc::c_char, + obj, + JSPROP_RESOLVING + )); } const OBJECT_OPS: ObjectOps = ObjectOps { @@ -344,10 +378,11 @@ const OBJECT_OPS: ObjectOps = ObjectOps { funToString: Some(fun_to_string_hook), }; -unsafe extern "C" fn fun_to_string_hook(cx: *mut JSContext, - obj: RawHandleObject, - _is_to_source: bool) - -> *mut JSString { +unsafe extern "C" fn fun_to_string_hook( + cx: *mut JSContext, + obj: RawHandleObject, + _is_to_source: bool, +) -> *mut JSString { let js_class = get_object_class(obj.get()); assert!(!js_class.is_null()); let repr = (*(js_class as *const NonCallbackInterfaceObjectClass)).representation; @@ -358,17 +393,19 @@ unsafe extern "C" fn fun_to_string_hook(cx: *mut JSContext, } /// Hook for instanceof on interface objects. -unsafe extern "C" fn has_instance_hook(cx: *mut JSContext, - obj: RawHandleObject, - value: RawMutableHandleValue, - rval: *mut bool) -> bool { +unsafe extern "C" fn has_instance_hook( + cx: *mut JSContext, + obj: RawHandleObject, + value: RawMutableHandleValue, + rval: *mut bool, +) -> bool { let obj_raw = HandleObject::from_raw(obj); let val_raw = HandleValue::from_raw(value.handle()); match has_instance(cx, obj_raw, val_raw) { Ok(result) => { *rval = result; true - } + }, Err(()) => false, } } @@ -376,10 +413,10 @@ unsafe extern "C" fn has_instance_hook(cx: *mut JSContext, /// Return whether a value is an instance of a given prototype. /// unsafe fn has_instance( - cx: *mut JSContext, - interface_object: HandleObject, - value: HandleValue) - -> Result { + cx: *mut JSContext, + interface_object: HandleObject, + value: HandleValue, +) -> Result { if !value.is_object() { // Step 1. return Ok(false); @@ -391,8 +428,10 @@ unsafe fn has_instance( let js_class = get_object_class(interface_object.get()); let object_class = &*(js_class as *const NonCallbackInterfaceObjectClass); - if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject(value.get(), - /* stopAtWindowProxy = */ 0)) { + if let Ok(dom_class) = get_dom_class(UncheckedUnwrapObject( + value.get(), + /* stopAtWindowProxy = */ 0, + )) { if dom_class.interface_chain[object_class.proto_depth as usize] == object_class.proto_id { // Step 4. return Ok(true); @@ -422,9 +461,10 @@ unsafe fn has_instance( } unsafe fn create_unscopable_object( - cx: *mut JSContext, - names: &[&[u8]], - mut rval: MutableHandleObject) { + cx: *mut JSContext, + names: &[&[u8]], + mut rval: MutableHandleObject, +) { assert!(!names.is_empty()); assert!(rval.is_null()); rval.set(JS_NewPlainObject(cx)); @@ -445,35 +485,39 @@ unsafe fn define_name(cx: *mut JSContext, obj: HandleObject, name: &[u8]) { assert_eq!(*name.last().unwrap(), b'\0'); rooted!(in(cx) let name = JS_AtomizeAndPinString(cx, name.as_ptr() as *const libc::c_char)); assert!(!name.is_null()); - assert!(JS_DefineProperty3(cx, - obj, - b"name\0".as_ptr() as *const libc::c_char, - name.handle().into(), - JSPROP_READONLY as u32)); + assert!(JS_DefineProperty3( + cx, + obj, + b"name\0".as_ptr() as *const libc::c_char, + name.handle().into(), + JSPROP_READONLY as u32 + )); } unsafe fn define_length(cx: *mut JSContext, obj: HandleObject, length: i32) { - assert!(JS_DefineProperty4(cx, - obj, - b"length\0".as_ptr() as *const libc::c_char, - length, - JSPROP_READONLY as u32)); + assert!(JS_DefineProperty4( + cx, + obj, + b"length\0".as_ptr() as *const libc::c_char, + length, + JSPROP_READONLY as u32 + )); } unsafe extern "C" fn invalid_constructor( - cx: *mut JSContext, - _argc: libc::c_uint, - _vp: *mut JSVal) - -> bool { + cx: *mut JSContext, + _argc: libc::c_uint, + _vp: *mut JSVal, +) -> bool { throw_type_error(cx, "Illegal constructor."); false } unsafe extern "C" fn non_new_constructor( - cx: *mut JSContext, - _argc: libc::c_uint, - _vp: *mut JSVal) - -> bool { + cx: *mut JSContext, + _argc: libc::c_uint, + _vp: *mut JSVal, +) -> bool { throw_type_error(cx, "This constructor needs to be called with `new`."); false } diff --git a/components/script/dom/bindings/iterable.rs b/components/script/dom/bindings/iterable.rs index 87ee05541fa..488714d3d0b 100644 --- a/components/script/dom/bindings/iterable.rs +++ b/components/script/dom/bindings/iterable.rs @@ -59,10 +59,11 @@ pub struct IterableIterator { impl IterableIterator { /// Create a new iterator instance for the provided iterable DOM interface. - pub fn new(iterable: &T, - type_: IteratorType, - wrap: unsafe fn(*mut JSContext, &GlobalScope, Box>) - -> DomRoot) -> DomRoot { + pub fn new( + iterable: &T, + type_: IteratorType, + wrap: unsafe fn(*mut JSContext, &GlobalScope, Box>) -> DomRoot, + ) -> DomRoot { let iterator = Box::new(IterableIterator { reflector: Reflector::new(), type_: type_, @@ -84,37 +85,45 @@ impl IterableIterator { match self.type_ { IteratorType::Keys => { unsafe { - self.iterable.get_key_at_index(index).to_jsval(cx, value.handle_mut()); + self.iterable + .get_key_at_index(index) + .to_jsval(cx, value.handle_mut()); } dict_return(cx, rval.handle_mut(), false, value.handle()) - } + }, IteratorType::Values => { unsafe { - self.iterable.get_value_at_index(index).to_jsval(cx, value.handle_mut()); + self.iterable + .get_value_at_index(index) + .to_jsval(cx, value.handle_mut()); } dict_return(cx, rval.handle_mut(), false, value.handle()) - } + }, IteratorType::Entries => { rooted!(in(cx) let mut key = UndefinedValue()); unsafe { - self.iterable.get_key_at_index(index).to_jsval(cx, key.handle_mut()); - self.iterable.get_value_at_index(index).to_jsval(cx, value.handle_mut()); + self.iterable + .get_key_at_index(index) + .to_jsval(cx, key.handle_mut()); + self.iterable + .get_value_at_index(index) + .to_jsval(cx, value.handle_mut()); } key_and_value_return(cx, rval.handle_mut(), key.handle(), value.handle()) - } + }, } }; self.index.set(index + 1); - result.map(|_| { - NonNull::new(rval.get()).expect("got a null pointer") - }) + result.map(|_| NonNull::new(rval.get()).expect("got a null pointer")) } } -fn dict_return(cx: *mut JSContext, - mut result: MutableHandleObject, - done: bool, - value: HandleValue) -> Fallible<()> { +fn dict_return( + cx: *mut JSContext, + mut result: MutableHandleObject, + done: bool, + value: HandleValue, +) -> Fallible<()> { let mut dict = IterableKeyOrValueResult::empty(); dict.done = done; dict.value.set(value.get()); @@ -126,16 +135,20 @@ fn dict_return(cx: *mut JSContext, Ok(()) } -fn key_and_value_return(cx: *mut JSContext, - mut result: MutableHandleObject, - key: HandleValue, - value: HandleValue) -> Fallible<()> { +fn key_and_value_return( + cx: *mut JSContext, + mut result: MutableHandleObject, + key: HandleValue, + value: HandleValue, +) -> Fallible<()> { let mut dict = IterableKeyAndValueResult::empty(); dict.done = false; - dict.value = Some(vec![key, value] - .into_iter() - .map(|handle| RootedTraceableBox::from_box(Heap::boxed(handle.get()))) - .collect()); + dict.value = Some( + vec![key, value] + .into_iter() + .map(|handle| RootedTraceableBox::from_box(Heap::boxed(handle.get()))) + .collect(), + ); rooted!(in(cx) let mut dict_value = UndefinedValue()); unsafe { dict.to_jsval(cx, dict_value.handle_mut()); diff --git a/components/script/dom/bindings/mozmap.rs b/components/script/dom/bindings/mozmap.rs index 2dfacbb2996..68ea9fa382d 100644 --- a/components/script/dom/bindings/mozmap.rs +++ b/components/script/dom/bindings/mozmap.rs @@ -49,24 +49,37 @@ impl Deref for MozMap { } impl FromJSValConvertible for MozMap - where T: FromJSValConvertible, - C: Clone, +where + T: FromJSValConvertible, + C: Clone, { type Config = C; - unsafe fn from_jsval(cx: *mut JSContext, value: HandleValue, config: C) - -> Result, ()> { + unsafe fn from_jsval( + cx: *mut JSContext, + value: HandleValue, + config: C, + ) -> Result, ()> { if !value.is_object() { - return Ok(ConversionResult::Failure("MozMap value was not an object".into())); + return Ok(ConversionResult::Failure( + "MozMap value was not an object".into(), + )); } rooted!(in(cx) let object = value.to_object()); let ids = IdVector::new(cx); - if !GetPropertyKeys(cx, object.handle(), JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, ids.get()) { + if !GetPropertyKeys( + cx, + object.handle(), + JSITER_OWNONLY | JSITER_HIDDEN | JSITER_SYMBOLS, + ids.get(), + ) { // TODO: can GetPropertyKeys fail? // (it does so if the object has duplicate keys) // https://github.com/servo/servo/issues/21462 report_pending_exception(cx, false); - return Ok(ConversionResult::Failure("Getting MozMap value property keys failed".into())); + return Ok(ConversionResult::Failure( + "Getting MozMap value property keys failed".into(), + )); } let mut map = HashMap::new(); @@ -90,9 +103,7 @@ impl FromJSValConvertible for MozMap } } - Ok(ConversionResult::Success(MozMap { - map: map, - })) + Ok(ConversionResult::Success(MozMap { map: map })) } } @@ -107,12 +118,14 @@ impl ToJSValConvertible for MozMap { let key = key.encode_utf16().collect::>(); value.to_jsval(cx, js_value.handle_mut()); - assert!(JS_DefineUCProperty2(cx, - js_object.handle(), - key.as_ptr(), - key.len(), - js_value.handle(), - JSPROP_ENUMERATE as u32)); + assert!(JS_DefineUCProperty2( + cx, + js_object.handle(), + key.as_ptr(), + key.len(), + js_value.handle(), + JSPROP_ENUMERATE as u32 + )); } rval.set(ObjectValue(js_object.handle().get())); diff --git a/components/script/dom/bindings/namespace.rs b/components/script/dom/bindings/namespace.rs index 69b82f0d0ba..64b67b33e1e 100644 --- a/components/script/dom/bindings/namespace.rs +++ b/components/script/dom/bindings/namespace.rs @@ -30,13 +30,14 @@ impl NamespaceObjectClass { /// Create a new namespace object. pub unsafe fn create_namespace_object( - cx: *mut JSContext, - global: HandleObject, - proto: HandleObject, - class: &'static NamespaceObjectClass, - methods: &[Guard<&'static [JSFunctionSpec]>], - name: &[u8], - rval: MutableHandleObject) { + cx: *mut JSContext, + global: HandleObject, + proto: HandleObject, + class: &'static NamespaceObjectClass, + methods: &[Guard<&'static [JSFunctionSpec]>], + name: &[u8], + rval: MutableHandleObject, +) { create_object(cx, proto, &class.0, methods, &[], &[], rval); define_on_global_object(cx, global, name, rval.handle()); } diff --git a/components/script/dom/bindings/num.rs b/components/script/dom/bindings/num.rs index 79480574f4d..da880f559ee 100644 --- a/components/script/dom/bindings/num.rs +++ b/components/script/dom/bindings/num.rs @@ -26,8 +26,10 @@ impl Finite { /// Create a new `Finite`. #[inline] pub fn wrap(value: T) -> Finite { - assert!(value.is_finite(), - "Finite doesn't encapsulate unrestricted value."); + assert!( + value.is_finite(), + "Finite doesn't encapsulate unrestricted value." + ); Finite(value) } } diff --git a/components/script/dom/bindings/proxyhandler.rs b/components/script/dom/bindings/proxyhandler.rs index 2a512b02df3..86b7d81667c 100644 --- a/components/script/dom/bindings/proxyhandler.rs +++ b/components/script/dom/bindings/proxyhandler.rs @@ -30,12 +30,12 @@ use js::rust::wrappers::JS_AlreadyHasOwnPropertyById; use js::rust::wrappers::JS_NewObjectWithGivenProto; use std::ptr; - /// Determine if this id shadows any existing properties for this proxy. -pub unsafe extern "C" fn shadow_check_callback(cx: *mut JSContext, - object: RawHandleObject, - id: RawHandleId) - -> DOMProxyShadowsResult { +pub unsafe extern "C" fn shadow_check_callback( + cx: *mut JSContext, + object: RawHandleObject, + id: RawHandleId, +) -> DOMProxyShadowsResult { // TODO: support OverrideBuiltins when #12978 is fixed. rooted!(in(cx) let mut expando = ptr::null_mut::()); @@ -59,19 +59,19 @@ pub unsafe extern "C" fn shadow_check_callback(cx: *mut JSContext, /// Initialize the infrastructure for DOM proxy objects. pub unsafe fn init() { - SetDOMProxyInformation(GetProxyHandlerFamily(), - Some(shadow_check_callback)); + SetDOMProxyInformation(GetProxyHandlerFamily(), Some(shadow_check_callback)); } /// Invoke the [[GetOwnProperty]] trap (`getOwnPropertyDescriptor`) on `proxy`, /// with argument `id` and return the result, if it is not `undefined`. /// Otherwise, walk along the prototype chain to find a property with that /// name. -pub unsafe extern "C" fn get_property_descriptor(cx: *mut JSContext, - proxy: RawHandleObject, - id: RawHandleId, - desc: RawMutableHandle) - -> bool { +pub unsafe extern "C" fn get_property_descriptor( + cx: *mut JSContext, + proxy: RawHandleObject, + id: RawHandleId, + desc: RawMutableHandle, +) -> bool { let handler = GetProxyHandler(proxy.get()); if !InvokeGetOwnPropertyDescriptor(handler, cx, proxy, id, desc) { return false; @@ -91,23 +91,25 @@ pub unsafe extern "C" fn get_property_descriptor(cx: *mut JSContext, } /// Defines an expando on the given `proxy`. -pub unsafe extern "C" fn define_property(cx: *mut JSContext, - proxy: RawHandleObject, - id: RawHandleId, - desc: RawHandle, - result: *mut ObjectOpResult) - -> bool { +pub unsafe extern "C" fn define_property( + cx: *mut JSContext, + proxy: RawHandleObject, + id: RawHandleId, + desc: RawHandle, + result: *mut ObjectOpResult, +) -> bool { rooted!(in(cx) let mut expando = ptr::null_mut::()); ensure_expando_object(cx, proxy, expando.handle_mut()); JS_DefinePropertyById(cx, expando.handle().into(), id, desc, result) } /// Deletes an expando off the given `proxy`. -pub unsafe extern "C" fn delete(cx: *mut JSContext, - proxy: RawHandleObject, - id: RawHandleId, - bp: *mut ObjectOpResult) - -> bool { +pub unsafe extern "C" fn delete( + cx: *mut JSContext, + proxy: RawHandleObject, + id: RawHandleId, + bp: *mut ObjectOpResult, +) -> bool { rooted!(in(cx) let mut expando = ptr::null_mut::()); get_expando_object(proxy, expando.handle_mut()); if expando.is_null() { @@ -119,19 +121,21 @@ pub unsafe extern "C" fn delete(cx: *mut JSContext, } /// Controls whether the Extensible bit can be changed -pub unsafe extern "C" fn prevent_extensions(_cx: *mut JSContext, - _proxy: RawHandleObject, - result: *mut ObjectOpResult) - -> bool { +pub unsafe extern "C" fn prevent_extensions( + _cx: *mut JSContext, + _proxy: RawHandleObject, + result: *mut ObjectOpResult, +) -> bool { (*result).code_ = JSErrNum::JSMSG_CANT_PREVENT_EXTENSIONS as ::libc::uintptr_t; true } /// Reports whether the object is Extensible -pub unsafe extern "C" fn is_extensible(_cx: *mut JSContext, - _proxy: RawHandleObject, - succeeded: *mut bool) - -> bool { +pub unsafe extern "C" fn is_extensible( + _cx: *mut JSContext, + _proxy: RawHandleObject, + succeeded: *mut bool, +) -> bool { *succeeded = true; true } @@ -145,11 +149,12 @@ pub unsafe extern "C" fn is_extensible(_cx: *mut JSContext, /// This implementation always handles the case of the ordinary /// `[[GetPrototypeOf]]` behavior. An alternative implementation will be /// necessary for the Location object. -pub unsafe extern "C" fn get_prototype_if_ordinary(_: *mut JSContext, - proxy: RawHandleObject, - is_ordinary: *mut bool, - proto: RawMutableHandleObject) - -> bool { +pub unsafe extern "C" fn get_prototype_if_ordinary( + _: *mut JSContext, + proxy: RawHandleObject, + is_ordinary: *mut bool, + proto: RawMutableHandleObject, +) -> bool { *is_ordinary = true; proto.set(GetStaticPrototype(proxy.get())); true @@ -169,11 +174,19 @@ pub unsafe fn get_expando_object(obj: RawHandleObject, mut expando: MutableHandl /// Get the expando object, or create it if it doesn't exist yet. /// Fails on JSAPI failure. -pub unsafe fn ensure_expando_object(cx: *mut JSContext, obj: RawHandleObject, mut expando: MutableHandleObject) { +pub unsafe fn ensure_expando_object( + cx: *mut JSContext, + obj: RawHandleObject, + mut expando: MutableHandleObject, +) { assert!(is_dom_proxy(obj.get())); get_expando_object(obj, expando); if expando.is_null() { - expando.set(JS_NewObjectWithGivenProto(cx, ptr::null_mut(), HandleObject::null())); + expando.set(JS_NewObjectWithGivenProto( + cx, + ptr::null_mut(), + HandleObject::null(), + )); assert!(!expando.is_null()); SetProxyPrivate(obj.get(), &ObjectValue(expando.get())); @@ -182,9 +195,11 @@ pub unsafe fn ensure_expando_object(cx: *mut JSContext, obj: RawHandleObject, mu /// Set the property descriptor's object to `obj` and set it to enumerable, /// and writable if `readonly` is true. -pub fn fill_property_descriptor(mut desc: MutableHandle, - obj: *mut JSObject, - attrs: u32) { +pub fn fill_property_descriptor( + mut desc: MutableHandle, + obj: *mut JSObject, + attrs: u32, +) { desc.obj = obj; desc.attrs = attrs; desc.getter = None; diff --git a/components/script/dom/bindings/refcounted.rs b/components/script/dom/bindings/refcounted.rs index 2c5a179ca2b..11a422a2f3f 100644 --- a/components/script/dom/bindings/refcounted.rs +++ b/components/script/dom/bindings/refcounted.rs @@ -39,9 +39,9 @@ use std::rc::Rc; use std::sync::{Arc, Weak}; use task::TaskOnce; - -#[allow(missing_docs)] // FIXME -mod dummy { // Attributes don’t apply through the macro. +#[allow(missing_docs)] // FIXME +mod dummy { + // Attributes don’t apply through the macro. use std::cell::RefCell; use std::rc::Rc; use super::LiveDOMReferences; @@ -50,7 +50,6 @@ mod dummy { // Attributes don’t apply through the macro. } pub use self::dummy::LIVE_REFERENCES; - /// A pointer to a Rust DOM object that needs to be destroyed. pub struct TrustedReference(*const libc::c_void); unsafe impl Send for TrustedReference {} @@ -98,19 +97,28 @@ impl TrustedPromise { LIVE_REFERENCES.with(|ref r| { let r = r.borrow(); let live_references = r.as_ref().unwrap(); - assert_eq!(self.owner_thread, (&*live_references) as *const _ as *const libc::c_void); + assert_eq!( + self.owner_thread, + (&*live_references) as *const _ as *const libc::c_void + ); // Borrow-check error requires the redundant `let promise = ...; promise` here. - let promise = match live_references.promise_table.borrow_mut().entry(self.dom_object) { + let promise = match live_references + .promise_table + .borrow_mut() + .entry(self.dom_object) + { Occupied(mut entry) => { let promise = { let promises = entry.get_mut(); - promises.pop().expect("rooted promise list unexpectedly empty") + promises + .pop() + .expect("rooted promise list unexpectedly empty") }; if entry.get().is_empty() { entry.remove(); } promise - } + }, Vacant(_) => unreachable!(), }; promise @@ -182,9 +190,7 @@ impl Trusted { let live_references = r.as_ref().unwrap(); self.owner_thread == (&*live_references) as *const _ as *const libc::c_void })); - unsafe { - DomRoot::from_ref(&*(self.refcount.0 as *const T)) - } + unsafe { DomRoot::from_ref(&*(self.refcount.0 as *const T)) } } } @@ -246,15 +252,15 @@ impl LiveDOMReferences { let refcount = Arc::new(TrustedReference::new(ptr)); entry.insert(Arc::downgrade(&refcount)); refcount - } + }, } } } /// Remove null entries from the live references table -fn remove_nulls (table: &mut HashMap>) { - let to_remove: Vec = - table.iter() +fn remove_nulls(table: &mut HashMap>) { + let to_remove: Vec = table + .iter() .filter(|&(_, value)| Weak::upgrade(value).is_none()) .map(|(key, _)| key.clone()) .collect(); diff --git a/components/script/dom/bindings/reflector.rs b/components/script/dom/bindings/reflector.rs index 416c3c3f552..2bf1983d40e 100644 --- a/components/script/dom/bindings/reflector.rs +++ b/components/script/dom/bindings/reflector.rs @@ -14,16 +14,16 @@ use std::default::Default; /// Create the reflector for a new DOM object and yield ownership to the /// reflector. pub fn reflect_dom_object( - obj: Box, - global: &U, - wrap_fn: unsafe fn(*mut JSContext, &GlobalScope, Box) -> DomRoot) - -> DomRoot - where T: DomObject, U: DerivedFrom + obj: Box, + global: &U, + wrap_fn: unsafe fn(*mut JSContext, &GlobalScope, Box) -> DomRoot, +) -> DomRoot +where + T: DomObject, + U: DerivedFrom, { let global_scope = global.upcast(); - unsafe { - wrap_fn(global_scope.get_cx(), global_scope, obj) - } + unsafe { wrap_fn(global_scope.get_cx(), global_scope, obj) } } /// A struct to store a reference to the reflector of a DOM object. @@ -79,7 +79,10 @@ pub trait DomObject: 'static { fn reflector(&self) -> &Reflector; /// Returns the global scope of the realm that the DomObject was created in. - fn global(&self) -> DomRoot where Self: Sized { + fn global(&self) -> DomRoot + where + Self: Sized, + { GlobalScope::from_reflector(self) } } diff --git a/components/script/dom/bindings/root.rs b/components/script/dom/bindings/root.rs index f8336e6a85d..d974e75737c 100644 --- a/components/script/dom/bindings/root.rs +++ b/components/script/dom/bindings/root.rs @@ -96,9 +96,7 @@ where trace_reflector(tracer, "on stack", &self.0); } } - unsafe { - &*(self.reflector() as *const Reflector as *const ReflectorStackRoot) - } + unsafe { &*(self.reflector() as *const Reflector as *const ReflectorStackRoot) } } } @@ -131,15 +129,17 @@ pub type DomRoot = Root>; impl DomRoot { /// Cast a DOM object root upwards to one of the interfaces it derives from. pub fn upcast(root: DomRoot) -> DomRoot - where U: Castable, - T: DerivedFrom + where + U: Castable, + T: DerivedFrom, { unsafe { mem::transmute(root) } } /// Cast a DOM object root downwards to one of the interfaces it might implement. pub fn downcast(root: DomRoot) -> Option> - where U: DerivedFrom + where + U: DerivedFrom, { if root.is::() { Some(unsafe { mem::transmute(root) }) @@ -207,9 +207,7 @@ pub struct ThreadLocalStackRoots<'a>(PhantomData<&'a u32>); impl<'a> ThreadLocalStackRoots<'a> { pub fn new(roots: &'a RootCollection) -> Self { - STACK_ROOTS.with(|ref r| { - r.set(Some(roots)) - }); + STACK_ROOTS.with(|ref r| r.set(Some(roots))); ThreadLocalStackRoots(PhantomData) } } @@ -363,9 +361,7 @@ unsafe impl JSTraceable for Dom { #[cfg(not(all(feature = "unstable", debug_assertions)))] let trace_info = "for DOM object on heap"; - trace_reflector(trc, - trace_info, - (*self.ptr.as_ptr()).reflector()); + trace_reflector(trc, trace_info, (*self.ptr.as_ptr()).reflector()); } } @@ -379,8 +375,9 @@ pub struct LayoutDom { impl LayoutDom { /// Cast a DOM object root upwards to one of the interfaces it derives from. pub fn upcast(&self) -> LayoutDom - where U: Castable, - T: DerivedFrom + where + U: Castable, + T: DerivedFrom, { debug_assert!(thread_state::get().is_layout()); let ptr: *mut T = self.ptr.as_ptr(); @@ -391,7 +388,8 @@ impl LayoutDom { /// Cast a DOM object downwards to one of the interfaces it might implement. pub fn downcast(&self) -> Option> - where U: DerivedFrom + where + U: DerivedFrom, { debug_assert!(thread_state::get().is_layout()); unsafe { @@ -429,7 +427,6 @@ impl<'a, T: DomObject> PartialEq<&'a T> for Dom { } } - impl Eq for Dom {} impl PartialEq for LayoutDom { @@ -452,7 +449,7 @@ impl Hash for LayoutDom { } } -impl Clone for Dom { +impl Clone for Dom { #[inline] #[allow(unrooted_must_root)] fn clone(&self) -> Dom { @@ -463,7 +460,7 @@ impl Clone for Dom { } } -impl Clone for LayoutDom { +impl Clone for LayoutDom { #[inline] fn clone(&self) -> LayoutDom { debug_assert!(thread_state::get().is_layout()); @@ -516,9 +513,7 @@ impl MutDom { /// Get the value in this `MutDom`. pub fn get(&self) -> DomRoot { debug_assert!(thread_state::get().is_script()); - unsafe { - DomRoot::from_ref(&*ptr::read(self.val.get())) - } + unsafe { DomRoot::from_ref(&*ptr::read(self.val.get())) } } } @@ -530,18 +525,14 @@ impl MallocSizeOf for MutDom { } impl PartialEq for MutDom { - fn eq(&self, other: &Self) -> bool { - unsafe { - *self.val.get() == *other.val.get() - } + fn eq(&self, other: &Self) -> bool { + unsafe { *self.val.get() == *other.val.get() } } } impl PartialEq for MutDom { fn eq(&self, other: &T) -> bool { - unsafe { - **self.val.get() == *other - } + unsafe { **self.val.get() == *other } } } @@ -569,7 +560,8 @@ impl MutNullableDom { /// Retrieve a copy of the current inner value. If it is `None`, it is /// initialized with the result of `cb` first. pub fn or_init(&self, cb: F) -> DomRoot - where F: FnOnce() -> DomRoot + where + F: FnOnce() -> DomRoot, { debug_assert!(thread_state::get().is_script()); match self.get() { @@ -594,9 +586,7 @@ impl MutNullableDom { #[allow(unrooted_must_root)] pub fn get(&self) -> Option> { debug_assert!(thread_state::get().is_script()); - unsafe { - ptr::read(self.ptr.get()).map(|o| DomRoot::from_ref(&*o)) - } + unsafe { ptr::read(self.ptr.get()).map(|o| DomRoot::from_ref(&*o)) } } /// Set this `MutNullableDom` to the given value. @@ -617,17 +607,13 @@ impl MutNullableDom { impl PartialEq for MutNullableDom { fn eq(&self, other: &Self) -> bool { - unsafe { - *self.ptr.get() == *other.ptr.get() - } + unsafe { *self.ptr.get() == *other.ptr.get() } } } impl<'a, T: DomObject> PartialEq> for MutNullableDom { fn eq(&self, other: &Option<&T>) -> bool { - unsafe { - *self.ptr.get() == other.map(Dom::from_ref) - } + unsafe { *self.ptr.get() == other.map(Dom::from_ref) } } } @@ -661,13 +647,14 @@ pub struct DomOnceCell { impl DomOnceCell where - T: DomObject + T: DomObject, { /// Retrieve a copy of the current inner value. If it is `None`, it is /// initialized with the result of `cb` first. #[allow(unrooted_must_root)] pub fn init_once(&self, cb: F) -> &T - where F: FnOnce() -> DomRoot + where + F: FnOnce() -> DomRoot, { debug_assert!(thread_state::get().is_script()); &self.ptr.init_once(|| Dom::from_ref(&cb())) @@ -725,14 +712,17 @@ pub trait OptionalHeapSetter { fn set(&mut self, v: Option); } -impl OptionalHeapSetter for Option> where Heap: Default { +impl OptionalHeapSetter for Option> +where + Heap: Default, +{ type Value = T; fn set(&mut self, v: Option) { let v = match v { None => { *self = None; return; - } + }, Some(v) => v, }; diff --git a/components/script/dom/bindings/settings_stack.rs b/components/script/dom/bindings/settings_stack.rs index f9438f17065..e5efea05e98 100644 --- a/components/script/dom/bindings/settings_stack.rs +++ b/components/script/dom/bindings/settings_stack.rs @@ -36,9 +36,7 @@ pub unsafe fn trace(tracer: *mut JSTracer) { } pub fn is_execution_stack_empty() -> bool { - STACK.with(|stack| { - stack.borrow().is_empty() - }) + STACK.with(|stack| stack.borrow().is_empty()) } /// RAII struct that pushes and pops entries from the script settings stack. @@ -69,9 +67,10 @@ impl Drop for AutoEntryScript { STACK.with(|stack| { let mut stack = stack.borrow_mut(); let entry = stack.pop().unwrap(); - assert_eq!(&*entry.global as *const GlobalScope, - &*self.global as *const GlobalScope, - "Dropped AutoEntryScript out of order."); + assert_eq!( + &*entry.global as *const GlobalScope, &*self.global as *const GlobalScope, + "Dropped AutoEntryScript out of order." + ); assert_eq!(entry.kind, StackEntryKind::Entry); trace!("Clean up after running script with {:p}", &*entry.global); }); @@ -87,13 +86,15 @@ impl Drop for AutoEntryScript { /// /// ["entry"]: https://html.spec.whatwg.org/multipage/#entry pub fn entry_global() -> DomRoot { - STACK.with(|stack| { - stack.borrow() - .iter() - .rev() - .find(|entry| entry.kind == StackEntryKind::Entry) - .map(|entry| DomRoot::from_ref(&*entry.global)) - }).unwrap() + STACK + .with(|stack| { + stack + .borrow() + .iter() + .rev() + .find(|entry| entry.kind == StackEntryKind::Entry) + .map(|entry| DomRoot::from_ref(&*entry.global)) + }).unwrap() } /// RAII struct that pushes and pops entries from the script settings stack. @@ -133,11 +134,15 @@ impl Drop for AutoIncumbentScript { let mut stack = stack.borrow_mut(); let entry = stack.pop().unwrap(); // Step 3. - assert_eq!(&*entry.global as *const GlobalScope as usize, - self.global, - "Dropped AutoIncumbentScript out of order."); + assert_eq!( + &*entry.global as *const GlobalScope as usize, self.global, + "Dropped AutoIncumbentScript out of order." + ); assert_eq!(entry.kind, StackEntryKind::Incumbent); - trace!("Clean up after running a callback with {:p}", &*entry.global); + trace!( + "Clean up after running a callback with {:p}", + &*entry.global + ); }); unsafe { // Step 1-2. @@ -169,8 +174,9 @@ pub fn incumbent_global() -> Option> { // Step 2: nothing from the JS engine. Let's use whatever's on the explicit stack. STACK.with(|stack| { - stack.borrow() - .last() - .map(|entry| DomRoot::from_ref(&*entry.global)) + stack + .borrow() + .last() + .map(|entry| DomRoot::from_ref(&*entry.global)) }) } diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index c4cc5f51d21..e52cf7755a3 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -82,7 +82,6 @@ impl ops::Deref for ByteString { #[derive(Clone, Default, MallocSizeOf)] pub struct USVString(pub String); - /// Returns whether `s` is a `token`, as defined by /// [RFC 2616](http://tools.ietf.org/html/rfc2616#page-17). pub fn is_token(s: &[u8]) -> bool { @@ -93,31 +92,14 @@ pub fn is_token(s: &[u8]) -> bool { // http://tools.ietf.org/html/rfc2616#section-2.2 match x { 0...31 | 127 => false, // CTLs - 40 | - 41 | - 60 | - 62 | - 64 | - 44 | - 59 | - 58 | - 92 | - 34 | - 47 | - 91 | - 93 | - 63 | - 61 | - 123 | - 125 | - 32 => false, // separators + 40 | 41 | 60 | 62 | 64 | 44 | 59 | 58 | 92 | 34 | 47 | 91 | 93 | 63 | 61 | 123 | + 125 | 32 => false, // separators x if x > 127 => false, // non-CHARs _ => true, } }) } - /// A DOMString. /// /// This type corresponds to the [`DOMString`](idl) type in WebIDL. @@ -196,14 +178,16 @@ impl DOMString { /// Removes leading and trailing ASCII whitespaces according to /// . pub fn strip_leading_and_trailing_ascii_whitespace(&mut self) { - if self.0.len() == 0 { return; } + if self.0.len() == 0 { + return; + } let last_non_whitespace = match self.0.rfind(|ref c| !char::is_ascii_whitespace(c)) { Some(idx) => idx + 1, None => { self.0.clear(); return; - } + }, }; let first_non_whitespace = self.0.find(|ref c| !char::is_ascii_whitespace(c)).unwrap(); @@ -231,17 +215,21 @@ impl DOMString { Done, Error, } - let next_state = |valid: bool, next: State| -> State { if valid { next } else { State::Error } }; + let next_state = |valid: bool, next: State| -> State { + if valid { + next + } else { + State::Error + } + }; let state = self.chars().fold(State::HourHigh, |state, c| { match state { // Step 1 "HH" - State::HourHigh => { - match c { - '0' | '1' => State::HourLow09, - '2' => State::HourLow03, - _ => State::Error, - } + State::HourHigh => match c { + '0' | '1' => State::HourLow09, + '2' => State::HourLow03, + _ => State::Error, }, State::HourLow09 => next_state(c.is_digit(10), State::MinuteColon), State::HourLow03 => next_state(c.is_digit(4), State::MinuteColon), @@ -323,15 +311,21 @@ impl DOMString { /// where date and time are both valid, and the time string must be as short as possible /// https://html.spec.whatwg.org/multipage/#valid-normalised-local-date-and-time-string pub fn convert_valid_normalized_local_date_and_time_string(&mut self) -> Result<(), ()> { - let ((year, month, day), (hour, minute, second)) = parse_local_date_and_time_string(&*self.0)?; + let ((year, month, day), (hour, minute, second)) = + parse_local_date_and_time_string(&*self.0)?; if second == 0.0 { - self.0 = format!("{:04}-{:02}-{:02}T{:02}:{:02}", year, month, day, hour, minute); + self.0 = format!( + "{:04}-{:02}-{:02}T{:02}:{:02}", + year, month, day, hour, minute + ); } else { - self.0 = format!("{:04}-{:02}-{:02}T{:02}:{:02}:{}", year, month, day, hour, minute, second); + self.0 = format!( + "{:04}-{:02}-{:02}T{:02}:{:02}:{}", + year, month, day, hour, minute, second + ); } Ok(()) } - } impl Borrow for DOMString { @@ -452,7 +446,10 @@ impl<'a> Into> for DOMString { } impl Extend for DOMString { - fn extend(&mut self, iterable: I) where I: IntoIterator { + fn extend(&mut self, iterable: I) + where + I: IntoIterator, + { self.0.extend(iterable) } } @@ -541,7 +538,7 @@ fn parse_month_component(value: &str) -> Result<(u32, u32), ()> { // Step 4, 5 let month_int = month.parse::().map_err(|_| ())?; - if month.len() != 2 || month_int > 12 || month_int < 1 { + if month.len() != 2 || month_int > 12 || month_int < 1 { return Err(()); } @@ -611,12 +608,12 @@ fn parse_time_component(value: &str) -> Result<(u32, u32, f32), ()> { return Err(()); } }, - None => {} + None => {}, } second.parse::().map_err(|_| ())? }, - None => 0.0 + None => 0.0, }; // Step 8 @@ -624,7 +621,7 @@ fn parse_time_component(value: &str) -> Result<(u32, u32, f32), ()> { } /// https://html.spec.whatwg.org/multipage/#parse-a-local-date-and-time-string -fn parse_local_date_and_time_string(value: &str) -> Result<((u32, u32, u32), (u32, u32, f32)), ()> { +fn parse_local_date_and_time_string(value: &str) -> Result<((u32, u32, u32), (u32, u32, f32)), ()> { // Step 1, 2, 4 let mut iterator = if value.contains('T') { value.split('T') @@ -651,8 +648,8 @@ fn parse_local_date_and_time_string(value: &str) -> Result<((u32, u32, u32), (u fn max_day_in_month(year_num: u32, month_num: u32) -> Result { match month_num { - 1|3|5|7|8|10|12 => Ok(31), - 4|6|9|11 => Ok(30), + 1 | 3 | 5 | 7 | 8 | 10 | 12 => Ok(31), + 4 | 6 | 9 | 11 => Ok(30), 2 => { if is_leap_year(year_num) { Ok(29) @@ -660,7 +657,7 @@ fn max_day_in_month(year_num: u32, month_num: u32) -> Result { Ok(28) } }, - _ => Err(()) + _ => Err(()), } } @@ -669,7 +666,7 @@ fn max_week_in_year(year: u32) -> u32 { match Utc.ymd(year as i32, 1, 1).weekday() { Weekday::Thu => 53, Weekday::Wed if is_leap_year(year) => 53, - _ => 52 + _ => 52, } } @@ -681,14 +678,16 @@ fn is_leap_year(year: u32) -> bool { /// https://html.spec.whatwg.org/multipage/#rules-for-parsing-floating-point-number-values fn parse_floating_point_number(input: &str) -> Result { match input.trim().parse::() { - Ok(val) if !( + Ok(val) + if !( // A valid number is the same as what rust considers to be valid, // except for +1., NaN, and Infinity. val.is_infinite() || val.is_nan() || input.ends_with(".") || input.starts_with("+") - ) => { + ) => + { // TODO(#19773): need consider `min`, `max`, `step`, when they are implemented Ok(val.round()) - }, - _ => Err(()) + } + _ => Err(()), } } diff --git a/components/script/dom/bindings/structuredclone.rs b/components/script/dom/bindings/structuredclone.rs index d530a51e7bc..c4a68547247 100644 --- a/components/script/dom/bindings/structuredclone.rs +++ b/components/script/dom/bindings/structuredclone.rs @@ -47,35 +47,39 @@ enum StructuredCloneTags { } #[cfg(target_pointer_width = "64")] -unsafe fn write_length(w: *mut JSStructuredCloneWriter, - length: usize) { - let high: u32 = (length >> 32) as u32; - let low: u32 = length as u32; - assert!(JS_WriteUint32Pair(w, high, low)); +unsafe fn write_length(w: *mut JSStructuredCloneWriter, length: usize) { + let high: u32 = (length >> 32) as u32; + let low: u32 = length as u32; + assert!(JS_WriteUint32Pair(w, high, low)); } #[cfg(target_pointer_width = "32")] -unsafe fn write_length(w: *mut JSStructuredCloneWriter, - length: usize) { - assert!(JS_WriteUint32Pair(w, length as u32, 0)); +unsafe fn write_length(w: *mut JSStructuredCloneWriter, length: usize) { + assert!(JS_WriteUint32Pair(w, length as u32, 0)); } #[cfg(target_pointer_width = "64")] -unsafe fn read_length(r: *mut JSStructuredCloneReader) - -> usize { - let mut high: u32 = 0; - let mut low: u32 = 0; - assert!(JS_ReadUint32Pair(r, &mut high as *mut u32, &mut low as *mut u32)); - return (low << high) as usize; +unsafe fn read_length(r: *mut JSStructuredCloneReader) -> usize { + let mut high: u32 = 0; + let mut low: u32 = 0; + assert!(JS_ReadUint32Pair( + r, + &mut high as *mut u32, + &mut low as *mut u32 + )); + return (low << high) as usize; } #[cfg(target_pointer_width = "32")] -unsafe fn read_length(r: *mut JSStructuredCloneReader) - -> usize { - let mut length: u32 = 0; - let mut zero: u32 = 0; - assert!(JS_ReadUint32Pair(r, &mut length as *mut u32, &mut zero as *mut u32)); - return length as usize; +unsafe fn read_length(r: *mut JSStructuredCloneReader) -> usize { + let mut length: u32 = 0; + let mut zero: u32 = 0; + assert!(JS_ReadUint32Pair( + r, + &mut length as *mut u32, + &mut zero as *mut u32 + )); + return length as usize; } struct StructuredCloneWriter { @@ -86,7 +90,11 @@ impl StructuredCloneWriter { unsafe fn write_slice(&self, v: &[u8]) { let type_length = v.len(); write_length(self.w, type_length); - assert!(JS_WriteBytes(self.w, v.as_ptr() as *const raw::c_void, type_length)); + assert!(JS_WriteBytes( + self.w, + v.as_ptr() as *const raw::c_void, + type_length + )); } unsafe fn write_str(&self, s: &str) { self.write_slice(s.as_bytes()); @@ -101,7 +109,11 @@ impl StructuredCloneReader { unsafe fn read_bytes(&self) -> Vec { let mut bytes = vec![0u8; read_length(self.r)]; let blob_length = bytes.len(); - assert!(JS_ReadBytes(self.r, bytes.as_mut_ptr() as *mut raw::c_void, blob_length)); + assert!(JS_ReadBytes( + self.r, + bytes.as_mut_ptr() as *mut raw::c_void, + blob_length + )); return bytes; } unsafe fn read_str(&self) -> String { @@ -110,87 +122,105 @@ impl StructuredCloneReader { } } -unsafe fn read_blob(cx: *mut JSContext, - r: *mut JSStructuredCloneReader, - sc_holder: &mut StructuredCloneHolder) - -> *mut JSObject { +unsafe fn read_blob( + cx: *mut JSContext, + r: *mut JSStructuredCloneReader, + sc_holder: &mut StructuredCloneHolder, +) -> *mut JSObject { let structured_reader = StructuredCloneReader { r: r }; let blob_buffer = structured_reader.read_bytes(); let type_str = structured_reader.read_str(); let target_global = GlobalScope::from_context(cx); - let blob = Blob::new(&target_global, BlobImpl::new_from_bytes(blob_buffer), type_str); + let blob = Blob::new( + &target_global, + BlobImpl::new_from_bytes(blob_buffer), + type_str, + ); let js_object = blob.reflector().get_jsobject().get(); sc_holder.blob = Some(blob); js_object } -unsafe fn write_blob(blob: DomRoot, - w: *mut JSStructuredCloneWriter) - -> Result<(), ()> { +unsafe fn write_blob(blob: DomRoot, w: *mut JSStructuredCloneWriter) -> Result<(), ()> { let structured_writer = StructuredCloneWriter { w: w }; let blob_vec = blob.get_bytes()?; - assert!(JS_WriteUint32Pair(w, StructuredCloneTags::DomBlob as u32, 0)); + assert!(JS_WriteUint32Pair( + w, + StructuredCloneTags::DomBlob as u32, + 0 + )); structured_writer.write_slice(&blob_vec); structured_writer.write_str(&blob.type_string()); - return Ok(()) + return Ok(()); } -unsafe extern "C" fn read_callback(cx: *mut JSContext, - r: *mut JSStructuredCloneReader, - tag: u32, - _data: u32, - closure: *mut raw::c_void) - -> *mut JSObject { - assert!(tag < StructuredCloneTags::Max as u32, "tag should be lower than StructuredCloneTags::Max"); - assert!(tag > StructuredCloneTags::Min as u32, "tag should be higher than StructuredCloneTags::Min"); +unsafe extern "C" fn read_callback( + cx: *mut JSContext, + r: *mut JSStructuredCloneReader, + tag: u32, + _data: u32, + closure: *mut raw::c_void, +) -> *mut JSObject { + assert!( + tag < StructuredCloneTags::Max as u32, + "tag should be lower than StructuredCloneTags::Max" + ); + assert!( + tag > StructuredCloneTags::Min as u32, + "tag should be higher than StructuredCloneTags::Min" + ); if tag == StructuredCloneTags::DomBlob as u32 { - return read_blob(cx, r, &mut *(closure as *mut StructuredCloneHolder)) + return read_blob(cx, r, &mut *(closure as *mut StructuredCloneHolder)); } - return ptr::null_mut() + return ptr::null_mut(); } -unsafe extern "C" fn write_callback(_cx: *mut JSContext, - w: *mut JSStructuredCloneWriter, - obj: RawHandleObject, - _closure: *mut raw::c_void) - -> bool { +unsafe extern "C" fn write_callback( + _cx: *mut JSContext, + w: *mut JSStructuredCloneWriter, + obj: RawHandleObject, + _closure: *mut raw::c_void, +) -> bool { if let Ok(blob) = root_from_handleobject::(Handle::from_raw(obj)) { - return write_blob(blob, w).is_ok() + return write_blob(blob, w).is_ok(); } - return false + return false; } -unsafe extern "C" fn read_transfer_callback(_cx: *mut JSContext, - _r: *mut JSStructuredCloneReader, - _tag: u32, - _content: *mut raw::c_void, - _extra_data: u64, - _closure: *mut raw::c_void, - _return_object: RawMutableHandleObject) - -> bool { +unsafe extern "C" fn read_transfer_callback( + _cx: *mut JSContext, + _r: *mut JSStructuredCloneReader, + _tag: u32, + _content: *mut raw::c_void, + _extra_data: u64, + _closure: *mut raw::c_void, + _return_object: RawMutableHandleObject, +) -> bool { false } -unsafe extern "C" fn write_transfer_callback(_cx: *mut JSContext, - _obj: RawHandleObject, - _closure: *mut raw::c_void, - _tag: *mut u32, - _ownership: *mut TransferableOwnership, - _content: *mut *mut raw::c_void, - _extra_data: *mut u64) - -> bool { +unsafe extern "C" fn write_transfer_callback( + _cx: *mut JSContext, + _obj: RawHandleObject, + _closure: *mut raw::c_void, + _tag: *mut u32, + _ownership: *mut TransferableOwnership, + _content: *mut *mut raw::c_void, + _extra_data: *mut u64, +) -> bool { false } -unsafe extern "C" fn free_transfer_callback(_tag: u32, - _ownership: TransferableOwnership, - _content: *mut raw::c_void, - _extra_data: u64, - _closure: *mut raw::c_void) { +unsafe extern "C" fn free_transfer_callback( + _tag: u32, + _ownership: TransferableOwnership, + _content: *mut raw::c_void, + _extra_data: u64, + _closure: *mut raw::c_void, +) { } -unsafe extern "C" fn report_error_callback(_cx: *mut JSContext, _errorid: u32) { -} +unsafe extern "C" fn report_error_callback(_cx: *mut JSContext, _errorid: u32) {} static STRUCTURED_CLONE_CALLBACKS: JSStructuredCloneCallbacks = JSStructuredCloneCallbacks { read: Some(read_callback), @@ -202,7 +232,7 @@ static STRUCTURED_CLONE_CALLBACKS: JSStructuredCloneCallbacks = JSStructuredClon }; struct StructuredCloneHolder { - blob: Option> + blob: Option>, } /// A buffer for a structured clone. @@ -210,7 +240,7 @@ pub enum StructuredCloneData { /// A non-serializable (default) variant Struct(*mut u64, size_t), /// A variant that can be serialized - Vector(Vec) + Vector(Vec), } impl StructuredCloneData { @@ -218,21 +248,25 @@ impl StructuredCloneData { /// Writes a structured clone. Returns a `DataClone` error if that fails. pub fn write(cx: *mut JSContext, message: HandleValue) -> Fallible { unsafe { - let scbuf = NewJSAutoStructuredCloneBuffer(StructuredCloneScope::DifferentProcess, - &STRUCTURED_CLONE_CALLBACKS); + let scbuf = NewJSAutoStructuredCloneBuffer( + StructuredCloneScope::DifferentProcess, + &STRUCTURED_CLONE_CALLBACKS, + ); let scdata = &mut ((*scbuf).data_); let policy = CloneDataPolicy { // TODO: SAB? sharedArrayBuffer_: false, }; - let result = JS_WriteStructuredClone(cx, - message, - scdata, - StructuredCloneScope::DifferentProcess, - policy, - &STRUCTURED_CLONE_CALLBACKS, - ptr::null_mut(), - HandleValue::undefined()); + let result = JS_WriteStructuredClone( + cx, + message, + scdata, + StructuredCloneScope::DifferentProcess, + policy, + &STRUCTURED_CLONE_CALLBACKS, + ptr::null_mut(), + HandleValue::undefined(), + ); if !result { JS_ClearPendingException(cx); return Err(Error::DataClone); @@ -252,41 +286,40 @@ impl StructuredCloneData { /// Converts a StructuredCloneData to Vec for inter-thread sharing pub fn move_to_arraybuffer(self) -> Vec { match self { - StructuredCloneData::Struct(data, nbytes) => { - unsafe { - slice::from_raw_parts(data as *mut u8, nbytes).to_vec() - } - } - StructuredCloneData::Vector(msg) => msg + StructuredCloneData::Struct(data, nbytes) => unsafe { + slice::from_raw_parts(data as *mut u8, nbytes).to_vec() + }, + StructuredCloneData::Vector(msg) => msg, } } /// Reads a structured clone. /// /// Panics if `JS_ReadStructuredClone` fails. - fn read_clone(global: &GlobalScope, - data: *mut u64, - nbytes: size_t, - rval: MutableHandleValue) { + fn read_clone(global: &GlobalScope, data: *mut u64, nbytes: size_t, rval: MutableHandleValue) { let cx = global.get_cx(); let globalhandle = global.reflector().get_jsobject(); let _ac = JSAutoCompartment::new(cx, globalhandle.get()); let mut sc_holder = StructuredCloneHolder { blob: None }; let sc_holder_ptr = &mut sc_holder as *mut _; unsafe { - let scbuf = NewJSAutoStructuredCloneBuffer(StructuredCloneScope::DifferentProcess, - &STRUCTURED_CLONE_CALLBACKS); + let scbuf = NewJSAutoStructuredCloneBuffer( + StructuredCloneScope::DifferentProcess, + &STRUCTURED_CLONE_CALLBACKS, + ); let scdata = &mut ((*scbuf).data_); WriteBytesToJSStructuredCloneData(data as *const u8, nbytes, scdata); - assert!(JS_ReadStructuredClone(cx, - scdata, - JS_STRUCTURED_CLONE_VERSION, - StructuredCloneScope::DifferentProcess, - rval, - &STRUCTURED_CLONE_CALLBACKS, - sc_holder_ptr as *mut raw::c_void)); + assert!(JS_ReadStructuredClone( + cx, + scdata, + JS_STRUCTURED_CLONE_VERSION, + StructuredCloneScope::DifferentProcess, + rval, + &STRUCTURED_CLONE_CALLBACKS, + sc_holder_ptr as *mut raw::c_void + )); DeleteJSAutoStructuredCloneBuffer(scbuf); } @@ -299,8 +332,10 @@ impl StructuredCloneData { let nbytes = vec_msg.len(); let data = vec_msg.as_mut_ptr() as *mut u64; StructuredCloneData::read_clone(global, data, nbytes, rval); - } - StructuredCloneData::Struct(data, nbytes) => StructuredCloneData::read_clone(global, data, nbytes, rval) + }, + StructuredCloneData::Struct(data, nbytes) => { + StructuredCloneData::read_clone(global, data, nbytes, rval) + }, } } } diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index ca01ff600d8..2c395094e7f 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -149,9 +149,11 @@ pub fn trace_jsval(tracer: *mut JSTracer, description: &str, val: &Heap) } trace!("tracing value {}", description); - CallValueTracer(tracer, - val.ptr.get() as *mut _, - GCTraceKindToAscii(val.get().trace_kind())); + CallValueTracer( + tracer, + val.ptr.get() as *mut _, + GCTraceKindToAscii(val.get().trace_kind()), + ); } } @@ -166,9 +168,11 @@ pub fn trace_reflector(tracer: *mut JSTracer, description: &str, reflector: &Ref pub fn trace_object(tracer: *mut JSTracer, description: &str, obj: &Heap<*mut JSObject>) { unsafe { trace!("tracing {}", description); - CallObjectTracer(tracer, - obj.ptr.get() as *mut _, - GCTraceKindToAscii(TraceKind::Object)); + CallObjectTracer( + tracer, + obj.ptr.get() as *mut _, + GCTraceKindToAscii(TraceKind::Object), + ); } } @@ -295,9 +299,10 @@ unsafe impl JSTraceable for Result { } unsafe impl JSTraceable for HashMap - where K: Hash + Eq + JSTraceable, - V: JSTraceable, - S: BuildHasher, +where + K: Hash + Eq + JSTraceable, + V: JSTraceable, + S: BuildHasher, { #[inline] unsafe fn trace(&self, trc: *mut JSTracer) { @@ -309,8 +314,9 @@ unsafe impl JSTraceable for HashMap } unsafe impl JSTraceable for HashSet - where T: Hash + Eq + JSTraceable, - S: BuildHasher, +where + T: Hash + Eq + JSTraceable, + S: BuildHasher, { #[inline] unsafe fn trace(&self, trc: *mut JSTracer) { @@ -365,7 +371,12 @@ unsafe_no_jsmanaged_fields!(PropertyDeclarationBlock); // These three are interdependent, if you plan to put jsmanaged data // in one of these make sure it is propagated properly to containing structs unsafe_no_jsmanaged_fields!(DocumentActivity, WindowSizeData, WindowSizeType); -unsafe_no_jsmanaged_fields!(BrowsingContextId, HistoryStateId, PipelineId, TopLevelBrowsingContextId); +unsafe_no_jsmanaged_fields!( + BrowsingContextId, + HistoryStateId, + PipelineId, + TopLevelBrowsingContextId +); unsafe_no_jsmanaged_fields!(TimerEventId, TimerSource); unsafe_no_jsmanaged_fields!(TimelineMarkerType); unsafe_no_jsmanaged_fields!(WorkerId); @@ -459,7 +470,10 @@ unsafe impl<'a, A, B> JSTraceable for fn(&A) -> B { } } -unsafe impl JSTraceable for IpcSender where T: for<'de> Deserialize<'de> + Serialize { +unsafe impl JSTraceable for IpcSender +where + T: for<'de> Deserialize<'de> + Serialize, +{ #[inline] unsafe fn trace(&self, _: *mut JSTracer) { // Do nothing @@ -481,7 +495,10 @@ unsafe impl JSTraceable for () { } } -unsafe impl JSTraceable for IpcReceiver where T: for<'de> Deserialize<'de> + Serialize { +unsafe impl JSTraceable for IpcReceiver +where + T: for<'de> Deserialize<'de> + Serialize, +{ #[inline] unsafe fn trace(&self, _: *mut JSTracer) { // Do nothing @@ -509,14 +526,20 @@ unsafe impl JSTraceable for Sender { } } -unsafe impl JSTraceable for WebGLReceiver where T: for<'de> Deserialize<'de> + Serialize { +unsafe impl JSTraceable for WebGLReceiver +where + T: for<'de> Deserialize<'de> + Serialize, +{ #[inline] unsafe fn trace(&self, _: *mut JSTracer) { // Do nothing } } -unsafe impl JSTraceable for WebGLSender where T: for<'de> Deserialize<'de> + Serialize { +unsafe impl JSTraceable for WebGLSender +where + T: for<'de> Deserialize<'de> + Serialize, +{ #[inline] unsafe fn trace(&self, _: *mut JSTracer) { // Do nothing @@ -665,7 +688,10 @@ unsafe impl JSTraceable for StyleLocked { } } -unsafe impl JSTraceable for TypedArray>> where T: TypedArrayElement { +unsafe impl JSTraceable for TypedArray>> +where + T: TypedArrayElement, +{ unsafe fn trace(&self, trc: *mut JSTracer) { self.underlying_object().trace(trc); } @@ -682,34 +708,26 @@ where } } - /// Holds a set of JSTraceables that need to be rooted struct RootedTraceableSet { set: Vec<*const JSTraceable>, } -thread_local!( - /// TLV Holds a set of JSTraceables that need to be rooted - static ROOTED_TRACEABLES: RefCell = - RefCell::new(RootedTraceableSet::new()); -); +thread_local!(/// TLV Holds a set of JSTraceables that need to be rooted +static ROOTED_TRACEABLES: RefCell = RefCell::new(RootedTraceableSet::new());); impl RootedTraceableSet { fn new() -> RootedTraceableSet { - RootedTraceableSet { - set: vec![], - } + RootedTraceableSet { set: vec![] } } unsafe fn remove(traceable: *const JSTraceable) { ROOTED_TRACEABLES.with(|ref traceables| { let mut traceables = traceables.borrow_mut(); - let idx = - match traceables.set.iter() - .rposition(|x| *x == traceable) { - Some(idx) => idx, - None => unreachable!(), - }; + let idx = match traceables.set.iter().rposition(|x| *x == traceable) { + Some(idx) => idx, + None => unreachable!(), + }; traceables.set.remove(idx); }); } @@ -744,9 +762,7 @@ impl<'a, T: JSTraceable + 'static> RootedTraceable<'a, T> { unsafe { RootedTraceableSet::add(traceable); } - RootedTraceable { - ptr: traceable, - } + RootedTraceable { ptr: traceable } } } @@ -787,16 +803,14 @@ impl RootedTraceableBox { unsafe { RootedTraceableSet::add(traceable); } - RootedTraceableBox { - ptr: traceable, - } + RootedTraceableBox { ptr: traceable } } } impl RootedTraceableBox> - where - Heap: JSTraceable + 'static, - T: GCMethods + Copy, +where + Heap: JSTraceable + 'static, + T: GCMethods + Copy, { pub fn handle(&self) -> Handle { unsafe { Handle::from_raw((*self.ptr).handle()) } @@ -812,17 +826,13 @@ impl Default for RootedTraceableBox { impl Deref for RootedTraceableBox { type Target = T; fn deref(&self) -> &T { - unsafe { - &*self.ptr - } + unsafe { &*self.ptr } } } impl DerefMut for RootedTraceableBox { fn deref_mut(&mut self) -> &mut T { - unsafe { - &mut *self.ptr - } + unsafe { &mut *self.ptr } } } @@ -849,9 +859,7 @@ pub struct RootableVec { impl RootableVec { /// Create a vector of items of type T that can be rooted later. pub fn new_unrooted() -> RootableVec { - RootableVec { - v: vec![], - } + RootableVec { v: vec![] } } } @@ -868,9 +876,7 @@ impl<'a, T: 'static + JSTraceable> RootedVec<'a, T> { unsafe { RootedTraceableSet::add(root); } - RootedVec { - root: root, - } + RootedVec { root: root } } } @@ -878,15 +884,14 @@ impl<'a, T: 'static + JSTraceable + DomObject> RootedVec<'a, Dom> { /// Create a vector of items of type Dom that is rooted for /// the lifetime of this struct pub fn from_iter(root: &'a mut RootableVec>, iter: I) -> Self - where I: Iterator> + where + I: Iterator>, { unsafe { RootedTraceableSet::add(root); } root.v.extend(iter.map(|item| Dom::from_ref(&*item))); - RootedVec { - root: root, - } + RootedVec { root: root } } } diff --git a/components/script/dom/bindings/utils.rs b/components/script/dom/bindings/utils.rs index a82786f2143..7366401af51 100644 --- a/components/script/dom/bindings/utils.rs +++ b/components/script/dom/bindings/utils.rs @@ -85,7 +85,6 @@ pub const DOM_PROTOTYPE_SLOT: u32 = js::JSCLASS_GLOBAL_SLOT_COUNT; // changes. pub const JSCLASS_DOM_GLOBAL: u32 = js::JSCLASS_USERBIT1; - /// The struct that holds inheritance information for DOM object reflectors. #[derive(Clone, Copy)] pub struct DOMClass { @@ -137,13 +136,14 @@ pub type ProtoOrIfaceArray = [*mut JSObject; PROTO_OR_IFACE_LENGTH]; /// set to true and `*vp` to the value, otherwise `*found` is set to false. /// /// Returns false on JSAPI failure. -pub unsafe fn get_property_on_prototype(cx: *mut JSContext, - proxy: HandleObject, - receiver: HandleValue, - id: HandleId, - found: *mut bool, - vp: MutableHandleValue) - -> bool { +pub unsafe fn get_property_on_prototype( + cx: *mut JSContext, + proxy: HandleObject, + receiver: HandleValue, + id: HandleId, + found: *mut bool, + vp: MutableHandleValue, +) -> bool { rooted!(in(cx) let mut proto = ptr::null_mut::()); if !JS_GetPrototype(cx, proxy, proto.handle_mut()) || proto.is_null() { *found = false; @@ -184,23 +184,29 @@ pub fn get_array_index_from_id(_cx: *mut JSContext, id: HandleId) -> Option return if StringIsArray(str, &mut i) != 0 { i } else { -1 } } else { IdToInt32(cx, id); - }*/ -} + }*/} /// Find the enum equivelent of a string given by `v` in `pairs`. /// Returns `Err(())` on JSAPI failure (there is a pending exception), and /// `Ok((None, value))` if there was no matching string. -pub unsafe fn find_enum_value<'a, T>(cx: *mut JSContext, - v: HandleValue, - pairs: &'a [(&'static str, T)]) - -> Result<(Option<&'a T>, DOMString), ()> { +pub unsafe fn find_enum_value<'a, T>( + cx: *mut JSContext, + v: HandleValue, + pairs: &'a [(&'static str, T)], +) -> Result<(Option<&'a T>, DOMString), ()> { let jsstr = ToString(cx, v); if jsstr.is_null() { return Err(()); } let search = jsstring_to_str(cx, jsstr); - Ok((pairs.iter().find(|&&(key, _)| search == *key).map(|&(_, ref ev)| ev), search)) + Ok(( + pairs + .iter() + .find(|&&(key, _)| search == *key) + .map(|&(_, ref ev)| ev), + search, + )) } /// Returns wether `obj` is a platform object @@ -228,23 +234,26 @@ pub fn is_platform_object(obj: *mut JSObject) -> bool { /// Get the property with name `property` from `object`. /// Returns `Err(())` on JSAPI failure (there is a pending exception), and /// `Ok(false)` if there was no property with the given name. -pub fn get_dictionary_property(cx: *mut JSContext, - object: HandleObject, - property: &str, - rval: MutableHandleValue) - -> Result { - fn has_property(cx: *mut JSContext, - object: HandleObject, - property: &CString, - found: &mut bool) - -> bool { +pub fn get_dictionary_property( + cx: *mut JSContext, + object: HandleObject, + property: &str, + rval: MutableHandleValue, +) -> Result { + fn has_property( + cx: *mut JSContext, + object: HandleObject, + property: &CString, + found: &mut bool, + ) -> bool { unsafe { JS_HasProperty(cx, object, property.as_ptr(), found) } } - fn get_property(cx: *mut JSContext, - object: HandleObject, - property: &CString, - value: MutableHandleValue) - -> bool { + fn get_property( + cx: *mut JSContext, + object: HandleObject, + property: &CString, + value: MutableHandleValue, + ) -> bool { unsafe { JS_GetProperty(cx, object, property.as_ptr(), value) } } @@ -272,11 +281,12 @@ pub fn get_dictionary_property(cx: *mut JSContext, /// Set the property with name `property` from `object`. /// Returns `Err(())` on JSAPI failure, or null object, /// and Ok(()) otherwise -pub fn set_dictionary_property(cx: *mut JSContext, - object: HandleObject, - property: &str, - value: HandleValue) - -> Result<(), ()> { +pub fn set_dictionary_property( + cx: *mut JSContext, + object: HandleObject, + property: &str, + value: HandleValue, +) -> Result<(), ()> { if object.get().is_null() { return Err(()); } @@ -292,11 +302,12 @@ pub fn set_dictionary_property(cx: *mut JSContext, } /// Returns whether `proxy` has a property `id` on its prototype. -pub unsafe fn has_property_on_prototype(cx: *mut JSContext, - proxy: HandleObject, - id: HandleId, - found: &mut bool) - -> bool { +pub unsafe fn has_property_on_prototype( + cx: *mut JSContext, + proxy: HandleObject, + id: HandleId, + found: &mut bool, +) -> bool { rooted!(in(cx) let mut proto = ptr::null_mut::()); if !JS_GetPrototype(cx, proxy, proto.handle_mut()) { return false; @@ -322,9 +333,11 @@ pub unsafe fn trace_global(tracer: *mut JSTracer, obj: *mut JSObject) { let array = get_proto_or_iface_array(obj); for proto in (*array).iter() { if !proto.is_null() { - trace_object(tracer, - "prototype", - &*(proto as *const *mut JSObject as *const Heap<*mut JSObject>)); + trace_object( + tracer, + "prototype", + &*(proto as *const *mut JSObject as *const Heap<*mut JSObject>), + ); } } } @@ -343,11 +356,11 @@ pub unsafe extern "C" fn enumerate_global(cx: *mut JSContext, obj: RawHandleObje /// Resolve a lazy global property, for interface objects and named constructors. pub unsafe extern "C" fn resolve_global( - cx: *mut JSContext, - obj: RawHandleObject, - id: RawHandleId, - rval: *mut bool) - -> bool { + cx: *mut JSContext, + obj: RawHandleObject, + id: RawHandleId, + rval: *mut bool, +) -> bool { assert!(JS_IsGlobalObject(obj.get())); if !JS_ResolveStandardClass(cx, obj, id, rval) { return false; @@ -379,20 +392,23 @@ pub unsafe extern "C" fn resolve_global( true } -unsafe extern "C" fn wrap(cx: *mut JSContext, - _existing: RawHandleObject, - obj: RawHandleObject) - -> *mut JSObject { +unsafe extern "C" fn wrap( + cx: *mut JSContext, + _existing: RawHandleObject, + obj: RawHandleObject, +) -> *mut JSObject { // FIXME terrible idea. need security wrappers // https://github.com/servo/servo/issues/2382 WrapperNew(cx, obj, GetCrossCompartmentWrapper(), ptr::null(), false) } -unsafe extern "C" fn pre_wrap(cx: *mut JSContext, - _scope: RawHandleObject, - obj: RawHandleObject, - _object_passed_to_wrap: RawHandleObject, - rval: RawMutableHandleObject) { +unsafe extern "C" fn pre_wrap( + cx: *mut JSContext, + _scope: RawHandleObject, + obj: RawHandleObject, + _object_passed_to_wrap: RawHandleObject, + rval: RawMutableHandleObject, +) { let _ac = JSAutoCompartment::new(cx, obj.get()); let obj = ToWindowProxyIfWindow(obj.get()); assert!(!obj.is_null()); @@ -406,23 +422,29 @@ pub static WRAP_CALLBACKS: JSWrapObjectCallbacks = JSWrapObjectCallbacks { }; /// Deletes the property `id` from `object`. -pub unsafe fn delete_property_by_id(cx: *mut JSContext, - object: HandleObject, - id: HandleId, - bp: *mut ObjectOpResult) - -> bool { +pub unsafe fn delete_property_by_id( + cx: *mut JSContext, + object: HandleObject, + id: HandleId, + bp: *mut ObjectOpResult, +) -> bool { JS_DeletePropertyById(cx, object, id, bp) } -unsafe fn generic_call(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal, - is_lenient: bool, - call: unsafe extern fn(*const JSJitInfo, *mut JSContext, - RawHandleObject, *mut libc::c_void, u32, - *mut JSVal) - -> bool) - -> bool { +unsafe fn generic_call( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, + is_lenient: bool, + call: unsafe extern "C" fn( + *const JSJitInfo, + *mut JSContext, + RawHandleObject, + *mut libc::c_void, + u32, + *mut JSVal, + ) -> bool, +) -> bool { let args = CallArgs::from_vp(vp, argc); let info = RUST_FUNCTION_VALUE_TO_JITINFO(JS_CALLEE(cx, vp)); @@ -441,9 +463,8 @@ unsafe fn generic_call(cx: *mut JSContext, }; rooted!(in(cx) let obj = obj); let depth = (*info).depth; - let proto_check = |class: &'static DOMClass| { - class.interface_chain[depth as usize] as u16 == proto_id - }; + let proto_check = + |class: &'static DOMClass| class.interface_chain[depth as usize] as u16 == proto_id; let this = match private_from_proto_check(obj.get(), proto_check) { Ok(val) => val, Err(()) => { @@ -455,42 +476,53 @@ unsafe fn generic_call(cx: *mut JSContext, throw_invalid_this(cx, proto_id); return false; } - } + }, }; - call(info, cx, obj.handle().into(), this as *mut libc::c_void, argc, vp) + call( + info, + cx, + obj.handle().into(), + this as *mut libc::c_void, + argc, + vp, + ) } /// Generic method of IDL interface. -pub unsafe extern "C" fn generic_method(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal) - -> bool { +pub unsafe extern "C" fn generic_method( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, +) -> bool { generic_call(cx, argc, vp, false, CallJitMethodOp) } /// Generic getter of IDL interface. -pub unsafe extern "C" fn generic_getter(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal) - -> bool { +pub unsafe extern "C" fn generic_getter( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, +) -> bool { generic_call(cx, argc, vp, false, CallJitGetterOp) } /// Generic lenient getter of IDL interface. -pub unsafe extern "C" fn generic_lenient_getter(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal) - -> bool { +pub unsafe extern "C" fn generic_lenient_getter( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, +) -> bool { generic_call(cx, argc, vp, true, CallJitGetterOp) } -unsafe extern "C" fn call_setter(info: *const JSJitInfo, - cx: *mut JSContext, - handle: RawHandleObject, - this: *mut libc::c_void, - argc: u32, - vp: *mut JSVal) - -> bool { +unsafe extern "C" fn call_setter( + info: *const JSJitInfo, + cx: *mut JSContext, + handle: RawHandleObject, + this: *mut libc::c_void, + argc: u32, + vp: *mut JSVal, +) -> bool { if !CallJitSetterOp(info, cx, handle, this, argc, vp) { return false; } @@ -499,31 +531,34 @@ unsafe extern "C" fn call_setter(info: *const JSJitInfo, } /// Generic setter of IDL interface. -pub unsafe extern "C" fn generic_setter(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal) - -> bool { +pub unsafe extern "C" fn generic_setter( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, +) -> bool { generic_call(cx, argc, vp, false, call_setter) } /// Generic lenient setter of IDL interface. -pub unsafe extern "C" fn generic_lenient_setter(cx: *mut JSContext, - argc: libc::c_uint, - vp: *mut JSVal) - -> bool { +pub unsafe extern "C" fn generic_lenient_setter( + cx: *mut JSContext, + argc: libc::c_uint, + vp: *mut JSVal, +) -> bool { generic_call(cx, argc, vp, true, call_setter) } -unsafe extern "C" fn instance_class_has_proto_at_depth(clasp: *const js::jsapi::Class, - proto_id: u32, - depth: u32) - -> bool { +unsafe extern "C" fn instance_class_has_proto_at_depth( + clasp: *const js::jsapi::Class, + proto_id: u32, + depth: u32, +) -> bool { let domclass: *const DOMJSClass = clasp as *const _; let domclass = &*domclass; domclass.dom_class.interface_chain[depth as usize] as u32 == proto_id } -#[allow(missing_docs)] // FIXME +#[allow(missing_docs)] // FIXME pub const DOM_CALLBACKS: DOMCallbacks = DOMCallbacks { instanceClassMatchesProto: Some(instance_class_has_proto_at_depth), }; diff --git a/components/script/dom/bindings/weakref.rs b/components/script/dom/bindings/weakref.rs index 4cafafc0440..aed0d9ec6f8 100644 --- a/components/script/dom/bindings/weakref.rs +++ b/components/script/dom/bindings/weakref.rs @@ -70,9 +70,11 @@ pub trait WeakReferenceable: DomObject + Sized { let box_ = &*ptr; assert!(box_.value.get().is_some()); let new_count = box_.count.get() + 1; - trace!("Incrementing WeakBox refcount for {:p} to {}.", - self, - new_count); + trace!( + "Incrementing WeakBox refcount for {:p} to {}.", + self, + new_count + ); box_.count.set(new_count); WeakRef { ptr: ptr::NonNull::new_unchecked(ptr), @@ -91,9 +93,10 @@ impl WeakRef { /// DomRoot a weak reference. Returns `None` if the object was already collected. pub fn root(&self) -> Option> { - unsafe { &*self.ptr.as_ptr() }.value.get().map(|ptr| unsafe { - DomRoot::from_ref(&*ptr.as_ptr()) - }) + unsafe { &*self.ptr.as_ptr() } + .value + .get() + .map(|ptr| unsafe { DomRoot::from_ref(&*ptr.as_ptr()) }) } /// Return whether the weakly-referenced object is still alive. @@ -108,9 +111,7 @@ impl Clone for WeakRef { let box_ = &*self.ptr.as_ptr(); let new_count = box_.count.get() + 1; box_.count.set(new_count); - WeakRef { - ptr: self.ptr, - } + WeakRef { ptr: self.ptr } } } } @@ -122,10 +123,10 @@ impl MallocSizeOf for WeakRef { } impl PartialEq for WeakRef { - fn eq(&self, other: &Self) -> bool { + fn eq(&self, other: &Self) -> bool { unsafe { (*self.ptr.as_ptr()).value.get().map(ptr::NonNull::as_ptr) == - (*other.ptr.as_ptr()).value.get().map(ptr::NonNull::as_ptr) + (*other.ptr.as_ptr()).value.get().map(ptr::NonNull::as_ptr) } } } @@ -190,7 +191,9 @@ impl MutableWeakRef { /// DomRoot a mutable weak reference. Returns `None` if the object /// was already collected. pub fn root(&self) -> Option> { - unsafe { &*self.cell.get() }.as_ref().and_then(WeakRef::root) + unsafe { &*self.cell.get() } + .as_ref() + .and_then(WeakRef::root) } } @@ -233,7 +236,10 @@ impl WeakRefVec { let mut i = 0; while i < self.vec.len() { if self.vec[i].is_alive() { - f(WeakRefEntry { vec: self, index: &mut i }); + f(WeakRefEntry { + vec: self, + index: &mut i, + }); } else { self.vec.swap_remove(i); } @@ -293,13 +299,13 @@ impl<'a, T: WeakReferenceable + 'a> Drop for WeakRefEntry<'a, T> { #[derive(MallocSizeOf)] pub struct DOMTracker { - dom_objects: DomRefCell> + dom_objects: DomRefCell>, } impl DOMTracker { pub fn new() -> Self { Self { - dom_objects: DomRefCell::new(WeakRefVec::new()) + dom_objects: DomRefCell::new(WeakRefVec::new()), } } diff --git a/components/script/dom/bindings/xmlname.rs b/components/script/dom/bindings/xmlname.rs index fc330b7563d..2a2b8a462a0 100644 --- a/components/script/dom/bindings/xmlname.rs +++ b/components/script/dom/bindings/xmlname.rs @@ -25,9 +25,10 @@ pub fn validate_qualified_name(qualified_name: &str) -> ErrorResult { /// Validate a namespace and qualified name and extract their parts. /// See https://dom.spec.whatwg.org/#validate-and-extract for details. -pub fn validate_and_extract(namespace: Option, - qualified_name: &str) - -> Fallible<(Namespace, Option, LocalName)> { +pub fn validate_and_extract( + namespace: Option, + qualified_name: &str, +) -> Fallible<(Namespace, Option, LocalName)> { // Step 1. let namespace = namespace_from_domstring(namespace); @@ -76,7 +77,7 @@ pub fn validate_and_extract(namespace: Option, (ns, p) => { // Step 10. Ok((ns, p.map(Prefix::from), LocalName::from(local_name))) - } + }, } } @@ -115,14 +116,10 @@ pub fn xml_name_type(name: &str) -> XMLName { } fn is_valid_continuation(c: char) -> bool { - is_valid_start(c) || - match c { - '-' | - '.' | - '0'...'9' | - '\u{B7}' | - '\u{300}'...'\u{36F}' | - '\u{203F}'...'\u{2040}' => true, + is_valid_start(c) || match c { + '-' | '.' | '0'...'9' | '\u{B7}' | '\u{300}'...'\u{36F}' | '\u{203F}'...'\u{2040}' => { + true + }, _ => false, } } @@ -140,7 +137,7 @@ pub fn xml_name_type(name: &str) -> XMLName { non_qname_colons = true; } c - } + }, }; for c in iter { diff --git a/components/script/dom/blob.rs b/components/script/dom/blob.rs index d8017f23ffa..490404bbf32 100644 --- a/components/script/dom/blob.rs +++ b/components/script/dom/blob.rs @@ -30,7 +30,6 @@ pub struct FileBlob { size: u64, } - /// Different backends of Blob #[must_root] #[derive(JSTraceable)] @@ -43,7 +42,7 @@ pub enum BlobImpl { /// relative positions of current slicing range, /// IMPORTANT: The depth of tree is only two, i.e. the parent Blob must be /// either File-based or Memory-based - Sliced(Dom, RelativePos) + Sliced(Dom, RelativePos), } impl BlobImpl { @@ -76,9 +75,7 @@ pub struct Blob { impl Blob { #[allow(unrooted_must_root)] - pub fn new( - global: &GlobalScope, blob_impl: BlobImpl, typeString: String) - -> DomRoot { + pub fn new(global: &GlobalScope, blob_impl: BlobImpl, typeString: String) -> DomRoot { let boxed_blob = Box::new(Blob::new_inherited(blob_impl, typeString)); reflect_dom_object(boxed_blob, global, BlobBinding::Wrap) } @@ -95,41 +92,49 @@ impl Blob { } #[allow(unrooted_must_root)] - fn new_sliced(parent: &Blob, rel_pos: RelativePos, - relative_content_type: DOMString) -> DomRoot { + fn new_sliced( + parent: &Blob, + rel_pos: RelativePos, + relative_content_type: DOMString, + ) -> DomRoot { let blob_impl = match *parent.blob_impl.borrow() { BlobImpl::File(_) => { // Create new parent node BlobImpl::Sliced(Dom::from_ref(parent), rel_pos) - } + }, BlobImpl::Memory(_) => { // Create new parent node BlobImpl::Sliced(Dom::from_ref(parent), rel_pos) - } + }, BlobImpl::Sliced(ref grandparent, ref old_rel_pos) => { // Adjust the slicing position, using same parent BlobImpl::Sliced(grandparent.clone(), old_rel_pos.slice_inner(&rel_pos)) - } + }, }; Blob::new(&parent.global(), blob_impl, relative_content_type.into()) } // https://w3c.github.io/FileAPI/#constructorBlob - pub fn Constructor(global: &GlobalScope, - blobParts: Option>, - blobPropertyBag: &BlobBinding::BlobPropertyBag) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + blobParts: Option>, + blobPropertyBag: &BlobBinding::BlobPropertyBag, + ) -> Fallible> { // TODO: accept other blobParts types - ArrayBuffer or ArrayBufferView let bytes: Vec = match blobParts { None => Vec::new(), Some(blobparts) => match blob_parts_to_bytes(blobparts) { Ok(bytes) => bytes, Err(_) => return Err(Error::InvalidCharacter), - } + }, }; - Ok(Blob::new(global, BlobImpl::new_from_bytes(bytes), blobPropertyBag.type_.to_string())) + Ok(Blob::new( + global, + BlobImpl::new_from_bytes(bytes), + blobPropertyBag.type_.to_string(), + )) } /// Get a slice to inner data, this might incur synchronous read and caching @@ -141,7 +146,7 @@ impl Blob { None => { let bytes = read_file(&self.global(), f.id.clone())?; (bytes, true) - } + }, }; // Cache @@ -150,14 +155,12 @@ impl Blob { } Ok(buffer) - } + }, BlobImpl::Memory(ref s) => Ok(s.clone()), - BlobImpl::Sliced(ref parent, ref rel_pos) => { - parent.get_bytes().map(|v| { - let range = rel_pos.to_abs_range(v.len()); - v.index(range).to_vec() - }) - } + BlobImpl::Sliced(ref parent, ref rel_pos) => parent.get_bytes().map(|v| { + let range = rel_pos.to_abs_range(v.len()); + v.index(range).to_vec() + }), } } @@ -171,13 +174,19 @@ impl Blob { pub fn get_blob_url_id(&self) -> Uuid { let opt_sliced_parent = match *self.blob_impl.borrow() { BlobImpl::Sliced(ref parent, ref rel_pos) => { - Some((parent.promote(/* set_valid is */ false), rel_pos.clone(), parent.Size())) - } - _ => None + Some(( + parent.promote(/* set_valid is */ false), + rel_pos.clone(), + parent.Size(), + )) + }, + _ => None, }; match opt_sliced_parent { - Some((parent_id, rel_pos, size)) => self.create_sliced_url_id(&parent_id, &rel_pos, size), + Some((parent_id, rel_pos, size)) => { + self.create_sliced_url_id(&parent_id, &rel_pos, size) + }, None => self.promote(/* set_valid is */ true), } } @@ -196,13 +205,15 @@ impl Blob { debug!("Sliced can't have a sliced parent"); // Return dummy id return Uuid::new_v4(); - } + }, BlobImpl::File(ref f) => { if set_valid { let origin = get_blob_origin(&global_url); - let (tx, rx) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); + let (tx, rx) = + ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let msg = FileManagerThreadMsg::ActivateBlobURL(f.id.clone(), tx, origin.clone()); + let msg = + FileManagerThreadMsg::ActivateBlobURL(f.id.clone(), tx, origin.clone()); self.send_to_file_manager(msg); match rx.recv().unwrap() { @@ -214,7 +225,7 @@ impl Blob { // no need to activate return f.id.clone(); } - } + }, BlobImpl::Memory(ref mut bytes_in) => mem::swap(bytes_in, &mut bytes), }; @@ -240,21 +251,28 @@ impl Blob { size: bytes.len() as u64, }); id - } + }, // Dummy id Err(_) => Uuid::new_v4(), } } /// Get a FileID representing sliced parent-blob content - fn create_sliced_url_id(&self, parent_id: &Uuid, - rel_pos: &RelativePos, parent_len: u64) -> Uuid { + fn create_sliced_url_id( + &self, + parent_id: &Uuid, + rel_pos: &RelativePos, + parent_len: u64, + ) -> Uuid { let origin = get_blob_origin(&self.global().get_url()); let (tx, rx) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let msg = FileManagerThreadMsg::AddSlicedURLEntry(parent_id.clone(), - rel_pos.clone(), - tx, origin.clone()); + let msg = FileManagerThreadMsg::AddSlicedURLEntry( + parent_id.clone(), + rel_pos.clone(), + tx, + origin.clone(), + ); self.send_to_file_manager(msg); match rx.recv().expect("File manager thread is down") { Ok(new_id) => { @@ -267,11 +285,11 @@ impl Blob { // Return the indirect id reference new_id - } + }, Err(_) => { // Return dummy id Uuid::new_v4() - } + }, } } @@ -303,7 +321,7 @@ impl Drop for Blob { fn read_file(global: &GlobalScope, id: Uuid) -> Result, ()> { let resource_threads = global.resource_threads(); - let (chan, recv) = ipc::channel(global.time_profiler_chan().clone()).map_err(|_|())?; + let (chan, recv) = ipc::channel(global.time_profiler_chan().clone()).map_err(|_| ())?; let origin = get_blob_origin(&global.get_url()); let check_url_validity = false; let msg = FileManagerThreadMsg::ReadFile(chan, id, check_url_validity, origin); @@ -315,13 +333,13 @@ fn read_file(global: &GlobalScope, id: Uuid) -> Result, ()> { match recv.recv().unwrap() { Ok(ReadFileProgress::Meta(mut blob_buf)) => { bytes.append(&mut blob_buf.bytes); - } + }, Ok(ReadFileProgress::Partial(mut bytes_in)) => { bytes.append(&mut bytes_in); - } + }, Ok(ReadFileProgress::EOF) => { return Ok(bytes); - } + }, Err(_) => return Err(()), } } @@ -330,7 +348,9 @@ fn read_file(global: &GlobalScope, id: Uuid) -> Result, ()> { /// Extract bytes from BlobParts, used by Blob and File constructor /// #[allow(unsafe_code)] -pub fn blob_parts_to_bytes(mut blobparts: Vec) -> Result, ()> { +pub fn blob_parts_to_bytes( + mut blobparts: Vec, +) -> Result, ()> { let mut ret = vec![]; for blobpart in &mut blobparts { match blobpart { @@ -348,7 +368,7 @@ pub fn blob_parts_to_bytes(mut blobparts: Vec unsafe { let bytes = a.as_slice(); ret.extend(bytes); - } + }, } } @@ -359,10 +379,11 @@ impl BlobMethods for Blob { // https://w3c.github.io/FileAPI/#dfn-size fn Size(&self) -> u64 { match *self.blob_impl.borrow() { - BlobImpl::File(ref f) => f.size, - BlobImpl::Memory(ref v) => v.len() as u64, - BlobImpl::Sliced(ref parent, ref rel_pos) => - rel_pos.to_abs_range(parent.Size() as usize).len() as u64, + BlobImpl::File(ref f) => f.size, + BlobImpl::Memory(ref v) => v.len() as u64, + BlobImpl::Sliced(ref parent, ref rel_pos) => { + rel_pos.to_abs_range(parent.Size() as usize).len() as u64 + }, } } @@ -372,11 +393,12 @@ impl BlobMethods for Blob { } // https://w3c.github.io/FileAPI/#slice-method-algo - fn Slice(&self, - start: Option, - end: Option, - content_type: Option) - -> DomRoot { + fn Slice( + &self, + start: Option, + end: Option, + content_type: Option, + ) -> DomRoot { let rel_pos = RelativePos::from_opts(start, end); Blob::new_sliced(self, rel_pos, content_type.unwrap_or(DOMString::from(""))) } @@ -391,8 +413,8 @@ fn normalize_type_string(s: &str) -> String { if is_ascii_printable(s) { let s_lower = s.to_ascii_lowercase(); // match s_lower.parse() as Result { - // Ok(_) => s_lower, - // Err(_) => "".to_string() + // Ok(_) => s_lower, + // Err(_) => "".to_string() s_lower } else { "".to_string() diff --git a/components/script/dom/bluetooth.rs b/components/script/dom/bluetooth.rs index b980562c46d..99c02576a1b 100644 --- a/components/script/dom/bluetooth.rs +++ b/components/script/dom/bluetooth.rs @@ -12,7 +12,7 @@ use dom::bindings::codegen::Bindings::BluetoothBinding::{self, BluetoothDataFilt use dom::bindings::codegen::Bindings::BluetoothBinding::{BluetoothMethods, RequestDeviceOptions}; use dom::bindings::codegen::Bindings::BluetoothPermissionResultBinding::BluetoothPermissionDescriptor; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerBinding:: - BluetoothRemoteGATTServerMethods; +BluetoothRemoteGATTServerMethods; use dom::bindings::codegen::Bindings::PermissionStatusBinding::{PermissionName, PermissionState}; use dom::bindings::codegen::UnionTypes::{ArrayBufferViewOrArrayBuffer, StringOrUnsignedLong}; use dom::bindings::error::Error::{self, Network, Security, Type}; @@ -42,20 +42,26 @@ use std::str::FromStr; use std::sync::{Arc, Mutex}; use task::TaskOnce; -const KEY_CONVERSION_ERROR: &'static str = "This `manufacturerData` key can not be parsed as unsigned short:"; -const FILTER_EMPTY_ERROR: &'static str = "'filters' member, if present, must be nonempty to find any devices."; +const KEY_CONVERSION_ERROR: &'static str = + "This `manufacturerData` key can not be parsed as unsigned short:"; +const FILTER_EMPTY_ERROR: &'static str = + "'filters' member, if present, must be nonempty to find any devices."; const FILTER_ERROR: &'static str = "A filter must restrict the devices in some way."; -const MANUFACTURER_DATA_ERROR: &'static str = "'manufacturerData', if present, must be non-empty to filter devices."; -const MASK_LENGTH_ERROR: &'static str = "`mask`, if present, must have the same length as `dataPrefix`."; +const MANUFACTURER_DATA_ERROR: &'static str = + "'manufacturerData', if present, must be non-empty to filter devices."; +const MASK_LENGTH_ERROR: &'static str = + "`mask`, if present, must have the same length as `dataPrefix`."; // 248 is the maximum number of UTF-8 code units in a Bluetooth Device Name. const MAX_DEVICE_NAME_LENGTH: usize = 248; const NAME_PREFIX_ERROR: &'static str = "'namePrefix', if present, must be nonempty."; const NAME_TOO_LONG_ERROR: &'static str = "A device name can't be longer than 248 bytes."; -const SERVICE_DATA_ERROR: &'static str = "'serviceData', if present, must be non-empty to filter devices."; +const SERVICE_DATA_ERROR: &'static str = + "'serviceData', if present, must be non-empty to filter devices."; const SERVICE_ERROR: &'static str = "'services', if present, must contain at least one service."; const OPTIONS_ERROR: &'static str = "Fields of 'options' conflict with each other. Either 'acceptAllDevices' member must be true, or 'filters' member must be set to a value."; -const BT_DESC_CONVERSION_ERROR: &'static str = "Can't convert to an IDL value of type BluetoothPermissionDescriptor"; +const BT_DESC_CONVERSION_ERROR: &'static str = + "Can't convert to an IDL value of type BluetoothPermissionDescriptor"; #[derive(JSTraceable, MallocSizeOf)] pub struct AllowedBluetoothDevice { @@ -84,7 +90,10 @@ impl BluetoothExtraPermissionData { } pub fn allowed_devices_contains_id(&self, id: DOMString) -> bool { - self.allowed_devices.borrow().iter().any(|d| d.deviceId == id) + self.allowed_devices + .borrow() + .iter() + .any(|d| d.deviceId == id) } } @@ -132,9 +141,11 @@ impl Bluetooth { } pub fn new(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(Bluetooth::new_inherited()), - global, - BluetoothBinding::Wrap) + reflect_dom_object( + Box::new(Bluetooth::new_inherited()), + global, + BluetoothBinding::Wrap, + ) } fn get_bluetooth_thread(&self) -> IpcSender { @@ -146,19 +157,21 @@ impl Bluetooth { } // https://webbluetoothcg.github.io/web-bluetooth/#request-bluetooth-devices - fn request_bluetooth_devices(&self, - p: &Rc, - filters: &Option>, - optional_services: &Option>, - sender: IpcSender) { + fn request_bluetooth_devices( + &self, + p: &Rc, + filters: &Option>, + optional_services: &Option>, + sender: IpcSender, + ) { // TODO: Step 1: Triggered by user activation. // Step 2.2: There are no requiredServiceUUIDS, we scan for all devices. - let mut uuid_filters = vec!(); + let mut uuid_filters = vec![]; if let &Some(ref filters) = filters { // Step 2.1. - if filters.is_empty() { + if filters.is_empty() { p.reject_error(Type(FILTER_EMPTY_ERROR.to_owned())); return; } @@ -180,7 +193,7 @@ impl Bluetooth { } } - let mut optional_services_uuids = vec!(); + let mut optional_services_uuids = vec![]; if let &Some(ref opt_services) = optional_services { for opt_service in opt_services { // Step 2.5 - 2.6. @@ -201,71 +214,83 @@ impl Bluetooth { } } - let option = RequestDeviceoptions::new(BluetoothScanfilterSequence::new(uuid_filters), - ServiceUUIDSequence::new(optional_services_uuids)); + let option = RequestDeviceoptions::new( + BluetoothScanfilterSequence::new(uuid_filters), + ServiceUUIDSequence::new(optional_services_uuids), + ); // Step 4 - 5. - if let PermissionState::Denied = get_descriptor_permission_state(PermissionName::Bluetooth, None) { + if let PermissionState::Denied = + get_descriptor_permission_state(PermissionName::Bluetooth, None) + { return p.reject_error(Error::NotFound); } // Note: Step 3, 6 - 8 are implemented in // components/net/bluetooth_thread.rs in request_device function. - self.get_bluetooth_thread().send(BluetoothRequest::RequestDevice(option, sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::RequestDevice(option, sender)) + .unwrap(); } } pub fn response_async( - promise: &Rc, - receiver: &T) -> IpcSender { + promise: &Rc, + receiver: &T, +) -> IpcSender { let (action_sender, action_receiver) = ipc::channel().unwrap(); let task_source = receiver.global().networking_task_source(); let context = Arc::new(Mutex::new(BluetoothContext { promise: Some(TrustedPromise::new(promise.clone())), receiver: Trusted::new(receiver), })); - ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| { - struct ListenerTask { - context: Arc>>, - action: BluetoothResponseResult, - } + ROUTER.add_route( + action_receiver.to_opaque(), + Box::new(move |message| { + struct ListenerTask { + context: Arc>>, + action: BluetoothResponseResult, + } - impl TaskOnce for ListenerTask - where - T: AsyncBluetoothListener + DomObject, - { - fn run_once(self) { - let mut context = self.context.lock().unwrap(); - context.response(self.action); + impl TaskOnce for ListenerTask + where + T: AsyncBluetoothListener + DomObject, + { + fn run_once(self) { + let mut context = self.context.lock().unwrap(); + context.response(self.action); + } } - } - let task = ListenerTask { - context: context.clone(), - action: message.to().unwrap(), - }; + let task = ListenerTask { + context: context.clone(), + action: message.to().unwrap(), + }; - let result = task_source.queue_unconditionally(task); - if let Err(err) = result { - warn!("failed to deliver network data: {:?}", err); - } - })); + let result = task_source.queue_unconditionally(task); + if let Err(err) = result { + warn!("failed to deliver network data: {:?}", err); + } + }), + ); action_sender } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#getgattchildren -pub fn get_gatt_children ( - attribute: &T, - single: bool, - uuid_canonicalizer: F, - uuid: Option, - instance_id: String, - connected: bool, - child_type: GATTType) - -> Rc - where T: AsyncBluetoothListener + DomObject + 'static, - F: FnOnce(StringOrUnsignedLong) -> Fallible { +pub fn get_gatt_children( + attribute: &T, + single: bool, + uuid_canonicalizer: F, + uuid: Option, + instance_id: String, + connected: bool, + child_type: GATTType, +) -> Rc +where + T: AsyncBluetoothListener + DomObject + 'static, + F: FnOnce(StringOrUnsignedLong) -> Fallible, +{ let p = Promise::new(&attribute.global()); let result_uuid = if let Some(u) = uuid { @@ -275,7 +300,7 @@ pub fn get_gatt_children ( Err(e) => { p.reject_error(e); return p; - } + }, }; // Step 2. if uuid_is_blocklisted(canonicalized.as_ref(), Blocklist::All) { @@ -298,8 +323,17 @@ pub fn get_gatt_children ( // Note: Steps 6 - 7 are implemented in components/bluetooth/lib.rs in get_descriptor function // and in handle_response function. let sender = response_async(&p, attribute); - attribute.global().as_window().bluetooth_thread().send( - BluetoothRequest::GetGATTChildren(instance_id, result_uuid, single, child_type, sender)).unwrap(); + attribute + .global() + .as_window() + .bluetooth_thread() + .send(BluetoothRequest::GetGATTChildren( + instance_id, + result_uuid, + single, + child_type, + sender, + )).unwrap(); return p; } @@ -307,11 +341,12 @@ pub fn get_gatt_children ( fn canonicalize_filter(filter: &BluetoothLEScanFilterInit) -> Fallible { // Step 1. if filter.services.is_none() && - filter.name.is_none() && - filter.namePrefix.is_none() && - filter.manufacturerData.is_none() && - filter.serviceData.is_none() { - return Err(Type(FILTER_ERROR.to_owned())); + filter.name.is_none() && + filter.namePrefix.is_none() && + filter.manufacturerData.is_none() && + filter.serviceData.is_none() + { + return Err(Type(FILTER_ERROR.to_owned())); } // Step 2: There is no empty canonicalizedFilter member, @@ -325,7 +360,7 @@ fn canonicalize_filter(filter: &BluetoothLEScanFilterInit) -> Fallible Fallible Fallible vec!(), + None => vec![], }; // Step 4. @@ -388,13 +423,18 @@ fn canonicalize_filter(filter: &BluetoothLEScanFilterInit) -> Fallible id, - Err(err) => return Err(Type(format!("{} {} {}", KEY_CONVERSION_ERROR, key, err))), + Err(err) => { + return Err(Type(format!("{} {} {}", KEY_CONVERSION_ERROR, key, err))) + }, }; // Step 7.3: No need to convert to IDL values since this is only used by native code. // Step 7.4 - 7.5. - map.insert(manufacturer_id, canonicalize_bluetooth_data_filter_init(bdfi)?); + map.insert( + manufacturer_id, + canonicalize_bluetooth_data_filter_init(bdfi)?, + ); } Some(map) }, @@ -414,7 +454,7 @@ fn canonicalize_filter(filter: &BluetoothLEScanFilterInit) -> Fallible StringOrUnsignedLong::UnsignedLong(number), // Step 9.2. - _ => StringOrUnsignedLong::String(key.clone()) + _ => StringOrUnsignedLong::String(key.clone()), }; // Step 9.3 - 9.4. @@ -436,16 +476,24 @@ fn canonicalize_filter(filter: &BluetoothLEScanFilterInit) -> Fallible Fallible<(Vec, Vec)> { +fn canonicalize_bluetooth_data_filter_init( + bdfi: &BluetoothDataFilterInit, +) -> Fallible<(Vec, Vec)> { // Step 1. let data_prefix = match bdfi.dataPrefix { Some(ArrayBufferViewOrArrayBuffer::ArrayBufferView(ref avb)) => avb.to_vec(), Some(ArrayBufferViewOrArrayBuffer::ArrayBuffer(ref ab)) => ab.to_vec(), - None => vec![] + None => vec![], }; // Step 2. @@ -454,7 +502,7 @@ fn canonicalize_bluetooth_data_filter_init(bdfi: &BluetoothDataFilterInit) -> Fa let mask = match bdfi.mask { Some(ArrayBufferViewOrArrayBuffer::ArrayBufferView(ref avb)) => avb.to_vec(), Some(ArrayBufferViewOrArrayBuffer::ArrayBuffer(ref ab)) => ab.to_vec(), - None => vec![0xFF; data_prefix.len()] + None => vec![0xFF; data_prefix.len()], }; // Step 3. @@ -486,7 +534,8 @@ impl BluetoothMethods for Bluetooth { let p = Promise::new(&self.global()); // Step 1. if (option.filters.is_some() && option.acceptAllDevices) || - (option.filters.is_none() && !option.acceptAllDevices) { + (option.filters.is_none() && !option.acceptAllDevices) + { p.reject_error(Error::Type(OPTIONS_ERROR.to_owned())); return p; } @@ -505,13 +554,18 @@ impl BluetoothMethods for Bluetooth { // Step 1. We did not override the method // Step 2 - 3. in handle_response let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::GetAvailability(sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::GetAvailability(sender)) + .unwrap(); p } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-onavailabilitychanged - event_handler!(availabilitychanged, GetOnavailabilitychanged, SetOnavailabilitychanged); + event_handler!( + availabilitychanged, + GetOnavailabilitychanged, + SetOnavailabilitychanged + ); } impl AsyncBluetoothListener for Bluetooth { @@ -524,18 +578,21 @@ impl AsyncBluetoothListener for Bluetooth { if let Some(existing_device) = device_instance_map.get(&device.id.clone()) { return promise.resolve_native(&**existing_device); } - let bt_device = BluetoothDevice::new(&self.global(), - DOMString::from(device.id.clone()), - device.name.map(DOMString::from), - &self); + let bt_device = BluetoothDevice::new( + &self.global(), + DOMString::from(device.id.clone()), + device.name.map(DOMString::from), + &self, + ); device_instance_map.insert(device.id.clone(), Dom::from_ref(&bt_device)); - self.global().as_window().bluetooth_extra_permission_data().add_new_allowed_device( - AllowedBluetoothDevice { + self.global() + .as_window() + .bluetooth_extra_permission_data() + .add_new_allowed_device(AllowedBluetoothDevice { deviceId: DOMString::from(device.id), mayUseGATT: true, - } - ); + }); // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetooth-requestdevice // Step 5. promise.resolve_native(&bt_device); @@ -544,7 +601,7 @@ impl AsyncBluetoothListener for Bluetooth { // Step 2 - 3. BluetoothResponse::GetAvailability(is_available) => { promise.resolve_native(&is_available); - } + }, _ => promise.reject_error(Error::Type("Something went wrong...".to_owned())), } } @@ -555,11 +612,14 @@ impl PermissionAlgorithm for Bluetooth { type Status = BluetoothPermissionResult; #[allow(unsafe_code)] - fn create_descriptor(cx: *mut JSContext, - permission_descriptor_obj: *mut JSObject) - -> Result { + fn create_descriptor( + cx: *mut JSContext, + permission_descriptor_obj: *mut JSObject, + ) -> Result { rooted!(in(cx) let mut property = UndefinedValue()); - property.handle_mut().set(ObjectValue(permission_descriptor_obj)); + property + .handle_mut() + .set(ObjectValue(permission_descriptor_obj)); unsafe { match BluetoothPermissionDescriptor::new(cx, property.handle()) { Ok(ConversionResult::Success(descriptor)) => Ok(descriptor), @@ -592,7 +652,10 @@ impl PermissionAlgorithm for Bluetooth { // Step 5. let global = status.global(); - let allowed_devices = global.as_window().bluetooth_extra_permission_data().get_allowed_devices(); + let allowed_devices = global + .as_window() + .bluetooth_extra_permission_data() + .get_allowed_devices(); let bluetooth = status.get_bluetooth(); let device_map = bluetooth.get_device_map().borrow(); @@ -622,11 +685,15 @@ impl PermissionAlgorithm for Bluetooth { // Step 6.2.2. // Instead of creating an internal slot we send an ipc message to the Bluetooth thread // to check if one of the filters matches. - let (sender, receiver) = ProfiledIpc::channel(global.time_profiler_chan().clone()).unwrap(); - status.get_bluetooth_thread() - .send(BluetoothRequest::MatchesFilter(device_id.clone(), - BluetoothScanfilterSequence::new(scan_filters), - sender)).unwrap(); + let (sender, receiver) = + ProfiledIpc::channel(global.time_profiler_chan().clone()).unwrap(); + status + .get_bluetooth_thread() + .send(BluetoothRequest::MatchesFilter( + device_id.clone(), + BluetoothScanfilterSequence::new(scan_filters), + sender, + )).unwrap(); match receiver.recv().unwrap() { Ok(true) => (), @@ -666,17 +733,28 @@ impl PermissionAlgorithm for Bluetooth { // Step 2. let sender = response_async(promise, status); let bluetooth = status.get_bluetooth(); - bluetooth.request_bluetooth_devices(promise, &descriptor.filters, &descriptor.optionalServices, sender); + bluetooth.request_bluetooth_devices( + promise, + &descriptor.filters, + &descriptor.optionalServices, + sender, + ); // NOTE: Step 3. is in BluetoothPermissionResult's `handle_response` function. } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#revoke-bluetooth-access - fn permission_revoke(_descriptor: &BluetoothPermissionDescriptor, status: &BluetoothPermissionResult) { + fn permission_revoke( + _descriptor: &BluetoothPermissionDescriptor, + status: &BluetoothPermissionResult, + ) { // Step 1. let global = status.global(); - let allowed_devices = global.as_window().bluetooth_extra_permission_data().get_allowed_devices(); + let allowed_devices = global + .as_window() + .bluetooth_extra_permission_data() + .get_allowed_devices(); // Step 2. let bluetooth = status.get_bluetooth(); let device_map = bluetooth.get_device_map().borrow(); @@ -684,7 +762,8 @@ impl PermissionAlgorithm for Bluetooth { let id = DOMString::from(id.clone()); // Step 2.1. if allowed_devices.iter().any(|d| d.deviceId == id) && - !device.is_represented_device_null() { + !device.is_represented_device_null() + { // Note: We don't need to update the allowed_services, // because we store it in the lower level // where it is already up-to-date diff --git a/components/script/dom/bluetoothadvertisingevent.rs b/components/script/dom/bluetoothadvertisingevent.rs index 452c43eac98..2dffb0a4dfc 100644 --- a/components/script/dom/bluetoothadvertisingevent.rs +++ b/components/script/dom/bluetoothadvertisingevent.rs @@ -29,12 +29,13 @@ pub struct BluetoothAdvertisingEvent { } impl BluetoothAdvertisingEvent { - pub fn new_inherited(device: &BluetoothDevice, - name: Option, - appearance: Option, - tx_power: Option, - rssi: Option) - -> BluetoothAdvertisingEvent { + pub fn new_inherited( + device: &BluetoothDevice, + name: Option, + appearance: Option, + tx_power: Option, + rssi: Option, + ) -> BluetoothAdvertisingEvent { BluetoothAdvertisingEvent { event: Event::new_inherited(), device: Dom::from_ref(device), @@ -45,26 +46,23 @@ impl BluetoothAdvertisingEvent { } } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable, - device: &BluetoothDevice, - name: Option, - appearance: Option, - txPower: Option, - rssi: Option) - -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + device: &BluetoothDevice, + name: Option, + appearance: Option, + txPower: Option, + rssi: Option, + ) -> DomRoot { let ev = reflect_dom_object( Box::new(BluetoothAdvertisingEvent::new_inherited( - device, - name, - appearance, - txPower, - rssi + device, name, appearance, txPower, rssi, )), global, - BluetoothAdvertisingEventBinding::Wrap + BluetoothAdvertisingEventBinding::Wrap, ); { let event = ev.upcast::(); @@ -74,10 +72,11 @@ impl BluetoothAdvertisingEvent { } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothadvertisingevent-bluetoothadvertisingevent - pub fn Constructor(window: &Window, - type_: DOMString, - init: &BluetoothAdvertisingEventInit) - -> Fallible> { + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &BluetoothAdvertisingEventInit, + ) -> Fallible> { let global = window.upcast::(); let device = init.device.r(); let name = init.name.clone(); @@ -86,15 +85,17 @@ impl BluetoothAdvertisingEvent { let rssi = init.rssi.clone(); let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(BluetoothAdvertisingEvent::new(global, - Atom::from(type_), - bubbles, - cancelable, - device, - name, - appearance, - txPower, - rssi)) + Ok(BluetoothAdvertisingEvent::new( + global, + Atom::from(type_), + bubbles, + cancelable, + device, + name, + appearance, + txPower, + rssi, + )) } } diff --git a/components/script/dom/bluetoothcharacteristicproperties.rs b/components/script/dom/bluetoothcharacteristicproperties.rs index 4a0b6029224..900ec257c7d 100644 --- a/components/script/dom/bluetoothcharacteristicproperties.rs +++ b/components/script/dom/bluetoothcharacteristicproperties.rs @@ -4,14 +4,14 @@ use dom::bindings::codegen::Bindings::BluetoothCharacteristicPropertiesBinding; use dom::bindings::codegen::Bindings::BluetoothCharacteristicPropertiesBinding:: - BluetoothCharacteristicPropertiesMethods; +BluetoothCharacteristicPropertiesMethods; use dom::bindings::reflector::{Reflector, reflect_dom_object}; use dom::bindings::root::DomRoot; use dom::globalscope::GlobalScope; use dom_struct::dom_struct; // https://webbluetoothcg.github.io/web-bluetooth/#characteristicproperties - #[dom_struct] +#[dom_struct] pub struct BluetoothCharacteristicProperties { reflector_: Reflector, broadcast: bool, @@ -26,16 +26,17 @@ pub struct BluetoothCharacteristicProperties { } impl BluetoothCharacteristicProperties { - pub fn new_inherited(broadcast: bool, - read: bool, - write_without_response: bool, - write: bool, - notify: bool, - indicate: bool, - authenticated_signed_writes: bool, - reliable_write: bool, - writable_auxiliaries: bool) - -> BluetoothCharacteristicProperties { + pub fn new_inherited( + broadcast: bool, + read: bool, + write_without_response: bool, + write: bool, + notify: bool, + indicate: bool, + authenticated_signed_writes: bool, + reliable_write: bool, + writable_auxiliaries: bool, + ) -> BluetoothCharacteristicProperties { BluetoothCharacteristicProperties { reflector_: Reflector::new(), broadcast: broadcast, @@ -50,17 +51,18 @@ impl BluetoothCharacteristicProperties { } } - pub fn new(global: &GlobalScope, - broadcast: bool, - read: bool, - writeWithoutResponse: bool, - write: bool, - notify: bool, - indicate: bool, - authenticatedSignedWrites: bool, - reliableWrite: bool, - writableAuxiliaries: bool) - -> DomRoot { + pub fn new( + global: &GlobalScope, + broadcast: bool, + read: bool, + writeWithoutResponse: bool, + write: bool, + notify: bool, + indicate: bool, + authenticatedSignedWrites: bool, + reliableWrite: bool, + writableAuxiliaries: bool, + ) -> DomRoot { reflect_dom_object( Box::new(BluetoothCharacteristicProperties::new_inherited( broadcast, @@ -71,10 +73,10 @@ impl BluetoothCharacteristicProperties { indicate, authenticatedSignedWrites, reliableWrite, - writableAuxiliaries + writableAuxiliaries, )), global, - BluetoothCharacteristicPropertiesBinding::Wrap + BluetoothCharacteristicPropertiesBinding::Wrap, ) } } diff --git a/components/script/dom/bluetoothdevice.rs b/components/script/dom/bluetoothdevice.rs index b8e08618960..ae97626b60e 100644 --- a/components/script/dom/bluetoothdevice.rs +++ b/components/script/dom/bluetoothdevice.rs @@ -38,118 +38,144 @@ pub struct BluetoothDevice { name: Option, gatt: MutNullableDom, context: Dom, - attribute_instance_map: (DomRefCell>>, - DomRefCell>>, - DomRefCell>>), + attribute_instance_map: ( + DomRefCell>>, + DomRefCell>>, + DomRefCell>>, + ), watching_advertisements: Cell, } impl BluetoothDevice { - pub fn new_inherited(id: DOMString, - name: Option, - context: &Bluetooth) - -> BluetoothDevice { + pub fn new_inherited( + id: DOMString, + name: Option, + context: &Bluetooth, + ) -> BluetoothDevice { BluetoothDevice { eventtarget: EventTarget::new_inherited(), id: id, name: name, gatt: Default::default(), context: Dom::from_ref(context), - attribute_instance_map: (DomRefCell::new(HashMap::new()), - DomRefCell::new(HashMap::new()), - DomRefCell::new(HashMap::new())), + attribute_instance_map: ( + DomRefCell::new(HashMap::new()), + DomRefCell::new(HashMap::new()), + DomRefCell::new(HashMap::new()), + ), watching_advertisements: Cell::new(false), } } - pub fn new(global: &GlobalScope, - id: DOMString, - name: Option, - context: &Bluetooth) - -> DomRoot { - reflect_dom_object(Box::new(BluetoothDevice::new_inherited(id, name, context)), - global, - BluetoothDeviceBinding::Wrap) + pub fn new( + global: &GlobalScope, + id: DOMString, + name: Option, + context: &Bluetooth, + ) -> DomRoot { + reflect_dom_object( + Box::new(BluetoothDevice::new_inherited(id, name, context)), + global, + BluetoothDeviceBinding::Wrap, + ) } pub fn get_gatt(&self) -> DomRoot { - self.gatt.or_init(|| { - BluetoothRemoteGATTServer::new(&self.global(), self) - }) + self.gatt + .or_init(|| BluetoothRemoteGATTServer::new(&self.global(), self)) } fn get_context(&self) -> DomRoot { DomRoot::from_ref(&self.context) } - pub fn get_or_create_service(&self, - service: &BluetoothServiceMsg, - server: &BluetoothRemoteGATTServer) - -> DomRoot { + pub fn get_or_create_service( + &self, + service: &BluetoothServiceMsg, + server: &BluetoothRemoteGATTServer, + ) -> DomRoot { let (ref service_map_ref, _, _) = self.attribute_instance_map; let mut service_map = service_map_ref.borrow_mut(); if let Some(existing_service) = service_map.get(&service.instance_id) { return DomRoot::from_ref(&existing_service); } - let bt_service = BluetoothRemoteGATTService::new(&server.global(), - &server.Device(), - DOMString::from(service.uuid.clone()), - service.is_primary, - service.instance_id.clone()); + let bt_service = BluetoothRemoteGATTService::new( + &server.global(), + &server.Device(), + DOMString::from(service.uuid.clone()), + service.is_primary, + service.instance_id.clone(), + ); service_map.insert(service.instance_id.clone(), Dom::from_ref(&bt_service)); return bt_service; } - pub fn get_or_create_characteristic(&self, - characteristic: &BluetoothCharacteristicMsg, - service: &BluetoothRemoteGATTService) - -> DomRoot { + pub fn get_or_create_characteristic( + &self, + characteristic: &BluetoothCharacteristicMsg, + service: &BluetoothRemoteGATTService, + ) -> DomRoot { let (_, ref characteristic_map_ref, _) = self.attribute_instance_map; let mut characteristic_map = characteristic_map_ref.borrow_mut(); if let Some(existing_characteristic) = characteristic_map.get(&characteristic.instance_id) { return DomRoot::from_ref(&existing_characteristic); } - let properties = - BluetoothCharacteristicProperties::new(&service.global(), - characteristic.broadcast, - characteristic.read, - characteristic.write_without_response, - characteristic.write, - characteristic.notify, - characteristic.indicate, - characteristic.authenticated_signed_writes, - characteristic.reliable_write, - characteristic.writable_auxiliaries); - let bt_characteristic = BluetoothRemoteGATTCharacteristic::new(&service.global(), - service, - DOMString::from(characteristic.uuid.clone()), - &properties, - characteristic.instance_id.clone()); - characteristic_map.insert(characteristic.instance_id.clone(), Dom::from_ref(&bt_characteristic)); + let properties = BluetoothCharacteristicProperties::new( + &service.global(), + characteristic.broadcast, + characteristic.read, + characteristic.write_without_response, + characteristic.write, + characteristic.notify, + characteristic.indicate, + characteristic.authenticated_signed_writes, + characteristic.reliable_write, + characteristic.writable_auxiliaries, + ); + let bt_characteristic = BluetoothRemoteGATTCharacteristic::new( + &service.global(), + service, + DOMString::from(characteristic.uuid.clone()), + &properties, + characteristic.instance_id.clone(), + ); + characteristic_map.insert( + characteristic.instance_id.clone(), + Dom::from_ref(&bt_characteristic), + ); return bt_characteristic; } pub fn is_represented_device_null(&self) -> bool { let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.get_bluetooth_thread().send( - BluetoothRequest::IsRepresentedDeviceNull(self.Id().to_string(), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::IsRepresentedDeviceNull( + self.Id().to_string(), + sender, + )).unwrap(); receiver.recv().unwrap() } - pub fn get_or_create_descriptor(&self, - descriptor: &BluetoothDescriptorMsg, - characteristic: &BluetoothRemoteGATTCharacteristic) - -> DomRoot { + pub fn get_or_create_descriptor( + &self, + descriptor: &BluetoothDescriptorMsg, + characteristic: &BluetoothRemoteGATTCharacteristic, + ) -> DomRoot { let (_, _, ref descriptor_map_ref) = self.attribute_instance_map; let mut descriptor_map = descriptor_map_ref.borrow_mut(); if let Some(existing_descriptor) = descriptor_map.get(&descriptor.instance_id) { return DomRoot::from_ref(&existing_descriptor); } - let bt_descriptor = BluetoothRemoteGATTDescriptor::new(&characteristic.global(), - characteristic, - DOMString::from(descriptor.uuid.clone()), - descriptor.instance_id.clone()); - descriptor_map.insert(descriptor.instance_id.clone(), Dom::from_ref(&bt_descriptor)); + let bt_descriptor = BluetoothRemoteGATTDescriptor::new( + &characteristic.global(), + characteristic, + DOMString::from(descriptor.uuid.clone()), + descriptor.instance_id.clone(), + ); + descriptor_map.insert( + descriptor.instance_id.clone(), + Dom::from_ref(&bt_descriptor), + ); return bt_descriptor; } @@ -180,11 +206,17 @@ impl BluetoothDevice { // Step 5, 6.4, 7. // TODO: Step 6: Implement `active notification context set` for BluetoothRemoteGATTCharacteristic. - let _ = self.get_bluetooth_thread().send( - BluetoothRequest::SetRepresentedToNull(service_ids, characteristic_ids, descriptor_ids)); + let _ = self + .get_bluetooth_thread() + .send(BluetoothRequest::SetRepresentedToNull( + service_ids, + characteristic_ids, + descriptor_ids, + )); // Step 8. - self.upcast::().fire_bubbling_event(atom!("gattserverdisconnected")); + self.upcast::() + .fire_bubbling_event(atom!("gattserverdisconnected")); } // https://webbluetoothcg.github.io/web-bluetooth/#garbage-collect-the-connection @@ -206,14 +238,17 @@ impl BluetoothDevice { // Step 3. let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - self.get_bluetooth_thread().send( - BluetoothRequest::GATTServerDisconnect(String::from(self.Id()), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::GATTServerDisconnect( + String::from(self.Id()), + sender, + )).unwrap(); receiver.recv().unwrap().map_err(Error::from) } } impl BluetoothDeviceMethods for BluetoothDevice { - // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-id + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-id fn Id(&self) -> DOMString { self.id.clone() } @@ -226,9 +261,14 @@ impl BluetoothDeviceMethods for BluetoothDevice { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdevice-gatt fn GetGatt(&self) -> Option> { // Step 1. - if self.global().as_window().bluetooth_extra_permission_data() - .allowed_devices_contains_id(self.id.clone()) && !self.is_represented_device_null() { - return Some(self.get_gatt()) + if self + .global() + .as_window() + .bluetooth_extra_permission_data() + .allowed_devices_contains_id(self.id.clone()) && + !self.is_represented_device_null() + { + return Some(self.get_gatt()); } // Step 2. None @@ -242,8 +282,11 @@ impl BluetoothDeviceMethods for BluetoothDevice { // TODO: Step 1. // Note: Steps 2 - 3 are implemented in components/bluetooth/lib.rs in watch_advertisements function // and in handle_response function. - self.get_bluetooth_thread().send( - BluetoothRequest::WatchAdvertisements(String::from(self.Id()), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::WatchAdvertisements( + String::from(self.Id()), + sender, + )).unwrap(); return p; } @@ -260,7 +303,11 @@ impl BluetoothDeviceMethods for BluetoothDevice { } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothdeviceeventhandlers-ongattserverdisconnected - event_handler!(gattserverdisconnected, GetOngattserverdisconnected, SetOngattserverdisconnected); + event_handler!( + gattserverdisconnected, + GetOngattserverdisconnected, + SetOngattserverdisconnected + ); } impl AsyncBluetoothListener for BluetoothDevice { diff --git a/components/script/dom/bluetoothpermissionresult.rs b/components/script/dom/bluetoothpermissionresult.rs index 047325c5ed3..a9208ed8cb2 100644 --- a/components/script/dom/bluetoothpermissionresult.rs +++ b/components/script/dom/bluetoothpermissionresult.rs @@ -40,10 +40,15 @@ impl BluetoothPermissionResult { result } - pub fn new(global: &GlobalScope, status: &PermissionStatus) -> DomRoot { - reflect_dom_object(Box::new(BluetoothPermissionResult::new_inherited(status)), - global, - BluetoothPermissionResultBinding::Wrap) + pub fn new( + global: &GlobalScope, + status: &PermissionStatus, + ) -> DomRoot { + reflect_dom_object( + Box::new(BluetoothPermissionResult::new_inherited(status)), + global, + BluetoothPermissionResultBinding::Wrap, + ) } pub fn get_bluetooth(&self) -> DomRoot { @@ -75,8 +80,12 @@ impl BluetoothPermissionResult { impl BluetoothPermissionResultMethods for BluetoothPermissionResult { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothpermissionresult-devices fn Devices(&self) -> Vec> { - let device_vec: Vec> = - self.devices.borrow().iter().map(|d| DomRoot::from_ref(&**d)).collect(); + let device_vec: Vec> = self + .devices + .borrow() + .iter() + .map(|d| DomRoot::from_ref(&**d)) + .collect(); device_vec } } @@ -93,26 +102,29 @@ impl AsyncBluetoothListener for BluetoothPermissionResult { if let Some(ref existing_device) = device_instance_map.get(&device.id) { // https://webbluetoothcg.github.io/web-bluetooth/#request-the-bluetooth-permission // Step 3. - self.set_devices(vec!(Dom::from_ref(&*existing_device))); + self.set_devices(vec![Dom::from_ref(&*existing_device)]); // https://w3c.github.io/permissions/#dom-permissions-request // Step 8. return promise.resolve_native(self); } - let bt_device = BluetoothDevice::new(&self.global(), - DOMString::from(device.id.clone()), - device.name.map(DOMString::from), - &bluetooth); + let bt_device = BluetoothDevice::new( + &self.global(), + DOMString::from(device.id.clone()), + device.name.map(DOMString::from), + &bluetooth, + ); device_instance_map.insert(device.id.clone(), Dom::from_ref(&bt_device)); - self.global().as_window().bluetooth_extra_permission_data().add_new_allowed_device( - AllowedBluetoothDevice { + self.global() + .as_window() + .bluetooth_extra_permission_data() + .add_new_allowed_device(AllowedBluetoothDevice { deviceId: DOMString::from(device.id), mayUseGATT: true, - } - ); + }); // https://webbluetoothcg.github.io/web-bluetooth/#request-the-bluetooth-permission // Step 3. - self.set_devices(vec!(Dom::from_ref(&bt_device))); + self.set_devices(vec![Dom::from_ref(&bt_device)]); // https://w3c.github.io/permissions/#dom-permissions-request // Step 8. diff --git a/components/script/dom/bluetoothremotegattcharacteristic.rs b/components/script/dom/bluetoothremotegattcharacteristic.rs index 8034623ff5c..70cbf23ffd2 100644 --- a/components/script/dom/bluetoothremotegattcharacteristic.rs +++ b/components/script/dom/bluetoothremotegattcharacteristic.rs @@ -6,10 +6,10 @@ use bluetooth_traits::{BluetoothRequest, BluetoothResponse, GATTType}; use bluetooth_traits::blocklist::{Blocklist, uuid_is_blocklisted}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::BluetoothCharacteristicPropertiesBinding:: - BluetoothCharacteristicPropertiesMethods; +BluetoothCharacteristicPropertiesMethods; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTCharacteristicBinding; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTCharacteristicBinding:: - BluetoothRemoteGATTCharacteristicMethods; +BluetoothRemoteGATTCharacteristicMethods; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServiceBinding::BluetoothRemoteGATTServiceMethods; use dom::bindings::codegen::UnionTypes::ArrayBufferViewOrArrayBuffer; @@ -45,11 +45,12 @@ pub struct BluetoothRemoteGATTCharacteristic { } impl BluetoothRemoteGATTCharacteristic { - pub fn new_inherited(service: &BluetoothRemoteGATTService, - uuid: DOMString, - properties: &BluetoothCharacteristicProperties, - instance_id: String) - -> BluetoothRemoteGATTCharacteristic { + pub fn new_inherited( + service: &BluetoothRemoteGATTService, + uuid: DOMString, + properties: &BluetoothCharacteristicProperties, + instance_id: String, + ) -> BluetoothRemoteGATTCharacteristic { BluetoothRemoteGATTCharacteristic { eventtarget: EventTarget::new_inherited(), service: Dom::from_ref(service), @@ -60,18 +61,19 @@ impl BluetoothRemoteGATTCharacteristic { } } - pub fn new(global: &GlobalScope, - service: &BluetoothRemoteGATTService, - uuid: DOMString, - properties: &BluetoothCharacteristicProperties, - instanceID: String) - -> DomRoot { + pub fn new( + global: &GlobalScope, + service: &BluetoothRemoteGATTService, + uuid: DOMString, + properties: &BluetoothCharacteristicProperties, + instanceID: String, + ) -> DomRoot { reflect_dom_object( Box::new(BluetoothRemoteGATTCharacteristic::new_inherited( - service, uuid, properties, instanceID + service, uuid, properties, instanceID, )), global, - BluetoothRemoteGATTCharacteristicBinding::Wrap + BluetoothRemoteGATTCharacteristicBinding::Wrap, ) } @@ -103,17 +105,29 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-getdescriptor fn GetDescriptor(&self, descriptor: BluetoothDescriptorUUID) -> Rc { - get_gatt_children(self, true, BluetoothUUID::descriptor, Some(descriptor), self.get_instance_id(), - self.Service().Device().get_gatt().Connected(), GATTType::Descriptor) + get_gatt_children( + self, + true, + BluetoothUUID::descriptor, + Some(descriptor), + self.get_instance_id(), + self.Service().Device().get_gatt().Connected(), + GATTType::Descriptor, + ) } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-getdescriptors - fn GetDescriptors(&self, - descriptor: Option) - -> Rc { - get_gatt_children(self, false, BluetoothUUID::descriptor, descriptor, self.get_instance_id(), - self.Service().Device().get_gatt().Connected(), GATTType::Descriptor) + fn GetDescriptors(&self, descriptor: Option) -> Rc { + get_gatt_children( + self, + false, + BluetoothUUID::descriptor, + descriptor, + self.get_instance_id(), + self.Service().Device().get_gatt().Connected(), + GATTType::Descriptor, + ) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattcharacteristic-value @@ -149,8 +163,9 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris // Note: Steps 3 - 4 and the remaining substeps of Step 5 are implemented in components/bluetooth/lib.rs // in readValue function and in handle_response function. let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::ReadValue(self.get_instance_id(), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::ReadValue(self.get_instance_id(), sender)) + .unwrap(); return p; } @@ -186,8 +201,9 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris // Step 7.1. if !(self.Properties().Write() || - self.Properties().WriteWithoutResponse() || - self.Properties().AuthenticatedSignedWrites()) { + self.Properties().WriteWithoutResponse() || + self.Properties().AuthenticatedSignedWrites()) + { p.reject_error(NotSupported); return p; } @@ -195,8 +211,12 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris // Note: Steps 5 - 6 and the remaining substeps of Step 7 are implemented in components/bluetooth/lib.rs // in writeValue function and in handle_response function. let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::WriteValue(self.get_instance_id(), vec, sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::WriteValue( + self.get_instance_id(), + vec, + sender, + )).unwrap(); return p; } @@ -218,8 +238,7 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris } // Step 5. - if !(self.Properties().Notify() || - self.Properties().Indicate()) { + if !(self.Properties().Notify() || self.Properties().Indicate()) { p.reject_error(NotSupported); return p; } @@ -229,10 +248,12 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris // Note: Steps 3 - 4, 7 - 11 are implemented in components/bluetooth/lib.rs in enable_notification function // and in handle_response function. let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::EnableNotification(self.get_instance_id(), - true, - sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::EnableNotification( + self.get_instance_id(), + true, + sender, + )).unwrap(); return p; } @@ -246,15 +267,21 @@ impl BluetoothRemoteGATTCharacteristicMethods for BluetoothRemoteGATTCharacteris // Note: Steps 1 - 2, and part of Step 4 and Step 5 are implemented in components/bluetooth/lib.rs // in enable_notification function and in handle_response function. - self.get_bluetooth_thread().send( - BluetoothRequest::EnableNotification(self.get_instance_id(), - false, - sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::EnableNotification( + self.get_instance_id(), + false, + sender, + )).unwrap(); return p; } // https://webbluetoothcg.github.io/web-bluetooth/#dom-characteristiceventhandlers-oncharacteristicvaluechanged - event_handler!(characteristicvaluechanged, GetOncharacteristicvaluechanged, SetOncharacteristicvaluechanged); + event_handler!( + characteristicvaluechanged, + GetOncharacteristicvaluechanged, + SetOncharacteristicvaluechanged + ); } impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic { @@ -265,10 +292,12 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic { // Step 7. BluetoothResponse::GetDescriptors(descriptors_vec, single) => { if single { - promise.resolve_native(&device.get_or_create_descriptor(&descriptors_vec[0], &self)); + promise.resolve_native( + &device.get_or_create_descriptor(&descriptors_vec[0], &self), + ); return; } - let mut descriptors = vec!(); + let mut descriptors = vec![]; for descriptor in descriptors_vec { let bt_descriptor = device.get_or_create_descriptor(&descriptor, &self); descriptors.push(bt_descriptor); @@ -285,7 +314,8 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTCharacteristic { *self.value.borrow_mut() = Some(value.clone()); // Step 5.5.3. - self.upcast::().fire_bubbling_event(atom!("characteristicvaluechanged")); + self.upcast::() + .fire_bubbling_event(atom!("characteristicvaluechanged")); // Step 5.5.4. promise.resolve_native(&value); diff --git a/components/script/dom/bluetoothremotegattdescriptor.rs b/components/script/dom/bluetoothremotegattdescriptor.rs index 493550ee91b..b0eb6476fe3 100644 --- a/components/script/dom/bluetoothremotegattdescriptor.rs +++ b/components/script/dom/bluetoothremotegattdescriptor.rs @@ -6,7 +6,7 @@ use bluetooth_traits::{BluetoothRequest, BluetoothResponse}; use bluetooth_traits::blocklist::{Blocklist, uuid_is_blocklisted}; use dom::bindings::cell::DomRefCell; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTCharacteristicBinding:: - BluetoothRemoteGATTCharacteristicMethods; +BluetoothRemoteGATTCharacteristicMethods; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTDescriptorBinding; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTDescriptorBinding::BluetoothRemoteGATTDescriptorMethods; use dom::bindings::codegen::Bindings::BluetoothRemoteGATTServerBinding::BluetoothRemoteGATTServerMethods; @@ -35,10 +35,11 @@ pub struct BluetoothRemoteGATTDescriptor { } impl BluetoothRemoteGATTDescriptor { - pub fn new_inherited(characteristic: &BluetoothRemoteGATTCharacteristic, - uuid: DOMString, - instance_id: String) - -> BluetoothRemoteGATTDescriptor { + pub fn new_inherited( + characteristic: &BluetoothRemoteGATTCharacteristic, + uuid: DOMString, + instance_id: String, + ) -> BluetoothRemoteGATTDescriptor { BluetoothRemoteGATTDescriptor { reflector_: Reflector::new(), characteristic: Dom::from_ref(characteristic), @@ -48,17 +49,20 @@ impl BluetoothRemoteGATTDescriptor { } } - pub fn new(global: &GlobalScope, - characteristic: &BluetoothRemoteGATTCharacteristic, - uuid: DOMString, - instanceID: String) - -> DomRoot{ + pub fn new( + global: &GlobalScope, + characteristic: &BluetoothRemoteGATTCharacteristic, + uuid: DOMString, + instanceID: String, + ) -> DomRoot { reflect_dom_object( Box::new(BluetoothRemoteGATTDescriptor::new_inherited( - characteristic, uuid, instanceID + characteristic, + uuid, + instanceID, )), global, - BluetoothRemoteGATTDescriptorBinding::Wrap + BluetoothRemoteGATTDescriptorBinding::Wrap, ) } @@ -74,7 +78,7 @@ impl BluetoothRemoteGATTDescriptor { impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-characteristic fn Characteristic(&self) -> DomRoot { - DomRoot::from_ref(&self.characteristic) + DomRoot::from_ref(&self.characteristic) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-uuid @@ -82,7 +86,7 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { self.uuid.clone() } - // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-value + // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattdescriptor-value fn GetValue(&self) -> Option { self.value.borrow().clone() } @@ -99,7 +103,13 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { } // Step 2. - if !self.Characteristic().Service().Device().get_gatt().Connected() { + if !self + .Characteristic() + .Service() + .Device() + .get_gatt() + .Connected() + { p.reject_error(Network); return p; } @@ -108,8 +118,9 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { // Note: Steps 3 - 4 and substeps of Step 5 are implemented in components/bluetooth/lib.rs // in readValue function and in handle_response function. let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::ReadValue(self.get_instance_id(), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::ReadValue(self.get_instance_id(), sender)) + .unwrap(); return p; } @@ -135,7 +146,13 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { } // Step 4. - if !self.Characteristic().Service().Device().get_gatt().Connected() { + if !self + .Characteristic() + .Service() + .Device() + .get_gatt() + .Connected() + { p.reject_error(Network); return p; } @@ -144,8 +161,12 @@ impl BluetoothRemoteGATTDescriptorMethods for BluetoothRemoteGATTDescriptor { // Note: Steps 5 - 6 and substeps of Step 7 are implemented in components/bluetooth/lib.rs // in writeValue function and in handle_response function. let sender = response_async(&p, self); - self.get_bluetooth_thread().send( - BluetoothRequest::WriteValue(self.get_instance_id(), vec, sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::WriteValue( + self.get_instance_id(), + vec, + sender, + )).unwrap(); return p; } } diff --git a/components/script/dom/bluetoothremotegattserver.rs b/components/script/dom/bluetoothremotegattserver.rs index 2c2fb3da351..3d4e5125b3e 100644 --- a/components/script/dom/bluetoothremotegattserver.rs +++ b/components/script/dom/bluetoothremotegattserver.rs @@ -37,10 +37,15 @@ impl BluetoothRemoteGATTServer { } } - pub fn new(global: &GlobalScope, device: &BluetoothDevice) -> DomRoot { - reflect_dom_object(Box::new(BluetoothRemoteGATTServer::new_inherited(device)), - global, - BluetoothRemoteGATTServerBinding::Wrap) + pub fn new( + global: &GlobalScope, + device: &BluetoothDevice, + ) -> DomRoot { + reflect_dom_object( + Box::new(BluetoothRemoteGATTServer::new_inherited(device)), + global, + BluetoothRemoteGATTServerBinding::Wrap, + ) } fn get_bluetooth_thread(&self) -> IpcSender { @@ -78,8 +83,11 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { // Note: Steps 2, 5.1.1 and 5.1.3 are in components/bluetooth/lib.rs in the gatt_server_connect function. // Steps 5.2.3 - 5.2.5 are in response function. - self.get_bluetooth_thread().send( - BluetoothRequest::GATTServerConnect(String::from(self.Device().Id()), sender)).unwrap(); + self.get_bluetooth_thread() + .send(BluetoothRequest::GATTServerConnect( + String::from(self.Device().Id()), + sender, + )).unwrap(); // Step 5: return promise. return p; } @@ -90,7 +98,7 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { // Step 2. if !self.Connected() { - return Ok(()) + return Ok(()); } // Step 3. @@ -104,17 +112,30 @@ impl BluetoothRemoteGATTServerMethods for BluetoothRemoteGATTServer { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-getprimaryservice fn GetPrimaryService(&self, service: BluetoothServiceUUID) -> Rc { // Step 1 - 2. - get_gatt_children(self, true, BluetoothUUID::service, Some(service), String::from(self.Device().Id()), - self.Device().get_gatt().Connected(), GATTType::PrimaryService) + get_gatt_children( + self, + true, + BluetoothUUID::service, + Some(service), + String::from(self.Device().Id()), + self.Device().get_gatt().Connected(), + GATTType::PrimaryService, + ) } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattserver-getprimaryservices fn GetPrimaryServices(&self, service: Option) -> Rc { // Step 1 - 2. - get_gatt_children(self, false, BluetoothUUID::service, service, String::from(self.Device().Id()), - self.Connected(), GATTType::PrimaryService) - + get_gatt_children( + self, + false, + BluetoothUUID::service, + service, + String::from(self.Device().Id()), + self.Connected(), + GATTType::PrimaryService, + ) } } @@ -145,7 +166,7 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTServer { promise.resolve_native(&device.get_or_create_service(&services_vec[0], &self)); return; } - let mut services = vec!(); + let mut services = vec![]; for service in services_vec { let bt_service = device.get_or_create_service(&service, &self); services.push(bt_service); diff --git a/components/script/dom/bluetoothremotegattservice.rs b/components/script/dom/bluetoothremotegattservice.rs index 74568b9a7df..85aa40c874c 100644 --- a/components/script/dom/bluetoothremotegattservice.rs +++ b/components/script/dom/bluetoothremotegattservice.rs @@ -30,11 +30,12 @@ pub struct BluetoothRemoteGATTService { } impl BluetoothRemoteGATTService { - pub fn new_inherited(device: &BluetoothDevice, - uuid: DOMString, - is_primary: bool, - instance_id: String) - -> BluetoothRemoteGATTService { + pub fn new_inherited( + device: &BluetoothDevice, + uuid: DOMString, + is_primary: bool, + instance_id: String, + ) -> BluetoothRemoteGATTService { BluetoothRemoteGATTService { eventtarget: EventTarget::new_inherited(), device: Dom::from_ref(device), @@ -44,18 +45,19 @@ impl BluetoothRemoteGATTService { } } - pub fn new(global: &GlobalScope, - device: &BluetoothDevice, - uuid: DOMString, - isPrimary: bool, - instanceID: String) - -> DomRoot { + pub fn new( + global: &GlobalScope, + device: &BluetoothDevice, + uuid: DOMString, + isPrimary: bool, + instanceID: String, + ) -> DomRoot { reflect_dom_object( Box::new(BluetoothRemoteGATTService::new_inherited( - device, uuid, isPrimary, instanceID + device, uuid, isPrimary, instanceID, )), global, - BluetoothRemoteGATTServiceBinding::Wrap + BluetoothRemoteGATTServiceBinding::Wrap, ) } @@ -82,39 +84,61 @@ impl BluetoothRemoteGATTServiceMethods for BluetoothRemoteGATTService { #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getcharacteristic - fn GetCharacteristic(&self, - characteristic: BluetoothCharacteristicUUID) - -> Rc { - get_gatt_children(self, true, BluetoothUUID::characteristic, Some(characteristic), self.get_instance_id(), - self.Device().get_gatt().Connected(), GATTType::Characteristic) + fn GetCharacteristic(&self, characteristic: BluetoothCharacteristicUUID) -> Rc { + get_gatt_children( + self, + true, + BluetoothUUID::characteristic, + Some(characteristic), + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::Characteristic, + ) } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getcharacteristics - fn GetCharacteristics(&self, - characteristic: Option) - -> Rc { - get_gatt_children(self, false, BluetoothUUID::characteristic, characteristic, self.get_instance_id(), - self.Device().get_gatt().Connected(), GATTType::Characteristic) + fn GetCharacteristics( + &self, + characteristic: Option, + ) -> Rc { + get_gatt_children( + self, + false, + BluetoothUUID::characteristic, + characteristic, + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::Characteristic, + ) } #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getincludedservice - fn GetIncludedService(&self, - service: BluetoothServiceUUID) - -> Rc { - get_gatt_children(self, false, BluetoothUUID::service, Some(service), self.get_instance_id(), - self.Device().get_gatt().Connected(), GATTType::IncludedService) + fn GetIncludedService(&self, service: BluetoothServiceUUID) -> Rc { + get_gatt_children( + self, + false, + BluetoothUUID::service, + Some(service), + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::IncludedService, + ) } - #[allow(unrooted_must_root)] // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothremotegattservice-getincludedservices - fn GetIncludedServices(&self, - service: Option) - -> Rc { - get_gatt_children(self, false, BluetoothUUID::service, service, self.get_instance_id(), - self.Device().get_gatt().Connected(), GATTType::IncludedService) + fn GetIncludedServices(&self, service: Option) -> Rc { + get_gatt_children( + self, + false, + BluetoothUUID::service, + service, + self.get_instance_id(), + self.Device().get_gatt().Connected(), + GATTType::IncludedService, + ) } // https://webbluetoothcg.github.io/web-bluetooth/#dom-serviceeventhandlers-onserviceadded @@ -135,12 +159,15 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTService { // Step 7. BluetoothResponse::GetCharacteristics(characteristics_vec, single) => { if single { - promise.resolve_native(&device.get_or_create_characteristic(&characteristics_vec[0], &self)); + promise.resolve_native( + &device.get_or_create_characteristic(&characteristics_vec[0], &self), + ); return; } - let mut characteristics = vec!(); + let mut characteristics = vec![]; for characteristic in characteristics_vec { - let bt_characteristic = device.get_or_create_characteristic(&characteristic, &self); + let bt_characteristic = + device.get_or_create_characteristic(&characteristic, &self); characteristics.push(bt_characteristic); } promise.resolve_native(&characteristics); @@ -149,9 +176,11 @@ impl AsyncBluetoothListener for BluetoothRemoteGATTService { // Step 7. BluetoothResponse::GetIncludedServices(services_vec, single) => { if single { - return promise.resolve_native(&device.get_or_create_service(&services_vec[0], &device.get_gatt())); + return promise.resolve_native( + &device.get_or_create_service(&services_vec[0], &device.get_gatt()), + ); } - let mut services = vec!(); + let mut services = vec![]; for service in services_vec { let bt_service = device.get_or_create_service(&service, &device.get_gatt()); services.push(bt_service); diff --git a/components/script/dom/bluetoothuuid.rs b/components/script/dom/bluetoothuuid.rs index a4ef66568a6..212318650c7 100644 --- a/components/script/dom/bluetoothuuid.rs +++ b/components/script/dom/bluetoothuuid.rs @@ -17,7 +17,7 @@ pub type BluetoothCharacteristicUUID = StringOrUnsignedLong; pub type BluetoothDescriptorUUID = StringOrUnsignedLong; // https://webbluetoothcg.github.io/web-bluetooth/#bluetoothuuid - #[dom_struct] +#[dom_struct] pub struct BluetoothUUID { reflector_: Reflector, } @@ -30,10 +30,16 @@ const BLUETOOTH_ASSIGNED_SERVICES: &'static [(&'static str, u32)] = &[ ("org.bluetooth.service.blood_pressure", 0x1810_u32), ("org.bluetooth.service.body_composition", 0x181b_u32), ("org.bluetooth.service.bond_management", 0x181e_u32), - ("org.bluetooth.service.continuous_glucose_monitoring", 0x181f_u32), + ( + "org.bluetooth.service.continuous_glucose_monitoring", + 0x181f_u32, + ), ("org.bluetooth.service.current_time", 0x1805_u32), ("org.bluetooth.service.cycling_power", 0x1818_u32), - ("org.bluetooth.service.cycling_speed_and_cadence", 0x1816_u32), + ( + "org.bluetooth.service.cycling_speed_and_cadence", + 0x1816_u32, + ), ("org.bluetooth.service.device_information", 0x180a_u32), ("org.bluetooth.service.environmental_sensing", 0x181a_u32), ("org.bluetooth.service.generic_access", 0x1800_u32), @@ -45,7 +51,10 @@ const BLUETOOTH_ASSIGNED_SERVICES: &'static [(&'static str, u32)] = &[ ("org.bluetooth.service.human_interface_device", 0x1812_u32), ("org.bluetooth.service.immediate_alert", 0x1802_u32), ("org.bluetooth.service.indoor_positioning", 0x1821_u32), - ("org.bluetooth.service.internet_protocol_support", 0x1820_u32), + ( + "org.bluetooth.service.internet_protocol_support", + 0x1820_u32, + ), ("org.bluetooth.service.link_loss", 0x1803_u32), ("org.bluetooth.service.location_and_navigation", 0x1819_u32), ("org.bluetooth.service.next_dst_change", 0x1807_u32), @@ -53,7 +62,10 @@ const BLUETOOTH_ASSIGNED_SERVICES: &'static [(&'static str, u32)] = &[ ("org.bluetooth.service.phone_alert_status", 0x180e_u32), ("org.bluetooth.service.pulse_oximeter", 0x1822_u32), ("org.bluetooth.service.reference_time_update", 0x1806_u32), - ("org.bluetooth.service.running_speed_and_cadence", 0x1814_u32), + ( + "org.bluetooth.service.running_speed_and_cadence", + 0x1814_u32, + ), ("org.bluetooth.service.scan_parameters", 0x1813_u32), ("org.bluetooth.service.transport_discovery", 0x1824), ("org.bluetooth.service.tx_power", 0x1804_u32), @@ -63,57 +75,150 @@ const BLUETOOTH_ASSIGNED_SERVICES: &'static [(&'static str, u32)] = &[ //https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx const BLUETOOTH_ASSIGNED_CHARCTERISTICS: &'static [(&'static str, u32)] = &[ - ("org.bluetooth.characteristic.aerobic_heart_rate_lower_limit", 0x2a7e_u32), - ("org.bluetooth.characteristic.aerobic_heart_rate_upper_limit", 0x2a84_u32), + ( + "org.bluetooth.characteristic.aerobic_heart_rate_lower_limit", + 0x2a7e_u32, + ), + ( + "org.bluetooth.characteristic.aerobic_heart_rate_upper_limit", + 0x2a84_u32, + ), ("org.bluetooth.characteristic.aerobic_threshold", 0x2a7f_u32), ("org.bluetooth.characteristic.age", 0x2a80_u32), ("org.bluetooth.characteristic.aggregate", 0x2a5a_u32), ("org.bluetooth.characteristic.alert_category_id", 0x2a43_u32), - ("org.bluetooth.characteristic.alert_category_id_bit_mask", 0x2a42_u32), + ( + "org.bluetooth.characteristic.alert_category_id_bit_mask", + 0x2a42_u32, + ), ("org.bluetooth.characteristic.alert_level", 0x2a06_u32), - ("org.bluetooth.characteristic.alert_notification_control_point", 0x2a44_u32), + ( + "org.bluetooth.characteristic.alert_notification_control_point", + 0x2a44_u32, + ), ("org.bluetooth.characteristic.alert_status", 0x2a3f_u32), ("org.bluetooth.characteristic.altitude", 0x2ab3_u32), - ("org.bluetooth.characteristic.anaerobic_heart_rate_lower_limit", 0x2a81_u32), - ("org.bluetooth.characteristic.anaerobic_heart_rate_upper_limit", 0x2a82_u32), - ("org.bluetooth.characteristic.anaerobic_threshold", 0x2a83_u32), + ( + "org.bluetooth.characteristic.anaerobic_heart_rate_lower_limit", + 0x2a81_u32, + ), + ( + "org.bluetooth.characteristic.anaerobic_heart_rate_upper_limit", + 0x2a82_u32, + ), + ( + "org.bluetooth.characteristic.anaerobic_threshold", + 0x2a83_u32, + ), ("org.bluetooth.characteristic.analog", 0x2a58_u32), - ("org.bluetooth.characteristic.apparent_wind_direction", 0x2a73_u32), - ("org.bluetooth.characteristic.apparent_wind_speed", 0x2a72_u32), + ( + "org.bluetooth.characteristic.apparent_wind_direction", + 0x2a73_u32, + ), + ( + "org.bluetooth.characteristic.apparent_wind_speed", + 0x2a72_u32, + ), ("org.bluetooth.characteristic.gap.appearance", 0x2a01_u32), - ("org.bluetooth.characteristic.barometric_pressure_trend", 0x2aa3_u32), + ( + "org.bluetooth.characteristic.barometric_pressure_trend", + 0x2aa3_u32, + ), ("org.bluetooth.characteristic.battery_level", 0x2a19_u32), - ("org.bluetooth.characteristic.blood_pressure_feature", 0x2a49_u32), - ("org.bluetooth.characteristic.blood_pressure_measurement", 0x2a35_u32), - ("org.bluetooth.characteristic.body_composition_feature", 0x2a9b_u32), - ("org.bluetooth.characteristic.body_composition_measurement", 0x2a9c_u32), - ("org.bluetooth.characteristic.body_sensor_location", 0x2a38_u32), - ("org.bluetooth.characteristic.bond_management_control_point", 0x2aa4_u32), - ("org.bluetooth.characteristic.bond_management_feature", 0x2aa5_u32), - ("org.bluetooth.characteristic.boot_keyboard_input_report", 0x2a22_u32), - ("org.bluetooth.characteristic.boot_keyboard_output_report", 0x2a32_u32), - ("org.bluetooth.characteristic.boot_mouse_input_report", 0x2a33_u32), - ("org.bluetooth.characteristic.gap.central_address_resolution_support", 0x2aa6_u32), + ( + "org.bluetooth.characteristic.blood_pressure_feature", + 0x2a49_u32, + ), + ( + "org.bluetooth.characteristic.blood_pressure_measurement", + 0x2a35_u32, + ), + ( + "org.bluetooth.characteristic.body_composition_feature", + 0x2a9b_u32, + ), + ( + "org.bluetooth.characteristic.body_composition_measurement", + 0x2a9c_u32, + ), + ( + "org.bluetooth.characteristic.body_sensor_location", + 0x2a38_u32, + ), + ( + "org.bluetooth.characteristic.bond_management_control_point", + 0x2aa4_u32, + ), + ( + "org.bluetooth.characteristic.bond_management_feature", + 0x2aa5_u32, + ), + ( + "org.bluetooth.characteristic.boot_keyboard_input_report", + 0x2a22_u32, + ), + ( + "org.bluetooth.characteristic.boot_keyboard_output_report", + 0x2a32_u32, + ), + ( + "org.bluetooth.characteristic.boot_mouse_input_report", + 0x2a33_u32, + ), + ( + "org.bluetooth.characteristic.gap.central_address_resolution_support", + 0x2aa6_u32, + ), ("org.bluetooth.characteristic.cgm_feature", 0x2aa8_u32), ("org.bluetooth.characteristic.cgm_measurement", 0x2aa7_u32), - ("org.bluetooth.characteristic.cgm_session_run_time", 0x2aab_u32), - ("org.bluetooth.characteristic.cgm_session_start_time", 0x2aaa_u32), - ("org.bluetooth.characteristic.cgm_specific_ops_control_point", 0x2aac_u32), + ( + "org.bluetooth.characteristic.cgm_session_run_time", + 0x2aab_u32, + ), + ( + "org.bluetooth.characteristic.cgm_session_start_time", + 0x2aaa_u32, + ), + ( + "org.bluetooth.characteristic.cgm_specific_ops_control_point", + 0x2aac_u32, + ), ("org.bluetooth.characteristic.cgm_status", 0x2aa9_u32), ("org.bluetooth.characteristic.csc_feature", 0x2a5c_u32), ("org.bluetooth.characteristic.csc_measurement", 0x2a5b_u32), ("org.bluetooth.characteristic.current_time", 0x2a2b_u32), - ("org.bluetooth.characteristic.cycling_power_control_point", 0x2a66_u32), - ("org.bluetooth.characteristic.cycling_power_feature", 0x2a65_u32), - ("org.bluetooth.characteristic.cycling_power_measurement", 0x2a63_u32), - ("org.bluetooth.characteristic.cycling_power_vector", 0x2a64_u32), - ("org.bluetooth.characteristic.database_change_increment", 0x2a99_u32), + ( + "org.bluetooth.characteristic.cycling_power_control_point", + 0x2a66_u32, + ), + ( + "org.bluetooth.characteristic.cycling_power_feature", + 0x2a65_u32, + ), + ( + "org.bluetooth.characteristic.cycling_power_measurement", + 0x2a63_u32, + ), + ( + "org.bluetooth.characteristic.cycling_power_vector", + 0x2a64_u32, + ), + ( + "org.bluetooth.characteristic.database_change_increment", + 0x2a99_u32, + ), ("org.bluetooth.characteristic.date_of_birth", 0x2a85_u32), - ("org.bluetooth.characteristic.date_of_threshold_assessment", 0x2a86_u32), + ( + "org.bluetooth.characteristic.date_of_threshold_assessment", + 0x2a86_u32, + ), ("org.bluetooth.characteristic.date_time", 0x2a08_u32), ("org.bluetooth.characteristic.day_date_time", 0x2a0a_u32), ("org.bluetooth.characteristic.day_of_week", 0x2a09_u32), - ("org.bluetooth.characteristic.descriptor_value_changed", 0x2a7d_u32), + ( + "org.bluetooth.characteristic.descriptor_value_changed", + 0x2a7d_u32, + ), ("org.bluetooth.characteristic.gap.device_name", 0x2a00_u32), ("org.bluetooth.characteristic.dew_point", 0x2a7b_u32), ("org.bluetooth.characteristic.digital", 0x2a56_u32), @@ -121,140 +226,332 @@ const BLUETOOTH_ASSIGNED_CHARCTERISTICS: &'static [(&'static str, u32)] = &[ ("org.bluetooth.characteristic.elevation", 0x2a6c_u32), ("org.bluetooth.characteristic.email_address", 0x2a87_u32), ("org.bluetooth.characteristic.exact_time_256", 0x2a0c_u32), - ("org.bluetooth.characteristic.fat_burn_heart_rate_lower_limit", 0x2a88_u32), - ("org.bluetooth.characteristic.fat_burn_heart_rate_upper_limit", 0x2a89_u32), - ("org.bluetooth.characteristic.firmware_revision_string", 0x2a26_u32), + ( + "org.bluetooth.characteristic.fat_burn_heart_rate_lower_limit", + 0x2a88_u32, + ), + ( + "org.bluetooth.characteristic.fat_burn_heart_rate_upper_limit", + 0x2a89_u32, + ), + ( + "org.bluetooth.characteristic.firmware_revision_string", + 0x2a26_u32, + ), ("org.bluetooth.characteristic.first_name", 0x2a8a_u32), - ("org.bluetooth.characteristic.five_zone_heart_rate_limits", 0x2a8b_u32), + ( + "org.bluetooth.characteristic.five_zone_heart_rate_limits", + 0x2a8b_u32, + ), ("org.bluetooth.characteristic.floor_number", 0x2ab2_u32), ("org.bluetooth.characteristic.gender", 0x2a8c_u32), ("org.bluetooth.characteristic.glucose_feature", 0x2a51_u32), - ("org.bluetooth.characteristic.glucose_measurement", 0x2a18_u32), - ("org.bluetooth.characteristic.glucose_measurement_context", 0x2a34_u32), + ( + "org.bluetooth.characteristic.glucose_measurement", + 0x2a18_u32, + ), + ( + "org.bluetooth.characteristic.glucose_measurement_context", + 0x2a34_u32, + ), ("org.bluetooth.characteristic.gust_factor", 0x2a74_u32), - ("org.bluetooth.characteristic.hardware_revision_string", 0x2a27_u32), - ("org.bluetooth.characteristic.heart_rate_control_point", 0x2a39_u32), + ( + "org.bluetooth.characteristic.hardware_revision_string", + 0x2a27_u32, + ), + ( + "org.bluetooth.characteristic.heart_rate_control_point", + 0x2a39_u32, + ), ("org.bluetooth.characteristic.heart_rate_max", 0x2a8d_u32), - ("org.bluetooth.characteristic.heart_rate_measurement", 0x2a37_u32), + ( + "org.bluetooth.characteristic.heart_rate_measurement", + 0x2a37_u32, + ), ("org.bluetooth.characteristic.heat_index", 0x2a7a_u32), ("org.bluetooth.characteristic.height", 0x2a8e_u32), ("org.bluetooth.characteristic.hid_control_point", 0x2a4c_u32), ("org.bluetooth.characteristic.hid_information", 0x2a4a_u32), ("org.bluetooth.characteristic.hip_circumference", 0x2a8f_u32), - ("org.bluetooth.characteristic.http_control_point", 0x2aba_u32), + ( + "org.bluetooth.characteristic.http_control_point", + 0x2aba_u32, + ), ("org.bluetooth.characteristic.http_entity_body", 0x2ab9_u32), ("org.bluetooth.characteristic.http_headers", 0x2ab7_u32), ("org.bluetooth.characteristic.http_status_code", 0x2ab8_u32), ("org.bluetooth.characteristic.https_security", 0x2abb_u32), ("org.bluetooth.characteristic.humidity", 0x2a6f_u32), - ("org.bluetooth.characteristic.ieee_11073-20601_regulatory_certification_data_list", 0x2a2a_u32), - ("org.bluetooth.characteristic.indoor_positioning_configuration", 0x2aad_u32), - ("org.bluetooth.characteristic.intermediate_cuff_pressure", 0x2a36_u32), - ("org.bluetooth.characteristic.intermediate_temperature", 0x2a1e_u32), + ( + "org.bluetooth.characteristic.ieee_11073-20601_regulatory_certification_data_list", + 0x2a2a_u32, + ), + ( + "org.bluetooth.characteristic.indoor_positioning_configuration", + 0x2aad_u32, + ), + ( + "org.bluetooth.characteristic.intermediate_cuff_pressure", + 0x2a36_u32, + ), + ( + "org.bluetooth.characteristic.intermediate_temperature", + 0x2a1e_u32, + ), ("org.bluetooth.characteristic.irradiance", 0x2a77_u32), ("org.bluetooth.characteristic.language", 0x2aa2_u32), ("org.bluetooth.characteristic.last_name", 0x2a90_u32), ("org.bluetooth.characteristic.latitude", 0x2aae_u32), ("org.bluetooth.characteristic.ln_control_point", 0x2a6b_u32), ("org.bluetooth.characteristic.ln_feature", 0x2a6a_u32), - ("org.bluetooth.characteristic.local_east_coordinate.xml", 0x2ab1_u32), - ("org.bluetooth.characteristic.local_north_coordinate", 0x2ab0_u32), - ("org.bluetooth.characteristic.local_time_information", 0x2a0f_u32), - ("org.bluetooth.characteristic.location_and_speed", 0x2a67_u32), + ( + "org.bluetooth.characteristic.local_east_coordinate.xml", + 0x2ab1_u32, + ), + ( + "org.bluetooth.characteristic.local_north_coordinate", + 0x2ab0_u32, + ), + ( + "org.bluetooth.characteristic.local_time_information", + 0x2a0f_u32, + ), + ( + "org.bluetooth.characteristic.location_and_speed", + 0x2a67_u32, + ), ("org.bluetooth.characteristic.location_name", 0x2ab5_u32), ("org.bluetooth.characteristic.longitude", 0x2aaf_u32), - ("org.bluetooth.characteristic.magnetic_declination", 0x2a2c_u32), - ("org.bluetooth.characteristic.magnetic_flux_density_2d", 0x2aa0_u32), - ("org.bluetooth.characteristic.magnetic_flux_density_3d", 0x2aa1_u32), - ("org.bluetooth.characteristic.manufacturer_name_string", 0x2a29_u32), - ("org.bluetooth.characteristic.maximum_recommended_heart_rate", 0x2a91_u32), - ("org.bluetooth.characteristic.measurement_interval", 0x2a21_u32), - ("org.bluetooth.characteristic.model_number_string", 0x2a24_u32), + ( + "org.bluetooth.characteristic.magnetic_declination", + 0x2a2c_u32, + ), + ( + "org.bluetooth.characteristic.magnetic_flux_density_2d", + 0x2aa0_u32, + ), + ( + "org.bluetooth.characteristic.magnetic_flux_density_3d", + 0x2aa1_u32, + ), + ( + "org.bluetooth.characteristic.manufacturer_name_string", + 0x2a29_u32, + ), + ( + "org.bluetooth.characteristic.maximum_recommended_heart_rate", + 0x2a91_u32, + ), + ( + "org.bluetooth.characteristic.measurement_interval", + 0x2a21_u32, + ), + ( + "org.bluetooth.characteristic.model_number_string", + 0x2a24_u32, + ), ("org.bluetooth.characteristic.navigation", 0x2a68_u32), ("org.bluetooth.characteristic.new_alert", 0x2a46_u32), - ("org.bluetooth.characteristic.object_action_control_point", 0x2ac5_u32), + ( + "org.bluetooth.characteristic.object_action_control_point", + 0x2ac5_u32, + ), ("org.bluetooth.characteristic.object_changed", 0x2ac8_u32), - ("org.bluetooth.characteristic.object_first_created", 0x2ac1_u32), + ( + "org.bluetooth.characteristic.object_first_created", + 0x2ac1_u32, + ), ("org.bluetooth.characteristic.object_id", 0x2ac3_u32), - ("org.bluetooth.characteristic.object_last_modified", 0x2ac2_u32), - ("org.bluetooth.characteristic.object_list_control_point", 0x2ac6_u32), - ("org.bluetooth.characteristic.object_list_filter", 0x2ac7_u32), + ( + "org.bluetooth.characteristic.object_last_modified", + 0x2ac2_u32, + ), + ( + "org.bluetooth.characteristic.object_list_control_point", + 0x2ac6_u32, + ), + ( + "org.bluetooth.characteristic.object_list_filter", + 0x2ac7_u32, + ), ("org.bluetooth.characteristic.object_name", 0x2abe_u32), ("org.bluetooth.characteristic.object_properties", 0x2ac4_u32), ("org.bluetooth.characteristic.object_size", 0x2ac0_u32), ("org.bluetooth.characteristic.object_type", 0x2abf_u32), ("org.bluetooth.characteristic.ots_feature", 0x2abd_u32), - ("org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters", 0x2a04_u32), - ("org.bluetooth.characteristic.gap.peripheral_privacy_flag", 0x2a02_u32), - ("org.bluetooth.characteristic.plx_continuous_measurement", 0x2a5f_u32), + ( + "org.bluetooth.characteristic.gap.peripheral_preferred_connection_parameters", + 0x2a04_u32, + ), + ( + "org.bluetooth.characteristic.gap.peripheral_privacy_flag", + 0x2a02_u32, + ), + ( + "org.bluetooth.characteristic.plx_continuous_measurement", + 0x2a5f_u32, + ), ("org.bluetooth.characteristic.plx_features", 0x2a60_u32), - ("org.bluetooth.characteristic.plx_spot_check_measurement", 0x2a5e_u32), + ( + "org.bluetooth.characteristic.plx_spot_check_measurement", + 0x2a5e_u32, + ), ("org.bluetooth.characteristic.pnp_id", 0x2a50_u32), - ("org.bluetooth.characteristic.pollen_concentration", 0x2a75_u32), + ( + "org.bluetooth.characteristic.pollen_concentration", + 0x2a75_u32, + ), ("org.bluetooth.characteristic.position_quality", 0x2a69_u32), ("org.bluetooth.characteristic.pressure", 0x2a6d_u32), ("org.bluetooth.characteristic.protocol_mode", 0x2a4e_u32), ("org.bluetooth.characteristic.rainfall", 0x2a78_u32), - ("org.bluetooth.characteristic.gap.reconnection_address", 0x2a03_u32), - ("org.bluetooth.characteristic.record_access_control_point", 0x2a52_u32), - ("org.bluetooth.characteristic.reference_time_information", 0x2a14_u32), + ( + "org.bluetooth.characteristic.gap.reconnection_address", + 0x2a03_u32, + ), + ( + "org.bluetooth.characteristic.record_access_control_point", + 0x2a52_u32, + ), + ( + "org.bluetooth.characteristic.reference_time_information", + 0x2a14_u32, + ), ("org.bluetooth.characteristic.report", 0x2a4d_u32), ("org.bluetooth.characteristic.report_map", 0x2a4b_u32), - ("org.bluetooth.characteristic.resting_heart_rate", 0x2a92_u32), - ("org.bluetooth.characteristic.ringer_control_point", 0x2a40_u32), + ( + "org.bluetooth.characteristic.resting_heart_rate", + 0x2a92_u32, + ), + ( + "org.bluetooth.characteristic.ringer_control_point", + 0x2a40_u32, + ), ("org.bluetooth.characteristic.ringer_setting", 0x2a41_u32), ("org.bluetooth.characteristic.rsc_feature", 0x2a54_u32), ("org.bluetooth.characteristic.rsc_measurement", 0x2a53_u32), ("org.bluetooth.characteristic.sc_control_point", 0x2a55_u32), - ("org.bluetooth.characteristic.scan_interval_window", 0x2a4f_u32), + ( + "org.bluetooth.characteristic.scan_interval_window", + 0x2a4f_u32, + ), ("org.bluetooth.characteristic.scan_refresh", 0x2a31_u32), ("org.bluetooth.characteristic.sensor_location", 0x2a5d_u32), - ("org.bluetooth.characteristic.serial_number_string", 0x2a25_u32), - ("org.bluetooth.characteristic.gatt.service_changed", 0x2a05_u32), - ("org.bluetooth.characteristic.software_revision_string", 0x2a28_u32), - ("org.bluetooth.characteristic.sport_type_for_aerobic_and_anaerobic_thresholds", 0x2a93_u32), - ("org.bluetooth.characteristic.supported_new_alert_category", 0x2a47_u32), - ("org.bluetooth.characteristic.supported_unread_alert_category", 0x2a48_u32), + ( + "org.bluetooth.characteristic.serial_number_string", + 0x2a25_u32, + ), + ( + "org.bluetooth.characteristic.gatt.service_changed", + 0x2a05_u32, + ), + ( + "org.bluetooth.characteristic.software_revision_string", + 0x2a28_u32, + ), + ( + "org.bluetooth.characteristic.sport_type_for_aerobic_and_anaerobic_thresholds", + 0x2a93_u32, + ), + ( + "org.bluetooth.characteristic.supported_new_alert_category", + 0x2a47_u32, + ), + ( + "org.bluetooth.characteristic.supported_unread_alert_category", + 0x2a48_u32, + ), ("org.bluetooth.characteristic.system_id", 0x2a23_u32), ("org.bluetooth.characteristic.tds_control_point", 0x2abc_u32), ("org.bluetooth.characteristic.temperature", 0x2a6e_u32), - ("org.bluetooth.characteristic.temperature_measurement", 0x2a1c_u32), + ( + "org.bluetooth.characteristic.temperature_measurement", + 0x2a1c_u32, + ), ("org.bluetooth.characteristic.temperature_type", 0x2a1d_u32), - ("org.bluetooth.characteristic.three_zone_heart_rate_limits", 0x2a94_u32), + ( + "org.bluetooth.characteristic.three_zone_heart_rate_limits", + 0x2a94_u32, + ), ("org.bluetooth.characteristic.time_accuracy", 0x2a12_u32), ("org.bluetooth.characteristic.time_source", 0x2a13_u32), - ("org.bluetooth.characteristic.time_update_control_point", 0x2a16_u32), + ( + "org.bluetooth.characteristic.time_update_control_point", + 0x2a16_u32, + ), ("org.bluetooth.characteristic.time_update_state", 0x2a17_u32), ("org.bluetooth.characteristic.time_with_dst", 0x2a11_u32), ("org.bluetooth.characteristic.time_zone", 0x2a0e_u32), - ("org.bluetooth.characteristic.true_wind_direction", 0x2a71_u32), + ( + "org.bluetooth.characteristic.true_wind_direction", + 0x2a71_u32, + ), ("org.bluetooth.characteristic.true_wind_speed", 0x2a70_u32), - ("org.bluetooth.characteristic.two_zone_heart_rate_limit", 0x2a95_u32), + ( + "org.bluetooth.characteristic.two_zone_heart_rate_limit", + 0x2a95_u32, + ), ("org.bluetooth.characteristic.tx_power_level", 0x2a07_u32), ("org.bluetooth.characteristic.uncertainty", 0x2ab4_u32), - ("org.bluetooth.characteristic.unread_alert_status", 0x2a45_u32), + ( + "org.bluetooth.characteristic.unread_alert_status", + 0x2a45_u32, + ), ("org.bluetooth.characteristic.uri", 0x2ab6_u32), - ("org.bluetooth.characteristic.user_control_point", 0x2a9f_u32), + ( + "org.bluetooth.characteristic.user_control_point", + 0x2a9f_u32, + ), ("org.bluetooth.characteristic.user_index", 0x2a9a_u32), ("org.bluetooth.characteristic.uv_index", 0x2a76_u32), ("org.bluetooth.characteristic.vo2_max", 0x2a96_u32), - ("org.bluetooth.characteristic.waist_circumference", 0x2a97_u32), + ( + "org.bluetooth.characteristic.waist_circumference", + 0x2a97_u32, + ), ("org.bluetooth.characteristic.weight", 0x2a98_u32), - ("org.bluetooth.characteristic.weight_measurement", 0x2a9d_u32), - ("org.bluetooth.characteristic.weight_scale_feature", 0x2a9e_u32), + ( + "org.bluetooth.characteristic.weight_measurement", + 0x2a9d_u32, + ), + ( + "org.bluetooth.characteristic.weight_scale_feature", + 0x2a9e_u32, + ), ("org.bluetooth.characteristic.wind_chill", 0x2a79_u32), ]; //https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx const BLUETOOTH_ASSIGNED_DESCRIPTORS: &'static [(&'static str, u32)] = &[ - ("org.bluetooth.descriptor.gatt.characteristic_extended_properties", 0x2900_u32), - ("org.bluetooth.descriptor.gatt.characteristic_user_description", 0x2901_u32), - ("org.bluetooth.descriptor.gatt.client_characteristic_configuration", 0x2902_u32), - ("org.bluetooth.descriptor.gatt.server_characteristic_configuration", 0x2903_u32), - ("org.bluetooth.descriptor.gatt.characteristic_presentation_format", 0x2904_u32), - ("org.bluetooth.descriptor.gatt.characteristic_aggregate_format", 0x2905_u32), + ( + "org.bluetooth.descriptor.gatt.characteristic_extended_properties", + 0x2900_u32, + ), + ( + "org.bluetooth.descriptor.gatt.characteristic_user_description", + 0x2901_u32, + ), + ( + "org.bluetooth.descriptor.gatt.client_characteristic_configuration", + 0x2902_u32, + ), + ( + "org.bluetooth.descriptor.gatt.server_characteristic_configuration", + 0x2903_u32, + ), + ( + "org.bluetooth.descriptor.gatt.characteristic_presentation_format", + 0x2904_u32, + ), + ( + "org.bluetooth.descriptor.gatt.characteristic_aggregate_format", + 0x2905_u32, + ), ("org.bluetooth.descriptor.valid_range", 0x2906_u32), - ("org.bluetooth.descriptor.external_report_reference", 0x2907_u32), + ( + "org.bluetooth.descriptor.external_report_reference", + 0x2907_u32, + ), ("org.bluetooth.descriptor.report_reference", 0x2908_u32), ("org.bluetooth.descriptor.number_of_digitals", 0x2909_u32), ("org.bluetooth.descriptor.value_trigger_setting", 0x290a_u32), @@ -268,19 +565,23 @@ const BASE_UUID: &'static str = "-0000-1000-8000-00805f9b34fb"; const SERVICE_PREFIX: &'static str = "org.bluetooth.service"; const CHARACTERISTIC_PREFIX: &'static str = "org.bluetooth.characteristic"; const DESCRIPTOR_PREFIX: &'static str = "org.bluetooth.descriptor"; -const VALID_UUID_REGEX: &'static str = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"; +const VALID_UUID_REGEX: &'static str = + "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"; // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.cpp?l=314 const UUID_ERROR_MESSAGE: &'static str = "It must be a valid UUID alias (e.g. 0x1234), \ UUID (lowercase hex characters e.g. '00001234-0000-1000-8000-00805f9b34fb'),\nor recognized standard name from"; // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.cpp?l=321 -const SERVICES_ERROR_MESSAGE: &'static str = "https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx\ - \ne.g. 'alert_notification'."; +const SERVICES_ERROR_MESSAGE: &'static str = + "https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspx\ + \ne.g. 'alert_notification'."; // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.cpp?l=327 -const CHARACTERISTIC_ERROR_MESSAGE: &'static str = "https://developer.bluetooth.org/gatt/characteristics/Pages/\ - CharacteristicsHome.aspx\ne.g. 'aerobic_heart_rate_lower_limit'."; +const CHARACTERISTIC_ERROR_MESSAGE: &'static str = + "https://developer.bluetooth.org/gatt/characteristics/Pages/\ + CharacteristicsHome.aspx\ne.g. 'aerobic_heart_rate_lower_limit'."; // https://cs.chromium.org/chromium/src/third_party/WebKit/Source/modules/bluetooth/BluetoothUUID.cpp?l=333 -const DESCRIPTOR_ERROR_MESSAGE: &'static str = "https://developer.bluetooth.org/gatt/descriptors/Pages/\ - DescriptorsHomePage.aspx\ne.g. 'gatt.characteristic_presentation_format'."; +const DESCRIPTOR_ERROR_MESSAGE: &'static str = + "https://developer.bluetooth.org/gatt/descriptors/Pages/\ + DescriptorsHomePage.aspx\ne.g. 'gatt.characteristic_presentation_format'."; impl BluetoothUUID { // https://webbluetoothcg.github.io/web-bluetooth/#dom-bluetoothuuid-canonicaluuid @@ -310,7 +611,11 @@ impl BluetoothUUID { } pub fn characteristic(name: BluetoothCharacteristicUUID) -> Fallible { - resolve_uuid_name(name, BLUETOOTH_ASSIGNED_CHARCTERISTICS, CHARACTERISTIC_PREFIX) + resolve_uuid_name( + name, + BLUETOOTH_ASSIGNED_CHARCTERISTICS, + CHARACTERISTIC_PREFIX, + ) } pub fn descriptor(name: BluetoothDescriptorUUID) -> Fallible { @@ -333,22 +638,20 @@ fn canonical_uuid(alias: u32) -> UUID { // https://webbluetoothcg.github.io/web-bluetooth/#resolveuuidname fn resolve_uuid_name( - name: StringOrUnsignedLong, - assigned_numbers_table: &'static [(&'static str, u32)], - prefix: &str) - -> Fallible { + name: StringOrUnsignedLong, + assigned_numbers_table: &'static [(&'static str, u32)], + prefix: &str, +) -> Fallible { match name { // Step 1. - StringOrUnsignedLong::UnsignedLong(unsigned32) => { - Ok(canonical_uuid(unsigned32)) - }, + StringOrUnsignedLong::UnsignedLong(unsigned32) => Ok(canonical_uuid(unsigned32)), StringOrUnsignedLong::String(dstring) => { - // Step 2. + // Step 2. let regex = Regex::new(VALID_UUID_REGEX).unwrap(); if regex.is_match(&*dstring) { Ok(dstring) } else { - // Step 3. + // Step 3. let concatenated = format!("{}.{}", prefix, dstring); let is_in_table = assigned_numbers_table.iter().find(|p| p.0 == concatenated); match is_in_table { @@ -356,16 +659,17 @@ fn resolve_uuid_name( None => { let (attribute_type, error_url_message) = match prefix { SERVICE_PREFIX => ("Service", SERVICES_ERROR_MESSAGE), - CHARACTERISTIC_PREFIX => ("Characteristic", CHARACTERISTIC_ERROR_MESSAGE), + CHARACTERISTIC_PREFIX => { + ("Characteristic", CHARACTERISTIC_ERROR_MESSAGE) + }, DESCRIPTOR_PREFIX => ("Descriptor", DESCRIPTOR_ERROR_MESSAGE), _ => unreachable!(), }; // Step 4. - return Err(Type(format!("Invalid {} name : '{}'.\n{} {}", - attribute_type, - dstring, - UUID_ERROR_MESSAGE, - error_url_message))); + return Err(Type(format!( + "Invalid {} name : '{}'.\n{} {}", + attribute_type, dstring, UUID_ERROR_MESSAGE, error_url_message + ))); }, } } diff --git a/components/script/dom/canvasgradient.rs b/components/script/dom/canvasgradient.rs index ab6ad47d905..e3f4ea54f4b 100644 --- a/components/script/dom/canvasgradient.rs +++ b/components/script/dom/canvasgradient.rs @@ -40,9 +40,11 @@ impl CanvasGradient { } pub fn new(global: &GlobalScope, style: CanvasGradientStyle) -> DomRoot { - reflect_dom_object(Box::new(CanvasGradient::new_inherited(style)), - global, - CanvasGradientBinding::Wrap) + reflect_dom_object( + Box::new(CanvasGradient::new_inherited(style)), + global, + CanvasGradientBinding::Wrap, + ) } } @@ -60,10 +62,10 @@ impl CanvasGradientMethods for CanvasGradient { match color { Ok(CSSColor::RGBA(rgba)) => rgba, Ok(CSSColor::CurrentColor) => RGBA::new(0, 0, 0, 255), - _ => return Err(Error::Syntax) + _ => return Err(Error::Syntax), } } else { - return Err(Error::Syntax) + return Err(Error::Syntax); }; self.stops.borrow_mut().push(CanvasGradientStop { @@ -83,21 +85,25 @@ impl<'a> ToFillOrStrokeStyle for &'a CanvasGradient { let gradient_stops = self.stops.borrow().clone(); match self.style { CanvasGradientStyle::Linear(ref gradient) => { - FillOrStrokeStyle::LinearGradient(LinearGradientStyle::new(gradient.x0, - gradient.y0, - gradient.x1, - gradient.y1, - gradient_stops)) - } + FillOrStrokeStyle::LinearGradient(LinearGradientStyle::new( + gradient.x0, + gradient.y0, + gradient.x1, + gradient.y1, + gradient_stops, + )) + }, CanvasGradientStyle::Radial(ref gradient) => { - FillOrStrokeStyle::RadialGradient(RadialGradientStyle::new(gradient.x0, - gradient.y0, - gradient.r0, - gradient.x1, - gradient.y1, - gradient.r1, - gradient_stops)) - } + FillOrStrokeStyle::RadialGradient(RadialGradientStyle::new( + gradient.x0, + gradient.y0, + gradient.r0, + gradient.x1, + gradient.y1, + gradient.r1, + gradient_stops, + )) + }, } } } diff --git a/components/script/dom/canvaspattern.rs b/components/script/dom/canvaspattern.rs index d1bf89f3e63..ced7a6bb11b 100644 --- a/components/script/dom/canvaspattern.rs +++ b/components/script/dom/canvaspattern.rs @@ -23,11 +23,12 @@ pub struct CanvasPattern { } impl CanvasPattern { - fn new_inherited(surface_data: Vec, - surface_size: Size2D, - repeat: RepetitionStyle, - origin_clean: bool) - -> CanvasPattern { + fn new_inherited( + surface_data: Vec, + surface_size: Size2D, + repeat: RepetitionStyle, + origin_clean: bool, + ) -> CanvasPattern { let (x, y) = match repeat { RepetitionStyle::Repeat => (true, true), RepetitionStyle::RepeatX => (true, false), @@ -44,30 +45,36 @@ impl CanvasPattern { origin_clean: origin_clean, } } - pub fn new(global: &GlobalScope, - surface_data: Vec, - surface_size: Size2D, - repeat: RepetitionStyle, - origin_clean: bool) - -> DomRoot { + pub fn new( + global: &GlobalScope, + surface_data: Vec, + surface_size: Size2D, + repeat: RepetitionStyle, + origin_clean: bool, + ) -> DomRoot { reflect_dom_object( Box::new(CanvasPattern::new_inherited( - surface_data, surface_size, repeat, origin_clean + surface_data, + surface_size, + repeat, + origin_clean, )), global, - CanvasPatternBinding::Wrap + CanvasPatternBinding::Wrap, ) } pub fn origin_is_clean(&self) -> bool { - self.origin_clean + self.origin_clean } } impl<'a> ToFillOrStrokeStyle for &'a CanvasPattern { fn to_fill_or_stroke_style(self) -> FillOrStrokeStyle { - FillOrStrokeStyle::Surface(SurfaceStyle::new(self.surface_data.clone(), - self.surface_size, - self.repeat_x, - self.repeat_y)) + FillOrStrokeStyle::Surface(SurfaceStyle::new( + self.surface_data.clone(), + self.surface_size, + self.repeat_x, + self.repeat_y, + )) } } diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 948fd0b9efe..e3ca01c311e 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -123,17 +123,21 @@ impl CanvasContextState { } impl CanvasRenderingContext2D { - pub fn new_inherited(global: &GlobalScope, - canvas: Option<&HTMLCanvasElement>, - image_cache: Arc, - base_url: ServoUrl, - size: Size2D) - -> CanvasRenderingContext2D { + pub fn new_inherited( + global: &GlobalScope, + canvas: Option<&HTMLCanvasElement>, + image_cache: Arc, + base_url: ServoUrl, + size: Size2D, + ) -> CanvasRenderingContext2D { debug!("Creating new canvas rendering context."); - let (sender, receiver) = profiled_ipc::channel(global.time_profiler_chan().clone()).unwrap(); + let (sender, receiver) = + profiled_ipc::channel(global.time_profiler_chan().clone()).unwrap(); let script_to_constellation_chan = global.script_to_constellation_chan(); debug!("Asking constellation to create new canvas thread."); - script_to_constellation_chan.send(ScriptMsg::CreateCanvasPaintThread(size, sender)).unwrap(); + script_to_constellation_chan + .send(ScriptMsg::CreateCanvasPaintThread(size, sender)) + .unwrap(); let (ipc_renderer, canvas_id) = receiver.recv().unwrap(); debug!("Done."); CanvasRenderingContext2D { @@ -150,15 +154,20 @@ impl CanvasRenderingContext2D { } } - pub fn new(global: &GlobalScope, - canvas: &HTMLCanvasElement, - size: Size2D) - -> DomRoot { + pub fn new( + global: &GlobalScope, + canvas: &HTMLCanvasElement, + size: Size2D, + ) -> DomRoot { let window = window_from_node(canvas); let image_cache = window.image_cache(); let base_url = window.get_url(); let boxed = Box::new(CanvasRenderingContext2D::new_inherited( - global, Some(canvas), image_cache, base_url, size + global, + Some(canvas), + image_cache, + base_url, + size, )); reflect_dom_object(boxed, global, CanvasRenderingContext2DBinding::Wrap) } @@ -191,28 +200,35 @@ impl CanvasRenderingContext2D { // on the drawImage call arguments // source rectangle = area of the original image to be copied // destination rectangle = area of the destination canvas where the source image is going to be drawn - fn adjust_source_dest_rects(&self, - image_size: Size2D, - sx: f64, - sy: f64, - sw: f64, - sh: f64, - dx: f64, - dy: f64, - dw: f64, - dh: f64) - -> (Rect, Rect) { - let image_rect = Rect::new(Point2D::new(0f64, 0f64), - Size2D::new(image_size.width as f64, image_size.height as f64)); + fn adjust_source_dest_rects( + &self, + image_size: Size2D, + sx: f64, + sy: f64, + sw: f64, + sh: f64, + dx: f64, + dy: f64, + dw: f64, + dh: f64, + ) -> (Rect, Rect) { + let image_rect = Rect::new( + Point2D::new(0f64, 0f64), + Size2D::new(image_size.width as f64, image_size.height as f64), + ); // The source rectangle is the rectangle whose corners are the four points (sx, sy), // (sx+sw, sy), (sx+sw, sy+sh), (sx, sy+sh). - let source_rect = Rect::new(Point2D::new(sx.min(sx + sw), sy.min(sy + sh)), - Size2D::new(sw.abs(), sh.abs())); + let source_rect = Rect::new( + Point2D::new(sx.min(sx + sw), sy.min(sy + sh)), + Size2D::new(sw.abs(), sh.abs()), + ); // When the source rectangle is outside the source image, // the source rectangle must be clipped to the source image - let source_rect_clipped = source_rect.intersection(&image_rect).unwrap_or(Rect::zero()); + let source_rect_clipped = source_rect + .intersection(&image_rect) + .unwrap_or(Rect::zero()); // Width and height ratios between the non clipped and clipped source rectangles let width_ratio: f64 = source_rect_clipped.size.width / source_rect.size.width; @@ -225,27 +241,29 @@ impl CanvasRenderingContext2D { // The destination rectangle is the rectangle whose corners are the four points (dx, dy), // (dx+dw, dy), (dx+dw, dy+dh), (dx, dy+dh). - let dest_rect = Rect::new(Point2D::new(dx.min(dx + dest_rect_width_scaled), - dy.min(dy + dest_rect_height_scaled)), - Size2D::new(dest_rect_width_scaled.abs(), - dest_rect_height_scaled.abs())); + let dest_rect = Rect::new( + Point2D::new( + dx.min(dx + dest_rect_width_scaled), + dy.min(dy + dest_rect_height_scaled), + ), + Size2D::new(dest_rect_width_scaled.abs(), dest_rect_height_scaled.abs()), + ); - let source_rect = Rect::new(Point2D::new(source_rect_clipped.origin.x, - source_rect_clipped.origin.y), - Size2D::new(source_rect_clipped.size.width, - source_rect_clipped.size.height)); + let source_rect = Rect::new( + Point2D::new(source_rect_clipped.origin.x, source_rect_clipped.origin.y), + Size2D::new( + source_rect_clipped.size.width, + source_rect_clipped.size.height, + ), + ); (source_rect, dest_rect) } // https://html.spec.whatwg.org/multipage/#the-image-argument-is-not-origin-clean - fn is_origin_clean(&self, - image: CanvasImageSource) - -> bool { + fn is_origin_clean(&self, image: CanvasImageSource) -> bool { match image { - CanvasImageSource::HTMLCanvasElement(canvas) => { - canvas.origin_is_clean() - } + CanvasImageSource::HTMLCanvasElement(canvas) => canvas.origin_is_clean(), CanvasImageSource::HTMLImageElement(image) => { image.same_origin(GlobalScope::entry().origin()) } @@ -274,38 +292,35 @@ impl CanvasRenderingContext2D { // is copied on the rectangle (dx, dy, dh, dw) of the destination canvas // // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage - fn draw_image(&self, - image: CanvasImageSource, - sx: f64, - sy: f64, - sw: Option, - sh: Option, - dx: f64, - dy: f64, - dw: Option, - dh: Option) - -> ErrorResult { + fn draw_image( + &self, + image: CanvasImageSource, + sx: f64, + sy: f64, + sw: Option, + sh: Option, + dx: f64, + dy: f64, + dw: Option, + dh: Option, + ) -> ErrorResult { let result = match image { CanvasImageSource::HTMLCanvasElement(ref canvas) => { - self.draw_html_canvas_element(&canvas, - sx, sy, sw, sh, - dx, dy, dw, dh) - } + self.draw_html_canvas_element(&canvas, sx, sy, sw, sh, dx, dy, dw, dh) + }, CanvasImageSource::HTMLImageElement(ref image) => { // https://html.spec.whatwg.org/multipage/#img-error // If the image argument is an HTMLImageElement object that is in the broken state, // then throw an InvalidStateError exception let url = image.get_url().ok_or(Error::InvalidState)?; - self.fetch_and_draw_image_data(url, - sx, sy, sw, sh, - dx, dy, dw, dh) - } + self.fetch_and_draw_image_data(url, sx, sy, sw, sh, dx, dy, dw, dh) + }, CanvasImageSource::CSSStyleValue(ref value) => { - let url = value.get_url(self.base_url.clone()).ok_or(Error::InvalidState)?; - self.fetch_and_draw_image_data(url, - sx, sy, sw, sh, - dx, dy, dw, dh) - } + let url = value + .get_url(self.base_url.clone()) + .ok_or(Error::InvalidState)?; + self.fetch_and_draw_image_data(url, sx, sy, sw, sh, dx, dy, dw, dh) + }, }; if result.is_ok() && !self.is_origin_clean(image) { @@ -339,17 +354,8 @@ impl CanvasRenderingContext2D { let image_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64); // 2. Establish the source and destination rectangles - let (source_rect, dest_rect) = self.adjust_source_dest_rects( - image_size, - sx, - sy, - sw, - sh, - dx, - dy, - dw, - dh, - ); + let (source_rect, dest_rect) = + self.adjust_source_dest_rects(image_size, sx, sy, sw, sh, dx, dy, dw, dh); if !is_rect_valid(source_rect) || !is_rect_valid(dest_rect) { return Ok(()); @@ -384,17 +390,18 @@ impl CanvasRenderingContext2D { Ok(()) } - fn fetch_and_draw_image_data(&self, - url: ServoUrl, - sx: f64, - sy: f64, - sw: Option, - sh: Option, - dx: f64, - dy: f64, - dw: Option, - dh: Option) - -> ErrorResult { + fn fetch_and_draw_image_data( + &self, + url: ServoUrl, + sx: f64, + sy: f64, + sw: Option, + sh: Option, + dx: f64, + dy: f64, + dw: Option, + dh: Option, + ) -> ErrorResult { debug!("Fetching image {}.", url); // https://html.spec.whatwg.org/multipage/#img-error // If the image argument is an HTMLImageElement object that is in the broken state, @@ -413,34 +420,25 @@ impl CanvasRenderingContext2D { let dh = dh.unwrap_or(image_size.height); let sw = sw.unwrap_or(image_size.width); let sh = sh.unwrap_or(image_size.height); - self.draw_image_data(image_data, - image_size, - sx, sy, sw, sh, - dx, dy, dw, dh) - } - - fn draw_image_data(&self, - image_data: Vec, - image_size: Size2D, - sx: f64, - sy: f64, - sw: f64, - sh: f64, - dx: f64, - dy: f64, - dw: f64, - dh: f64) - -> ErrorResult { + self.draw_image_data(image_data, image_size, sx, sy, sw, sh, dx, dy, dw, dh) + } + + fn draw_image_data( + &self, + image_data: Vec, + image_size: Size2D, + sx: f64, + sy: f64, + sw: f64, + sh: f64, + dx: f64, + dy: f64, + dw: f64, + dh: f64, + ) -> ErrorResult { // Establish the source and destination rectangles - let (source_rect, dest_rect) = self.adjust_source_dest_rects(image_size, - sx, - sy, - sw, - sh, - dx, - dy, - dw, - dh); + let (source_rect, dest_rect) = + self.adjust_source_dest_rects(image_size, sx, sy, sw, sh, dx, dy, dw, dh); if !is_rect_valid(source_rect) || !is_rect_valid(dest_rect) { return Ok(()); @@ -465,7 +463,7 @@ impl CanvasRenderingContext2D { ImageResponse::None | ImageResponse::MetadataLoaded(_) => { return None; - } + }, }; let image_size = Size2D::new(img.width as i32, img.height as i32); @@ -481,15 +479,16 @@ impl CanvasRenderingContext2D { #[inline] fn request_image_from_cache(&self, url: ServoUrl) -> ImageResponse { - let response = self.image_cache - .find_image_or_metadata(url.clone(), - UsePlaceholder::No, - CanRequestImages::No); + let response = self.image_cache.find_image_or_metadata( + url.clone(), + UsePlaceholder::No, + CanRequestImages::No, + ); match response { - Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) => - ImageResponse::Loaded(image, url), - Err(ImageState::Pending(_)) => - ImageResponse::None, + Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) => { + ImageResponse::Loaded(image, url) + }, + Err(ImageState::Pending(_)) => ImageResponse::None, _ => { // Rather annoyingly, we get the same response back from // A load which really failed and from a load which hasn't started yet. @@ -512,8 +511,10 @@ impl CanvasRenderingContext2D { return None; } - Some(Rect::new(Point2D::new(x as f32, y as f32), - Size2D::new(w as f32, h as f32))) + Some(Rect::new( + Point2D::new(x as f32, y as f32), + Size2D::new(w as f32, h as f32), + )) } fn parse_color(&self, string: &str) -> Result { @@ -540,11 +541,13 @@ impl CanvasRenderingContext2D { let canvas_element = canvas.upcast::(); match canvas_element.style() { - Some(ref s) if canvas_element.has_css_layout_box() => Ok(s.get_color().color), - _ => Ok(RGBA::new(0, 0, 0, 255)) + Some(ref s) if canvas_element.has_css_layout_box() => { + Ok(s.get_color().color) + }, + _ => Ok(RGBA::new(0, 0, 0, 255)), } }, - _ => Err(()) + _ => Err(()), } } else { Err(()) @@ -556,7 +559,9 @@ impl CanvasRenderingContext2D { } pub fn send_canvas_2d_msg(&self, msg: Canvas2dMsg) { - self.ipc_renderer.send(CanvasMsg::Canvas2d(msg, self.get_canvas_id())).unwrap() + self.ipc_renderer + .send(CanvasMsg::Canvas2d(msg, self.get_canvas_id())) + .unwrap() } pub fn get_ipc_renderer(&self) -> IpcSender { @@ -610,7 +615,9 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-save fn Save(&self) { - self.saved_states.borrow_mut().push(self.state.borrow().clone()); + self.saved_states + .borrow_mut() + .push(self.state.borrow().clone()); self.send_canvas_2d_msg(Canvas2dMsg::SaveContext); } @@ -643,10 +650,14 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { let (sin, cos) = (angle.sin(), angle.cos()); let transform = self.state.borrow().transform; - self.state.borrow_mut().transform = transform.pre_mul( - &Transform2D::row_major(cos as f32, sin as f32, - -sin as f32, cos as f32, - 0.0, 0.0)); + self.state.borrow_mut().transform = transform.pre_mul(&Transform2D::row_major( + cos as f32, + sin as f32, + -sin as f32, + cos as f32, + 0.0, + 0.0, + )); self.update_transform() } @@ -663,21 +674,32 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-transform fn Transform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { - if !(a.is_finite() && b.is_finite() && c.is_finite() && - d.is_finite() && e.is_finite() && f.is_finite()) { + if !(a.is_finite() && + b.is_finite() && + c.is_finite() && + d.is_finite() && + e.is_finite() && + f.is_finite()) + { return; } let transform = self.state.borrow().transform; - self.state.borrow_mut().transform = transform.pre_mul( - &Transform2D::row_major(a as f32, b as f32, c as f32, d as f32, e as f32, f as f32)); + self.state.borrow_mut().transform = transform.pre_mul(&Transform2D::row_major( + a as f32, b as f32, c as f32, d as f32, e as f32, f as f32, + )); self.update_transform() } // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform fn SetTransform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { - if !(a.is_finite() && b.is_finite() && c.is_finite() && - d.is_finite() && e.is_finite() && f.is_finite()) { + if !(a.is_finite() && + b.is_finite() && + c.is_finite() && + d.is_finite() && + e.is_finite() && + f.is_finite()) + { return; } @@ -784,7 +806,8 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { CanvasFillRule::Nonzero => FillRule::Nonzero, CanvasFillRule::Evenodd => FillRule::Evenodd, }; - let (sender, receiver) = profiled_ipc::channel::(self.global().time_profiler_chan().clone()).unwrap(); + let (sender, receiver) = + profiled_ipc::channel::(self.global().time_profiler_chan().clone()).unwrap(); self.send_canvas_2d_msg(Canvas2dMsg::IsPointInPath(x, y, fill_rule, sender)); receiver.recv().unwrap() } @@ -797,11 +820,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { } // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage - fn DrawImage(&self, - image: CanvasImageSource, - dx: f64, - dy: f64) - -> ErrorResult { + fn DrawImage(&self, image: CanvasImageSource, dx: f64, dy: f64) -> ErrorResult { if !(dx.is_finite() && dy.is_finite()) { return Ok(()); } @@ -810,13 +829,14 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { } // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage - fn DrawImage_(&self, - image: CanvasImageSource, - dx: f64, - dy: f64, - dw: f64, - dh: f64) - -> ErrorResult { + fn DrawImage_( + &self, + image: CanvasImageSource, + dx: f64, + dy: f64, + dw: f64, + dh: f64, + ) -> ErrorResult { if !(dx.is_finite() && dy.is_finite() && dw.is_finite() && dh.is_finite()) { return Ok(()); } @@ -825,31 +845,41 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { } // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage - fn DrawImage__(&self, - image: CanvasImageSource, - sx: f64, - sy: f64, - sw: f64, - sh: f64, - dx: f64, - dy: f64, - dw: f64, - dh: f64) - -> ErrorResult { - if !(sx.is_finite() && sy.is_finite() && sw.is_finite() && sh.is_finite() && - dx.is_finite() && dy.is_finite() && dw.is_finite() && dh.is_finite()) { + fn DrawImage__( + &self, + image: CanvasImageSource, + sx: f64, + sy: f64, + sw: f64, + sh: f64, + dx: f64, + dy: f64, + dw: f64, + dh: f64, + ) -> ErrorResult { + if !(sx.is_finite() && + sy.is_finite() && + sw.is_finite() && + sh.is_finite() && + dx.is_finite() && + dy.is_finite() && + dw.is_finite() && + dh.is_finite()) + { return Ok(()); } - self.draw_image(image, - sx, - sy, - Some(sw), - Some(sh), - dx, - dy, - Some(dw), - Some(dh)) + self.draw_image( + image, + sx, + sy, + Some(sw), + Some(sh), + dx, + dy, + Some(dw), + Some(dh), + ) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-moveto @@ -871,8 +901,10 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-rect fn Rect(&self, x: f64, y: f64, width: f64, height: f64) { if [x, y, width, height].iter().all(|val| val.is_finite()) { - let rect = Rect::new(Point2D::new(x as f32, y as f32), - Size2D::new(width as f32, height as f32)); + let rect = Rect::new( + Point2D::new(x as f32, y as f32), + Size2D::new(width as f32, height as f32), + ); self.send_canvas_2d_msg(Canvas2dMsg::Rect(rect)); } } @@ -882,23 +914,28 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { if !(cpx.is_finite() && cpy.is_finite() && x.is_finite() && y.is_finite()) { return; } - self.send_canvas_2d_msg(Canvas2dMsg::QuadraticCurveTo(Point2D::new(cpx as f32, - cpy as f32), - Point2D::new(x as f32, - y as f32))); + self.send_canvas_2d_msg(Canvas2dMsg::QuadraticCurveTo( + Point2D::new(cpx as f32, cpy as f32), + Point2D::new(x as f32, y as f32), + )); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-beziercurveto fn BezierCurveTo(&self, cp1x: f64, cp1y: f64, cp2x: f64, cp2y: f64, x: f64, y: f64) { - if !(cp1x.is_finite() && cp1y.is_finite() && cp2x.is_finite() && cp2y.is_finite() && - x.is_finite() && y.is_finite()) { + if !(cp1x.is_finite() && + cp1y.is_finite() && + cp2x.is_finite() && + cp2y.is_finite() && + x.is_finite() && + y.is_finite()) + { return; } - self.send_canvas_2d_msg(Canvas2dMsg::BezierCurveTo(Point2D::new(cp1x as f32, - cp1y as f32), - Point2D::new(cp2x as f32, - cp2y as f32), - Point2D::new(x as f32, y as f32))); + self.send_canvas_2d_msg(Canvas2dMsg::BezierCurveTo( + Point2D::new(cp1x as f32, cp1y as f32), + Point2D::new(cp2x as f32, cp2y as f32), + Point2D::new(x as f32, y as f32), + )); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-arc @@ -911,11 +948,13 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { return Err(Error::IndexSize); } - self.send_canvas_2d_msg(Canvas2dMsg::Arc(Point2D::new(x as f32, y as f32), - r as f32, - start as f32, - end as f32, - ccw)); + self.send_canvas_2d_msg(Canvas2dMsg::Arc( + Point2D::new(x as f32, y as f32), + r as f32, + start as f32, + end as f32, + ccw, + )); Ok(()) } @@ -928,28 +967,45 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { return Err(Error::IndexSize); } - self.send_canvas_2d_msg(Canvas2dMsg::ArcTo(Point2D::new(cp1x as f32, cp1y as f32), - Point2D::new(cp2x as f32, cp2y as f32), - r as f32)); + self.send_canvas_2d_msg(Canvas2dMsg::ArcTo( + Point2D::new(cp1x as f32, cp1y as f32), + Point2D::new(cp2x as f32, cp2y as f32), + r as f32, + )); Ok(()) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-ellipse - fn Ellipse(&self, x: f64, y: f64, rx: f64, ry: f64, rotation: f64, start: f64, end: f64, ccw: bool) -> ErrorResult { - if !([x, y, rx, ry, rotation, start, end].iter().all(|x| x.is_finite())) { + fn Ellipse( + &self, + x: f64, + y: f64, + rx: f64, + ry: f64, + rotation: f64, + start: f64, + end: f64, + ccw: bool, + ) -> ErrorResult { + if !([x, y, rx, ry, rotation, start, end] + .iter() + .all(|x| x.is_finite())) + { return Ok(()); } if rx < 0.0 || ry < 0.0 { return Err(Error::IndexSize); } - self.send_canvas_2d_msg(Canvas2dMsg::Ellipse(Point2D::new(x as f32, y as f32), - rx as f32, - ry as f32, - rotation as f32, - start as f32, - end as f32, - ccw)); + self.send_canvas_2d_msg(Canvas2dMsg::Ellipse( + Point2D::new(x as f32, y as f32), + rx as f32, + ry as f32, + rotation as f32, + start as f32, + end as f32, + ccw, + )); Ok(()) } @@ -977,7 +1033,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { }, CanvasFillOrStrokeStyle::Pattern(ref pattern) => { StringOrCanvasGradientOrCanvasPattern::CanvasPattern(DomRoot::from_ref(&*pattern)) - } + }, } } @@ -987,23 +1043,28 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { StringOrCanvasGradientOrCanvasPattern::String(string) => { if let Ok(rgba) = self.parse_color(&string) { self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba); - self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle( - FillOrStrokeStyle::Color(rgba))); + self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color( + rgba, + ))); } }, StringOrCanvasGradientOrCanvasPattern::CanvasGradient(gradient) => { self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Gradient(Dom::from_ref(&*gradient)); - self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(gradient.to_fill_or_stroke_style())); + self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle( + gradient.to_fill_or_stroke_style(), + )); }, StringOrCanvasGradientOrCanvasPattern::CanvasPattern(pattern) => { self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Pattern(Dom::from_ref(&*pattern)); - self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle(pattern.to_fill_or_stroke_style())); + self.send_canvas_2d_msg(Canvas2dMsg::SetStrokeStyle( + pattern.to_fill_or_stroke_style(), + )); if !pattern.origin_is_clean() { self.set_origin_unclean(); } - } + }, } } @@ -1020,7 +1081,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { }, CanvasFillOrStrokeStyle::Pattern(ref pattern) => { StringOrCanvasGradientOrCanvasPattern::CanvasPattern(DomRoot::from_ref(&*pattern)) - } + }, } } @@ -1030,23 +1091,28 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { StringOrCanvasGradientOrCanvasPattern::String(string) => { if let Ok(rgba) = self.parse_color(&string) { self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba); - self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle( - FillOrStrokeStyle::Color(rgba))) + self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color( + rgba, + ))) } - } + }, StringOrCanvasGradientOrCanvasPattern::CanvasGradient(gradient) => { self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Gradient(Dom::from_ref(&*gradient)); - self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(gradient.to_fill_or_stroke_style())); - } + self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle( + gradient.to_fill_or_stroke_style(), + )); + }, StringOrCanvasGradientOrCanvasPattern::CanvasPattern(pattern) => { self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Pattern(Dom::from_ref(&*pattern)); - self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle(pattern.to_fill_or_stroke_style())); + self.send_canvas_2d_msg(Canvas2dMsg::SetFillStyle( + pattern.to_fill_or_stroke_style(), + )); if !pattern.origin_is_clean() { self.set_origin_unclean(); } - } + }, } } @@ -1063,21 +1129,19 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-createimagedata fn CreateImageData_(&self, imagedata: &ImageData) -> Fallible> { - ImageData::new(&self.global(), - imagedata.Width(), - imagedata.Height(), - None) + ImageData::new(&self.global(), imagedata.Width(), imagedata.Height(), None) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata - fn GetImageData(&self, - sx: Finite, - sy: Finite, - sw: Finite, - sh: Finite) - -> Fallible> { + fn GetImageData( + &self, + sx: Finite, + sy: Finite, + sw: Finite, + sh: Finite, + ) -> Fallible> { if !self.origin_is_clean() { - return Err(Error::Security) + return Err(Error::Security); } let mut sx = *sx; @@ -1102,9 +1166,15 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { let sw = cmp::max(1, sw.to_u32().unwrap()); let (sender, receiver) = ipc::bytes_channel().unwrap(); - let dest_rect = Rect::new(Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()), - Size2D::new(sw as i32, sh as i32)); - let canvas_size = self.canvas.as_ref().map(|c| c.get_size()).unwrap_or(Size2D::zero()); + let dest_rect = Rect::new( + Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()), + Size2D::new(sw as i32, sh as i32), + ); + let canvas_size = self + .canvas + .as_ref() + .map(|c| c.get_size()) + .unwrap_or(Size2D::zero()); let canvas_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64); self.send_canvas_2d_msg(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender)); let mut data = receiver.recv().unwrap(); @@ -1122,97 +1192,110 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata fn PutImageData(&self, imagedata: &ImageData, dx: Finite, dy: Finite) { - self.PutImageData_(imagedata, - dx, - dy, - Finite::wrap(0f64), - Finite::wrap(0f64), - Finite::wrap(imagedata.Width() as f64), - Finite::wrap(imagedata.Height() as f64)) + self.PutImageData_( + imagedata, + dx, + dy, + Finite::wrap(0f64), + Finite::wrap(0f64), + Finite::wrap(imagedata.Width() as f64), + Finite::wrap(imagedata.Height() as f64), + ) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata - fn PutImageData_(&self, - imagedata: &ImageData, - dx: Finite, - dy: Finite, - dirty_x: Finite, - dirty_y: Finite, - dirty_width: Finite, - dirty_height: Finite) { + fn PutImageData_( + &self, + imagedata: &ImageData, + dx: Finite, + dy: Finite, + dirty_x: Finite, + dirty_y: Finite, + dirty_width: Finite, + dirty_height: Finite, + ) { let data = imagedata.get_data_array(); let offset = Vector2D::new(*dx, *dy); let image_data_size = Size2D::new(imagedata.Width() as f64, imagedata.Height() as f64); - let dirty_rect = Rect::new(Point2D::new(*dirty_x, *dirty_y), - Size2D::new(*dirty_width, *dirty_height)); - self.send_canvas_2d_msg(Canvas2dMsg::PutImageData(data.into(), - offset, - image_data_size, - dirty_rect)); + let dirty_rect = Rect::new( + Point2D::new(*dirty_x, *dirty_y), + Size2D::new(*dirty_width, *dirty_height), + ); + self.send_canvas_2d_msg(Canvas2dMsg::PutImageData( + data.into(), + offset, + image_data_size, + dirty_rect, + )); self.mark_as_dirty(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-createlineargradient - fn CreateLinearGradient(&self, - x0: Finite, - y0: Finite, - x1: Finite, - y1: Finite) - -> DomRoot { - CanvasGradient::new(&self.global(), - CanvasGradientStyle::Linear(LinearGradientStyle::new(*x0, - *y0, - *x1, - *y1, - Vec::new()))) + fn CreateLinearGradient( + &self, + x0: Finite, + y0: Finite, + x1: Finite, + y1: Finite, + ) -> DomRoot { + CanvasGradient::new( + &self.global(), + CanvasGradientStyle::Linear(LinearGradientStyle::new(*x0, *y0, *x1, *y1, Vec::new())), + ) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-createradialgradient - fn CreateRadialGradient(&self, - x0: Finite, - y0: Finite, - r0: Finite, - x1: Finite, - y1: Finite, - r1: Finite) - -> Fallible> { + fn CreateRadialGradient( + &self, + x0: Finite, + y0: Finite, + r0: Finite, + x1: Finite, + y1: Finite, + r1: Finite, + ) -> Fallible> { if *r0 < 0. || *r1 < 0. { return Err(Error::IndexSize); } - Ok(CanvasGradient::new(&self.global(), - CanvasGradientStyle::Radial(RadialGradientStyle::new(*x0, - *y0, - *r0, - *x1, - *y1, - *r1, - Vec::new())))) + Ok(CanvasGradient::new( + &self.global(), + CanvasGradientStyle::Radial(RadialGradientStyle::new( + *x0, + *y0, + *r0, + *x1, + *y1, + *r1, + Vec::new(), + )), + )) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-createpattern - fn CreatePattern(&self, - image: CanvasImageSource, - mut repetition: DOMString) - -> Fallible> { + fn CreatePattern( + &self, + image: CanvasImageSource, + mut repetition: DOMString, + ) -> Fallible> { let (image_data, image_size) = match image { CanvasImageSource::HTMLImageElement(ref image) => { // https://html.spec.whatwg.org/multipage/#img-error // If the image argument is an HTMLImageElement object that is in the broken state, // then throw an InvalidStateError exception - image.get_url() + image + .get_url() .and_then(|url| self.fetch_image_data(url)) .ok_or(Error::InvalidState)? }, CanvasImageSource::HTMLCanvasElement(ref canvas) => { canvas.fetch_all_data().ok_or(Error::InvalidState)? }, - CanvasImageSource::CSSStyleValue(ref value) => { - value.get_url(self.base_url.clone()) - .and_then(|url| self.fetch_image_data(url)) - .ok_or(Error::InvalidState)? - } + CanvasImageSource::CSSStyleValue(ref value) => value + .get_url(self.base_url.clone()) + .and_then(|url| self.fetch_image_data(url)) + .ok_or(Error::InvalidState)?, }; if repetition.is_empty() { @@ -1220,11 +1303,13 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { } if let Ok(rep) = RepetitionStyle::from_str(&repetition) { - Ok(CanvasPattern::new(&self.global(), - image_data, - image_size, - rep, - self.is_origin_clean(image))) + Ok(CanvasPattern::new( + &self.global(), + image_data, + image_size, + rep, + self.is_origin_clean(image), + )) } else { Err(Error::Syntax) } @@ -1362,7 +1447,10 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { impl Drop for CanvasRenderingContext2D { fn drop(&mut self) { - if let Err(err) = self.ipc_renderer.send(CanvasMsg::Close(self.get_canvas_id())) { + if let Err(err) = self + .ipc_renderer + .send(CanvasMsg::Close(self.get_canvas_id())) + { warn!("Could not close canvas: {}", err) } } @@ -1391,22 +1479,32 @@ fn is_rect_valid(rect: Rect) -> bool { // https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour fn serialize(color: &RGBA, dest: &mut W) -> fmt::Result - where W: fmt::Write +where + W: fmt::Write, { let red = color.red; let green = color.green; let blue = color.blue; if color.alpha == 255 { - write!(dest, - "#{:x}{:x}{:x}{:x}{:x}{:x}", - red >> 4, - red & 0xF, - green >> 4, - green & 0xF, - blue >> 4, - blue & 0xF) + write!( + dest, + "#{:x}{:x}{:x}{:x}{:x}{:x}", + red >> 4, + red & 0xF, + green >> 4, + green & 0xF, + blue >> 4, + blue & 0xF + ) } else { - write!(dest, "rgba({}, {}, {}, {})", red, green, blue, color.alpha_f32()) + write!( + dest, + "rgba({}, {}, {}, {})", + red, + green, + blue, + color.alpha_f32() + ) } } diff --git a/components/script/dom/channelmergernode.rs b/components/script/dom/channelmergernode.rs index 4140f21b9b4..33f00927909 100644 --- a/components/script/dom/channelmergernode.rs +++ b/components/script/dom/channelmergernode.rs @@ -26,16 +26,18 @@ impl ChannelMergerNode { context: &BaseAudioContext, options: &ChannelMergerOptions, ) -> Fallible { - let node_options = options.parent - .unwrap_or(1, ChannelCountMode::Explicit, - ChannelInterpretation::Speakers); + let node_options = options.parent.unwrap_or( + 1, + ChannelCountMode::Explicit, + ChannelInterpretation::Speakers, + ); if node_options.count != 1 || node_options.mode != ChannelCountMode::Explicit { - return Err(Error::InvalidState) + return Err(Error::InvalidState); } if options.numberOfInputs < 1 || options.numberOfInputs > MAX_CHANNEL_COUNT { - return Err(Error::IndexSize) + return Err(Error::IndexSize); } let node = AudioNode::new_inherited( @@ -43,11 +45,9 @@ impl ChannelMergerNode { context, node_options, options.numberOfInputs, // inputs - 1, // outputs + 1, // outputs )?; - Ok(ChannelMergerNode { - node, - }) + Ok(ChannelMergerNode { node }) } #[allow(unrooted_must_root)] @@ -57,7 +57,11 @@ impl ChannelMergerNode { options: &ChannelMergerOptions, ) -> Fallible> { let node = ChannelMergerNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window, ChannelMergerNodeBinding::Wrap)) + Ok(reflect_dom_object( + Box::new(node), + window, + ChannelMergerNodeBinding::Wrap, + )) } pub fn Constructor( diff --git a/components/script/dom/characterdata.rs b/components/script/dom/characterdata.rs index 2d6bfbb706f..4b6676ec955 100644 --- a/components/script/dom/characterdata.rs +++ b/components/script/dom/characterdata.rs @@ -45,7 +45,7 @@ impl CharacterData { match self.upcast::().type_id() { NodeTypeId::CharacterData(CharacterDataTypeId::Comment) => { DomRoot::upcast(Comment::new(data, &document)) - } + }, NodeTypeId::CharacterData(CharacterDataTypeId::ProcessingInstruction) => { let pi = self.downcast::().unwrap(); DomRoot::upcast(ProcessingInstruction::new(pi.Target(), data, &document)) @@ -107,7 +107,8 @@ impl CharacterDataMethods for CharacterData { *self.data.borrow_mut() = data; self.content_changed(); let node = self.upcast::(); - node.ranges().replace_code_units(node, 0, old_length, new_length); + node.ranges() + .replace_code_units(node, 0, old_length, new_length); } // https://dom.spec.whatwg.org/#dom-characterdata-length @@ -130,7 +131,7 @@ impl CharacterDataMethods for CharacterData { substring = substring + "\u{FFFD}"; } remaining = s; - } + }, // Step 2. Err(()) => return Err(Error::IndexSize), } @@ -146,7 +147,7 @@ impl CharacterDataMethods for CharacterData { if astral.is_some() { substring = substring + "\u{FFFD}"; } - } + }, }; Ok(DOMString::from(substring)) } @@ -183,7 +184,7 @@ impl CharacterDataMethods for CharacterData { // since our DOMString is currently strict UTF-8. replacement_before = if astral.is_some() { "\u{FFFD}" } else { "" }; remaining = r; - } + }, // Step 2. Err(()) => return Err(Error::IndexSize), }; @@ -194,14 +195,14 @@ impl CharacterDataMethods for CharacterData { Err(()) => { replacement_after = ""; suffix = ""; - } + }, Ok((_, astral, s)) => { // As if we had split the UTF-16 surrogate pair in half // and then transcoded that to UTF-8 lossily, // since our DOMString is currently strict UTF-8. replacement_after = if astral.is_some() { "\u{FFFD}" } else { "" }; suffix = s; - } + }, }; // Step 4: Mutation observers. self.queue_mutation_record(); @@ -209,10 +210,11 @@ impl CharacterDataMethods for CharacterData { // Step 5 to 7. new_data = String::with_capacity( prefix.len() + - replacement_before.len() + - arg.len() + - replacement_after.len() + - suffix.len()); + replacement_before.len() + + arg.len() + + replacement_after.len() + + suffix.len(), + ); new_data.push_str(prefix); new_data.push_str(replacement_before); new_data.push_str(&arg); @@ -223,8 +225,8 @@ impl CharacterDataMethods for CharacterData { self.content_changed(); // Steps 8-11. let node = self.upcast::(); - node.ranges().replace_code_units( - node, offset, count, arg.encode_utf16().count() as u32); + node.ranges() + .replace_code_units(node, offset, count, arg.encode_utf16().count() as u32); Ok(()) } @@ -251,12 +253,18 @@ impl CharacterDataMethods for CharacterData { // https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-previouselementsibling fn GetPreviousElementSibling(&self) -> Option> { - self.upcast::().preceding_siblings().filter_map(DomRoot::downcast).next() + self.upcast::() + .preceding_siblings() + .filter_map(DomRoot::downcast) + .next() } // https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-nextelementsibling fn GetNextElementSibling(&self) -> Option> { - self.upcast::().following_siblings().filter_map(DomRoot::downcast).next() + self.upcast::() + .following_siblings() + .filter_map(DomRoot::downcast) + .next() } } @@ -305,13 +313,15 @@ fn split_at_utf16_code_unit_offset(s: &str, offset: u32) -> Result<(&str, Option if code_units == offset { if opts::get().replace_surrogates { debug_assert_eq!(c.len_utf8(), 4); - return Ok((&s[..i], Some(c), &s[i + c.len_utf8()..])) + return Ok((&s[..i], Some(c), &s[i + c.len_utf8()..])); } - panic!("\n\n\ - Would split a surrogate pair in CharacterData API.\n\ - If you see this in real content, please comment with the URL\n\ - on https://github.com/servo/servo/issues/6873\n\ - \n"); + panic!( + "\n\n\ + Would split a surrogate pair in CharacterData API.\n\ + If you see this in real content, please comment with the URL\n\ + on https://github.com/servo/servo/issues/6873\n\ + \n" + ); } code_units += 1; } diff --git a/components/script/dom/client.rs b/components/script/dom/client.rs index 7c68daecdb3..ff63979c4ef 100644 --- a/components/script/dom/client.rs +++ b/components/script/dom/client.rs @@ -21,7 +21,7 @@ pub struct Client { url: ServoUrl, frame_type: FrameType, #[ignore_malloc_size_of = "Defined in uuid"] - id: Uuid + id: Uuid, } impl Client { @@ -31,14 +31,16 @@ impl Client { active_worker: Default::default(), url: url, frame_type: FrameType::None, - id: Uuid::new_v4() + id: Uuid::new_v4(), } } pub fn new(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(Client::new_inherited(window.get_url())), - window, - Wrap) + reflect_dom_object( + Box::new(Client::new_inherited(window.get_url())), + window, + Wrap, + ) } pub fn creation_url(&self) -> ServoUrl { diff --git a/components/script/dom/closeevent.rs b/components/script/dom/closeevent.rs index 1675d8b27e3..0c353b68188 100644 --- a/components/script/dom/closeevent.rs +++ b/components/script/dom/closeevent.rs @@ -34,45 +34,48 @@ impl CloseEvent { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(CloseEvent::new_inherited(false, 0, DOMString::new())), - global, - CloseEventBinding::Wrap) + reflect_dom_object( + Box::new(CloseEvent::new_inherited(false, 0, DOMString::new())), + global, + CloseEventBinding::Wrap, + ) } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable, - wasClean: bool, - code: u16, - reason: DOMString) - -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + wasClean: bool, + code: u16, + reason: DOMString, + ) -> DomRoot { let event = Box::new(CloseEvent::new_inherited(wasClean, code, reason)); let ev = reflect_dom_object(event, global, CloseEventBinding::Wrap); { let event = ev.upcast::(); - event.init_event(type_, - bool::from(bubbles), - bool::from(cancelable)); + event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); } ev } - pub fn Constructor(global: &GlobalScope, - type_: DOMString, - init: &CloseEventBinding::CloseEventInit) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + type_: DOMString, + init: &CloseEventBinding::CloseEventInit, + ) -> Fallible> { let bubbles = EventBubbles::from(init.parent.bubbles); let cancelable = EventCancelable::from(init.parent.cancelable); - Ok(CloseEvent::new(global, - Atom::from(type_), - bubbles, - cancelable, - init.wasClean, - init.code, - init.reason.clone())) + Ok(CloseEvent::new( + global, + Atom::from(type_), + bubbles, + cancelable, + init.wasClean, + init.code, + init.reason.clone(), + )) } - } impl CloseEventMethods for CloseEvent { diff --git a/components/script/dom/comment.rs b/components/script/dom/comment.rs index 3eb6175e20c..9901a834a41 100644 --- a/components/script/dom/comment.rs +++ b/components/script/dom/comment.rs @@ -27,9 +27,11 @@ impl Comment { } pub fn new(text: DOMString, document: &Document) -> DomRoot { - Node::reflect_node(Box::new(Comment::new_inherited(text, document)), - document, - CommentBinding::Wrap) + Node::reflect_node( + Box::new(Comment::new_inherited(text, document)), + document, + CommentBinding::Wrap, + ) } pub fn Constructor(window: &Window, data: DOMString) -> Fallible> { diff --git a/components/script/dom/compositionevent.rs b/components/script/dom/compositionevent.rs index dc93427dbed..191572b51ab 100644 --- a/components/script/dom/compositionevent.rs +++ b/components/script/dom/compositionevent.rs @@ -19,34 +19,42 @@ pub struct CompositionEvent { } impl CompositionEvent { - pub fn new(window: &Window, - type_: DOMString, - can_bubble: bool, - cancelable: bool, - view: Option<&Window>, - detail: i32, - data: DOMString) -> DomRoot { - let ev = reflect_dom_object(Box::new(CompositionEvent { - uievent: UIEvent::new_inherited(), - data: data, - }), - window, - CompositionEventBinding::Wrap); - ev.uievent.InitUIEvent(type_, can_bubble, cancelable, view, detail); + pub fn new( + window: &Window, + type_: DOMString, + can_bubble: bool, + cancelable: bool, + view: Option<&Window>, + detail: i32, + data: DOMString, + ) -> DomRoot { + let ev = reflect_dom_object( + Box::new(CompositionEvent { + uievent: UIEvent::new_inherited(), + data: data, + }), + window, + CompositionEventBinding::Wrap, + ); + ev.uievent + .InitUIEvent(type_, can_bubble, cancelable, view, detail); ev } - pub fn Constructor(window: &Window, - type_: DOMString, - init: &CompositionEventBinding::CompositionEventInit) - -> Fallible> { - let event = CompositionEvent::new(window, - type_, - init.parent.parent.bubbles, - init.parent.parent.cancelable, - init.parent.view.r(), - init.parent.detail, - init.data.clone()); + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &CompositionEventBinding::CompositionEventInit, + ) -> Fallible> { + let event = CompositionEvent::new( + window, + type_, + init.parent.parent.bubbles, + init.parent.parent.cancelable, + init.parent.view.r(), + init.parent.detail, + init.data.clone(), + ); Ok(event) } } diff --git a/components/script/dom/console.rs b/components/script/dom/console.rs index 7aa99c2fab6..410477a79d3 100644 --- a/components/script/dom/console.rs +++ b/components/script/dom/console.rs @@ -16,13 +16,14 @@ impl Console { fn send_to_devtools(global: &GlobalScope, level: LogLevel, message: DOMString) { if let Some(chan) = global.devtools_chan() { let console_message = prepare_message(level, message); - let worker_id = global.downcast::().map(|worker| { - worker.get_worker_id() - }); + let worker_id = global + .downcast::() + .map(|worker| worker.get_worker_id()); let devtools_message = ScriptToDevtoolsControlMsg::ConsoleAPI( global.pipeline_id(), console_message, - worker_id); + worker_id, + ); chan.send(devtools_message).unwrap(); } } @@ -33,7 +34,10 @@ impl Console { // we're finished with stdout. Since the stderr lock is reentrant, there is // no risk of deadlock if the callback ends up trying to write to stderr for // any reason. -fn with_stderr_lock(f: F) where F: FnOnce() { +fn with_stderr_lock(f: F) +where + F: FnOnce(), +{ let stderr = io::stderr(); let _handle = stderr.lock(); f() @@ -116,9 +120,7 @@ impl Console { pub fn TimeEnd(global: &GlobalScope, label: DOMString) { with_stderr_lock(move || { if let Ok(delta) = global.time_end(&label) { - let message = DOMString::from( - format!("{}: {}ms", label, delta) - ); + let message = DOMString::from(format!("{}: {}ms", label, delta)); println!("{}", message); Self::send_to_devtools(global, LogLevel::Log, message); }; diff --git a/components/script/dom/create.rs b/components/script/dom/create.rs index 64116663a84..94fe6bd1457 100644 --- a/components/script/dom/create.rs +++ b/components/script/dom/create.rs @@ -84,10 +84,11 @@ use js::jsapi::JSAutoCompartment; use script_thread::ScriptThread; use servo_config::prefs::PREFS; -fn create_svg_element(name: QualName, - prefix: Option, - document: &Document) - -> DomRoot { +fn create_svg_element( + name: QualName, + prefix: Option, + document: &Document, +) -> DomRoot { assert_eq!(name.ns, ns!(svg)); macro_rules! make( @@ -106,20 +107,21 @@ fn create_svg_element(name: QualName, } match name.local { - local_name!("svg") => make!(SVGSVGElement), - _ => Element::new(name.local, name.ns, prefix, document), + local_name!("svg") => make!(SVGSVGElement), + _ => Element::new(name.local, name.ns, prefix, document), } } // https://dom.spec.whatwg.org/#concept-create-element #[allow(unsafe_code)] -fn create_html_element(name: QualName, - prefix: Option, - is: Option, - document: &Document, - creator: ElementCreator, - mode: CustomElementCreationMode) - -> DomRoot { +fn create_html_element( + name: QualName, + prefix: Option, + is: Option, + document: &Document, + creator: ElementCreator, + mode: CustomElementCreationMode, +) -> DomRoot { assert_eq!(name.ns, ns!(html)); // Step 4 @@ -129,8 +131,11 @@ fn create_html_element(name: QualName, if definition.is_autonomous() { match mode { CustomElementCreationMode::Asynchronous => { - let result = DomRoot::upcast::( - HTMLElement::new(name.local.clone(), prefix.clone(), document)); + let result = DomRoot::upcast::(HTMLElement::new( + name.local.clone(), + prefix.clone(), + document, + )); result.set_custom_element_state(CustomElementState::Undefined); ScriptThread::enqueue_upgrade_reaction(&*result, definition); return result; @@ -144,19 +149,24 @@ fn create_html_element(name: QualName, }, Err(error) => { // Step 6. Recovering from exception. - let global = GlobalScope::current().unwrap_or_else(|| document.global()); + let global = + GlobalScope::current().unwrap_or_else(|| document.global()); let cx = global.get_cx(); // Step 6.1.1 unsafe { - let _ac = JSAutoCompartment::new(cx, global.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new( + cx, + global.reflector().get_jsobject().get(), + ); throw_dom_exception(cx, &global, error); report_pending_exception(cx, true); } // Step 6.1.2 - let element = DomRoot::upcast::( - HTMLUnknownElement::new(local_name, prefix, document)); + let element = DomRoot::upcast::(HTMLUnknownElement::new( + local_name, prefix, document, + )); element.set_custom_element_state(CustomElementState::Failed); element }, @@ -170,11 +180,11 @@ fn create_html_element(name: QualName, element.set_custom_element_state(CustomElementState::Undefined); match mode { // Step 5.3 - CustomElementCreationMode::Synchronous => - upgrade_element(definition, &*element), + CustomElementCreationMode::Synchronous => upgrade_element(definition, &*element), // Step 5.4 - CustomElementCreationMode::Asynchronous => - ScriptThread::enqueue_upgrade_reaction(&*element, definition), + CustomElementCreationMode::Asynchronous => { + ScriptThread::enqueue_upgrade_reaction(&*element, definition) + }, } return element; } @@ -214,162 +224,163 @@ pub fn create_native_html_element( // Perhaps we should build a perfect hash from those IDs instead. // https://html.spec.whatwg.org/multipage/#elements-in-the-dom match name.local { - local_name!("a") => make!(HTMLAnchorElement), - local_name!("abbr") => make!(HTMLElement), - local_name!("acronym") => make!(HTMLElement), - local_name!("address") => make!(HTMLElement), - local_name!("area") => make!(HTMLAreaElement), - local_name!("article") => make!(HTMLElement), - local_name!("aside") => make!(HTMLElement), - local_name!("audio") => make!(HTMLAudioElement), - local_name!("b") => make!(HTMLElement), - local_name!("base") => make!(HTMLBaseElement), - local_name!("bdi") => make!(HTMLElement), - local_name!("bdo") => make!(HTMLElement), + local_name!("a") => make!(HTMLAnchorElement), + local_name!("abbr") => make!(HTMLElement), + local_name!("acronym") => make!(HTMLElement), + local_name!("address") => make!(HTMLElement), + local_name!("area") => make!(HTMLAreaElement), + local_name!("article") => make!(HTMLElement), + local_name!("aside") => make!(HTMLElement), + local_name!("audio") => make!(HTMLAudioElement), + local_name!("b") => make!(HTMLElement), + local_name!("base") => make!(HTMLBaseElement), + local_name!("bdi") => make!(HTMLElement), + local_name!("bdo") => make!(HTMLElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:bgsound - local_name!("bgsound") => make!(HTMLUnknownElement), - local_name!("big") => make!(HTMLElement), + local_name!("bgsound") => make!(HTMLUnknownElement), + local_name!("big") => make!(HTMLElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:blink - local_name!("blink") => make!(HTMLUnknownElement), + local_name!("blink") => make!(HTMLUnknownElement), // https://html.spec.whatwg.org/multipage/#the-blockquote-element local_name!("blockquote") => make!(HTMLQuoteElement), - local_name!("body") => make!(HTMLBodyElement), - local_name!("br") => make!(HTMLBRElement), - local_name!("button") => make!(HTMLButtonElement), - local_name!("canvas") => make!(HTMLCanvasElement), - local_name!("caption") => make!(HTMLTableCaptionElement), - local_name!("center") => make!(HTMLElement), - local_name!("cite") => make!(HTMLElement), - local_name!("code") => make!(HTMLElement), - local_name!("col") => make!(HTMLTableColElement), - local_name!("colgroup") => make!(HTMLTableColElement), - local_name!("data") => make!(HTMLDataElement), - local_name!("datalist") => make!(HTMLDataListElement), - local_name!("dd") => make!(HTMLElement), - local_name!("del") => make!(HTMLModElement), - local_name!("details") => make!(HTMLDetailsElement), - local_name!("dfn") => make!(HTMLElement), - local_name!("dialog") => make!(HTMLDialogElement), - local_name!("dir") => make!(HTMLDirectoryElement), - local_name!("div") => make!(HTMLDivElement), - local_name!("dl") => make!(HTMLDListElement), - local_name!("dt") => make!(HTMLElement), - local_name!("em") => make!(HTMLElement), - local_name!("embed") => make!(HTMLEmbedElement), - local_name!("fieldset") => make!(HTMLFieldSetElement), + local_name!("body") => make!(HTMLBodyElement), + local_name!("br") => make!(HTMLBRElement), + local_name!("button") => make!(HTMLButtonElement), + local_name!("canvas") => make!(HTMLCanvasElement), + local_name!("caption") => make!(HTMLTableCaptionElement), + local_name!("center") => make!(HTMLElement), + local_name!("cite") => make!(HTMLElement), + local_name!("code") => make!(HTMLElement), + local_name!("col") => make!(HTMLTableColElement), + local_name!("colgroup") => make!(HTMLTableColElement), + local_name!("data") => make!(HTMLDataElement), + local_name!("datalist") => make!(HTMLDataListElement), + local_name!("dd") => make!(HTMLElement), + local_name!("del") => make!(HTMLModElement), + local_name!("details") => make!(HTMLDetailsElement), + local_name!("dfn") => make!(HTMLElement), + local_name!("dialog") => make!(HTMLDialogElement), + local_name!("dir") => make!(HTMLDirectoryElement), + local_name!("div") => make!(HTMLDivElement), + local_name!("dl") => make!(HTMLDListElement), + local_name!("dt") => make!(HTMLElement), + local_name!("em") => make!(HTMLElement), + local_name!("embed") => make!(HTMLEmbedElement), + local_name!("fieldset") => make!(HTMLFieldSetElement), local_name!("figcaption") => make!(HTMLElement), - local_name!("figure") => make!(HTMLElement), - local_name!("font") => make!(HTMLFontElement), - local_name!("footer") => make!(HTMLElement), - local_name!("form") => make!(HTMLFormElement), - local_name!("frame") => make!(HTMLFrameElement), - local_name!("frameset") => make!(HTMLFrameSetElement), - local_name!("h1") => make!(HTMLHeadingElement, HeadingLevel::Heading1), - local_name!("h2") => make!(HTMLHeadingElement, HeadingLevel::Heading2), - local_name!("h3") => make!(HTMLHeadingElement, HeadingLevel::Heading3), - local_name!("h4") => make!(HTMLHeadingElement, HeadingLevel::Heading4), - local_name!("h5") => make!(HTMLHeadingElement, HeadingLevel::Heading5), - local_name!("h6") => make!(HTMLHeadingElement, HeadingLevel::Heading6), - local_name!("head") => make!(HTMLHeadElement), - local_name!("header") => make!(HTMLElement), - local_name!("hgroup") => make!(HTMLElement), - local_name!("hr") => make!(HTMLHRElement), - local_name!("html") => make!(HTMLHtmlElement), - local_name!("i") => make!(HTMLElement), - local_name!("iframe") => make!(HTMLIFrameElement), - local_name!("img") => make!(HTMLImageElement), - local_name!("input") => make!(HTMLInputElement), - local_name!("ins") => make!(HTMLModElement), + local_name!("figure") => make!(HTMLElement), + local_name!("font") => make!(HTMLFontElement), + local_name!("footer") => make!(HTMLElement), + local_name!("form") => make!(HTMLFormElement), + local_name!("frame") => make!(HTMLFrameElement), + local_name!("frameset") => make!(HTMLFrameSetElement), + local_name!("h1") => make!(HTMLHeadingElement, HeadingLevel::Heading1), + local_name!("h2") => make!(HTMLHeadingElement, HeadingLevel::Heading2), + local_name!("h3") => make!(HTMLHeadingElement, HeadingLevel::Heading3), + local_name!("h4") => make!(HTMLHeadingElement, HeadingLevel::Heading4), + local_name!("h5") => make!(HTMLHeadingElement, HeadingLevel::Heading5), + local_name!("h6") => make!(HTMLHeadingElement, HeadingLevel::Heading6), + local_name!("head") => make!(HTMLHeadElement), + local_name!("header") => make!(HTMLElement), + local_name!("hgroup") => make!(HTMLElement), + local_name!("hr") => make!(HTMLHRElement), + local_name!("html") => make!(HTMLHtmlElement), + local_name!("i") => make!(HTMLElement), + local_name!("iframe") => make!(HTMLIFrameElement), + local_name!("img") => make!(HTMLImageElement), + local_name!("input") => make!(HTMLInputElement), + local_name!("ins") => make!(HTMLModElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:isindex-2 - local_name!("isindex") => make!(HTMLUnknownElement), - local_name!("kbd") => make!(HTMLElement), - local_name!("label") => make!(HTMLLabelElement), - local_name!("legend") => make!(HTMLLegendElement), - local_name!("li") => make!(HTMLLIElement), - local_name!("link") => make!(HTMLLinkElement, creator), + local_name!("isindex") => make!(HTMLUnknownElement), + local_name!("kbd") => make!(HTMLElement), + local_name!("label") => make!(HTMLLabelElement), + local_name!("legend") => make!(HTMLLegendElement), + local_name!("li") => make!(HTMLLIElement), + local_name!("link") => make!(HTMLLinkElement, creator), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:listing - local_name!("listing") => make!(HTMLPreElement), - local_name!("main") => make!(HTMLElement), - local_name!("map") => make!(HTMLMapElement), - local_name!("mark") => make!(HTMLElement), - local_name!("marquee") => make!(HTMLElement), - local_name!("meta") => make!(HTMLMetaElement), - local_name!("meter") => make!(HTMLMeterElement), + local_name!("listing") => make!(HTMLPreElement), + local_name!("main") => make!(HTMLElement), + local_name!("map") => make!(HTMLMapElement), + local_name!("mark") => make!(HTMLElement), + local_name!("marquee") => make!(HTMLElement), + local_name!("meta") => make!(HTMLMetaElement), + local_name!("meter") => make!(HTMLMeterElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:multicol - local_name!("multicol") => make!(HTMLUnknownElement), - local_name!("nav") => make!(HTMLElement), + local_name!("multicol") => make!(HTMLUnknownElement), + local_name!("nav") => make!(HTMLElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:nextid - local_name!("nextid") => make!(HTMLUnknownElement), - local_name!("nobr") => make!(HTMLElement), - local_name!("noframes") => make!(HTMLElement), - local_name!("noscript") => make!(HTMLElement), - local_name!("object") => make!(HTMLObjectElement), - local_name!("ol") => make!(HTMLOListElement), - local_name!("optgroup") => make!(HTMLOptGroupElement), - local_name!("option") => make!(HTMLOptionElement), - local_name!("output") => make!(HTMLOutputElement), - local_name!("p") => make!(HTMLParagraphElement), - local_name!("param") => make!(HTMLParamElement), - local_name!("picture") => make!(HTMLPictureElement), - local_name!("plaintext") => make!(HTMLPreElement), - local_name!("pre") => make!(HTMLPreElement), - local_name!("progress") => make!(HTMLProgressElement), - local_name!("q") => make!(HTMLQuoteElement), - local_name!("rp") => make!(HTMLElement), - local_name!("rt") => make!(HTMLElement), - local_name!("ruby") => make!(HTMLElement), - local_name!("s") => make!(HTMLElement), - local_name!("samp") => make!(HTMLElement), - local_name!("script") => make!(HTMLScriptElement, creator), - local_name!("section") => make!(HTMLElement), - local_name!("select") => make!(HTMLSelectElement), - local_name!("small") => make!(HTMLElement), - local_name!("source") => make!(HTMLSourceElement), + local_name!("nextid") => make!(HTMLUnknownElement), + local_name!("nobr") => make!(HTMLElement), + local_name!("noframes") => make!(HTMLElement), + local_name!("noscript") => make!(HTMLElement), + local_name!("object") => make!(HTMLObjectElement), + local_name!("ol") => make!(HTMLOListElement), + local_name!("optgroup") => make!(HTMLOptGroupElement), + local_name!("option") => make!(HTMLOptionElement), + local_name!("output") => make!(HTMLOutputElement), + local_name!("p") => make!(HTMLParagraphElement), + local_name!("param") => make!(HTMLParamElement), + local_name!("picture") => make!(HTMLPictureElement), + local_name!("plaintext") => make!(HTMLPreElement), + local_name!("pre") => make!(HTMLPreElement), + local_name!("progress") => make!(HTMLProgressElement), + local_name!("q") => make!(HTMLQuoteElement), + local_name!("rp") => make!(HTMLElement), + local_name!("rt") => make!(HTMLElement), + local_name!("ruby") => make!(HTMLElement), + local_name!("s") => make!(HTMLElement), + local_name!("samp") => make!(HTMLElement), + local_name!("script") => make!(HTMLScriptElement, creator), + local_name!("section") => make!(HTMLElement), + local_name!("select") => make!(HTMLSelectElement), + local_name!("small") => make!(HTMLElement), + local_name!("source") => make!(HTMLSourceElement), // https://html.spec.whatwg.org/multipage/#other-elements,-attributes-and-apis:spacer - local_name!("spacer") => make!(HTMLUnknownElement), - local_name!("span") => make!(HTMLSpanElement), - local_name!("strike") => make!(HTMLElement), - local_name!("strong") => make!(HTMLElement), - local_name!("style") => make!(HTMLStyleElement, creator), - local_name!("sub") => make!(HTMLElement), - local_name!("summary") => make!(HTMLElement), - local_name!("sup") => make!(HTMLElement), - local_name!("table") => make!(HTMLTableElement), - local_name!("tbody") => make!(HTMLTableSectionElement), - local_name!("td") => make!(HTMLTableDataCellElement), - local_name!("template") => make!(HTMLTemplateElement), - local_name!("textarea") => make!(HTMLTextAreaElement), + local_name!("spacer") => make!(HTMLUnknownElement), + local_name!("span") => make!(HTMLSpanElement), + local_name!("strike") => make!(HTMLElement), + local_name!("strong") => make!(HTMLElement), + local_name!("style") => make!(HTMLStyleElement, creator), + local_name!("sub") => make!(HTMLElement), + local_name!("summary") => make!(HTMLElement), + local_name!("sup") => make!(HTMLElement), + local_name!("table") => make!(HTMLTableElement), + local_name!("tbody") => make!(HTMLTableSectionElement), + local_name!("td") => make!(HTMLTableDataCellElement), + local_name!("template") => make!(HTMLTemplateElement), + local_name!("textarea") => make!(HTMLTextAreaElement), // https://html.spec.whatwg.org/multipage/#the-tfoot-element:concept-element-dom - local_name!("tfoot") => make!(HTMLTableSectionElement), - local_name!("th") => make!(HTMLTableHeaderCellElement), + local_name!("tfoot") => make!(HTMLTableSectionElement), + local_name!("th") => make!(HTMLTableHeaderCellElement), // https://html.spec.whatwg.org/multipage/#the-thead-element:concept-element-dom - local_name!("thead") => make!(HTMLTableSectionElement), - local_name!("time") => make!(HTMLTimeElement), - local_name!("title") => make!(HTMLTitleElement), - local_name!("tr") => make!(HTMLTableRowElement), - local_name!("tt") => make!(HTMLElement), - local_name!("track") => make!(HTMLTrackElement), - local_name!("u") => make!(HTMLElement), - local_name!("ul") => make!(HTMLUListElement), - local_name!("var") => make!(HTMLElement), - local_name!("video") => make!(HTMLVideoElement), - local_name!("wbr") => make!(HTMLElement), - local_name!("xmp") => make!(HTMLPreElement), + local_name!("thead") => make!(HTMLTableSectionElement), + local_name!("time") => make!(HTMLTimeElement), + local_name!("title") => make!(HTMLTitleElement), + local_name!("tr") => make!(HTMLTableRowElement), + local_name!("tt") => make!(HTMLElement), + local_name!("track") => make!(HTMLTrackElement), + local_name!("u") => make!(HTMLElement), + local_name!("ul") => make!(HTMLUListElement), + local_name!("var") => make!(HTMLElement), + local_name!("video") => make!(HTMLVideoElement), + local_name!("wbr") => make!(HTMLElement), + local_name!("xmp") => make!(HTMLPreElement), _ if is_valid_custom_element_name(&*name.local) => make!(HTMLElement), - _ => make!(HTMLUnknownElement), + _ => make!(HTMLUnknownElement), } } -pub fn create_element(name: QualName, - is: Option, - document: &Document, - creator: ElementCreator, - mode: CustomElementCreationMode) - -> DomRoot { +pub fn create_element( + name: QualName, + is: Option, + document: &Document, + creator: ElementCreator, + mode: CustomElementCreationMode, +) -> DomRoot { let prefix = name.prefix.clone(); match name.ns { - ns!(html) => create_html_element(name, prefix, is, document, creator, mode), - ns!(svg) => create_svg_element(name, prefix, document), - _ => Element::new(name.local, name.ns, prefix, document) + ns!(html) => create_html_element(name, prefix, is, document, creator, mode), + ns!(svg) => create_svg_element(name, prefix, document), + _ => Element::new(name.local, name.ns, prefix, document), } } diff --git a/components/script/dom/crypto.rs b/components/script/dom/crypto.rs index 2ee87a1719b..cc17c8a00f3 100644 --- a/components/script/dom/crypto.rs +++ b/components/script/dom/crypto.rs @@ -36,17 +36,22 @@ impl Crypto { } pub fn new(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(Crypto::new_inherited()), global, CryptoBinding::Wrap) + reflect_dom_object( + Box::new(Crypto::new_inherited()), + global, + CryptoBinding::Wrap, + ) } } impl CryptoMethods for Crypto { #[allow(unsafe_code)] // https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#Crypto-method-getRandomValues - unsafe fn GetRandomValues(&self, - _cx: *mut JSContext, - mut input: CustomAutoRooterGuard) - -> Fallible> { + unsafe fn GetRandomValues( + &self, + _cx: *mut JSContext, + mut input: CustomAutoRooterGuard, + ) -> Fallible> { let array_type = input.get_array_type(); if !is_integer_buffer(array_type) { diff --git a/components/script/dom/cssconditionrule.rs b/components/script/dom/cssconditionrule.rs index 5d07722c8f9..beef32f8a42 100644 --- a/components/script/dom/cssconditionrule.rs +++ b/components/script/dom/cssconditionrule.rs @@ -20,8 +20,10 @@ pub struct CSSConditionRule { } impl CSSConditionRule { - pub fn new_inherited(parent_stylesheet: &CSSStyleSheet, - rules: Arc>) -> CSSConditionRule { + pub fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + rules: Arc>, + ) -> CSSConditionRule { CSSConditionRule { cssgroupingrule: CSSGroupingRule::new_inherited(parent_stylesheet, rules), } diff --git a/components/script/dom/cssfontfacerule.rs b/components/script/dom/cssfontfacerule.rs index 8f2970abc39..5865ec76008 100644 --- a/components/script/dom/cssfontfacerule.rs +++ b/components/script/dom/cssfontfacerule.rs @@ -22,8 +22,10 @@ pub struct CSSFontFaceRule { } impl CSSFontFaceRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, fontfacerule: Arc>) - -> CSSFontFaceRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + fontfacerule: Arc>, + ) -> CSSFontFaceRule { CSSFontFaceRule { cssrule: CSSRule::new_inherited(parent_stylesheet), fontfacerule: fontfacerule, @@ -31,11 +33,19 @@ impl CSSFontFaceRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - fontfacerule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSFontFaceRule::new_inherited(parent_stylesheet, fontfacerule)), - window, - CSSFontFaceRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + fontfacerule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSFontFaceRule::new_inherited( + parent_stylesheet, + fontfacerule, + )), + window, + CSSFontFaceRuleBinding::Wrap, + ) } } @@ -47,6 +57,9 @@ impl SpecificCSSRule for CSSFontFaceRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.fontfacerule.read_with(&guard).to_css_string(&guard).into() + self.fontfacerule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/cssgroupingrule.rs b/components/script/dom/cssgroupingrule.rs index 21c744118ea..9324035b0b0 100644 --- a/components/script/dom/cssgroupingrule.rs +++ b/components/script/dom/cssgroupingrule.rs @@ -25,8 +25,10 @@ pub struct CSSGroupingRule { } impl CSSGroupingRule { - pub fn new_inherited(parent_stylesheet: &CSSStyleSheet, - rules: Arc>) -> CSSGroupingRule { + pub fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + rules: Arc>, + ) -> CSSGroupingRule { CSSGroupingRule { cssrule: CSSRule::new_inherited(parent_stylesheet), rules: rules, @@ -36,9 +38,13 @@ impl CSSGroupingRule { fn rulelist(&self) -> DomRoot { let parent_stylesheet = self.upcast::().parent_stylesheet(); - self.rulelist.or_init(|| CSSRuleList::new(self.global().as_window(), - parent_stylesheet, - RulesSource::Rules(self.rules.clone()))) + self.rulelist.or_init(|| { + CSSRuleList::new( + self.global().as_window(), + parent_stylesheet, + RulesSource::Rules(self.rules.clone()), + ) + }) } pub fn parent_stylesheet(&self) -> &CSSStyleSheet { diff --git a/components/script/dom/cssimportrule.rs b/components/script/dom/cssimportrule.rs index 989917700ac..c8675c0457b 100644 --- a/components/script/dom/cssimportrule.rs +++ b/components/script/dom/cssimportrule.rs @@ -22,9 +22,10 @@ pub struct CSSImportRule { } impl CSSImportRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, - import_rule: Arc>) - -> Self { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + import_rule: Arc>, + ) -> Self { CSSImportRule { cssrule: CSSRule::new_inherited(parent_stylesheet), import_rule: import_rule, @@ -32,12 +33,16 @@ impl CSSImportRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, - parent_stylesheet: &CSSStyleSheet, - import_rule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(Self::new_inherited(parent_stylesheet, import_rule)), - window, - CSSImportRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + import_rule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(Self::new_inherited(parent_stylesheet, import_rule)), + window, + CSSImportRuleBinding::Wrap, + ) } } @@ -49,6 +54,9 @@ impl SpecificCSSRule for CSSImportRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.import_rule.read_with(&guard).to_css_string(&guard).into() + self.import_rule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/csskeyframerule.rs b/components/script/dom/csskeyframerule.rs index 63ec6e1d016..7d579447491 100644 --- a/components/script/dom/csskeyframerule.rs +++ b/components/script/dom/csskeyframerule.rs @@ -25,8 +25,10 @@ pub struct CSSKeyframeRule { } impl CSSKeyframeRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, keyframerule: Arc>) - -> CSSKeyframeRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + keyframerule: Arc>, + ) -> CSSKeyframeRule { CSSKeyframeRule { cssrule: CSSRule::new_inherited(parent_stylesheet), keyframerule: keyframerule, @@ -35,11 +37,19 @@ impl CSSKeyframeRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - keyframerule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSKeyframeRule::new_inherited(parent_stylesheet, keyframerule)), - window, - CSSKeyframeRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + keyframerule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSKeyframeRule::new_inherited( + parent_stylesheet, + keyframerule, + )), + window, + CSSKeyframeRuleBinding::Wrap, + ) } } @@ -69,6 +79,9 @@ impl SpecificCSSRule for CSSKeyframeRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.keyframerule.read_with(&guard).to_css_string(&guard).into() + self.keyframerule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/csskeyframesrule.rs b/components/script/dom/csskeyframesrule.rs index 7f1c212057d..4c8902c6edd 100644 --- a/components/script/dom/csskeyframesrule.rs +++ b/components/script/dom/csskeyframesrule.rs @@ -30,8 +30,10 @@ pub struct CSSKeyframesRule { } impl CSSKeyframesRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, keyframesrule: Arc>) - -> CSSKeyframesRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + keyframesrule: Arc>, + ) -> CSSKeyframesRule { CSSKeyframesRule { cssrule: CSSRule::new_inherited(parent_stylesheet), keyframesrule: keyframesrule, @@ -40,19 +42,29 @@ impl CSSKeyframesRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - keyframesrule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSKeyframesRule::new_inherited(parent_stylesheet, keyframesrule)), - window, - CSSKeyframesRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + keyframesrule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSKeyframesRule::new_inherited( + parent_stylesheet, + keyframesrule, + )), + window, + CSSKeyframesRuleBinding::Wrap, + ) } fn rulelist(&self) -> DomRoot { self.rulelist.or_init(|| { let parent_stylesheet = &self.upcast::().parent_stylesheet(); - CSSRuleList::new(self.global().as_window(), - parent_stylesheet, - RulesSource::Keyframes(self.keyframesrule.clone())) + CSSRuleList::new( + self.global().as_window(), + parent_stylesheet, + RulesSource::Keyframes(self.keyframesrule.clone()), + ) }) } @@ -64,10 +76,11 @@ impl CSSKeyframesRule { let guard = self.cssrule.shared_lock().read(); // This finds the *last* element matching a selector // because that's the rule that applies. Thus, rposition - self.keyframesrule.read_with(&guard) - .keyframes.iter().rposition(|frame| { - frame.read_with(&guard).selector == sel - }) + self.keyframesrule + .read_with(&guard) + .keyframes + .iter() + .rposition(|frame| frame.read_with(&guard).selector == sel) } else { None } @@ -86,12 +99,15 @@ impl CSSKeyframesRuleMethods for CSSKeyframesRule { let rule = Keyframe::parse( &rule, &style_stylesheet.contents, - &style_stylesheet.shared_lock + &style_stylesheet.shared_lock, ); if let Ok(rule) = rule { let mut guard = self.cssrule.shared_lock().write(); - self.keyframesrule.write_with(&mut guard).keyframes.push(rule); + self.keyframesrule + .write_with(&mut guard) + .keyframes + .push(rule); self.rulelist().append_lazy_dom_rule(); } } @@ -105,9 +121,9 @@ impl CSSKeyframesRuleMethods for CSSKeyframesRule { // https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-findrule fn FindRule(&self, selector: DOMString) -> Option> { - self.find_rule(&selector).and_then(|idx| { - self.rulelist().item(idx as u32) - }).and_then(DomRoot::downcast) + self.find_rule(&selector) + .and_then(|idx| self.rulelist().item(idx as u32)) + .and_then(DomRoot::downcast) } // https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-name @@ -136,7 +152,10 @@ impl SpecificCSSRule for CSSKeyframesRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.keyframesrule.read_with(&guard).to_css_string(&guard).into() + self.keyframesrule + .read_with(&guard) + .to_css_string(&guard) + .into() } fn deparent_children(&self) { diff --git a/components/script/dom/cssmediarule.rs b/components/script/dom/cssmediarule.rs index ccc803e4b42..9c8bc87d89b 100644 --- a/components/script/dom/cssmediarule.rs +++ b/components/script/dom/cssmediarule.rs @@ -31,8 +31,10 @@ pub struct CSSMediaRule { } impl CSSMediaRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, mediarule: Arc>) - -> CSSMediaRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + mediarule: Arc>, + ) -> CSSMediaRule { let guard = parent_stylesheet.shared_lock().read(); let list = mediarule.read_with(&guard).rules.clone(); CSSMediaRule { @@ -43,19 +45,26 @@ impl CSSMediaRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - mediarule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSMediaRule::new_inherited(parent_stylesheet, mediarule)), - window, - CSSMediaRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + mediarule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSMediaRule::new_inherited(parent_stylesheet, mediarule)), + window, + CSSMediaRuleBinding::Wrap, + ) } fn medialist(&self) -> DomRoot { self.medialist.or_init(|| { let guard = self.cssconditionrule.shared_lock().read(); - MediaList::new(self.global().as_window(), - self.cssconditionrule.parent_stylesheet(), - self.mediarule.read_with(&guard).media_queries.clone()) + MediaList::new( + self.global().as_window(), + self.cssconditionrule.parent_stylesheet(), + self.mediarule.read_with(&guard).media_queries.clone(), + ) }) } @@ -106,7 +115,10 @@ impl SpecificCSSRule for CSSMediaRule { fn get_css(&self) -> DOMString { let guard = self.cssconditionrule.shared_lock().read(); - self.mediarule.read_with(&guard).to_css_string(&guard).into() + self.mediarule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/cssnamespacerule.rs b/components/script/dom/cssnamespacerule.rs index f585f420732..b0340fecfeb 100644 --- a/components/script/dom/cssnamespacerule.rs +++ b/components/script/dom/cssnamespacerule.rs @@ -23,8 +23,10 @@ pub struct CSSNamespaceRule { } impl CSSNamespaceRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, namespacerule: Arc>) - -> CSSNamespaceRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + namespacerule: Arc>, + ) -> CSSNamespaceRule { CSSNamespaceRule { cssrule: CSSRule::new_inherited(parent_stylesheet), namespacerule: namespacerule, @@ -32,11 +34,19 @@ impl CSSNamespaceRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - namespacerule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSNamespaceRule::new_inherited(parent_stylesheet, namespacerule)), - window, - CSSNamespaceRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + namespacerule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSNamespaceRule::new_inherited( + parent_stylesheet, + namespacerule, + )), + window, + CSSNamespaceRuleBinding::Wrap, + ) } } @@ -44,8 +54,11 @@ impl CSSNamespaceRuleMethods for CSSNamespaceRule { // https://drafts.csswg.org/cssom/#dom-cssnamespacerule-prefix fn Prefix(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.namespacerule.read_with(&guard).prefix - .as_ref().map(|s| s.to_string().into()) + self.namespacerule + .read_with(&guard) + .prefix + .as_ref() + .map(|s| s.to_string().into()) .unwrap_or(DOMString::new()) } @@ -64,6 +77,9 @@ impl SpecificCSSRule for CSSNamespaceRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.namespacerule.read_with(&guard).to_css_string(&guard).into() + self.namespacerule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/cssrule.rs b/components/script/dom/cssrule.rs index da867be8df0..71f8ab5844c 100644 --- a/components/script/dom/cssrule.rs +++ b/components/script/dom/cssrule.rs @@ -23,7 +23,6 @@ use std::cell::Cell; use style::shared_lock::SharedRwLock; use style::stylesheets::CssRule as StyleCssRule; - #[dom_struct] pub struct CSSRule { reflector_: Reflector, @@ -71,20 +70,39 @@ impl CSSRule { // Given a StyleCssRule, create a new instance of a derived class of // CSSRule based on which rule it is - pub fn new_specific(window: &Window, parent_stylesheet: &CSSStyleSheet, - rule: StyleCssRule) -> DomRoot { + pub fn new_specific( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + rule: StyleCssRule, + ) -> DomRoot { // be sure to update the match in as_specific when this is updated match rule { - StyleCssRule::Import(s) => DomRoot::upcast(CSSImportRule::new(window, parent_stylesheet, s)), - StyleCssRule::Style(s) => DomRoot::upcast(CSSStyleRule::new(window, parent_stylesheet, s)), - StyleCssRule::FontFace(s) => DomRoot::upcast(CSSFontFaceRule::new(window, parent_stylesheet, s)), + StyleCssRule::Import(s) => { + DomRoot::upcast(CSSImportRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::Style(s) => { + DomRoot::upcast(CSSStyleRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::FontFace(s) => { + DomRoot::upcast(CSSFontFaceRule::new(window, parent_stylesheet, s)) + }, StyleCssRule::FontFeatureValues(_) => unimplemented!(), StyleCssRule::CounterStyle(_) => unimplemented!(), - StyleCssRule::Keyframes(s) => DomRoot::upcast(CSSKeyframesRule::new(window, parent_stylesheet, s)), - StyleCssRule::Media(s) => DomRoot::upcast(CSSMediaRule::new(window, parent_stylesheet, s)), - StyleCssRule::Namespace(s) => DomRoot::upcast(CSSNamespaceRule::new(window, parent_stylesheet, s)), - StyleCssRule::Viewport(s) => DomRoot::upcast(CSSViewportRule::new(window, parent_stylesheet, s)), - StyleCssRule::Supports(s) => DomRoot::upcast(CSSSupportsRule::new(window, parent_stylesheet, s)), + StyleCssRule::Keyframes(s) => { + DomRoot::upcast(CSSKeyframesRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::Media(s) => { + DomRoot::upcast(CSSMediaRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::Namespace(s) => { + DomRoot::upcast(CSSNamespaceRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::Viewport(s) => { + DomRoot::upcast(CSSViewportRule::new(window, parent_stylesheet, s)) + }, + StyleCssRule::Supports(s) => { + DomRoot::upcast(CSSSupportsRule::new(window, parent_stylesheet, s)) + }, StyleCssRule::Page(_) => unreachable!(), StyleCssRule::Document(_) => unimplemented!(), // TODO } diff --git a/components/script/dom/cssrulelist.rs b/components/script/dom/cssrulelist.rs index baa685d5a72..f6668763e59 100644 --- a/components/script/dom/cssrulelist.rs +++ b/components/script/dom/cssrulelist.rs @@ -39,7 +39,7 @@ pub struct CSSRuleList { parent_stylesheet: Dom, #[ignore_malloc_size_of = "Arc"] rules: RulesSource, - dom_rules: DomRefCell>> + dom_rules: DomRefCell>>, } pub enum RulesSource { @@ -52,12 +52,18 @@ impl CSSRuleList { pub fn new_inherited(parent_stylesheet: &CSSStyleSheet, rules: RulesSource) -> CSSRuleList { let guard = parent_stylesheet.shared_lock().read(); let dom_rules = match rules { - RulesSource::Rules(ref rules) => { - rules.read_with(&guard).0.iter().map(|_| MutNullableDom::new(None)).collect() - } - RulesSource::Keyframes(ref rules) => { - rules.read_with(&guard).keyframes.iter().map(|_| MutNullableDom::new(None)).collect() - } + RulesSource::Rules(ref rules) => rules + .read_with(&guard) + .0 + .iter() + .map(|_| MutNullableDom::new(None)) + .collect(), + RulesSource::Keyframes(ref rules) => rules + .read_with(&guard) + .keyframes + .iter() + .map(|_| MutNullableDom::new(None)) + .collect(), }; CSSRuleList { @@ -69,11 +75,16 @@ impl CSSRuleList { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - rules: RulesSource) -> DomRoot { - reflect_dom_object(Box::new(CSSRuleList::new_inherited(parent_stylesheet, rules)), - window, - CSSRuleListBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + rules: RulesSource, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSRuleList::new_inherited(parent_stylesheet, rules)), + window, + CSSRuleListBinding::Wrap, + ) } /// Should only be called for CssRules-backed rules. Use append_lazy_rule @@ -91,18 +102,21 @@ impl CSSRuleList { let parent_stylesheet = self.parent_stylesheet.style_stylesheet(); let new_rule = css_rules.with_raw_offset_arc(|arc| { - arc.insert_rule(&parent_stylesheet.shared_lock, - rule, - &parent_stylesheet.contents, - index, - nested, - None) + arc.insert_rule( + &parent_stylesheet.shared_lock, + rule, + &parent_stylesheet.contents, + index, + nested, + None, + ) })?; - let parent_stylesheet = &*self.parent_stylesheet; let dom_rule = CSSRule::new_specific(&window, parent_stylesheet, new_rule); - self.dom_rules.borrow_mut().insert(index, MutNullableDom::new(Some(&*dom_rule))); + self.dom_rules + .borrow_mut() + .insert(index, MutNullableDom::new(Some(&*dom_rule))); Ok(idx) } @@ -118,7 +132,7 @@ impl CSSRuleList { dom_rules[index].get().map(|r| r.detach()); dom_rules.remove(index); Ok(()) - } + }, RulesSource::Keyframes(ref kf) => { // https://drafts.csswg.org/css-animations/#dom-csskeyframesrule-deleterule let mut dom_rules = self.dom_rules.borrow_mut(); @@ -126,7 +140,7 @@ impl CSSRuleList { dom_rules.remove(index); kf.write_with(&mut guard).keyframes.remove(index); Ok(()) - } + }, } } @@ -143,20 +157,17 @@ impl CSSRuleList { let parent_stylesheet = &self.parent_stylesheet; let guard = parent_stylesheet.shared_lock().read(); match self.rules { - RulesSource::Rules(ref rules) => { - CSSRule::new_specific(self.global().as_window(), - parent_stylesheet, - rules.read_with(&guard).0[idx as usize].clone()) - } - RulesSource::Keyframes(ref rules) => { - DomRoot::upcast(CSSKeyframeRule::new(self.global().as_window(), - parent_stylesheet, - rules.read_with(&guard) - .keyframes[idx as usize] - .clone())) - } + RulesSource::Rules(ref rules) => CSSRule::new_specific( + self.global().as_window(), + parent_stylesheet, + rules.read_with(&guard).0[idx as usize].clone(), + ), + RulesSource::Keyframes(ref rules) => DomRoot::upcast(CSSKeyframeRule::new( + self.global().as_window(), + parent_stylesheet, + rules.read_with(&guard).keyframes[idx as usize].clone(), + )), } - }) }) } @@ -190,4 +201,3 @@ impl CSSRuleListMethods for CSSRuleList { self.Item(index) } } - diff --git a/components/script/dom/cssstyledeclaration.rs b/components/script/dom/cssstyledeclaration.rs index 25beffd9549..795e401a5d3 100644 --- a/components/script/dom/cssstyledeclaration.rs +++ b/components/script/dom/cssstyledeclaration.rs @@ -36,16 +36,18 @@ pub struct CSSStyleDeclaration { #[must_root] pub enum CSSStyleOwner { Element(Dom), - CSSRule(Dom, - #[ignore_malloc_size_of = "Arc"] - Arc>), + CSSRule( + Dom, + #[ignore_malloc_size_of = "Arc"] Arc>, + ), } impl CSSStyleOwner { // Mutate the declaration block associated to this style owner, and // optionally indicate if it has changed (assumed to be true). fn mutate_associated_block(&self, f: F) -> R - where F: FnOnce(&mut PropertyDeclarationBlock, &mut bool) -> R, + where + F: FnOnce(&mut PropertyDeclarationBlock, &mut bool) -> R, { // TODO(emilio): This has some duplication just to avoid dummy clones. // @@ -87,9 +89,10 @@ impl CSSStyleOwner { let guard = shared_lock.read(); let mut serialization = String::new(); pdb.read_with(&guard).to_css(&mut serialization).unwrap(); - el.set_attribute(&local_name!("style"), - AttrValue::Declaration(serialization, - pdb)); + el.set_attribute( + &local_name!("style"), + AttrValue::Declaration(serialization, pdb), + ); } } else { // Remember to put it back. @@ -97,7 +100,7 @@ impl CSSStyleOwner { } result - } + }, CSSStyleOwner::CSSRule(ref rule, ref pdb) => { let result = { let mut guard = rule.shared_lock().write(); @@ -106,34 +109,36 @@ impl CSSStyleOwner { if changed { // If this is changed, see also // CSSStyleRule::SetSelectorText, which does the same thing. - rule.global().as_window().Document().invalidate_stylesheets(); + rule.global() + .as_window() + .Document() + .invalidate_stylesheets(); } result - } + }, } } fn with_block(&self, f: F) -> R - where F: FnOnce(&PropertyDeclarationBlock) -> R, + where + F: FnOnce(&PropertyDeclarationBlock) -> R, { match *self { - CSSStyleOwner::Element(ref el) => { - match *el.style_attribute().borrow() { - Some(ref pdb) => { - let document = document_from_node(&**el); - let guard = document.style_shared_lock().read(); - f(pdb.read_with(&guard)) - } - None => { - let pdb = PropertyDeclarationBlock::new(); - f(&pdb) - } - } - } + CSSStyleOwner::Element(ref el) => match *el.style_attribute().borrow() { + Some(ref pdb) => { + let document = document_from_node(&**el); + let guard = document.style_shared_lock().read(); + f(pdb.read_with(&guard)) + }, + None => { + let pdb = PropertyDeclarationBlock::new(); + f(&pdb) + }, + }, CSSStyleOwner::CSSRule(ref rule, ref pdb) => { let guard = rule.shared_lock().read(); f(pdb.read_with(&guard)) - } + }, } } @@ -147,9 +152,12 @@ impl CSSStyleOwner { fn base_url(&self) -> ServoUrl { match *self { CSSStyleOwner::Element(ref el) => window_from_node(&**el).Document().base_url(), - CSSStyleOwner::CSSRule(ref rule, _) => { - (*rule.parent_stylesheet().style_stylesheet().contents.url_data.read()).clone() - } + CSSStyleOwner::CSSRule(ref rule, _) => (*rule + .parent_stylesheet() + .style_stylesheet() + .contents + .url_data + .read()).clone(), } } } @@ -181,10 +189,7 @@ macro_rules! css_properties( ); ); -fn remove_property( - decls: &mut PropertyDeclarationBlock, - id: &PropertyId, -) -> bool { +fn remove_property(decls: &mut PropertyDeclarationBlock, id: &PropertyId) -> bool { let first_declaration = decls.first_declaration_to_remove(id); let first_declaration = match first_declaration { Some(i) => i, @@ -196,10 +201,11 @@ fn remove_property( impl CSSStyleDeclaration { #[allow(unrooted_must_root)] - pub fn new_inherited(owner: CSSStyleOwner, - pseudo: Option, - modification_access: CSSModificationAccess) - -> CSSStyleDeclaration { + pub fn new_inherited( + owner: CSSStyleOwner, + pseudo: Option, + modification_access: CSSModificationAccess, + ) -> CSSStyleDeclaration { CSSStyleDeclaration { reflector_: Reflector::new(), owner: owner, @@ -209,22 +215,28 @@ impl CSSStyleDeclaration { } #[allow(unrooted_must_root)] - pub fn new(global: &Window, - owner: CSSStyleOwner, - pseudo: Option, - modification_access: CSSModificationAccess) - -> DomRoot { + pub fn new( + global: &Window, + owner: CSSStyleOwner, + pseudo: Option, + modification_access: CSSModificationAccess, + ) -> DomRoot { reflect_dom_object( - Box::new(CSSStyleDeclaration::new_inherited(owner, pseudo, modification_access)), + Box::new(CSSStyleDeclaration::new_inherited( + owner, + pseudo, + modification_access, + )), global, - CSSStyleDeclarationBinding::Wrap + CSSStyleDeclarationBinding::Wrap, ) } fn get_computed_style(&self, property: PropertyId) -> DOMString { match self.owner { - CSSStyleOwner::CSSRule(..) => - panic!("get_computed_style called on CSSStyleDeclaration with a CSSRule owner"), + CSSStyleOwner::CSSRule(..) => { + panic!("get_computed_style called on CSSStyleDeclaration with a CSSRule owner") + }, CSSStyleOwner::Element(ref el) => { let node = el.upcast::(); if !node.is_in_doc() { @@ -234,7 +246,7 @@ impl CSSStyleDeclaration { } let addr = node.to_trusted_node_address(); window_from_node(node).resolved_style_query(addr, self.pseudo.clone(), property) - } + }, } } @@ -277,7 +289,7 @@ impl CSSStyleDeclaration { _ => { *changed = false; return Ok(()); - } + }, }; // Step 5 @@ -300,12 +312,11 @@ impl CSSStyleDeclaration { Err(_) => { *changed = false; return Ok(()); - } + }, } let mut updates = Default::default(); - *changed = - pdb.prepare_for_update(&declarations, importance, &mut updates); + *changed = pdb.prepare_for_update(&declarations, importance, &mut updates); if !*changed { return Ok(()); @@ -323,9 +334,7 @@ impl CSSStyleDeclaration { impl CSSStyleDeclarationMethods for CSSStyleDeclaration { // https://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-length fn Length(&self) -> u32 { - self.owner.with_block(|pdb| { - pdb.declarations().len() as u32 - }) + self.owner.with_block(|pdb| pdb.declarations().len() as u32) } // https://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-item @@ -360,11 +369,12 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { } // https://dev.w3.org/csswg/cssom/#dom-cssstyledeclaration-setproperty - fn SetProperty(&self, - property: DOMString, - value: DOMString, - priority: DOMString) - -> ErrorResult { + fn SetProperty( + &self, + property: DOMString, + value: DOMString, + priority: DOMString, + ) -> ErrorResult { // Step 3 let id = match PropertyId::parse_enabled_for_all_content(&property) { Ok(id) => id, @@ -444,10 +454,12 @@ impl CSSStyleDeclarationMethods for CSSStyleDeclaration { let quirks_mode = window.Document().quirks_mode(); self.owner.mutate_associated_block(|pdb, _changed| { // Step 3 - *pdb = parse_style_attribute(&value, - &self.owner.base_url(), - window.css_error_reporter(), - quirks_mode); + *pdb = parse_style_attribute( + &value, + &self.owner.base_url(), + window.css_error_reporter(), + quirks_mode, + ); }); Ok(()) diff --git a/components/script/dom/cssstylerule.rs b/components/script/dom/cssstylerule.rs index 0e9f001dc05..788b72927b5 100644 --- a/components/script/dom/cssstylerule.rs +++ b/components/script/dom/cssstylerule.rs @@ -31,8 +31,10 @@ pub struct CSSStyleRule { } impl CSSStyleRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, stylerule: Arc>) - -> CSSStyleRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + stylerule: Arc>, + ) -> CSSStyleRule { CSSStyleRule { cssrule: CSSRule::new_inherited(parent_stylesheet), stylerule: stylerule, @@ -41,11 +43,16 @@ impl CSSStyleRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - stylerule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSStyleRule::new_inherited(parent_stylesheet, stylerule)), - window, - CSSStyleRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + stylerule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSStyleRule::new_inherited(parent_stylesheet, stylerule)), + window, + CSSStyleRuleBinding::Wrap, + ) } } @@ -57,7 +64,10 @@ impl SpecificCSSRule for CSSStyleRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.stylerule.read_with(&guard).to_css_string(&guard).into() + self.stylerule + .read_with(&guard) + .to_css_string(&guard) + .into() } } @@ -70,10 +80,10 @@ impl CSSStyleRuleMethods for CSSStyleRule { self.global().as_window(), CSSStyleOwner::CSSRule( Dom::from_ref(self.upcast()), - self.stylerule.read_with(&guard).block.clone() + self.stylerule.read_with(&guard).block.clone(), ), None, - CSSModificationAccess::ReadWrite + CSSModificationAccess::ReadWrite, ) }) } @@ -89,7 +99,13 @@ impl CSSStyleRuleMethods for CSSStyleRule { fn SetSelectorText(&self, value: DOMString) { // It's not clear from the spec if we should use the stylesheet's namespaces. // https://github.com/w3c/csswg-drafts/issues/1511 - let namespaces = self.cssrule.parent_stylesheet().style_stylesheet().contents.namespaces.read(); + let namespaces = self + .cssrule + .parent_stylesheet() + .style_stylesheet() + .contents + .namespaces + .read(); let parser = SelectorParser { stylesheet_origin: Origin::Author, namespaces: &namespaces, @@ -104,7 +120,10 @@ impl CSSStyleRuleMethods for CSSStyleRule { mem::swap(&mut stylerule.selectors, &mut s); // It seems like we will want to avoid having to invalidate all // stylesheets eventually! - self.global().as_window().Document().invalidate_stylesheets(); + self.global() + .as_window() + .Document() + .invalidate_stylesheets(); } } } diff --git a/components/script/dom/cssstylesheet.rs b/components/script/dom/cssstylesheet.rs index d393b1f3ff7..def0f26bc77 100644 --- a/components/script/dom/cssstylesheet.rs +++ b/components/script/dom/cssstylesheet.rs @@ -30,11 +30,13 @@ pub struct CSSStyleSheet { } impl CSSStyleSheet { - fn new_inherited(owner: &Element, - type_: DOMString, - href: Option, - title: Option, - stylesheet: Arc) -> CSSStyleSheet { + fn new_inherited( + owner: &Element, + type_: DOMString, + href: Option, + title: Option, + stylesheet: Arc, + ) -> CSSStyleSheet { CSSStyleSheet { stylesheet: StyleSheet::new_inherited(type_, href, title), owner: Dom::from_ref(owner), @@ -45,25 +47,27 @@ impl CSSStyleSheet { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, - owner: &Element, - type_: DOMString, - href: Option, - title: Option, - stylesheet: Arc) -> DomRoot { - reflect_dom_object(Box::new(CSSStyleSheet::new_inherited(owner, type_, href, title, stylesheet)), - window, - CSSStyleSheetBinding::Wrap) + pub fn new( + window: &Window, + owner: &Element, + type_: DOMString, + href: Option, + title: Option, + stylesheet: Arc, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSStyleSheet::new_inherited( + owner, type_, href, title, stylesheet, + )), + window, + CSSStyleSheetBinding::Wrap, + ) } fn rulelist(&self) -> DomRoot { self.rulelist.or_init(|| { let rules = self.style_stylesheet.contents.rules.clone(); - CSSRuleList::new( - self.global().as_window(), - self, - RulesSource::Rules(rules) - ) + CSSRuleList::new(self.global().as_window(), self, RulesSource::Rules(rules)) }) } @@ -73,7 +77,10 @@ impl CSSStyleSheet { pub fn set_disabled(&self, disabled: bool) { if self.style_stylesheet.set_disabled(disabled) { - self.global().as_window().Document().invalidate_stylesheets(); + self.global() + .as_window() + .Document() + .invalidate_stylesheets(); } } @@ -104,7 +111,8 @@ impl CSSStyleSheetMethods for CSSStyleSheet { if !self.origin_clean.get() { return Err(Error::Security); } - self.rulelist().insert_rule(&rule, index, /* nested */ false) + self.rulelist() + .insert_rule(&rule, index, /* nested */ false) } // https://drafts.csswg.org/cssom/#dom-cssstylesheet-deleterule @@ -115,4 +123,3 @@ impl CSSStyleSheetMethods for CSSStyleSheet { self.rulelist().remove_rule(index) } } - diff --git a/components/script/dom/cssstylevalue.rs b/components/script/dom/cssstylevalue.rs index e440a428cd2..2ecdbbe357f 100644 --- a/components/script/dom/cssstylevalue.rs +++ b/components/script/dom/cssstylevalue.rs @@ -48,7 +48,9 @@ impl CSSStyleValue { pub fn get_url(&self, base_url: ServoUrl) -> Option { let mut input = ParserInput::new(&*self.value); let mut parser = Parser::new(&mut input); - parser.expect_url().ok() + parser + .expect_url() + .ok() .and_then(|string| base_url.join(&*string).ok()) } } diff --git a/components/script/dom/csssupportsrule.rs b/components/script/dom/csssupportsrule.rs index 8b66fbe76cf..136a742e0e7 100644 --- a/components/script/dom/csssupportsrule.rs +++ b/components/script/dom/csssupportsrule.rs @@ -28,8 +28,10 @@ pub struct CSSSupportsRule { } impl CSSSupportsRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, supportsrule: Arc>) - -> CSSSupportsRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + supportsrule: Arc>, + ) -> CSSSupportsRule { let guard = parent_stylesheet.shared_lock().read(); let list = supportsrule.read_with(&guard).rules.clone(); CSSSupportsRule { @@ -39,11 +41,19 @@ impl CSSSupportsRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - supportsrule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSSupportsRule::new_inherited(parent_stylesheet, supportsrule)), - window, - CSSSupportsRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + supportsrule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSSupportsRule::new_inherited( + parent_stylesheet, + supportsrule, + )), + window, + CSSSupportsRuleBinding::Wrap, + ) } /// @@ -88,6 +98,9 @@ impl SpecificCSSRule for CSSSupportsRule { fn get_css(&self) -> DOMString { let guard = self.cssconditionrule.shared_lock().read(); - self.supportsrule.read_with(&guard).to_css_string(&guard).into() + self.supportsrule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/cssviewportrule.rs b/components/script/dom/cssviewportrule.rs index 89e523cdc39..8f0dbaa8c15 100644 --- a/components/script/dom/cssviewportrule.rs +++ b/components/script/dom/cssviewportrule.rs @@ -22,7 +22,10 @@ pub struct CSSViewportRule { } impl CSSViewportRule { - fn new_inherited(parent_stylesheet: &CSSStyleSheet, viewportrule: Arc>) -> CSSViewportRule { + fn new_inherited( + parent_stylesheet: &CSSStyleSheet, + viewportrule: Arc>, + ) -> CSSViewportRule { CSSViewportRule { cssrule: CSSRule::new_inherited(parent_stylesheet), viewportrule: viewportrule, @@ -30,11 +33,19 @@ impl CSSViewportRule { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, parent_stylesheet: &CSSStyleSheet, - viewportrule: Arc>) -> DomRoot { - reflect_dom_object(Box::new(CSSViewportRule::new_inherited(parent_stylesheet, viewportrule)), - window, - CSSViewportRuleBinding::Wrap) + pub fn new( + window: &Window, + parent_stylesheet: &CSSStyleSheet, + viewportrule: Arc>, + ) -> DomRoot { + reflect_dom_object( + Box::new(CSSViewportRule::new_inherited( + parent_stylesheet, + viewportrule, + )), + window, + CSSViewportRuleBinding::Wrap, + ) } } @@ -46,6 +57,9 @@ impl SpecificCSSRule for CSSViewportRule { fn get_css(&self) -> DOMString { let guard = self.cssrule.shared_lock().read(); - self.viewportrule.read_with(&guard).to_css_string(&guard).into() + self.viewportrule + .read_with(&guard) + .to_css_string(&guard) + .into() } } diff --git a/components/script/dom/customelementregistry.rs b/components/script/dom/customelementregistry.rs index b4a07750f7a..7239a99b0c0 100644 --- a/components/script/dom/customelementregistry.rs +++ b/components/script/dom/customelementregistry.rs @@ -71,9 +71,11 @@ impl CustomElementRegistry { } pub fn new(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(CustomElementRegistry::new_inherited(window)), - window, - CustomElementRegistryBinding::Wrap) + reflect_dom_object( + Box::new(CustomElementRegistry::new_inherited(window)), + window, + CustomElementRegistryBinding::Wrap, + ) } /// Cleans up any active promises @@ -83,40 +85,57 @@ impl CustomElementRegistry { } /// - pub fn lookup_definition(&self, - local_name: &LocalName, - is: Option<&LocalName>) - -> Option> { - self.definitions.borrow().values().find(|definition| { - // Step 4-5 - definition.local_name == *local_name && - (definition.name == *local_name || Some(&definition.name) == is) - }).cloned() + pub fn lookup_definition( + &self, + local_name: &LocalName, + is: Option<&LocalName>, + ) -> Option> { + self.definitions + .borrow() + .values() + .find(|definition| { + // Step 4-5 + definition.local_name == *local_name && + (definition.name == *local_name || Some(&definition.name) == is) + }).cloned() } - pub fn lookup_definition_by_constructor(&self, constructor: HandleObject) -> Option> { - self.definitions.borrow().values().find(|definition| { - definition.constructor.callback() == constructor.get() - }).cloned() + pub fn lookup_definition_by_constructor( + &self, + constructor: HandleObject, + ) -> Option> { + self.definitions + .borrow() + .values() + .find(|definition| definition.constructor.callback() == constructor.get()) + .cloned() } /// /// Steps 10.1, 10.2 #[allow(unsafe_code)] - fn check_prototype(&self, constructor: HandleObject, prototype: MutableHandleValue) -> ErrorResult { + fn check_prototype( + &self, + constructor: HandleObject, + prototype: MutableHandleValue, + ) -> ErrorResult { let global_scope = self.window.upcast::(); unsafe { // Step 10.1 - if !JS_GetProperty(global_scope.get_cx(), - constructor, - b"prototype\0".as_ptr() as *const _, - prototype) { + if !JS_GetProperty( + global_scope.get_cx(), + constructor, + b"prototype\0".as_ptr() as *const _, + prototype, + ) { return Err(Error::JSFailed); } // Step 10.2 if !prototype.is_object() { - return Err(Error::Type("constructor.prototype is not an object".to_owned())); + return Err(Error::Type( + "constructor.prototype is not an object".to_owned(), + )); } } Ok(()) @@ -143,10 +162,14 @@ impl CustomElementRegistry { fn get_observed_attributes(&self, constructor: HandleObject) -> Fallible> { let cx = self.window.get_cx(); rooted!(in(cx) let mut observed_attributes = UndefinedValue()); - if unsafe { !JS_GetProperty(cx, - constructor, - b"observedAttributes\0".as_ptr() as *const _, - observed_attributes.handle_mut()) } { + if unsafe { + !JS_GetProperty( + cx, + constructor, + b"observedAttributes\0".as_ptr() as *const _, + observed_attributes.handle_mut(), + ) + } { return Err(Error::JSFailed); } @@ -155,7 +178,11 @@ impl CustomElementRegistry { } let conversion = unsafe { - FromJSValConvertible::from_jsval(cx, observed_attributes.handle(), StringificationBehavior::Default) + FromJSValConvertible::from_jsval( + cx, + observed_attributes.handle(), + StringificationBehavior::Default, + ) }; match conversion { Ok(ConversionResult::Success(attributes)) => Ok(attributes), @@ -176,7 +203,12 @@ unsafe fn get_callback( rooted!(in(cx) let mut callback = UndefinedValue()); // Step 10.4.1 - if !JS_GetProperty(cx, prototype, name.as_ptr() as *const _, callback.handle_mut()) { + if !JS_GetProperty( + cx, + prototype, + name.as_ptr() as *const _, + callback.handle_mut(), + ) { return Err(Error::JSFailed); } @@ -195,9 +227,10 @@ impl CustomElementRegistryMethods for CustomElementRegistry { #[allow(unsafe_code, unrooted_must_root)] /// fn Define( - &self, name: DOMString, + &self, + name: DOMString, constructor_: Rc, - options: &ElementDefinitionOptions + options: &ElementDefinitionOptions, ) -> ErrorResult { let cx = self.window.get_cx(); rooted!(in(cx) let constructor = constructor_.callback()); @@ -213,12 +246,14 @@ impl CustomElementRegistryMethods for CustomElementRegistry { } if unsafe { !IsConstructor(unwrapped_constructor.get()) } { - return Err(Error::Type("Second argument of CustomElementRegistry.define is not a constructor".to_owned())); + return Err(Error::Type( + "Second argument of CustomElementRegistry.define is not a constructor".to_owned(), + )); } // Step 2 if !is_valid_custom_element_name(&name) { - return Err(Error::Syntax) + return Err(Error::Syntax); } // Step 3 @@ -227,7 +262,12 @@ impl CustomElementRegistryMethods for CustomElementRegistry { } // Step 4 - if self.definitions.borrow().iter().any(|(_, ref def)| def.constructor == constructor_) { + if self + .definitions + .borrow() + .iter() + .any(|(_, ref def)| def.constructor == constructor_) + { return Err(Error::NotSupported); } @@ -238,12 +278,12 @@ impl CustomElementRegistryMethods for CustomElementRegistry { let local_name = if let Some(ref extended_name) = *extends { // Step 7.1 if is_valid_custom_element_name(extended_name) { - return Err(Error::NotSupported) + return Err(Error::NotSupported); } // Step 7.2 if !is_extendable_element_interface(extended_name) { - return Err(Error::NotSupported) + return Err(Error::NotSupported); } LocalName::from(&**extended_name) @@ -300,20 +340,28 @@ impl CustomElementRegistryMethods for CustomElementRegistry { self.element_definition_is_running.set(false); // Step 11 - let definition = Rc::new(CustomElementDefinition::new(name.clone(), - local_name.clone(), - constructor_, - observed_attributes, - callbacks)); + let definition = Rc::new(CustomElementDefinition::new( + name.clone(), + local_name.clone(), + constructor_, + observed_attributes, + callbacks, + )); // Step 12 - self.definitions.borrow_mut().insert(name.clone(), definition.clone()); + self.definitions + .borrow_mut() + .insert(name.clone(), definition.clone()); // Step 13 let document = self.window.Document(); // Steps 14-15 - for candidate in document.upcast::().traverse_preorder().filter_map(DomRoot::downcast::) { + for candidate in document + .upcast::() + .traverse_preorder() + .filter_map(DomRoot::downcast::) + { let is = candidate.get_is(); if *candidate.local_name() == local_name && *candidate.namespace() == ns!(html) && @@ -336,7 +384,9 @@ impl CustomElementRegistryMethods for CustomElementRegistry { match self.definitions.borrow().get(&LocalName::from(&*name)) { Some(definition) => { rooted!(in(cx) let mut constructor = UndefinedValue()); - definition.constructor.to_jsval(cx, constructor.handle_mut()); + definition + .constructor + .to_jsval(cx, constructor.handle_mut()); constructor.get() }, None => UndefinedValue(), @@ -353,14 +403,14 @@ impl CustomElementRegistryMethods for CustomElementRegistry { if !is_valid_custom_element_name(&name) { let promise = Promise::new(global_scope); promise.reject_native(&DOMException::new(global_scope, DOMErrorName::SyntaxError)); - return promise + return promise; } // Step 2 if self.definitions.borrow().contains_key(&name) { let promise = Promise::new(global_scope); promise.resolve_native(&UndefinedValue()); - return promise + return promise; } // Step 3 @@ -417,12 +467,13 @@ pub struct CustomElementDefinition { } impl CustomElementDefinition { - fn new(name: LocalName, - local_name: LocalName, - constructor: Rc, - observed_attributes: Vec, - callbacks: LifecycleCallbacks) - -> CustomElementDefinition { + fn new( + name: LocalName, + local_name: LocalName, + constructor: Rc, + observed_attributes: Vec, + callbacks: LifecycleCallbacks, + ) -> CustomElementDefinition { CustomElementDefinition { name: name, local_name: local_name, @@ -440,7 +491,11 @@ impl CustomElementDefinition { /// https://dom.spec.whatwg.org/#concept-create-element Step 6.1 #[allow(unsafe_code)] - pub fn create_element(&self, document: &Document, prefix: Option) -> Fallible> { + pub fn create_element( + &self, + document: &Document, + prefix: Option, + ) -> Fallible> { let window = document.window(); let cx = window.get_cx(); // Step 2 @@ -456,16 +511,22 @@ impl CustomElementDefinition { } rooted!(in(cx) let element_val = ObjectValue(element.get())); - let element: DomRoot = match unsafe { DomRoot::from_jsval(cx, element_val.handle(), ()) } { - Ok(ConversionResult::Success(element)) => element, - Ok(ConversionResult::Failure(..)) => - return Err(Error::Type("Constructor did not return a DOM node".to_owned())), - _ => return Err(Error::JSFailed), - }; + let element: DomRoot = + match unsafe { DomRoot::from_jsval(cx, element_val.handle(), ()) } { + Ok(ConversionResult::Success(element)) => element, + Ok(ConversionResult::Failure(..)) => { + return Err(Error::Type( + "Constructor did not return a DOM node".to_owned(), + )) + }, + _ => return Err(Error::JSFailed), + }; // Step 3 if !element.is::() { - return Err(Error::Type("Constructor did not return a DOM node".to_owned())); + return Err(Error::Type( + "Constructor did not return a DOM node".to_owned(), + )); } // Steps 4-9 @@ -503,17 +564,27 @@ pub fn upgrade_element(definition: Rc, element: &Elemen let local_name = attr.local_name().clone(); let value = DOMString::from(&**attr.value()); let namespace = attr.namespace().clone(); - ScriptThread::enqueue_callback_reaction(element, - CallbackReaction::AttributeChanged(local_name, None, Some(value), namespace), Some(definition.clone())); + ScriptThread::enqueue_callback_reaction( + element, + CallbackReaction::AttributeChanged(local_name, None, Some(value), namespace), + Some(definition.clone()), + ); } // Step 4 if element.is_connected() { - ScriptThread::enqueue_callback_reaction(element, CallbackReaction::Connected, Some(definition.clone())); + ScriptThread::enqueue_callback_reaction( + element, + CallbackReaction::Connected, + Some(definition.clone()), + ); } // Step 5 - definition.construction_stack.borrow_mut().push(ConstructionStackEntry::Element(DomRoot::from_ref(element))); + definition + .construction_stack + .borrow_mut() + .push(ConstructionStackEntry::Element(DomRoot::from_ref(element))); // Step 7 let result = run_upgrade_constructor(&definition.constructor, element); @@ -548,25 +619,44 @@ pub fn upgrade_element(definition: Rc, element: &Elemen /// /// Steps 7.1-7.2 #[allow(unsafe_code)] -fn run_upgrade_constructor(constructor: &Rc, element: &Element) -> ErrorResult { +fn run_upgrade_constructor( + constructor: &Rc, + element: &Element, +) -> ErrorResult { let window = window_from_node(element); let cx = window.get_cx(); rooted!(in(cx) let constructor_val = ObjectValue(constructor.callback())); rooted!(in(cx) let mut element_val = UndefinedValue()); - unsafe { element.to_jsval(cx, element_val.handle_mut()); } + unsafe { + element.to_jsval(cx, element_val.handle_mut()); + } rooted!(in(cx) let mut construct_result = ptr::null_mut::()); { // Go into the constructor's compartment let _ac = JSAutoCompartment::new(cx, constructor.callback()); let args = HandleValueArray::new(); // Step 7.1 - if unsafe { !Construct1(cx, constructor_val.handle(), &args, construct_result.handle_mut()) } { + if unsafe { + !Construct1( + cx, + constructor_val.handle(), + &args, + construct_result.handle_mut(), + ) + } { return Err(Error::JSFailed); } // Step 7.2 let mut same = false; rooted!(in(cx) let construct_result_val = ObjectValue(construct_result.get())); - if unsafe { !JS_SameValue(cx, construct_result_val.handle(), element_val.handle(), &mut same) } { + if unsafe { + !JS_SameValue( + cx, + construct_result_val.handle(), + element_val.handle(), + &mut same, + ) + } { return Err(Error::JSFailed); } if !same { @@ -583,7 +673,9 @@ pub fn try_upgrade_element(element: &Element) { let namespace = element.namespace(); let local_name = element.local_name(); let is = element.get_is(); - if let Some(definition) = document.lookup_custom_element_definition(namespace, local_name, is.as_ref()) { + if let Some(definition) = + document.lookup_custom_element_definition(namespace, local_name, is.as_ref()) + { // Step 2 ScriptThread::enqueue_upgrade_reaction(element, definition); } @@ -592,14 +684,10 @@ pub fn try_upgrade_element(element: &Element) { #[derive(JSTraceable, MallocSizeOf)] #[must_root] pub enum CustomElementReaction { - Upgrade( - #[ignore_malloc_size_of = "Rc"] - Rc - ), + Upgrade(#[ignore_malloc_size_of = "Rc"] Rc), Callback( - #[ignore_malloc_size_of = "Rc"] - Rc, - Box<[Heap]> + #[ignore_malloc_size_of = "Rc"] Rc, + Box<[Heap]>, ), } @@ -609,12 +697,17 @@ impl CustomElementReaction { pub fn invoke(&self, element: &Element) { // Step 2.1 match *self { - CustomElementReaction::Upgrade(ref definition) => upgrade_element(definition.clone(), element), + CustomElementReaction::Upgrade(ref definition) => { + upgrade_element(definition.clone(), element) + }, CustomElementReaction::Callback(ref callback, ref arguments) => { // We're rooted, so it's safe to hand out a handle to objects in Heap - let arguments = arguments.iter().map(|arg| unsafe { HandleValue::from_raw(arg.handle()) }).collect(); + let arguments = arguments + .iter() + .map(|arg| unsafe { HandleValue::from_raw(arg.handle()) }) + .collect(); let _ = callback.Call_(&*element, arguments, ExceptionHandling::Report); - } + }, } } } @@ -675,7 +768,8 @@ impl CustomElementReactionStack { self.backup_queue.invoke_reactions(); // Step 4.2 - self.processing_backup_element_queue.set(BackupElementQueueFlag::NotProcessing); + self.processing_backup_element_queue + .set(BackupElementQueueFlag::NotProcessing); } /// @@ -693,7 +787,8 @@ impl CustomElementReactionStack { } // Step 1.3 - self.processing_backup_element_queue.set(BackupElementQueueFlag::Processing); + self.processing_backup_element_queue + .set(BackupElementQueueFlag::Processing); // Step 4 ScriptThread::enqueue_microtask(Microtask::CustomElementReaction); @@ -702,10 +797,12 @@ impl CustomElementReactionStack { /// #[allow(unsafe_code)] - pub fn enqueue_callback_reaction(&self, - element: &Element, - reaction: CallbackReaction, - definition: Option>) { + pub fn enqueue_callback_reaction( + &self, + element: &Element, + reaction: CallbackReaction, + definition: Option>, + ) { // Step 1 let definition = match definition.or_else(|| element.get_custom_element_definition()) { Some(definition) => definition, @@ -714,8 +811,13 @@ impl CustomElementReactionStack { // Step 2 let (callback, args) = match reaction { - CallbackReaction::Connected => (definition.callbacks.connected_callback.clone(), Vec::new()), - CallbackReaction::Disconnected => (definition.callbacks.disconnected_callback.clone(), Vec::new()), + CallbackReaction::Connected => { + (definition.callbacks.connected_callback.clone(), Vec::new()) + }, + CallbackReaction::Disconnected => ( + definition.callbacks.disconnected_callback.clone(), + Vec::new(), + ), CallbackReaction::Adopted(ref old_doc, ref new_doc) => { let args = vec![Heap::default(), Heap::default()]; args[0].set(ObjectValue(old_doc.reflector().get_jsobject().get())); @@ -724,7 +826,11 @@ impl CustomElementReactionStack { }, CallbackReaction::AttributeChanged(local_name, old_val, val, namespace) => { // Step 4 - if !definition.observed_attributes.iter().any(|attr| *attr == *local_name) { + if !definition + .observed_attributes + .iter() + .any(|attr| *attr == *local_name) + { return; } @@ -732,31 +838,47 @@ impl CustomElementReactionStack { let local_name = DOMString::from(&*local_name); rooted!(in(cx) let mut name_value = UndefinedValue()); - unsafe { local_name.to_jsval(cx, name_value.handle_mut()); } + unsafe { + local_name.to_jsval(cx, name_value.handle_mut()); + } rooted!(in(cx) let mut old_value = NullValue()); if let Some(old_val) = old_val { - unsafe { old_val.to_jsval(cx, old_value.handle_mut()); } + unsafe { + old_val.to_jsval(cx, old_value.handle_mut()); + } } rooted!(in(cx) let mut value = NullValue()); if let Some(val) = val { - unsafe { val.to_jsval(cx, value.handle_mut()); } + unsafe { + val.to_jsval(cx, value.handle_mut()); + } } rooted!(in(cx) let mut namespace_value = NullValue()); if namespace != ns!() { let namespace = DOMString::from(&*namespace); - unsafe { namespace.to_jsval(cx, namespace_value.handle_mut()); } + unsafe { + namespace.to_jsval(cx, namespace_value.handle_mut()); + } } - let args = vec![Heap::default(), Heap::default(), Heap::default(), Heap::default()]; + let args = vec![ + Heap::default(), + Heap::default(), + Heap::default(), + Heap::default(), + ]; args[0].set(name_value.get()); args[1].set(old_value.get()); args[2].set(value.get()); args[3].set(namespace_value.get()); - (definition.callbacks.attribute_changed_callback.clone(), args) + ( + definition.callbacks.attribute_changed_callback.clone(), + args, + ) }, }; @@ -774,7 +896,11 @@ impl CustomElementReactionStack { } /// - pub fn enqueue_upgrade_reaction(&self, element: &Element, definition: Rc) { + pub fn enqueue_upgrade_reaction( + &self, + element: &Element, + definition: Rc, + ) { // Step 1 element.push_upgrade_reaction(definition); // Step 2 @@ -806,7 +932,12 @@ impl ElementQueue { } fn next_element(&self) -> Option> { - self.queue.borrow_mut().pop_front().as_ref().map(Dom::deref).map(DomRoot::from_ref) + self.queue + .borrow_mut() + .pop_front() + .as_ref() + .map(Dom::deref) + .map(DomRoot::from_ref) } fn append_element(&self, element: &Element) { @@ -859,145 +990,148 @@ pub fn is_valid_custom_element_name(name: &str) -> bool { /// Check if this character is a PCENChar /// fn is_potential_custom_element_char(c: char) -> bool { - c == '-' || c == '.' || c == '_' || c == '\u{B7}' || - (c >= '0' && c <= '9') || - (c >= 'a' && c <= 'z') || - (c >= '\u{C0}' && c <= '\u{D6}') || - (c >= '\u{D8}' && c <= '\u{F6}') || - (c >= '\u{F8}' && c <= '\u{37D}') || - (c >= '\u{37F}' && c <= '\u{1FFF}') || - (c >= '\u{200C}' && c <= '\u{200D}') || - (c >= '\u{203F}' && c <= '\u{2040}') || - (c >= '\u{2070}' && c <= '\u{2FEF}') || - (c >= '\u{3001}' && c <= '\u{D7FF}') || - (c >= '\u{F900}' && c <= '\u{FDCF}') || - (c >= '\u{FDF0}' && c <= '\u{FFFD}') || - (c >= '\u{10000}' && c <= '\u{EFFFF}') + c == '-' || + c == '.' || + c == '_' || + c == '\u{B7}' || + (c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + (c >= '\u{C0}' && c <= '\u{D6}') || + (c >= '\u{D8}' && c <= '\u{F6}') || + (c >= '\u{F8}' && c <= '\u{37D}') || + (c >= '\u{37F}' && c <= '\u{1FFF}') || + (c >= '\u{200C}' && c <= '\u{200D}') || + (c >= '\u{203F}' && c <= '\u{2040}') || + (c >= '\u{2070}' && c <= '\u{2FEF}') || + (c >= '\u{3001}' && c <= '\u{D7FF}') || + (c >= '\u{F900}' && c <= '\u{FDCF}') || + (c >= '\u{FDF0}' && c <= '\u{FFFD}') || + (c >= '\u{10000}' && c <= '\u{EFFFF}') } fn is_extendable_element_interface(element: &str) -> bool { element == "a" || - element == "abbr" || - element == "acronym" || - element == "address" || - element == "area" || - element == "article" || - element == "aside" || - element == "audio" || - element == "b" || - element == "base" || - element == "bdi" || - element == "bdo" || - element == "big" || - element == "blockquote" || - element == "body" || - element == "br" || - element == "button" || - element == "canvas" || - element == "caption" || - element == "center" || - element == "cite" || - element == "code" || - element == "col" || - element == "colgroup" || - element == "data" || - element == "datalist" || - element == "dd" || - element == "del" || - element == "details" || - element == "dfn" || - element == "dialog" || - element == "dir" || - element == "div" || - element == "dl" || - element == "dt" || - element == "em" || - element == "embed" || - element == "fieldset" || - element == "figcaption" || - element == "figure" || - element == "font" || - element == "footer" || - element == "form" || - element == "frame" || - element == "frameset" || - element == "h1" || - element == "h2" || - element == "h3" || - element == "h4" || - element == "h5" || - element == "h6" || - element == "head" || - element == "header" || - element == "hgroup" || - element == "hr" || - element == "html" || - element == "i" || - element == "iframe" || - element == "img" || - element == "input" || - element == "ins" || - element == "kbd" || - element == "label" || - element == "legend" || - element == "li" || - element == "link" || - element == "listing" || - element == "main" || - element == "map" || - element == "mark" || - element == "marquee" || - element == "meta" || - element == "meter" || - element == "nav" || - element == "nobr" || - element == "noframes" || - element == "noscript" || - element == "object" || - element == "ol" || - element == "optgroup" || - element == "option" || - element == "output" || - element == "p" || - element == "param" || - element == "plaintext" || - element == "pre" || - element == "progress" || - element == "q" || - element == "rp" || - element == "rt" || - element == "ruby" || - element == "s" || - element == "samp" || - element == "script" || - element == "section" || - element == "select" || - element == "small" || - element == "source" || - element == "span" || - element == "strike" || - element == "strong" || - element == "style" || - element == "sub" || - element == "summary" || - element == "sup" || - element == "table" || - element == "tbody" || - element == "td" || - element == "template" || - element == "textarea" || - element == "tfoot" || - element == "th" || - element == "thead" || - element == "time" || - element == "title" || - element == "tr" || - element == "tt" || - element == "track" || - element == "u" || - element == "ul" || - element == "var" || - element == "video" || - element == "wbr" || - element == "xmp" + element == "abbr" || + element == "acronym" || + element == "address" || + element == "area" || + element == "article" || + element == "aside" || + element == "audio" || + element == "b" || + element == "base" || + element == "bdi" || + element == "bdo" || + element == "big" || + element == "blockquote" || + element == "body" || + element == "br" || + element == "button" || + element == "canvas" || + element == "caption" || + element == "center" || + element == "cite" || + element == "code" || + element == "col" || + element == "colgroup" || + element == "data" || + element == "datalist" || + element == "dd" || + element == "del" || + element == "details" || + element == "dfn" || + element == "dialog" || + element == "dir" || + element == "div" || + element == "dl" || + element == "dt" || + element == "em" || + element == "embed" || + element == "fieldset" || + element == "figcaption" || + element == "figure" || + element == "font" || + element == "footer" || + element == "form" || + element == "frame" || + element == "frameset" || + element == "h1" || + element == "h2" || + element == "h3" || + element == "h4" || + element == "h5" || + element == "h6" || + element == "head" || + element == "header" || + element == "hgroup" || + element == "hr" || + element == "html" || + element == "i" || + element == "iframe" || + element == "img" || + element == "input" || + element == "ins" || + element == "kbd" || + element == "label" || + element == "legend" || + element == "li" || + element == "link" || + element == "listing" || + element == "main" || + element == "map" || + element == "mark" || + element == "marquee" || + element == "meta" || + element == "meter" || + element == "nav" || + element == "nobr" || + element == "noframes" || + element == "noscript" || + element == "object" || + element == "ol" || + element == "optgroup" || + element == "option" || + element == "output" || + element == "p" || + element == "param" || + element == "plaintext" || + element == "pre" || + element == "progress" || + element == "q" || + element == "rp" || + element == "rt" || + element == "ruby" || + element == "s" || + element == "samp" || + element == "script" || + element == "section" || + element == "select" || + element == "small" || + element == "source" || + element == "span" || + element == "strike" || + element == "strong" || + element == "style" || + element == "sub" || + element == "summary" || + element == "sup" || + element == "table" || + element == "tbody" || + element == "td" || + element == "template" || + element == "textarea" || + element == "tfoot" || + element == "th" || + element == "thead" || + element == "time" || + element == "title" || + element == "tr" || + element == "tt" || + element == "track" || + element == "u" || + element == "ul" || + element == "var" || + element == "video" || + element == "wbr" || + element == "xmp" } diff --git a/components/script/dom/customevent.rs b/components/script/dom/customevent.rs index f932e1a96ae..b054d1a0dcb 100644 --- a/components/script/dom/customevent.rs +++ b/components/script/dom/customevent.rs @@ -36,38 +36,46 @@ impl CustomEvent { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(CustomEvent::new_inherited()), - global, - CustomEventBinding::Wrap) + reflect_dom_object( + Box::new(CustomEvent::new_inherited()), + global, + CustomEventBinding::Wrap, + ) } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: bool, - cancelable: bool, - detail: HandleValue) - -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + detail: HandleValue, + ) -> DomRoot { let ev = CustomEvent::new_uninitialized(global); ev.init_custom_event(type_, bubbles, cancelable, detail); ev } #[allow(unsafe_code)] - pub fn Constructor(global: &GlobalScope, - type_: DOMString, - init: RootedTraceableBox) - -> Fallible> { - Ok(CustomEvent::new(global, - Atom::from(type_), - init.parent.bubbles, - init.parent.cancelable, - init.detail.handle())) + pub fn Constructor( + global: &GlobalScope, + type_: DOMString, + init: RootedTraceableBox, + ) -> Fallible> { + Ok(CustomEvent::new( + global, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + init.detail.handle(), + )) } - fn init_custom_event(&self, - type_: Atom, - can_bubble: bool, - cancelable: bool, - detail: HandleValue) { + fn init_custom_event( + &self, + type_: Atom, + can_bubble: bool, + cancelable: bool, + detail: HandleValue, + ) { let event = self.upcast::(); if event.dispatching() { return; @@ -87,12 +95,14 @@ impl CustomEventMethods for CustomEvent { #[allow(unsafe_code)] // https://dom.spec.whatwg.org/#dom-customevent-initcustomevent - unsafe fn InitCustomEvent(&self, - _cx: *mut JSContext, - type_: DOMString, - can_bubble: bool, - cancelable: bool, - detail: HandleValue) { + unsafe fn InitCustomEvent( + &self, + _cx: *mut JSContext, + type_: DOMString, + can_bubble: bool, + cancelable: bool, + detail: HandleValue, + ) { self.init_custom_event(Atom::from(type_), can_bubble, cancelable, detail) } diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 791190e0fd2..dac95aeb4c5 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -57,9 +57,10 @@ pub struct AutoWorkerReset<'a> { } impl<'a> AutoWorkerReset<'a> { - fn new(workerscope: &'a DedicatedWorkerGlobalScope, - worker: TrustedWorkerAddress) - -> AutoWorkerReset<'a> { + fn new( + workerscope: &'a DedicatedWorkerGlobalScope, + worker: TrustedWorkerAddress, + ) -> AutoWorkerReset<'a> { AutoWorkerReset { workerscope: workerscope, old_worker: replace(&mut *workerscope.worker.borrow_mut(), Some(worker)), @@ -83,7 +84,7 @@ pub enum DedicatedWorkerScriptMsg { pub enum MixedMessage { FromWorker(DedicatedWorkerScriptMsg), FromScheduler((TrustedWorkerAddress, TimerEvent)), - FromDevtools(DevtoolScriptControlMsg) + FromDevtools(DevtoolScriptControlMsg), } impl QueuedTaskConversion for DedicatedWorkerScriptMsg { @@ -97,14 +98,18 @@ impl QueuedTaskConversion for DedicatedWorkerScriptMsg { _ => return None, }; match script_msg { - CommonScriptMsg::Task(_category, _boxed, _pipeline_id, source_name) => Some(&source_name), + CommonScriptMsg::Task(_category, _boxed, _pipeline_id, source_name) => { + Some(&source_name) + }, _ => return None, } } fn into_queued_task(self) -> Option { let (worker, common_worker_msg) = match self { - DedicatedWorkerScriptMsg::CommonWorker(worker, common_worker_msg) => (worker, common_worker_msg), + DedicatedWorkerScriptMsg::CommonWorker(worker, common_worker_msg) => { + (worker, common_worker_msg) + }, _ => return None, }; let script_msg = match common_worker_msg { @@ -112,8 +117,9 @@ impl QueuedTaskConversion for DedicatedWorkerScriptMsg { _ => return None, }; let (category, boxed, pipeline_id, task_source) = match script_msg { - CommonScriptMsg::Task(category, boxed, pipeline_id, task_source) => - (category, boxed, pipeline_id, task_source), + CommonScriptMsg::Task(category, boxed, pipeline_id, task_source) => { + (category, boxed, pipeline_id, task_source) + }, _ => return None, }; Some((Some(worker), category, boxed, pipeline_id, task_source)) @@ -121,12 +127,7 @@ impl QueuedTaskConversion for DedicatedWorkerScriptMsg { fn from_queued_task(queued_task: QueuedTask) -> Self { let (worker, category, boxed, pipeline_id, task_source) = queued_task; - let script_msg = CommonScriptMsg::Task( - category, - boxed, - pipeline_id, - task_source - ); + let script_msg = CommonScriptMsg::Task(category, boxed, pipeline_id, task_source); DedicatedWorkerScriptMsg::CommonWorker(worker.unwrap(), WorkerScriptMsg::Common(script_msg)) } @@ -197,24 +198,27 @@ impl WorkerEventLoopMethods for DedicatedWorkerGlobalScope { } impl DedicatedWorkerGlobalScope { - fn new_inherited(init: WorkerGlobalScopeInit, - worker_url: ServoUrl, - from_devtools_receiver: Receiver, - runtime: Runtime, - parent_sender: Box, - own_sender: Sender, - receiver: Receiver, - timer_event_chan: IpcSender, - timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>, - closing: Arc) - -> DedicatedWorkerGlobalScope { + fn new_inherited( + init: WorkerGlobalScopeInit, + worker_url: ServoUrl, + from_devtools_receiver: Receiver, + runtime: Runtime, + parent_sender: Box, + own_sender: Sender, + receiver: Receiver, + timer_event_chan: IpcSender, + timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>, + closing: Arc, + ) -> DedicatedWorkerGlobalScope { DedicatedWorkerGlobalScope { - workerglobalscope: WorkerGlobalScope::new_inherited(init, - worker_url, - runtime, - from_devtools_receiver, - timer_event_chan, - Some(closing)), + workerglobalscope: WorkerGlobalScope::new_inherited( + init, + worker_url, + runtime, + from_devtools_receiver, + timer_event_chan, + Some(closing), + ), task_queue: TaskQueue::new(receiver, own_sender.clone()), own_sender: own_sender, timer_event_port: timer_event_port, @@ -224,17 +228,18 @@ impl DedicatedWorkerGlobalScope { } #[allow(unsafe_code)] - pub fn new(init: WorkerGlobalScopeInit, - worker_url: ServoUrl, - from_devtools_receiver: Receiver, - runtime: Runtime, - parent_sender: Box, - own_sender: Sender, - receiver: Receiver, - timer_event_chan: IpcSender, - timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>, - closing: Arc) - -> DomRoot { + pub fn new( + init: WorkerGlobalScopeInit, + worker_url: ServoUrl, + from_devtools_receiver: Receiver, + runtime: Runtime, + parent_sender: Box, + own_sender: Sender, + receiver: Receiver, + timer_event_chan: IpcSender, + timer_event_port: Receiver<(TrustedWorkerAddress, TimerEvent)>, + closing: Arc, + ) -> DomRoot { let cx = runtime.cx(); let scope = Box::new(DedicatedWorkerGlobalScope::new_inherited( init, @@ -246,115 +251,147 @@ impl DedicatedWorkerGlobalScope { receiver, timer_event_chan, timer_event_port, - closing + closing, )); - unsafe { - DedicatedWorkerGlobalScopeBinding::Wrap(cx, scope) - } + unsafe { DedicatedWorkerGlobalScopeBinding::Wrap(cx, scope) } } #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#run-a-worker - pub fn run_worker_scope(init: WorkerGlobalScopeInit, - worker_url: ServoUrl, - from_devtools_receiver: IpcReceiver, - worker: TrustedWorkerAddress, - parent_sender: Box, - own_sender: Sender, - receiver: Receiver, - worker_load_origin: WorkerScriptLoadOrigin, - closing: Arc) { + pub fn run_worker_scope( + init: WorkerGlobalScopeInit, + worker_url: ServoUrl, + from_devtools_receiver: IpcReceiver, + worker: TrustedWorkerAddress, + parent_sender: Box, + own_sender: Sender, + receiver: Receiver, + worker_load_origin: WorkerScriptLoadOrigin, + closing: Arc, + ) { let serialized_worker_url = worker_url.to_string(); let name = format!("WebWorker for {}", serialized_worker_url); let top_level_browsing_context_id = TopLevelBrowsingContextId::installed(); - let origin = GlobalScope::current().expect("No current global object").origin().immutable().clone(); - - thread::Builder::new().name(name).spawn(move || { - thread_state::initialize(ThreadState::SCRIPT | ThreadState::IN_WORKER); + let origin = GlobalScope::current() + .expect("No current global object") + .origin() + .immutable() + .clone(); + + thread::Builder::new() + .name(name) + .spawn(move || { + thread_state::initialize(ThreadState::SCRIPT | ThreadState::IN_WORKER); + + if let Some(top_level_browsing_context_id) = top_level_browsing_context_id { + TopLevelBrowsingContextId::install(top_level_browsing_context_id); + } - if let Some(top_level_browsing_context_id) = top_level_browsing_context_id { - TopLevelBrowsingContextId::install(top_level_browsing_context_id); - } + let roots = RootCollection::new(); + let _stack_roots = ThreadLocalStackRoots::new(&roots); + + let WorkerScriptLoadOrigin { + referrer_url, + referrer_policy, + pipeline_id, + } = worker_load_origin; + + let request = RequestInit { + url: worker_url.clone(), + destination: Destination::Worker, + credentials_mode: CredentialsMode::Include, + use_url_credentials: true, + pipeline_id: pipeline_id, + referrer_url: referrer_url, + referrer_policy: referrer_policy, + origin, + ..RequestInit::default() + }; + + let (metadata, bytes) = + match load_whole_resource(request, &init.resource_threads.sender()) { + Err(_) => { + println!("error loading script {}", serialized_worker_url); + parent_sender + .send(CommonScriptMsg::Task( + WorkerEvent, + Box::new(SimpleWorkerErrorHandler::new(worker)), + pipeline_id, + TaskSourceName::DOMManipulation, + )).unwrap(); + return; + }, + Ok((metadata, bytes)) => (metadata, bytes), + }; + let url = metadata.final_url; + let source = String::from_utf8_lossy(&bytes); + + let runtime = unsafe { new_rt_and_cx() }; + + let (devtools_mpsc_chan, devtools_mpsc_port) = channel(); + route_ipc_receiver_to_new_servo_sender(from_devtools_receiver, devtools_mpsc_chan); + + let (timer_tx, timer_rx) = channel(); + let (timer_ipc_chan, timer_ipc_port) = ipc::channel().unwrap(); + let worker_for_route = worker.clone(); + ROUTER.add_route( + timer_ipc_port.to_opaque(), + Box::new(move |message| { + let event = message.to().unwrap(); + timer_tx.send((worker_for_route.clone(), event)).unwrap(); + }), + ); + + let global = DedicatedWorkerGlobalScope::new( + init, + url, + devtools_mpsc_port, + runtime, + parent_sender.clone(), + own_sender, + receiver, + timer_ipc_chan, + timer_rx, + closing, + ); + // FIXME(njn): workers currently don't have a unique ID suitable for using in reporter + // registration (#6631), so we instead use a random number and cross our fingers. + let scope = global.upcast::(); + + unsafe { + // Handle interrupt requests + JS_AddInterruptCallback(scope.get_cx(), Some(interrupt_callback)); + } - let roots = RootCollection::new(); - let _stack_roots = ThreadLocalStackRoots::new(&roots); - - let WorkerScriptLoadOrigin { referrer_url, referrer_policy, pipeline_id } = worker_load_origin; - - let request = RequestInit { - url: worker_url.clone(), - destination: Destination::Worker, - credentials_mode: CredentialsMode::Include, - use_url_credentials: true, - pipeline_id: pipeline_id, - referrer_url: referrer_url, - referrer_policy: referrer_policy, - origin, - .. RequestInit::default() - }; - - let (metadata, bytes) = match load_whole_resource(request, - &init.resource_threads.sender()) { - Err(_) => { - println!("error loading script {}", serialized_worker_url); - parent_sender.send(CommonScriptMsg::Task( - WorkerEvent, - Box::new(SimpleWorkerErrorHandler::new(worker)), - pipeline_id, - TaskSourceName::DOMManipulation, - )).unwrap(); + if scope.is_closing() { return; } - Ok((metadata, bytes)) => (metadata, bytes) - }; - let url = metadata.final_url; - let source = String::from_utf8_lossy(&bytes); - - let runtime = unsafe { new_rt_and_cx() }; - - let (devtools_mpsc_chan, devtools_mpsc_port) = channel(); - route_ipc_receiver_to_new_servo_sender(from_devtools_receiver, devtools_mpsc_chan); - - let (timer_tx, timer_rx) = channel(); - let (timer_ipc_chan, timer_ipc_port) = ipc::channel().unwrap(); - let worker_for_route = worker.clone(); - ROUTER.add_route(timer_ipc_port.to_opaque(), Box::new(move |message| { - let event = message.to().unwrap(); - timer_tx.send((worker_for_route.clone(), event)).unwrap(); - })); - - let global = DedicatedWorkerGlobalScope::new( - init, url, devtools_mpsc_port, runtime, - parent_sender.clone(), own_sender, receiver, - timer_ipc_chan, timer_rx, closing); - // FIXME(njn): workers currently don't have a unique ID suitable for using in reporter - // registration (#6631), so we instead use a random number and cross our fingers. - let scope = global.upcast::(); - - unsafe { - // Handle interrupt requests - JS_AddInterruptCallback(scope.get_cx(), Some(interrupt_callback)); - } - - if scope.is_closing() { - return; - } - { - let _ar = AutoWorkerReset::new(&global, worker.clone()); - scope.execute_script(DOMString::from(source)); - } - - let reporter_name = format!("dedicated-worker-reporter-{}", random::()); - scope.upcast::().mem_profiler_chan().run_with_memory_reporting(|| { - // Step 29, Run the responsible event loop specified by inside settings until it is destroyed. - // The worker processing model remains on this step until the event loop is destroyed, - // which happens after the closing flag is set to true. - while !scope.is_closing() { - run_worker_event_loop(&*global, Some(&worker)); + { + let _ar = AutoWorkerReset::new(&global, worker.clone()); + scope.execute_script(DOMString::from(source)); } - }, reporter_name, parent_sender, CommonScriptMsg::CollectReports); - }).expect("Thread spawning failed"); + + let reporter_name = format!("dedicated-worker-reporter-{}", random::()); + scope + .upcast::() + .mem_profiler_chan() + .run_with_memory_reporting( + || { + // Step 29, Run the responsible event loop specified + // by inside settings until it is destroyed. + // The worker processing model remains on this step + // until the event loop is destroyed, + // which happens after the closing flag is set to true. + while !scope.is_closing() { + run_worker_event_loop(&*global, Some(&worker)); + } + }, + reporter_name, + parent_sender, + CommonScriptMsg::CollectReports, + ); + }).expect("Thread spawning failed"); } pub fn script_chan(&self) -> Box { @@ -378,8 +415,8 @@ impl DedicatedWorkerGlobalScope { WorkerScriptMsg::DOMMessage(data) => { let scope = self.upcast::(); let target = self.upcast(); - let _ac = JSAutoCompartment::new(scope.get_cx(), - scope.reflector().get_jsobject().get()); + let _ac = + JSAutoCompartment::new(scope.get_cx(), scope.reflector().get_jsobject().get()); rooted!(in(scope.get_cx()) let mut message = UndefinedValue()); data.read(scope.upcast(), message.handle_mut()); MessageEvent::dispatch_jsval(target, scope.upcast(), message.handle(), None); @@ -392,33 +429,33 @@ impl DedicatedWorkerGlobalScope { fn handle_mixed_message(&self, msg: MixedMessage) { match msg { - MixedMessage::FromDevtools(msg) => { - match msg { - DevtoolScriptControlMsg::EvaluateJS(_pipe_id, string, sender) => - devtools::handle_evaluate_js(self.upcast(), string, sender), - DevtoolScriptControlMsg::GetCachedMessages(pipe_id, message_types, sender) => - devtools::handle_get_cached_messages(pipe_id, message_types, sender), - DevtoolScriptControlMsg::WantsLiveNotifications(_pipe_id, bool_val) => - devtools::handle_wants_live_notifications(self.upcast(), bool_val), - _ => debug!("got an unusable devtools control message inside the worker!"), - } + MixedMessage::FromDevtools(msg) => match msg { + DevtoolScriptControlMsg::EvaluateJS(_pipe_id, string, sender) => { + devtools::handle_evaluate_js(self.upcast(), string, sender) + }, + DevtoolScriptControlMsg::GetCachedMessages(pipe_id, message_types, sender) => { + devtools::handle_get_cached_messages(pipe_id, message_types, sender) + }, + DevtoolScriptControlMsg::WantsLiveNotifications(_pipe_id, bool_val) => { + devtools::handle_wants_live_notifications(self.upcast(), bool_val) + }, + _ => debug!("got an unusable devtools control message inside the worker!"), }, - MixedMessage::FromScheduler((linked_worker, timer_event)) => { - match timer_event { - TimerEvent(TimerSource::FromWorker, id) => { - let _ar = AutoWorkerReset::new(self, linked_worker); - let scope = self.upcast::(); - scope.handle_fire_timer(id); - }, - TimerEvent(_, _) => { - panic!("A worker received a TimerEvent from a window.") - } - } - } - MixedMessage::FromWorker(DedicatedWorkerScriptMsg::CommonWorker(linked_worker, msg)) => { + MixedMessage::FromScheduler((linked_worker, timer_event)) => match timer_event { + TimerEvent(TimerSource::FromWorker, id) => { + let _ar = AutoWorkerReset::new(self, linked_worker); + let scope = self.upcast::(); + scope.handle_fire_timer(id); + }, + TimerEvent(_, _) => panic!("A worker received a TimerEvent from a window."), + }, + MixedMessage::FromWorker(DedicatedWorkerScriptMsg::CommonWorker( + linked_worker, + msg, + )) => { let _ar = AutoWorkerReset::new(self, linked_worker); self.handle_script_event(msg); - } + }, MixedMessage::FromWorker(DedicatedWorkerScriptMsg::WakeUp) => {}, } } @@ -452,20 +489,20 @@ impl DedicatedWorkerGlobalScope { global.report_an_error(error_info, HandleValue::null()); } })); - self.parent_sender.send(CommonScriptMsg::Task( - WorkerEvent, - task, - Some(pipeline_id), - TaskSourceName::DOMManipulation, + self.parent_sender + .send(CommonScriptMsg::Task( + WorkerEvent, + task, + Some(pipeline_id), + TaskSourceName::DOMManipulation, )).unwrap(); } } #[allow(unsafe_code)] unsafe extern "C" fn interrupt_callback(cx: *mut JSContext) -> bool { - let worker = - DomRoot::downcast::(GlobalScope::from_context(cx)) - .expect("global is not a worker scope"); + let worker = DomRoot::downcast::(GlobalScope::from_context(cx)) + .expect("global is not a worker scope"); assert!(worker.is::()); // A false response causes the script to terminate @@ -483,12 +520,13 @@ impl DedicatedWorkerGlobalScopeMethods for DedicatedWorkerGlobalScope { Worker::handle_message(worker, data); })); // TODO: Change this task source to a new `unshipped-port-message-queue` task source - self.parent_sender.send(CommonScriptMsg::Task( - WorkerEvent, - task, - Some(pipeline_id), - TaskSourceName::DOMManipulation, - )).unwrap(); + self.parent_sender + .send(CommonScriptMsg::Task( + WorkerEvent, + task, + Some(pipeline_id), + TaskSourceName::DOMManipulation, + )).unwrap(); Ok(()) } diff --git a/components/script/dom/dissimilaroriginlocation.rs b/components/script/dom/dissimilaroriginlocation.rs index 5c98e20bf5e..0f8fe5bd394 100644 --- a/components/script/dom/dissimilaroriginlocation.rs +++ b/components/script/dom/dissimilaroriginlocation.rs @@ -40,9 +40,11 @@ impl DissimilarOriginLocation { } pub fn new(window: &DissimilarOriginWindow) -> DomRoot { - reflect_dom_object(Box::new(DissimilarOriginLocation::new_inherited(window)), - window, - DissimilarOriginLocationBinding::Wrap) + reflect_dom_object( + Box::new(DissimilarOriginLocation::new_inherited(window)), + window, + DissimilarOriginLocationBinding::Wrap, + ) } #[allow(dead_code)] diff --git a/components/script/dom/dissimilaroriginwindow.rs b/components/script/dom/dissimilaroriginwindow.rs index 68b4ca894cf..40897b2bf52 100644 --- a/components/script/dom/dissimilaroriginwindow.rs +++ b/components/script/dom/dissimilaroriginwindow.rs @@ -46,10 +46,7 @@ pub struct DissimilarOriginWindow { impl DissimilarOriginWindow { #[allow(unsafe_code)] - pub fn new( - global_to_clone_from: &GlobalScope, - window_proxy: &WindowProxy, - ) -> DomRoot { + pub fn new(global_to_clone_from: &GlobalScope, window_proxy: &WindowProxy) -> DomRoot { let cx = global_to_clone_from.get_cx(); // Any timer events fired on this window are ignored. let (timer_event_chan, _) = ipc::channel().unwrap(); @@ -142,7 +139,12 @@ impl DissimilarOriginWindowMethods for DissimilarOriginWindow { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-window-postmessage - unsafe fn PostMessage(&self, cx: *mut JSContext, message: HandleValue, origin: DOMString) -> ErrorResult { + unsafe fn PostMessage( + &self, + cx: *mut JSContext, + message: HandleValue, + origin: DOMString, + ) -> ErrorResult { // Step 3-5. let origin = match &origin[..] { "*" => None, @@ -153,7 +155,7 @@ impl DissimilarOriginWindowMethods for DissimilarOriginWindow { url => match ServoUrl::parse(&url) { Ok(url) => Some(url.origin()), Err(_) => return Err(Error::Syntax), - } + }, }; // Step 1-2, 6-8. @@ -190,7 +192,8 @@ impl DissimilarOriginWindowMethods for DissimilarOriginWindow { // https://html.spec.whatwg.org/multipage/#dom-location fn Location(&self) -> DomRoot { - self.location.or_init(|| DissimilarOriginLocation::new(self)) + self.location + .or_init(|| DissimilarOriginLocation::new(self)) } } @@ -200,9 +203,11 @@ impl DissimilarOriginWindow { None => return warn!("postMessage called with no incumbent global"), Some(incumbent) => incumbent, }; - let msg = ScriptMsg::PostMessage(self.window_proxy.browsing_context_id(), - origin, - data.move_to_arraybuffer()); + let msg = ScriptMsg::PostMessage( + self.window_proxy.browsing_context_id(), + origin, + data.move_to_arraybuffer(), + ); let _ = incumbent.script_to_constellation_chan().send(msg); } } diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index a463ec8c4e2..d68f085af83 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -417,7 +417,7 @@ struct LinksFilter; impl CollectionFilter for LinksFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { (elem.is::() || elem.is::()) && - elem.has_attribute(&local_name!("href")) + elem.has_attribute(&local_name!("href")) } } @@ -457,7 +457,9 @@ impl Document { } #[inline] - pub fn has_browsing_context(&self) -> bool { self.has_browsing_context } + pub fn has_browsing_context(&self) -> bool { + self.has_browsing_context + } /// #[inline] @@ -500,14 +502,17 @@ impl Document { if activity == DocumentActivity::FullyActive { self.title_changed(); self.dirty_all_nodes(); - self.window().reflow(ReflowGoal::Full, ReflowReason::CachedPageNeededReflow); + self.window() + .reflow(ReflowGoal::Full, ReflowReason::CachedPageNeededReflow); self.window().resume(); // html.spec.whatwg.org/multipage/#history-traversal // Step 4.6 if self.ready_state.get() == DocumentReadyState::Complete { let document = Trusted::new(self); - self.window.dom_manipulation_task_source().queue( - task!(fire_pageshow_event: move || { + self.window + .dom_manipulation_task_source() + .queue( + task!(fire_pageshow_event: move || { let document = document.root(); let window = document.window(); // Step 4.6.1 @@ -532,8 +537,8 @@ impl Document { &event, ); }), - self.window.upcast(), - ).unwrap(); + self.window.upcast(), + ).unwrap(); } } else { self.window().suspend(); @@ -580,11 +585,10 @@ impl Document { // FIXME: This should check the dirty bit on the document, // not the document element. Needs some layout changes to make // that workable. - self.stylesheets.borrow().has_changed() || - self.GetDocumentElement().map_or(false, |root| { + self.stylesheets.borrow().has_changed() || self.GetDocumentElement().map_or(false, |root| { root.upcast::().has_dirty_descendants() || - !self.pending_restyles.borrow().is_empty() || - self.needs_paint() + !self.pending_restyles.borrow().is_empty() || + self.needs_paint() }) } @@ -596,10 +600,15 @@ impl Document { /// Refresh the cached first base element in the DOM. /// pub fn refresh_base_element(&self) { - let base = self.upcast::() - .traverse_preorder() - .filter_map(DomRoot::downcast::) - .find(|element| element.upcast::().has_attribute(&local_name!("href"))); + let base = self + .upcast::() + .traverse_preorder() + .filter_map(DomRoot::downcast::) + .find(|element| { + element + .upcast::() + .has_attribute(&local_name!("href")) + }); self.base_element.set(base.r()); } @@ -627,7 +636,10 @@ impl Document { self.quirks_mode.set(mode); if mode == QuirksMode::Quirks { - self.window.layout_chan().send(Msg::SetQuirksMode(mode)).unwrap(); + self.window + .layout_chan() + .send(Msg::SetQuirksMode(mode)) + .unwrap(); } } @@ -657,7 +669,8 @@ impl Document { } self.reflow_timeout.set(None); - self.window.reflow(ReflowGoal::Full, ReflowReason::RefreshTick); + self.window + .reflow(ReflowGoal::Full, ReflowReason::RefreshTick); } } @@ -675,10 +688,10 @@ impl Document { /// Remove any existing association between the provided id and any elements in this document. pub fn unregister_named_element(&self, to_unregister: &Element, id: Atom) { - debug!("Removing named element from document {:p}: {:p} id={}", - self, - to_unregister, - id); + debug!( + "Removing named element from document {:p}: {:p} id={}", + self, to_unregister, id + ); // Limit the scope of the borrow because id_map might be borrowed again by // GetElementById through the following sequence of calls // reset_form_owner_for_listeners -> reset_form_owner -> GetElementById @@ -687,12 +700,13 @@ impl Document { let is_empty = match id_map.get_mut(&id) { None => false, Some(elements) => { - let position = elements.iter() - .position(|element| &**element == to_unregister) - .expect("This element should be in registered."); + let position = elements + .iter() + .position(|element| &**element == to_unregister) + .expect("This element should be in registered."); elements.remove(position); elements.is_empty() - } + }, }; if is_empty { id_map.remove(&id); @@ -703,16 +717,17 @@ impl Document { /// Associate an element present in this document with the provided id. pub fn register_named_element(&self, element: &Element, id: Atom) { - debug!("Adding named element to document {:p}: {:p} id={}", - self, - element, - id); + debug!( + "Adding named element to document {:p}: {:p} id={}", + self, element, id + ); assert!(element.upcast::().is_in_doc()); assert!(!id.is_empty()); - let root = self.GetDocumentElement() - .expect("The element is in the document, so there must be a document \ - element."); + let root = self.GetDocumentElement().expect( + "The element is in the document, so there must be a document \ + element.", + ); // Limit the scope of the borrow because id_map might be borrowed again by // GetElementById through the following sequence of calls @@ -732,10 +747,16 @@ impl Document { set.insert(Dom::from_ref(listener)); } - pub fn unregister_form_id_listener(&self, id: DOMString, listener: &T) { + pub fn unregister_form_id_listener( + &self, + id: DOMString, + listener: &T, + ) { let mut map = self.form_id_listener_map.borrow_mut(); if let Occupied(mut entry) = map.entry(Atom::from(id)) { - entry.get_mut().remove(&Dom::from_ref(listener.to_element())); + entry + .get_mut() + .remove(&Dom::from_ref(listener.to_element())); if entry.get().is_empty() { entry.remove(); } @@ -765,37 +786,46 @@ impl Document { // Step 1 self.set_target_element(target.r()); - let point = target.r().map(|element| { - // FIXME(#8275, pcwalton): This is pretty bogus when multiple layers are involved. - // Really what needs to happen is that this needs to go through layout to ask which - // layer the element belongs to, and have it send the scroll message to the - // compositor. - let rect = element.upcast::().bounding_content_box_or_zero(); - - // In order to align with element edges, we snap to unscaled pixel boundaries, since - // the paint thread currently does the same for drawing elements. This is important - // for pages that require pixel perfect scroll positioning for proper display - // (like Acid2). Since we don't have the device pixel ratio here, this might not be - // accurate, but should work as long as the ratio is a whole number. Once #8275 is - // fixed this should actually take into account the real device pixel ratio. - (rect.origin.x.to_nearest_px() as f32, rect.origin.y.to_nearest_px() as f32) - }).or_else(|| if fragment.is_empty() || fragment.eq_ignore_ascii_case("top") { - // FIXME(stshine): this should be the origin of the stacking context space, - // which may differ under the influence of writing mode. - Some((0.0, 0.0)) - } else { - None - }); + let point = target + .r() + .map(|element| { + // FIXME(#8275, pcwalton): This is pretty bogus when multiple layers are involved. + // Really what needs to happen is that this needs to go through layout to ask which + // layer the element belongs to, and have it send the scroll message to the + // compositor. + let rect = element.upcast::().bounding_content_box_or_zero(); + + // In order to align with element edges, we snap to unscaled pixel boundaries, since + // the paint thread currently does the same for drawing elements. This is important + // for pages that require pixel perfect scroll positioning for proper display + // (like Acid2). Since we don't have the device pixel ratio here, this might not be + // accurate, but should work as long as the ratio is a whole number. Once #8275 is + // fixed this should actually take into account the real device pixel ratio. + ( + rect.origin.x.to_nearest_px() as f32, + rect.origin.y.to_nearest_px() as f32, + ) + }).or_else(|| { + if fragment.is_empty() || fragment.eq_ignore_ascii_case("top") { + // FIXME(stshine): this should be the origin of the stacking context space, + // which may differ under the influence of writing mode. + Some((0.0, 0.0)) + } else { + None + } + }); if let Some((x, y)) = point { // Step 3 let global_scope = self.window.upcast::(); self.window.update_viewport_for_scroll(x, y); - self.window.perform_a_scroll(x, - y, - global_scope.pipeline_id().root_scroll_id(), - ScrollBehavior::Instant, - target.r()); + self.window.perform_a_scroll( + x, + y, + global_scope.pipeline_id().root_scroll_id(), + ScrollBehavior::Instant, + target.r(), + ); } } @@ -806,10 +836,11 @@ impl Document { .map_or(false, |attr| &**attr.value() == name) }; let doc_node = self.upcast::(); - doc_node.traverse_preorder() - .filter_map(DomRoot::downcast) - .find(|node| check_anchor(&node)) - .map(DomRoot::upcast) + doc_node + .traverse_preorder() + .filter_map(DomRoot::downcast) + .find(|node| check_anchor(&node)) + .map(DomRoot::upcast) } // https://html.spec.whatwg.org/multipage/#current-document-readiness @@ -826,7 +857,8 @@ impl Document { self.ready_state.set(state); - self.upcast::().fire_event(atom!("readystatechange")); + self.upcast::() + .fire_event(atom!("readystatechange")); } /// Return whether scripting is enabled or not @@ -857,7 +889,7 @@ impl Document { /// transaction, or none if no elements requested it. pub fn commit_focus_transaction(&self, focus_type: FocusType) { if self.focused == self.possibly_focused.get().r() { - return + return; } if let Some(ref elem) = self.focused.get() { let node = elem.upcast::(); @@ -927,7 +959,7 @@ impl Document { client_point: Point2D, mouse_event_type: MouseEventType, node_address: Option, - point_in_node: Option> + point_in_node: Option>, ) { let mouse_event_type_string = match mouse_event_type { MouseEventType::Click => "click".to_owned(), @@ -1012,7 +1044,8 @@ impl Document { self.maybe_fire_dblclick(client_point, node); } - self.window.reflow(ReflowGoal::Full, ReflowReason::MouseEvent); + self.window + .reflow(ReflowGoal::Full, ReflowReason::MouseEvent); } fn maybe_fire_dblclick(&self, click_pos: Point2D, target: &Node) { @@ -1022,16 +1055,24 @@ impl Document { let opt = self.last_click_info.borrow_mut().take(); if let Some((last_time, last_pos)) = opt { - let DBL_CLICK_TIMEOUT = Duration::from_millis(PREFS.get("dom.document.dblclick_timeout").as_u64() - .unwrap_or(300)); - let DBL_CLICK_DIST_THRESHOLD = PREFS.get("dom.document.dblclick_dist").as_u64().unwrap_or(1); + let DBL_CLICK_TIMEOUT = Duration::from_millis( + PREFS + .get("dom.document.dblclick_timeout") + .as_u64() + .unwrap_or(300), + ); + let DBL_CLICK_DIST_THRESHOLD = PREFS + .get("dom.document.dblclick_dist") + .as_u64() + .unwrap_or(1); // Calculate distance between this click and the previous click. let line = click_pos - last_pos; let dist = (line.dot(line) as f64).sqrt(); if now.duration_since(last_time) < DBL_CLICK_TIMEOUT && - dist < DBL_CLICK_DIST_THRESHOLD as f64 { + dist < DBL_CLICK_DIST_THRESHOLD as f64 + { // A double click has occurred if this click is within a certain time and dist. of previous click. let click_count = 2; let client_x = click_pos.x as i32; @@ -1054,7 +1095,7 @@ impl Document { false, 0i16, None, - None + None, ); event.upcast::().fire(target.upcast()); @@ -1068,7 +1109,12 @@ impl Document { *self.last_click_info.borrow_mut() = Some((now, click_pos)); } - pub fn fire_mouse_event(&self, client_point: Point2D, target: &EventTarget, event_name: FireMouseEventType) { + pub fn fire_mouse_event( + &self, + client_point: Point2D, + target: &EventTarget, + event_name: FireMouseEventType, + ) { let client_x = client_point.x.to_i32().unwrap_or(0); let client_y = client_point.y.to_i32().unwrap_or(0); @@ -1089,7 +1135,7 @@ impl Document { false, 0i16, None, - None + None, ); let event = mouse_event.upcast::(); event.fire(target); @@ -1101,7 +1147,7 @@ impl Document { js_runtime: *mut JSRuntime, client_point: Option>, prev_mouse_over_target: &MutNullableDom, - node_address: Option + node_address: Option, ) { let client_point = match client_point { None => { @@ -1109,7 +1155,7 @@ impl Document { // FIXME: dispatch mouseout here. We have no point. prev_mouse_over_target.set(None); return; - } + }, Some(client_point) => client_point, }; @@ -1135,11 +1181,13 @@ impl Document { return; } - let old_target_is_ancestor_of_new_target = match (prev_mouse_over_target.get(), maybe_new_target.as_ref()) { - (Some(old_target), Some(new_target)) - => old_target.upcast::().is_ancestor_of(new_target.upcast::()), - _ => false, - }; + let old_target_is_ancestor_of_new_target = + match (prev_mouse_over_target.get(), maybe_new_target.as_ref()) { + (Some(old_target), Some(new_target)) => old_target + .upcast::() + .is_ancestor_of(new_target.upcast::()), + _ => false, + }; // Here we know the target has changed, so we must update the state, // dispatch mouseout to the previous one, mouseover to the new one, @@ -1147,9 +1195,11 @@ impl Document { // If the old target is an ancestor of the new target, this can be skipped // completely, since the node's hover state will be reseted below. if !old_target_is_ancestor_of_new_target { - for element in old_target.upcast::() - .inclusive_ancestors() - .filter_map(DomRoot::downcast::) { + for element in old_target + .upcast::() + .inclusive_ancestors() + .filter_map(DomRoot::downcast::) + { element.set_hover_state(false); element.set_active_state(false); } @@ -1163,9 +1213,11 @@ impl Document { } if let Some(ref new_target) = maybe_new_target { - for element in new_target.upcast::() - .inclusive_ancestors() - .filter_map(DomRoot::downcast::) { + for element in new_target + .upcast::() + .inclusive_ancestors() + .filter_map(DomRoot::downcast::) + { if element.hover_state() { break; } @@ -1181,7 +1233,8 @@ impl Document { // Store the current mouse over target for next frame. prev_mouse_over_target.set(maybe_new_target.r()); - self.window.reflow(ReflowGoal::Full, ReflowReason::MouseEvent); + self.window + .reflow(ReflowGoal::Full, ReflowReason::MouseEvent); } #[allow(unsafe_code)] @@ -1191,7 +1244,7 @@ impl Document { event_type: TouchEventType, touch_id: TouchId, point: Point2D, - node_address: Option + node_address: Option, ) -> TouchEventResult { let TouchId(identifier) = touch_id; @@ -1221,40 +1274,43 @@ impl Document { let page_x = Finite::wrap(point.x as f64 + window.PageXOffset() as f64); let page_y = Finite::wrap(point.y as f64 + window.PageYOffset() as f64); - let touch = Touch::new(window, - identifier, - &target, - client_x, - client_y, // TODO: Get real screen coordinates? - client_x, - client_y, - page_x, - page_y); + let touch = Touch::new( + window, identifier, &target, client_x, + client_y, // TODO: Get real screen coordinates? + client_x, client_y, page_x, page_y, + ); match event_type { TouchEventType::Down => { // Add a new touch point - self.active_touch_points.borrow_mut().push(Dom::from_ref(&*touch)); - } + self.active_touch_points + .borrow_mut() + .push(Dom::from_ref(&*touch)); + }, TouchEventType::Move => { // Replace an existing touch point let mut active_touch_points = self.active_touch_points.borrow_mut(); - match active_touch_points.iter_mut().find(|t| t.Identifier() == identifier) { + match active_touch_points + .iter_mut() + .find(|t| t.Identifier() == identifier) + { Some(t) => *t = Dom::from_ref(&*touch), None => warn!("Got a touchmove event for a non-active touch point"), } - } - TouchEventType::Up | - TouchEventType::Cancel => { + }, + TouchEventType::Up | TouchEventType::Cancel => { // Remove an existing touch point let mut active_touch_points = self.active_touch_points.borrow_mut(); - match active_touch_points.iter().position(|t| t.Identifier() == identifier) { + match active_touch_points + .iter() + .position(|t| t.Identifier() == identifier) + { Some(i) => { active_touch_points.swap_remove(i); - } + }, None => warn!("Got a touchend event for a non-active touch point"), } - } + }, } rooted_vec!(let mut target_touches); @@ -1292,11 +1348,13 @@ impl Document { } /// The entry point for all key processing for web content - pub fn dispatch_key_event(&self, - ch: Option, - key: Key, - state: KeyState, - modifiers: KeyModifiers) { + pub fn dispatch_key_event( + &self, + ch: Option, + key: Key, + state: KeyState, + modifiers: KeyModifiers, + ) { let focused = self.get_focused_element(); let body = self.GetBody(); @@ -1313,59 +1371,67 @@ impl Document { let is_composing = false; let is_repeating = state == KeyState::Repeated; - let ev_type = DOMString::from(match state { - KeyState::Pressed | KeyState::Repeated => "keydown", - KeyState::Released => "keyup", - } - .to_owned()); + let ev_type = DOMString::from( + match state { + KeyState::Pressed | KeyState::Repeated => "keydown", + KeyState::Released => "keyup", + }.to_owned(), + ); let props = KeyboardEvent::key_properties(ch, key, modifiers); - let keyevent = KeyboardEvent::new(&self.window, - ev_type, - true, - true, - Some(&self.window), - 0, - ch, - Some(key), - DOMString::from(props.key_string.clone()), - DOMString::from(props.code), - props.location, - is_repeating, - is_composing, - ctrl, - alt, - shift, - meta, - None, - props.key_code); + let keyevent = KeyboardEvent::new( + &self.window, + ev_type, + true, + true, + Some(&self.window), + 0, + ch, + Some(key), + DOMString::from(props.key_string.clone()), + DOMString::from(props.code), + props.location, + is_repeating, + is_composing, + ctrl, + alt, + shift, + meta, + None, + props.key_code, + ); let event = keyevent.upcast::(); event.fire(target); let mut cancel_state = event.get_cancel_state(); // https://w3c.github.io/uievents/#keys-cancelable-keys - if state != KeyState::Released && props.is_printable() && cancel_state != EventDefault::Prevented { + if state != KeyState::Released && + props.is_printable() && + cancel_state != EventDefault::Prevented + { // https://w3c.github.io/uievents/#keypress-event-order - let event = KeyboardEvent::new(&self.window, - DOMString::from("keypress"), - true, - true, - Some(&self.window), - 0, - ch, - Some(key), - DOMString::from(props.key_string), - DOMString::from(props.code), - props.location, - is_repeating, - is_composing, - ctrl, - alt, - shift, - meta, - props.char_code, - 0); + let event = KeyboardEvent::new( + &self.window, + DOMString::from("keypress"), + true, + true, + Some(&self.window), + 0, + ch, + Some(key), + DOMString::from(props.key_string), + DOMString::from(props.code), + props.location, + is_repeating, + is_composing, + ctrl, + alt, + shift, + meta, + props.char_code, + 0, + ); let ev = event.upcast::(); ev.fire(target); cancel_state = ev.get_cancel_state(); @@ -1384,14 +1450,16 @@ impl Document { Key::Space if state == KeyState::Released => { let maybe_elem = target.downcast::(); if let Some(el) = maybe_elem { - synthetic_click_activation(el, - false, - false, - false, - false, - ActivationSource::NotFromClick) + synthetic_click_activation( + el, + false, + false, + false, + false, + ActivationSource::NotFromClick, + ) } - } + }, Key::Enter if state == KeyState::Released => { let maybe_elem = target.downcast::(); if let Some(el) = maybe_elem { @@ -1399,7 +1467,7 @@ impl Document { a.implicit_submission(ctrl, alt, shift, meta); } } - } + }, _ => (), } } @@ -1408,9 +1476,10 @@ impl Document { } // https://dom.spec.whatwg.org/#converting-nodes-into-a-node - pub fn node_from_nodes_and_strings(&self, - mut nodes: Vec) - -> Fallible> { + pub fn node_from_nodes_and_strings( + &self, + mut nodes: Vec, + ) -> Fallible> { if nodes.len() == 1 { Ok(match nodes.pop().unwrap() { NodeOrString::Node(node) => node, @@ -1428,7 +1497,7 @@ impl Document { // No try!() here because appending a text node // should not fail. fragment.AppendChild(&node).unwrap(); - } + }, } } Ok(fragment) @@ -1436,16 +1505,20 @@ impl Document { } pub fn get_body_attribute(&self, local_name: &LocalName) -> DOMString { - match self.GetBody().and_then(DomRoot::downcast::) { - Some(ref body) => { - body.upcast::().get_string_attribute(local_name) - }, + match self + .GetBody() + .and_then(DomRoot::downcast::) + { + Some(ref body) => body.upcast::().get_string_attribute(local_name), None => DOMString::new(), } } pub fn set_body_attribute(&self, local_name: &LocalName, value: DOMString) { - if let Some(ref body) = self.GetBody().and_then(DomRoot::downcast::) { + if let Some(ref body) = self + .GetBody() + .and_then(DomRoot::downcast::) + { let body = body.upcast::(); let value = body.parse_attribute(&ns!(), &local_name, value); body.set_attribute(local_name, value); @@ -1487,7 +1560,9 @@ impl Document { let ident = self.animation_frame_ident.get() + 1; self.animation_frame_ident.set(ident); - self.animation_frame_list.borrow_mut().push((ident, Some(callback))); + self.animation_frame_list + .borrow_mut() + .push((ident, Some(callback))); // TODO: Should tick animation only when document is visible @@ -1497,9 +1572,10 @@ impl Document { let callback = FakeRequestAnimationFrameCallback { document: Trusted::new(self), }; - self.global() - .schedule_callback(OneshotTimerCallback::FakeRequestAnimationFrame(callback), - MsDuration::new(FAKE_REQUEST_ANIMATION_FRAME_DELAY)); + self.global().schedule_callback( + OneshotTimerCallback::FakeRequestAnimationFrame(callback), + MsDuration::new(FAKE_REQUEST_ANIMATION_FRAME_DELAY), + ); } else if !self.running_animation_callbacks.get() { // No need to send a `ChangeRunningAnimationsState` if we're running animation callbacks: // we're guaranteed to already be in the "animation callbacks present" state. @@ -1507,7 +1583,8 @@ impl Document { // This reduces CPU usage by avoiding needless thread wakeups in the common case of // repeated rAF. - let event = ScriptMsg::ChangeRunningAnimationsState(AnimationState::AnimationCallbacksPresent); + let event = + ScriptMsg::ChangeRunningAnimationsState(AnimationState::AnimationCallbacksPresent); self.window().send_to_constellation(event); } @@ -1527,7 +1604,8 @@ impl Document { rooted_vec!(let mut animation_frame_list); mem::swap( &mut *animation_frame_list, - &mut *self.animation_frame_list.borrow_mut()); + &mut *self.animation_frame_list.borrow_mut(), + ); self.running_animation_callbacks.set(true); let was_faking_animation_frames = self.is_faking_animation_frames(); @@ -1541,7 +1619,9 @@ impl Document { self.running_animation_callbacks.set(false); - let spurious = !self.window.reflow(ReflowGoal::Full, ReflowReason::RequestAnimationFrame); + let spurious = !self + .window + .reflow(ReflowGoal::Full, ReflowReason::RequestAnimationFrame); if spurious && !was_faking_animation_frames { // If the rAF callbacks did not mutate the DOM, then the @@ -1554,7 +1634,8 @@ impl Document { // for the interim frames where we are deciding whether this rAF // is considered spurious, we need to ensure that the layout // and compositor *do* tick the animation. - self.window.force_reflow(ReflowGoal::Full, ReflowReason::RequestAnimationFrame); + self.window + .force_reflow(ReflowGoal::Full, ReflowReason::RequestAnimationFrame); } // Only send the animation change state message after running any callbacks. @@ -1578,23 +1659,29 @@ impl Document { &mut *animation_frame_list, ); } - let event = ScriptMsg::ChangeRunningAnimationsState(AnimationState::NoAnimationCallbacksPresent); + let event = ScriptMsg::ChangeRunningAnimationsState( + AnimationState::NoAnimationCallbacksPresent, + ); self.window().send_to_constellation(event); } // Update the counter of spurious animation frames. if spurious { if self.spurious_animation_frames.get() < SPURIOUS_ANIMATION_FRAME_THRESHOLD { - self.spurious_animation_frames.set(self.spurious_animation_frames.get() + 1) + self.spurious_animation_frames + .set(self.spurious_animation_frames.get() + 1) } } else { self.spurious_animation_frames.set(0) } } - pub fn fetch_async(&self, load: LoadType, - request: RequestInit, - fetch_target: IpcSender) { + pub fn fetch_async( + &self, + load: LoadType, + request: RequestInit, + fetch_target: IpcSender, + ) { let mut loader = self.loader.borrow_mut(); loader.fetch_async(load, request, fetch_target); } @@ -1620,7 +1707,8 @@ impl Document { // Disarm the reflow timer and trigger the initial reflow. self.reflow_timeout.set(None); self.upcast::().dirty(NodeDamage::OtherNodeDamage); - self.window.reflow(ReflowGoal::Full, ReflowReason::FirstLoad); + self.window + .reflow(ReflowGoal::Full, ReflowReason::FirstLoad); } // Deferred scripts have to wait for page to finish loading, @@ -1660,18 +1748,17 @@ impl Document { self.incr_ignore_opens_during_unload_counter(); //Step 3-5. let document = Trusted::new(self); - let beforeunload_event = BeforeUnloadEvent::new(&self.window, - atom!("beforeunload"), - EventBubbles::Bubbles, - EventCancelable::Cancelable); + let beforeunload_event = BeforeUnloadEvent::new( + &self.window, + atom!("beforeunload"), + EventBubbles::Bubbles, + EventCancelable::Cancelable, + ); let event = beforeunload_event.upcast::(); event.set_trusted(true); let event_target = self.window.upcast::(); let has_listeners = event.has_listeners_for(&event_target, &atom!("beforeunload")); - event_target.dispatch_event_with_target( - document.root().upcast(), - &event, - ); + event_target.dispatch_event_with_target(document.root().upcast(), &event); // TODO: Step 6, decrease the event loop's termination nesting level by 1. // Step 7 if has_listeners { @@ -1680,7 +1767,11 @@ impl Document { let mut can_unload = true; // TODO: Step 8, also check sandboxing modals flag. let default_prevented = event.DefaultPrevented(); - let return_value_not_empty = !event.downcast::().unwrap().ReturnValue().is_empty(); + let return_value_not_empty = !event + .downcast::() + .unwrap() + .ReturnValue() + .is_empty(); if default_prevented || return_value_not_empty { let (chan, port) = ipc::channel().expect("Failed to create IPC channel!"); let msg = EmbedderMsg::AllowUnload(chan); @@ -1694,7 +1785,7 @@ impl Document { let document = document_from_node(&*iframe); can_unload = document.prompt_to_unload(true); if !document.salvageable() { - self.salvageable.set(false); + self.salvageable.set(false); } if !can_unload { break; @@ -1718,16 +1809,16 @@ impl Document { let event = PageTransitionEvent::new( &self.window, atom!("pagehide"), - false, // bubbles - false, // cancelable + false, // bubbles + false, // cancelable self.salvageable.get(), // persisted ); let event = event.upcast::(); event.set_trusted(true); - let _ = self.window.upcast::().dispatch_event_with_target( - document.root().upcast(), - &event, - ); + let _ = self + .window + .upcast::() + .dispatch_event_with_target(document.root().upcast(), &event); // TODO Step 6, document visibility steps. } // Step 7 @@ -1741,10 +1832,7 @@ impl Document { event.set_trusted(true); let event_target = self.window.upcast::(); let has_listeners = event.has_listeners_for(&event_target, &atom!("unload")); - let _ = event_target.dispatch_event_with_target( - document.root().upcast(), - &event, - ); + let _ = event_target.dispatch_event_with_target(document.root().upcast(), &event); self.fired_unload.set(true); // Step 9 if has_listeners { @@ -1791,8 +1879,10 @@ impl Document { // Step 7. debug!("Document loads are complete."); let document = Trusted::new(self); - self.window.dom_manipulation_task_source().queue( - task!(fire_load_event: move || { + self.window + .dom_manipulation_task_source() + .queue( + task!(fire_load_event: move || { let document = document.root(); let window = document.window(); if !window.is_alive() { @@ -1835,14 +1925,16 @@ impl Document { document.check_and_scroll_fragment(fragment); } }), - self.window.upcast(), - ).unwrap(); + self.window.upcast(), + ).unwrap(); // Step 8. let document = Trusted::new(self); if document.root().browsing_context().is_some() { - self.window.dom_manipulation_task_source().queue( - task!(fire_pageshow_event: move || { + self.window + .dom_manipulation_task_source() + .queue( + task!(fire_pageshow_event: move || { let document = document.root(); let window = document.window(); if document.page_showing.get() || !window.is_alive() { @@ -1867,8 +1959,8 @@ impl Document { &event, ); }), - self.window.upcast(), - ).unwrap(); + self.window.upcast(), + ).unwrap(); } // Step 9. @@ -1885,11 +1977,14 @@ impl Document { } // https://html.spec.whatwg.org/multipage/#pending-parsing-blocking-script - pub fn set_pending_parsing_blocking_script(&self, - script: &HTMLScriptElement, - load: Option) { + pub fn set_pending_parsing_blocking_script( + &self, + script: &HTMLScriptElement, + load: Option, + ) { assert!(!self.has_pending_parsing_blocking_script()); - *self.pending_parsing_blocking_script.borrow_mut() = Some(PendingScript::new_with_load(script, load)); + *self.pending_parsing_blocking_script.borrow_mut() = + Some(PendingScript::new_with_load(script, load)); } // https://html.spec.whatwg.org/multipage/#pending-parsing-blocking-script @@ -1898,7 +1993,11 @@ impl Document { } /// https://html.spec.whatwg.org/multipage/#prepare-a-script step 22.d. - pub fn pending_parsing_blocking_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) { + pub fn pending_parsing_blocking_script_loaded( + &self, + element: &HTMLScriptElement, + result: ScriptResult, + ) { { let mut blocking_script = self.pending_parsing_blocking_script.borrow_mut(); let entry = blocking_script.as_mut().unwrap(); @@ -1912,19 +2011,24 @@ impl Document { if self.script_blocking_stylesheets_count.get() > 0 { return; } - let pair = self.pending_parsing_blocking_script + let pair = self + .pending_parsing_blocking_script .borrow_mut() .as_mut() .and_then(PendingScript::take_result); if let Some((element, result)) = pair { *self.pending_parsing_blocking_script.borrow_mut() = None; - self.get_current_parser().unwrap().resume_with_pending_parsing_blocking_script(&element, result); + self.get_current_parser() + .unwrap() + .resume_with_pending_parsing_blocking_script(&element, result); } } // https://html.spec.whatwg.org/multipage/#set-of-scripts-that-will-execute-as-soon-as-possible pub fn add_asap_script(&self, script: &HTMLScriptElement) { - self.asap_scripts_set.borrow_mut().push(Dom::from_ref(script)); + self.asap_scripts_set + .borrow_mut() + .push(Dom::from_ref(script)); } /// https://html.spec.whatwg.org/multipage/#the-end step 5. @@ -1932,7 +2036,10 @@ impl Document { pub fn asap_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) { { let mut scripts = self.asap_scripts_set.borrow_mut(); - let idx = scripts.iter().position(|entry| &**entry == element).unwrap(); + let idx = scripts + .iter() + .position(|entry| &**entry == element) + .unwrap(); scripts.swap_remove(idx); } element.execute(result); @@ -1945,11 +2052,12 @@ impl Document { /// https://html.spec.whatwg.org/multipage/#the-end step 5. /// https://html.spec.whatwg.org/multipage/#prepare-a-script step 22.c. - pub fn asap_in_order_script_loaded(&self, - element: &HTMLScriptElement, - result: ScriptResult) { + pub fn asap_in_order_script_loaded(&self, element: &HTMLScriptElement, result: ScriptResult) { self.asap_in_order_scripts_list.loaded(element, result); - while let Some((element, result)) = self.asap_in_order_scripts_list.take_next_ready_to_be_executed() { + while let Some((element, result)) = self + .asap_in_order_scripts_list + .take_next_ready_to_be_executed() + { element.execute(result); } } @@ -1976,7 +2084,8 @@ impl Document { if self.script_blocking_stylesheets_count.get() > 0 { return; } - if let Some((element, result)) = self.deferred_scripts.take_next_ready_to_be_executed() { + if let Some((element, result)) = self.deferred_scripts.take_next_ready_to_be_executed() + { element.execute(result); } else { break; @@ -1994,21 +2103,31 @@ impl Document { return; } self.domcontentloaded_dispatched.set(true); - assert_ne!(self.ReadyState(), DocumentReadyState::Complete, - "Complete before DOMContentLoaded?"); + assert_ne!( + self.ReadyState(), + DocumentReadyState::Complete, + "Complete before DOMContentLoaded?" + ); update_with_current_time_ms(&self.dom_content_loaded_event_start); // Step 4.1. let window = self.window(); - window.dom_manipulation_task_source().queue_event(self.upcast(), atom!("DOMContentLoaded"), - EventBubbles::Bubbles, EventCancelable::NotCancelable, window); + window.dom_manipulation_task_source().queue_event( + self.upcast(), + atom!("DOMContentLoaded"), + EventBubbles::Bubbles, + EventCancelable::NotCancelable, + window, + ); window.reflow(ReflowGoal::Full, ReflowReason::DOMContentLoaded); update_with_current_time_ms(&self.dom_content_loaded_event_end); // html parsing has finished - set dom content loaded - self.interactive_time.borrow().maybe_set_tti(self, InteractiveFlag::DOMContentLoaded); + self.interactive_time + .borrow() + .maybe_set_tti(self, InteractiveFlag::DOMContentLoaded); // Step 4.2. // TODO: client message queue. @@ -2046,7 +2165,8 @@ impl Document { // Note: the spec says to discard any tasks queued for fetch. // This cancels all tasks on the networking task source, which might be too broad. // See https://github.com/whatwg/html/issues/3837 - self.window.cancel_all_tasks_from_source(TaskSourceName::Networking); + self.window + .cancel_all_tasks_from_source(TaskSourceName::Networking); // Step 3. if let Some(parser) = self.get_current_parser() { @@ -2073,21 +2193,24 @@ impl Document { // It is safe to run script if the parser is not actively parsing, // or if it is impossible to interact with the token stream. parser.parser_is_not_active() || - self.throw_on_dynamic_markup_insertion_counter.get() > 0 - } + self.throw_on_dynamic_markup_insertion_counter.get() > 0 + }, None => true, } } /// Iterate over all iframes in the document. - pub fn iter_iframes(&self) -> impl Iterator> { + pub fn iter_iframes(&self) -> impl Iterator> { self.upcast::() .traverse_preorder() .filter_map(DomRoot::downcast::) } /// Find an iframe element in the document. - pub fn find_iframe(&self, browsing_context_id: BrowsingContextId) -> Option> { + pub fn find_iframe( + &self, + browsing_context_id: BrowsingContextId, + ) -> Option> { self.iter_iframes() .find(|node| node.browsing_context_id() == Some(browsing_context_id)) } @@ -2101,7 +2224,9 @@ impl Document { } pub fn set_navigation_start(&self, navigation_start: u64) { - self.interactive_time.borrow_mut().set_navigation_start(navigation_start); + self.interactive_time + .borrow_mut() + .set_navigation_start(navigation_start); } pub fn get_interactive_metrics(&self) -> Ref { @@ -2146,26 +2271,37 @@ impl Document { /// if it's been 10s since this doc encountered a task over 50ms, then we consider the /// main thread available and try to set tti pub fn record_tti_if_necessary(&self) { - if self.has_recorded_tti_metric() { return; } + if self.has_recorded_tti_metric() { + return; + } if self.tti_window.borrow().needs_check() { - self.get_interactive_metrics().maybe_set_tti(self, - InteractiveFlag::TimeToInteractive(self.tti_window.borrow().get_start())); + self.get_interactive_metrics().maybe_set_tti( + self, + InteractiveFlag::TimeToInteractive(self.tti_window.borrow().get_start()), + ); } } // https://html.spec.whatwg.org/multipage/#fire-a-focus-event - fn fire_focus_event(&self, focus_event_type: FocusEventType, node: &Node, related_target: Option<&EventTarget>) { + fn fire_focus_event( + &self, + focus_event_type: FocusEventType, + node: &Node, + related_target: Option<&EventTarget>, + ) { let (event_name, does_bubble) = match focus_event_type { FocusEventType::Focus => (DOMString::from("focus"), EventBubbles::DoesNotBubble), FocusEventType::Blur => (DOMString::from("blur"), EventBubbles::DoesNotBubble), }; - let event = FocusEvent::new(&self.window, - event_name, - does_bubble, - EventCancelable::NotCancelable, - Some(&self.window), - 0i32, - related_target); + let event = FocusEvent::new( + &self.window, + event_name, + does_bubble, + EventCancelable::NotCancelable, + Some(&self.window), + 0i32, + related_target, + ); let event = event.upcast::(); event.set_trusted(true); let target = node.upcast(); @@ -2177,24 +2313,33 @@ impl Document { !self.has_browsing_context || !url_has_network_scheme(&self.url()) } - pub fn nodes_from_point(&self, - client_point: &Point2D, - reflow_goal: NodesFromPointQueryType) - -> Vec { - if !self.window.layout_reflow(QueryMsg::NodesFromPointQuery(*client_point, reflow_goal)) { - return vec!(); + pub fn nodes_from_point( + &self, + client_point: &Point2D, + reflow_goal: NodesFromPointQueryType, + ) -> Vec { + if !self + .window + .layout_reflow(QueryMsg::NodesFromPointQuery(*client_point, reflow_goal)) + { + return vec![]; }; self.window.layout().nodes_from_point_response() } /// - pub fn lookup_custom_element_definition(&self, - namespace: &Namespace, - local_name: &LocalName, - is: Option<&LocalName>) - -> Option> { - if !PREFS.get("dom.customelements.enabled").as_boolean().unwrap_or(false) { + pub fn lookup_custom_element_definition( + &self, + namespace: &Namespace, + local_name: &LocalName, + is: Option<&LocalName>, + ) -> Option> { + if !PREFS + .get("dom.customelements.enabled") + .as_boolean() + .unwrap_or(false) + { return None; } @@ -2216,12 +2361,14 @@ impl Document { pub fn increment_throw_on_dynamic_markup_insertion_counter(&self) { let counter = self.throw_on_dynamic_markup_insertion_counter.get(); - self.throw_on_dynamic_markup_insertion_counter.set(counter + 1); + self.throw_on_dynamic_markup_insertion_counter + .set(counter + 1); } pub fn decrement_throw_on_dynamic_markup_insertion_counter(&self) { let counter = self.throw_on_dynamic_markup_insertion_counter.get(); - self.throw_on_dynamic_markup_insertion_counter.set(counter - 1); + self.throw_on_dynamic_markup_insertion_counter + .set(counter - 1); } pub fn react_to_environment_changes(&self) { @@ -2235,7 +2382,11 @@ impl Document { } pub fn unregister_responsive_image(&self, img: &HTMLImageElement) { - let index = self.responsive_images.borrow().iter().position(|x| **x == *img); + let index = self + .responsive_images + .borrow() + .iter() + .position(|x| **x == *img); if let Some(i) = index { self.responsive_images.borrow_mut().remove(i); } @@ -2268,10 +2419,13 @@ impl LayoutDocumentHelpers for LayoutDom { #[inline] #[allow(unrooted_must_root)] unsafe fn drain_pending_restyles(&self) -> Vec<(LayoutDom, PendingRestyle)> { - let mut elements = (*self.unsafe_get()).pending_restyles.borrow_mut_for_layout(); + let mut elements = (*self.unsafe_get()) + .pending_restyles + .borrow_mut_for_layout(); // Elements were in a document when they were adding to this list, but that // may no longer be true when the next layout occurs. - let result = elements.drain() + let result = elements + .drain() .map(|(k, v)| (k.to_layout(), v)) .filter(|&(ref k, _)| k.upcast::().get_flag(NodeFlags::IS_IN_DOC)) .collect(); @@ -2302,7 +2456,10 @@ impl LayoutDocumentHelpers for LayoutDom { // https://html.spec.whatwg.org/multipage/#is-a-registrable-domain-suffix-of-or-is-equal-to // The spec says to return a bool, we actually return an Option containing // the parsed host in the successful case, to avoid having to re-parse the host. -fn get_registrable_domain_suffix_of_or_is_equal_to(host_suffix_string: &str, original_host: Host) -> Option { +fn get_registrable_domain_suffix_of_or_is_equal_to( + host_suffix_string: &str, + original_host: Host, +) -> Option { // Step 1 if host_suffix_string.is_empty() { return None; @@ -2362,20 +2519,21 @@ pub enum HasBrowsingContext { } impl Document { - pub fn new_inherited(window: &Window, - has_browsing_context: HasBrowsingContext, - url: Option, - origin: MutableOrigin, - is_html_document: IsHTMLDocument, - content_type: Option, - last_modified: Option, - activity: DocumentActivity, - source: DocumentSource, - doc_loader: DocumentLoader, - referrer: Option, - referrer_policy: Option, - canceller: FetchCanceller) - -> Document { + pub fn new_inherited( + window: &Window, + has_browsing_context: HasBrowsingContext, + url: Option, + origin: MutableOrigin, + is_html_document: IsHTMLDocument, + content_type: Option, + last_modified: Option, + activity: DocumentActivity, + source: DocumentSource, + doc_loader: DocumentLoader, + referrer: Option, + referrer_policy: Option, + canceller: FetchCanceller, + ) -> Document { let url = url.unwrap_or_else(|| ServoUrl::parse("about:blank").unwrap()); let (ready_state, domcontentloaded_dispatched) = if source == DocumentSource::FromParser { @@ -2384,7 +2542,8 @@ impl Document { (DocumentReadyState::Complete, true) }; - let interactive_time = InteractiveMetrics::new(window.time_profiler_chan().clone(), url.clone()); + let interactive_time = + InteractiveMetrics::new(window.time_profiler_chan().clone(), url.clone()); Document { node: Node::new_document_node(), @@ -2397,7 +2556,9 @@ impl Document { // https://dom.spec.whatwg.org/#dom-domimplementation-createhtmldocument IsHTMLDocument::HTMLDocument => Mime(TopLevel::Text, SubLevel::Html, vec![]), // https://dom.spec.whatwg.org/#concept-document-content-type - IsHTMLDocument::NonHTMLDocument => Mime(TopLevel::Application, SubLevel::Xml, vec![]), + IsHTMLDocument::NonHTMLDocument => { + Mime(TopLevel::Application, SubLevel::Xml, vec![]) + }, }), }, last_modified: last_modified, @@ -2485,7 +2646,7 @@ impl Document { page_showing: Cell::new(false), salvageable: Cell::new(true), fired_unload: Cell::new(false), - responsive_images: Default::default() + responsive_images: Default::default(), } } @@ -2493,35 +2654,38 @@ impl Document { pub fn Constructor(window: &Window) -> Fallible> { let doc = window.Document(); let docloader = DocumentLoader::new(&*doc.loader()); - Ok(Document::new(window, - HasBrowsingContext::No, - None, - doc.origin().clone(), - IsHTMLDocument::NonHTMLDocument, - None, - None, - DocumentActivity::Inactive, - DocumentSource::NotFromParser, - docloader, - None, - None, - Default::default())) - } - - pub fn new(window: &Window, - has_browsing_context: HasBrowsingContext, - url: Option, - origin: MutableOrigin, - doctype: IsHTMLDocument, - content_type: Option, - last_modified: Option, - activity: DocumentActivity, - source: DocumentSource, - doc_loader: DocumentLoader, - referrer: Option, - referrer_policy: Option, - canceller: FetchCanceller) - -> DomRoot { + Ok(Document::new( + window, + HasBrowsingContext::No, + None, + doc.origin().clone(), + IsHTMLDocument::NonHTMLDocument, + None, + None, + DocumentActivity::Inactive, + DocumentSource::NotFromParser, + docloader, + None, + None, + Default::default(), + )) + } + + pub fn new( + window: &Window, + has_browsing_context: HasBrowsingContext, + url: Option, + origin: MutableOrigin, + doctype: IsHTMLDocument, + content_type: Option, + last_modified: Option, + activity: DocumentActivity, + source: DocumentSource, + doc_loader: DocumentLoader, + referrer: Option, + referrer_policy: Option, + canceller: FetchCanceller, + ) -> DomRoot { let document = reflect_dom_object( Box::new(Document::new_inherited( window, @@ -2536,10 +2700,10 @@ impl Document { doc_loader, referrer, referrer_policy, - canceller + canceller, )), window, - DocumentBinding::Wrap + DocumentBinding::Wrap, ); { let node = document.upcast::(); @@ -2551,9 +2715,10 @@ impl Document { fn create_node_list bool>(&self, callback: F) -> DomRoot { let doc = self.GetDocumentElement(); let maybe_node = doc.r().map(Castable::upcast::); - let iter = maybe_node.iter() - .flat_map(|node| node.traverse_preorder()) - .filter(|node| callback(&node)); + let iter = maybe_node + .iter() + .flat_map(|node| node.traverse_preorder()) + .filter(|node| callback(&node)); NodeList::new_simple_list(&self.window, iter) } @@ -2591,7 +2756,11 @@ impl Document { let window_size = self.window().window_size()?; let viewport_size = window_size.initial_viewport; let device_pixel_ratio = window_size.device_pixel_ratio; - Some(Device::new(MediaType::screen(), viewport_size, device_pixel_ratio)) + Some(Device::new( + MediaType::screen(), + viewport_size, + device_pixel_ratio, + )) } /// Remove a stylesheet owned by `owner` from the list of document sheets. @@ -2622,25 +2791,27 @@ impl Document { // FIXME(emilio): It'd be nice to unify more code between the elements // that own stylesheets, but StylesheetOwner is more about loading // them... - debug_assert!(owner.as_stylesheet_owner().is_some() || - owner.is::(), "Wat"); + debug_assert!( + owner.as_stylesheet_owner().is_some() || owner.is::(), + "Wat" + ); let mut stylesheets = self.stylesheets.borrow_mut(); - let insertion_point = - stylesheets - .iter() - .map(|(sheet, _origin)| sheet) - .find(|sheet_in_doc| { - owner.upcast::().is_before(sheet_in_doc.owner.upcast()) - }).cloned(); + let insertion_point = stylesheets + .iter() + .map(|(sheet, _origin)| sheet) + .find(|sheet_in_doc| { + owner + .upcast::() + .is_before(sheet_in_doc.owner.upcast()) + }).cloned(); self.window() .layout_chan() .send(Msg::AddStylesheet( sheet.clone(), - insertion_point.as_ref().map(|s| s.sheet.clone()) - )) - .unwrap(); + insertion_point.as_ref().map(|s| s.sheet.clone()), + )).unwrap(); let sheet = StyleSheetInDocument { sheet, @@ -2653,10 +2824,10 @@ impl Document { match insertion_point { Some(ip) => { stylesheets.insert_stylesheet_before(None, sheet, ip, &guard); - } + }, None => { stylesheets.append_stylesheet(None, sheet, &guard); - } + }, } } @@ -2672,45 +2843,56 @@ impl Document { pub fn stylesheet_at(&self, index: usize) -> Option> { let stylesheets = self.stylesheets.borrow(); - stylesheets.get(Origin::Author, index).and_then(|s| { - s.owner.upcast::().get_cssom_stylesheet() - }) + stylesheets + .get(Origin::Author, index) + .and_then(|s| s.owner.upcast::().get_cssom_stylesheet()) } /// pub fn appropriate_template_contents_owner_document(&self) -> DomRoot { - self.appropriate_template_contents_owner_document.or_init(|| { - let doctype = if self.is_html_document { - IsHTMLDocument::HTMLDocument - } else { - IsHTMLDocument::NonHTMLDocument - }; - let new_doc = Document::new(self.window(), - HasBrowsingContext::No, - None, - // https://github.com/whatwg/html/issues/2109 - MutableOrigin::new(ImmutableOrigin::new_opaque()), - doctype, - None, - None, - DocumentActivity::Inactive, - DocumentSource::NotFromParser, - DocumentLoader::new(&self.loader()), - None, - None, - Default::default()); - new_doc.appropriate_template_contents_owner_document.set(Some(&new_doc)); - new_doc - }) + self.appropriate_template_contents_owner_document + .or_init(|| { + let doctype = if self.is_html_document { + IsHTMLDocument::HTMLDocument + } else { + IsHTMLDocument::NonHTMLDocument + }; + let new_doc = Document::new( + self.window(), + HasBrowsingContext::No, + None, + // https://github.com/whatwg/html/issues/2109 + MutableOrigin::new(ImmutableOrigin::new_opaque()), + doctype, + None, + None, + DocumentActivity::Inactive, + DocumentSource::NotFromParser, + DocumentLoader::new(&self.loader()), + None, + None, + Default::default(), + ); + new_doc + .appropriate_template_contents_owner_document + .set(Some(&new_doc)); + new_doc + }) } pub fn get_element_by_id(&self, id: &Atom) -> Option> { - self.id_map.borrow().get(&id).map(|ref elements| DomRoot::from_ref(&*(*elements)[0])) + self.id_map + .borrow() + .get(&id) + .map(|ref elements| DomRoot::from_ref(&*(*elements)[0])) } pub fn ensure_pending_restyle(&self, el: &Element) -> RefMut { let map = self.pending_restyles.borrow_mut(); - RefMut::map(map, |m| m.entry(Dom::from_ref(el)).or_insert_with(PendingRestyle::new)) + RefMut::map(map, |m| { + m.entry(Dom::from_ref(el)) + .or_insert_with(PendingRestyle::new) + }) } pub fn element_state_will_change(&self, el: &Element) { @@ -2751,10 +2933,11 @@ impl Document { snapshot.other_attributes_changed = true; } if snapshot.attrs.is_none() { - let attrs = el.attrs() - .iter() - .map(|attr| (attr.identifier().clone(), attr.value().clone())) - .collect(); + let attrs = el + .attrs() + .iter() + .map(|attr| (attr.identifier().clone(), attr.value().clone())) + .collect(); snapshot.attrs = Some(attrs); } } @@ -2779,17 +2962,18 @@ impl Document { element.set_target_state(true); } - self.window.reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); + self.window + .reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); } pub fn incr_ignore_destructive_writes_counter(&self) { - self.ignore_destructive_writes_counter.set( - self.ignore_destructive_writes_counter.get() + 1); + self.ignore_destructive_writes_counter + .set(self.ignore_destructive_writes_counter.get() + 1); } pub fn decr_ignore_destructive_writes_counter(&self) { - self.ignore_destructive_writes_counter.set( - self.ignore_destructive_writes_counter.get() - 1); + self.ignore_destructive_writes_counter + .set(self.ignore_destructive_writes_counter.get() - 1); } pub fn is_prompting_or_unloading(&self) -> bool { @@ -2797,13 +2981,13 @@ impl Document { } fn incr_ignore_opens_during_unload_counter(&self) { - self.ignore_opens_during_unload_counter.set( - self.ignore_opens_during_unload_counter.get() + 1); + self.ignore_opens_during_unload_counter + .set(self.ignore_opens_during_unload_counter.get() + 1); } fn decr_ignore_opens_during_unload_counter(&self) { - self.ignore_opens_during_unload_counter.set( - self.ignore_opens_during_unload_counter.get() - 1); + self.ignore_opens_during_unload_counter + .set(self.ignore_opens_during_unload_counter.get() - 1); } /// Whether we've seen so many spurious animation frames (i.e. animation frames that didn't @@ -2826,12 +3010,12 @@ impl Document { if pending.local_name().as_ref() != "math" { error = true; } - } + }, ns!(svg) => { if pending.local_name().as_ref() != "svg" { error = true; } - } + }, ns!(html) => (), _ => error = true, } @@ -2880,7 +3064,7 @@ impl Document { // Step 2 if self.fullscreen_element.get().is_none() { promise.reject_error(Error::Type(String::from("fullscreen is null"))); - return promise + return promise; } // TODO Step 3-6 let element = self.fullscreen_element.get().unwrap(); @@ -2927,9 +3111,11 @@ impl Document { true } else { // Step 3 - window.GetFrameElement().map_or(false, |el| el.has_attribute(&local_name!("allowfullscreen"))) + window.GetFrameElement().map_or(false, |el| { + el.has_attribute(&local_name!("allowfullscreen")) + }) } - } + }, } } @@ -2937,15 +3123,16 @@ impl Document { let map = self.form_id_listener_map.borrow(); if let Some(listeners) = map.get(id) { for listener in listeners { - listener.r().as_maybe_form_control() - .expect("Element must be a form control") - .reset_form_owner(); + listener + .r() + .as_maybe_form_control() + .expect("Element must be a form control") + .reset_form_owner(); } } } } - impl Element { fn click_event_filter_by_disabled_state(&self) -> bool { let node = self.upcast::(); @@ -2975,7 +3162,8 @@ impl ProfilerMetadataFactory for Document { impl DocumentMethods for Document { // https://drafts.csswg.org/cssom/#dom-document-stylesheets fn StyleSheets(&self) -> DomRoot { - self.stylesheet_list.or_init(|| StyleSheetList::new(&self.window, Dom::from_ref(&self))) + self.stylesheet_list + .or_init(|| StyleSheetList::new(&self.window, Dom::from_ref(&self))) } // https://dom.spec.whatwg.org/#dom-document-implementation @@ -2993,8 +3181,9 @@ impl DocumentMethods for Document { // TODO: Step 2. match self.get_focused_element() { - Some(element) => Some(element), // Step 3. and 4. - None => match self.GetBody() { // Step 5. + Some(element) => Some(element), // Step 3. and 4. + None => match self.GetBody() { + // Step 5. Some(body) => Some(DomRoot::upcast(body)), None => self.GetDocumentElement(), }, @@ -3046,7 +3235,8 @@ impl DocumentMethods for Document { }; // Step 5 - let host = match get_registrable_domain_suffix_of_or_is_equal_to(&*value, effective_domain) { + let host = match get_registrable_domain_suffix_of_or_is_equal_to(&*value, effective_domain) + { None => return Err(Error::Security), Some(host) => host, }; @@ -3061,7 +3251,7 @@ impl DocumentMethods for Document { fn Referrer(&self) -> DOMString { match self.referrer { Some(ref referrer) => DOMString::from(referrer.to_string()), - None => DOMString::new() + None => DOMString::new(), } } @@ -3100,7 +3290,10 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-document-doctype fn GetDoctype(&self) -> Option> { - self.upcast::().children().filter_map(DomRoot::downcast).next() + self.upcast::() + .children() + .filter_map(DomRoot::downcast) + .next() } // https://dom.spec.whatwg.org/#dom-document-documentelement @@ -3114,19 +3307,20 @@ impl DocumentMethods for Document { match self.tag_map.borrow_mut().entry(qualified_name.clone()) { Occupied(entry) => DomRoot::from_ref(entry.get()), Vacant(entry) => { - let result = HTMLCollection::by_qualified_name( - &self.window, self.upcast(), qualified_name); + let result = + HTMLCollection::by_qualified_name(&self.window, self.upcast(), qualified_name); entry.insert(Dom::from_ref(&*result)); result - } + }, } } // https://dom.spec.whatwg.org/#dom-document-getelementsbytagnamens - fn GetElementsByTagNameNS(&self, - maybe_ns: Option, - tag_name: DOMString) - -> DomRoot { + fn GetElementsByTagNameNS( + &self, + maybe_ns: Option, + tag_name: DOMString, + ) -> DomRoot { let ns = namespace_from_domstring(maybe_ns); let local = LocalName::from(tag_name); let qname = QualName::new(None, ns, local); @@ -3136,24 +3330,21 @@ impl DocumentMethods for Document { let result = HTMLCollection::by_qual_tag_name(&self.window, self.upcast(), qname); entry.insert(Dom::from_ref(&*result)); result - } + }, } } // https://dom.spec.whatwg.org/#dom-document-getelementsbyclassname fn GetElementsByClassName(&self, classes: DOMString) -> DomRoot { - let class_atoms: Vec = split_html_space_chars(&classes) - .map(Atom::from) - .collect(); + let class_atoms: Vec = split_html_space_chars(&classes).map(Atom::from).collect(); match self.classes_map.borrow_mut().entry(class_atoms.clone()) { Occupied(entry) => DomRoot::from_ref(entry.get()), Vacant(entry) => { - let result = HTMLCollection::by_atomic_class_name(&self.window, - self.upcast(), - class_atoms); + let result = + HTMLCollection::by_atomic_class_name(&self.window, self.upcast(), class_atoms); entry.insert(Dom::from_ref(&*result)); result - } + }, } } @@ -3163,10 +3354,11 @@ impl DocumentMethods for Document { } // https://dom.spec.whatwg.org/#dom-document-createelement - fn CreateElement(&self, - mut local_name: DOMString, - options: &ElementCreationOptions) - -> Fallible> { + fn CreateElement( + &self, + mut local_name: DOMString, + options: &ElementCreationOptions, + ) -> Fallible> { if xml_name_type(&local_name) == InvalidXMLName { debug!("Not a valid element name"); return Err(Error::InvalidCharacter); @@ -3175,7 +3367,8 @@ impl DocumentMethods for Document { local_name.make_ascii_lowercase(); } - let is_xhtml = self.content_type.0 == TopLevel::Application && self.content_type.1.as_str() == "xhtml+xml"; + let is_xhtml = self.content_type.0 == TopLevel::Application && + self.content_type.1.as_str() == "xhtml+xml"; let ns = if self.is_html_document || is_xhtml { ns!(html) } else { @@ -3184,20 +3377,32 @@ impl DocumentMethods for Document { let name = QualName::new(None, ns, LocalName::from(local_name)); let is = options.is.as_ref().map(|is| LocalName::from(&**is)); - Ok(Element::create(name, is, self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous)) + Ok(Element::create( + name, + is, + self, + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + )) } // https://dom.spec.whatwg.org/#dom-document-createelementns - fn CreateElementNS(&self, - namespace: Option, - qualified_name: DOMString, - options: &ElementCreationOptions) - -> Fallible> { - let (namespace, prefix, local_name) = validate_and_extract(namespace, - &qualified_name)?; + fn CreateElementNS( + &self, + namespace: Option, + qualified_name: DOMString, + options: &ElementCreationOptions, + ) -> Fallible> { + let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?; let name = QualName::new(prefix, namespace, local_name); let is = options.is.as_ref().map(|is| LocalName::from(&**is)); - Ok(Element::create(name, is, self, ElementCreator::ScriptCreated, CustomElementCreationMode::Synchronous)) + Ok(Element::create( + name, + is, + self, + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + )) } // https://dom.spec.whatwg.org/#dom-document-createattribute @@ -3212,25 +3417,35 @@ impl DocumentMethods for Document { let name = LocalName::from(local_name); let value = AttrValue::String("".to_owned()); - Ok(Attr::new(&self.window, name.clone(), value, name, ns!(), None, None)) + Ok(Attr::new( + &self.window, + name.clone(), + value, + name, + ns!(), + None, + None, + )) } // https://dom.spec.whatwg.org/#dom-document-createattributens - fn CreateAttributeNS(&self, - namespace: Option, - qualified_name: DOMString) - -> Fallible> { - let (namespace, prefix, local_name) = validate_and_extract(namespace, - &qualified_name)?; + fn CreateAttributeNS( + &self, + namespace: Option, + qualified_name: DOMString, + ) -> Fallible> { + let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?; let value = AttrValue::String("".to_owned()); let qualified_name = LocalName::from(qualified_name); - Ok(Attr::new(&self.window, - local_name, - value, - qualified_name, - namespace, - prefix, - None)) + Ok(Attr::new( + &self.window, + local_name, + value, + qualified_name, + namespace, + prefix, + None, + )) } // https://dom.spec.whatwg.org/#dom-document-createdocumentfragment @@ -3249,10 +3464,11 @@ impl DocumentMethods for Document { } // https://dom.spec.whatwg.org/#dom-document-createprocessinginstruction - fn CreateProcessingInstruction(&self, - target: DOMString, - data: DOMString) - -> Fallible> { + fn CreateProcessingInstruction( + &self, + target: DOMString, + data: DOMString, + ) -> Fallible> { // Step 1. if xml_name_type(&target) == InvalidXMLName { return Err(Error::InvalidCharacter); @@ -3302,49 +3518,58 @@ impl DocumentMethods for Document { fn CreateEvent(&self, mut interface: DOMString) -> Fallible> { interface.make_ascii_lowercase(); match &*interface { - "beforeunloadevent" => - Ok(DomRoot::upcast(BeforeUnloadEvent::new_uninitialized(&self.window))), - "closeevent" => - Ok(DomRoot::upcast(CloseEvent::new_uninitialized(self.window.upcast()))), - "customevent" => - Ok(DomRoot::upcast(CustomEvent::new_uninitialized(self.window.upcast()))), - "errorevent" => - Ok(DomRoot::upcast(ErrorEvent::new_uninitialized(self.window.upcast()))), - "events" | "event" | "htmlevents" | "svgevents" => - Ok(Event::new_uninitialized(&self.window.upcast())), - "focusevent" => - Ok(DomRoot::upcast(FocusEvent::new_uninitialized(&self.window))), - "hashchangeevent" => - Ok(DomRoot::upcast(HashChangeEvent::new_uninitialized(&self.window))), - "keyboardevent" => - Ok(DomRoot::upcast(KeyboardEvent::new_uninitialized(&self.window))), - "messageevent" => - Ok(DomRoot::upcast(MessageEvent::new_uninitialized(self.window.upcast()))), - "mouseevent" | "mouseevents" => - Ok(DomRoot::upcast(MouseEvent::new_uninitialized(&self.window))), - "pagetransitionevent" => - Ok(DomRoot::upcast(PageTransitionEvent::new_uninitialized(&self.window))), - "popstateevent" => - Ok(DomRoot::upcast(PopStateEvent::new_uninitialized(&self.window))), - "progressevent" => - Ok(DomRoot::upcast(ProgressEvent::new_uninitialized(self.window.upcast()))), - "storageevent" => { - Ok(DomRoot::upcast(StorageEvent::new_uninitialized(&self.window, "".into()))) + "beforeunloadevent" => Ok(DomRoot::upcast(BeforeUnloadEvent::new_uninitialized( + &self.window, + ))), + "closeevent" => Ok(DomRoot::upcast(CloseEvent::new_uninitialized( + self.window.upcast(), + ))), + "customevent" => Ok(DomRoot::upcast(CustomEvent::new_uninitialized( + self.window.upcast(), + ))), + "errorevent" => Ok(DomRoot::upcast(ErrorEvent::new_uninitialized( + self.window.upcast(), + ))), + "events" | "event" | "htmlevents" | "svgevents" => { + Ok(Event::new_uninitialized(&self.window.upcast())) }, - "touchevent" => - Ok(DomRoot::upcast( - TouchEvent::new_uninitialized(&self.window, - &TouchList::new(&self.window, &[]), - &TouchList::new(&self.window, &[]), - &TouchList::new(&self.window, &[]), - ) - )), - "uievent" | "uievents" => - Ok(DomRoot::upcast(UIEvent::new_uninitialized(&self.window))), - "webglcontextevent" => - Ok(DomRoot::upcast(WebGLContextEvent::new_uninitialized(&self.window))), - _ => - Err(Error::NotSupported), + "focusevent" => Ok(DomRoot::upcast(FocusEvent::new_uninitialized(&self.window))), + "hashchangeevent" => Ok(DomRoot::upcast(HashChangeEvent::new_uninitialized( + &self.window, + ))), + "keyboardevent" => Ok(DomRoot::upcast(KeyboardEvent::new_uninitialized( + &self.window, + ))), + "messageevent" => Ok(DomRoot::upcast(MessageEvent::new_uninitialized( + self.window.upcast(), + ))), + "mouseevent" | "mouseevents" => { + Ok(DomRoot::upcast(MouseEvent::new_uninitialized(&self.window))) + }, + "pagetransitionevent" => Ok(DomRoot::upcast(PageTransitionEvent::new_uninitialized( + &self.window, + ))), + "popstateevent" => Ok(DomRoot::upcast(PopStateEvent::new_uninitialized( + &self.window, + ))), + "progressevent" => Ok(DomRoot::upcast(ProgressEvent::new_uninitialized( + self.window.upcast(), + ))), + "storageevent" => Ok(DomRoot::upcast(StorageEvent::new_uninitialized( + &self.window, + "".into(), + ))), + "touchevent" => Ok(DomRoot::upcast(TouchEvent::new_uninitialized( + &self.window, + &TouchList::new(&self.window, &[]), + &TouchList::new(&self.window, &[]), + &TouchList::new(&self.window, &[]), + ))), + "uievent" | "uievents" => Ok(DomRoot::upcast(UIEvent::new_uninitialized(&self.window))), + "webglcontextevent" => Ok(DomRoot::upcast(WebGLContextEvent::new_uninitialized( + &self.window, + ))), + _ => Err(Error::NotSupported), } } @@ -3352,7 +3577,12 @@ impl DocumentMethods for Document { fn LastModified(&self) -> DOMString { match self.last_modified { Some(ref t) => DOMString::from(t.clone()), - None => DOMString::from(time::now().strftime("%m/%d/%Y %H:%M:%S").unwrap().to_string()), + None => DOMString::from( + time::now() + .strftime("%m/%d/%Y %H:%M:%S") + .unwrap() + .to_string(), + ), } } @@ -3362,35 +3592,31 @@ impl DocumentMethods for Document { } // https://dom.spec.whatwg.org/#dom-document-createnodeiteratorroot-whattoshow-filter - fn CreateNodeIterator(&self, - root: &Node, - what_to_show: u32, - filter: Option>) - -> DomRoot { + fn CreateNodeIterator( + &self, + root: &Node, + what_to_show: u32, + filter: Option>, + ) -> DomRoot { NodeIterator::new(self, root, what_to_show, filter) } // https://w3c.github.io/touch-events/#idl-def-Document - fn CreateTouch(&self, - window: &Window, - target: &EventTarget, - identifier: i32, - page_x: Finite, - page_y: Finite, - screen_x: Finite, - screen_y: Finite) - -> DomRoot { + fn CreateTouch( + &self, + window: &Window, + target: &EventTarget, + identifier: i32, + page_x: Finite, + page_y: Finite, + screen_x: Finite, + screen_y: Finite, + ) -> DomRoot { let client_x = Finite::wrap(*page_x - window.PageXOffset() as f64); let client_y = Finite::wrap(*page_y - window.PageYOffset() as f64); - Touch::new(window, - identifier, - target, - screen_x, - screen_y, - client_x, - client_y, - page_x, - page_y) + Touch::new( + window, identifier, target, screen_x, screen_y, client_x, client_y, page_x, page_y, + ) } // https://w3c.github.io/touch-events/#idl-def-document-createtouchlist(touch...) @@ -3399,11 +3625,12 @@ impl DocumentMethods for Document { } // https://dom.spec.whatwg.org/#dom-document-createtreewalker - fn CreateTreeWalker(&self, - root: &Node, - what_to_show: u32, - filter: Option>) - -> DomRoot { + fn CreateTreeWalker( + &self, + root: &Node, + what_to_show: u32, + filter: Option>, + ) -> DomRoot { TreeWalker::new(self, root, what_to_show, filter) } @@ -3416,8 +3643,7 @@ impl DocumentMethods for Document { .child_elements() .find(|node| { node.namespace() == &ns!(svg) && node.local_name() == &local_name!("title") - }) - .map(DomRoot::upcast::) + }).map(DomRoot::upcast::) } else { // Step 2. root.upcast::() @@ -3451,39 +3677,41 @@ impl DocumentMethods for Document { Some(elem) => DomRoot::upcast::(elem), None => { let name = QualName::new(None, ns!(svg), local_name!("title")); - let elem = Element::create(name, - None, - self, - ElementCreator::ScriptCreated, - CustomElementCreationMode::Synchronous); + let elem = Element::create( + name, + None, + self, + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + ); let parent = root.upcast::(); let child = elem.upcast::(); - parent.InsertBefore(child, parent.GetFirstChild().r()) - .unwrap() - } + parent + .InsertBefore(child, parent.GetFirstChild().r()) + .unwrap() + }, } } else if root.namespace() == &ns!(html) { - let elem = root.upcast::() - .traverse_preorder() - .find(|node| node.is::()); + let elem = root + .upcast::() + .traverse_preorder() + .find(|node| node.is::()); match elem { Some(elem) => elem, - None => { - match self.GetHead() { - Some(head) => { - let name = QualName::new(None, ns!(html), local_name!("title")); - let elem = Element::create(name, - None, - self, - ElementCreator::ScriptCreated, - CustomElementCreationMode::Synchronous); - head.upcast::() - .AppendChild(elem.upcast()) - .unwrap() - }, - None => return, - } - } + None => match self.GetHead() { + Some(head) => { + let name = QualName::new(None, ns!(html), local_name!("title")); + let elem = Element::create( + name, + None, + self, + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + ); + head.upcast::().AppendChild(elem.upcast()).unwrap() + }, + None => return, + }, } } else { return; @@ -3494,8 +3722,12 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-head fn GetHead(&self) -> Option> { - self.get_html_element() - .and_then(|root| root.upcast::().children().filter_map(DomRoot::downcast).next()) + self.get_html_element().and_then(|root| { + root.upcast::() + .children() + .filter_map(DomRoot::downcast) + .next() + }) } // https://html.spec.whatwg.org/multipage/#dom-document-currentscript @@ -3507,13 +3739,16 @@ impl DocumentMethods for Document { fn GetBody(&self) -> Option> { self.get_html_element().and_then(|root| { let node = root.upcast::(); - node.children().find(|child| { - match child.type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLBodyElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFrameSetElement)) => true, - _ => false - } - }).map(|node| DomRoot::downcast(node).unwrap()) + node.children() + .find(|child| match child.type_id() { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLBodyElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLFrameSetElement, + )) => true, + _ => false, + }).map(|node| DomRoot::downcast(node).unwrap()) }) } @@ -3528,7 +3763,9 @@ impl DocumentMethods for Document { let node = new_body.upcast::(); match node.type_id() { NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLBodyElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLFrameSetElement)) => {} + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLFrameSetElement, + )) => {}, _ => return Err(Error::HierarchyRequest), } @@ -3542,7 +3779,8 @@ impl DocumentMethods for Document { // Step 3. (Some(ref root), &Some(ref child)) => { let root = root.upcast::(); - root.ReplaceChild(new_body.upcast(), child.upcast()).unwrap(); + root.ReplaceChild(new_body.upcast(), child.upcast()) + .unwrap(); }, // Step 4. @@ -3552,7 +3790,7 @@ impl DocumentMethods for Document { (Some(ref root), &None) => { let root = root.upcast::(); root.AppendChild(new_body.upcast()).unwrap(); - } + }, } Ok(()) } @@ -3567,8 +3805,9 @@ impl DocumentMethods for Document { if element.namespace() != &ns!(html) { return false; } - element.get_attribute(&ns!(), &local_name!("name")) - .map_or(false, |attr| &**attr.value() == &*name) + element + .get_attribute(&ns!(), &local_name!("name")) + .map_or(false, |attr| &**attr.value() == &*name) }) } @@ -3627,9 +3866,8 @@ impl DocumentMethods for Document { // https://html.spec.whatwg.org/multipage/#dom-document-applets fn Applets(&self) -> DomRoot { - self.applets.or_init(|| { - HTMLCollection::always_empty(&self.window, self.upcast()) - }) + self.applets + .or_init(|| HTMLCollection::always_empty(&self.window, self.upcast())) } // https://html.spec.whatwg.org/multipage/#dom-document-location @@ -3653,7 +3891,10 @@ impl DocumentMethods for Document { // https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild fn GetLastElementChild(&self) -> Option> { - self.upcast::().rev_children().filter_map(DomRoot::downcast).next() + self.upcast::() + .rev_children() + .filter_map(DomRoot::downcast) + .next() } // https://dom.spec.whatwg.org/#dom-parentnode-childelementcount @@ -3709,7 +3950,8 @@ impl DocumentMethods for Document { let url = self.url(); let (tx, rx) = profile_ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let _ = self.window + let _ = self + .window .upcast::() .resource_threads() .send(GetCookiesForUrl(url, tx, NonHTTP)); @@ -3728,13 +3970,16 @@ impl DocumentMethods for Document { } if let Ok(cookie_header) = SetCookie::parse_header(&vec![cookie.to_string().into_bytes()]) { - let cookies = cookie_header.0.into_iter().filter_map(|cookie| { - cookie_rs::Cookie::parse(cookie).ok().map(Serde) - }).collect(); - let _ = self.window - .upcast::() - .resource_threads() - .send(SetCookiesForUrl(self.url(), cookies, NonHTTP)); + let cookies = cookie_header + .0 + .into_iter() + .filter_map(|cookie| cookie_rs::Cookie::parse(cookie).ok().map(Serde)) + .collect(); + let _ = self + .window + .upcast::() + .resource_threads() + .send(SetCookiesForUrl(self.url(), cookies, NonHTTP)); } Ok(()) } @@ -3761,7 +4006,11 @@ impl DocumentMethods for Document { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:dom-document-nameditem-filter - unsafe fn NamedGetter(&self, _cx: *mut JSContext, name: DOMString) -> Option> { + unsafe fn NamedGetter( + &self, + _cx: *mut JSContext, + name: DOMString, + ) -> Option> { #[derive(JSTraceable, MallocSizeOf)] struct NamedElementFilter { name: Atom, @@ -3811,25 +4060,28 @@ impl DocumentMethods for Document { let root = self.upcast::(); { // Step 1. - let mut elements = root.traverse_preorder() - .filter(|node| filter_by_name(&name, &node)) - .peekable(); + let mut elements = root + .traverse_preorder() + .filter(|node| filter_by_name(&name, &node)) + .peekable(); if let Some(first) = elements.next() { if elements.peek().is_none() { // TODO: Step 2. // Step 3. - return Some(NonNull::new_unchecked(first.reflector().get_jsobject().get())); + return Some(NonNull::new_unchecked( + first.reflector().get_jsobject().get(), + )); } } else { return None; } } // Step 4. - let filter = NamedElementFilter { - name: name, - }; + let filter = NamedElementFilter { name: name }; let collection = HTMLCollection::create(self.window(), root, Box::new(filter)); - Some(NonNull::new_unchecked(collection.reflector().get_jsobject().get())) + Some(NonNull::new_unchecked( + collection.reflector().get_jsobject().get(), + )) } // https://html.spec.whatwg.org/multipage/#dom-tree-accessors:supported-property-names @@ -3857,7 +4109,11 @@ impl DocumentMethods for Document { global_event_handlers!(); // https://html.spec.whatwg.org/multipage/#handler-onreadystatechange - event_handler!(readystatechange, GetOnreadystatechange, SetOnreadystatechange); + event_handler!( + readystatechange, + GetOnreadystatechange, + SetOnreadystatechange + ); #[allow(unsafe_code)] // https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint @@ -3876,20 +4132,21 @@ impl DocumentMethods for Document { return None; } - match self.nodes_from_point(point, NodesFromPointQueryType::Topmost).first() { + match self + .nodes_from_point(point, NodesFromPointQueryType::Topmost) + .first() + { Some(address) => { let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) }; - let node = unsafe { - node::from_untrusted_node_address(js_runtime, *address) - }; + let node = unsafe { node::from_untrusted_node_address(js_runtime, *address) }; let parent_node = node.GetParentNode().unwrap(); - let element_ref = node.downcast::().unwrap_or_else(|| { - parent_node.downcast::().unwrap() - }); + let element_ref = node + .downcast::() + .unwrap_or_else(|| parent_node.downcast::().unwrap()); Some(DomRoot::from_ref(element_ref)) }, - None => self.GetDocumentElement() + None => self.GetDocumentElement(), } } @@ -3902,29 +4159,30 @@ impl DocumentMethods for Document { let window = window_from_node(self); let viewport = match window.window_size() { Some(size) => size.initial_viewport, - None => return vec![] + None => return vec![], }; if self.browsing_context().is_none() { - return vec!(); + return vec![]; } // Step 2 if x < 0.0 || y < 0.0 || x > viewport.width || y > viewport.height { - return vec!(); + return vec![]; } let js_runtime = unsafe { JS_GetRuntime(window.get_cx()) }; // Step 1 and Step 3 let nodes = self.nodes_from_point(point, NodesFromPointQueryType::All); - let mut elements: Vec> = nodes.iter() + let mut elements: Vec> = nodes + .iter() .flat_map(|&untrusted_node_address| { let node = unsafe { node::from_untrusted_node_address(js_runtime, untrusted_node_address) }; DomRoot::downcast::(node) - }).collect(); + }).collect(); // Step 4 if let Some(root_element) = self.GetDocumentElement() { @@ -3964,7 +4222,10 @@ impl DocumentMethods for Document { return Err(Error::Security); } - if self.get_current_parser().map_or(false, |parser| parser.is_active()) { + if self + .get_current_parser() + .map_or(false, |parser| parser.is_active()) + { // Step 5. return Ok(DomRoot::from_ref(self)); } @@ -4045,8 +4306,11 @@ impl DocumentMethods for Document { // TODO: mute iframe load. // Step 26. - let resource_threads = - self.window.upcast::().resource_threads().clone(); + let resource_threads = self + .window + .upcast::() + .resource_threads() + .clone(); *self.loader.borrow_mut() = DocumentLoader::new_with_threads(resource_threads, Some(url.clone())); ServoParser::parse_html_script_input(self, url, "text/html"); @@ -4108,7 +4372,7 @@ impl DocumentMethods for Document { // Step 5. self.Open(None, "".into())?; self.get_current_parser().unwrap() - } + }, }; // Step 7. @@ -4144,7 +4408,7 @@ impl DocumentMethods for Document { _ => { // Step 3. return Ok(()); - } + }, }; // Step 4-6. @@ -4160,7 +4424,11 @@ impl DocumentMethods for Document { event_handler!(fullscreenerror, GetOnfullscreenerror, SetOnfullscreenerror); // https://fullscreen.spec.whatwg.org/#handler-document-onfullscreenchange - event_handler!(fullscreenchange, GetOnfullscreenchange, SetOnfullscreenchange); + event_handler!( + fullscreenchange, + GetOnfullscreenchange, + SetOnfullscreenchange + ); // https://fullscreen.spec.whatwg.org/#dom-document-fullscreenenabled fn FullscreenEnabled(&self) -> bool { @@ -4212,14 +4480,14 @@ pub fn determine_policy_for_token(token: &str) -> Option { /// Specifies the type of focus event that is sent to a pipeline #[derive(Clone, Copy, PartialEq)] pub enum FocusType { - Element, // The first focus message - focus the element itself - Parent, // Focusing a parent element (an iframe) + Element, // The first focus message - focus the element itself + Parent, // Focusing a parent element (an iframe) } /// Focus events pub enum FocusEventType { - Focus, // Element gained focus. Doesn't bubble. - Blur, // Element lost focus. Doesn't bubble. + Focus, // Element gained focus. Doesn't bubble. + Blur, // Element lost focus. Doesn't bubble. } /// A fake `requestAnimationFrame()` callback—"fake" because it is not triggered by the video @@ -4244,10 +4512,12 @@ impl FakeRequestAnimationFrameCallback { #[derive(JSTraceable, MallocSizeOf)] pub enum AnimationFrameCallback { - DevtoolsFramerateTick { actor_name: String }, + DevtoolsFramerateTick { + actor_name: String, + }, FrameRequestCallback { #[ignore_malloc_size_of = "Rc is hard"] - callback: Rc + callback: Rc, }, } @@ -4256,14 +4526,18 @@ impl AnimationFrameCallback { match *self { AnimationFrameCallback::DevtoolsFramerateTick { ref actor_name } => { let msg = ScriptToDevtoolsControlMsg::FramerateTick(actor_name.clone(), now); - let devtools_sender = document.window().upcast::().devtools_chan().unwrap(); + let devtools_sender = document + .window() + .upcast::() + .devtools_chan() + .unwrap(); devtools_sender.send(msg).unwrap(); - } + }, AnimationFrameCallback::FrameRequestCallback { ref callback } => { // TODO(jdm): The spec says that any exceptions should be suppressed: // https://github.com/servo/servo/issues/6928 let _ = callback.Call__(Finite::wrap(now), ExceptionHandling::Report); - } + }, } } } @@ -4280,12 +4554,17 @@ impl PendingInOrderScriptVec { } fn push(&self, element: &HTMLScriptElement) { - self.scripts.borrow_mut().push_back(PendingScript::new(element)); + self.scripts + .borrow_mut() + .push_back(PendingScript::new(element)); } fn loaded(&self, element: &HTMLScriptElement, result: ScriptResult) { let mut scripts = self.scripts.borrow_mut(); - let entry = scripts.iter_mut().find(|entry| &*entry.element == element).unwrap(); + let entry = scripts + .iter_mut() + .find(|entry| &*entry.element == element) + .unwrap(); entry.loaded(result); } @@ -4310,11 +4589,17 @@ struct PendingScript { impl PendingScript { fn new(element: &HTMLScriptElement) -> Self { - Self { element: Dom::from_ref(element), load: None } + Self { + element: Dom::from_ref(element), + load: None, + } } fn new_with_load(element: &HTMLScriptElement, load: Option) -> Self { - Self { element: Dom::from_ref(element), load } + Self { + element: Dom::from_ref(element), + load, + } } fn loaded(&mut self, result: ScriptResult) { @@ -4323,6 +4608,8 @@ impl PendingScript { } fn take_result(&mut self) -> Option<(DomRoot, ScriptResult)> { - self.load.take().map(|result| (DomRoot::from_ref(&*self.element), result)) + self.load + .take() + .map(|result| (DomRoot::from_ref(&*self.element), result)) } } diff --git a/components/script/dom/documentfragment.rs b/components/script/dom/documentfragment.rs index b4a0e3cd04b..444398700bc 100644 --- a/components/script/dom/documentfragment.rs +++ b/components/script/dom/documentfragment.rs @@ -34,9 +34,11 @@ impl DocumentFragment { } pub fn new(document: &Document) -> DomRoot { - Node::reflect_node(Box::new(DocumentFragment::new_inherited(document)), - document, - DocumentFragmentBinding::Wrap) + Node::reflect_node( + Box::new(DocumentFragment::new_inherited(document)), + document, + DocumentFragmentBinding::Wrap, + ) } pub fn Constructor(window: &Window) -> Fallible> { @@ -57,12 +59,14 @@ impl DocumentFragmentMethods for DocumentFragment { fn GetElementById(&self, id: DOMString) -> Option> { let node = self.upcast::(); let id = Atom::from(id); - node.traverse_preorder().filter_map(DomRoot::downcast::).find(|descendant| { - match descendant.get_attribute(&ns!(), &local_name!("id")) { - None => false, - Some(attr) => *attr.value().as_atom() == id, - } - }) + node.traverse_preorder() + .filter_map(DomRoot::downcast::) + .find( + |descendant| match descendant.get_attribute(&ns!(), &local_name!("id")) { + None => false, + Some(attr) => *attr.value().as_atom() == id, + }, + ) } // https://dom.spec.whatwg.org/#dom-parentnode-firstelementchild @@ -72,7 +76,10 @@ impl DocumentFragmentMethods for DocumentFragment { // https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild fn GetLastElementChild(&self) -> Option> { - self.upcast::().rev_children().filter_map(DomRoot::downcast::).next() + self.upcast::() + .rev_children() + .filter_map(DomRoot::downcast::) + .next() } // https://dom.spec.whatwg.org/#dom-parentnode-childelementcount diff --git a/components/script/dom/documenttype.rs b/components/script/dom/documenttype.rs index d00ecb7ff56..007790abe4d 100644 --- a/components/script/dom/documenttype.rs +++ b/components/script/dom/documenttype.rs @@ -24,11 +24,12 @@ pub struct DocumentType { } impl DocumentType { - fn new_inherited(name: DOMString, - public_id: Option, - system_id: Option, - document: &Document) - -> DocumentType { + fn new_inherited( + name: DOMString, + public_id: Option, + system_id: Option, + document: &Document, + ) -> DocumentType { DocumentType { node: Node::new_inherited(document), name: name, @@ -37,14 +38,19 @@ impl DocumentType { } } #[allow(unrooted_must_root)] - pub fn new(name: DOMString, - public_id: Option, - system_id: Option, - document: &Document) - -> DomRoot { - Node::reflect_node(Box::new(DocumentType::new_inherited(name, public_id, system_id, document)), - document, - DocumentTypeBinding::Wrap) + pub fn new( + name: DOMString, + public_id: Option, + system_id: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(DocumentType::new_inherited( + name, public_id, system_id, document, + )), + document, + DocumentTypeBinding::Wrap, + ) } #[inline] diff --git a/components/script/dom/domexception.rs b/components/script/dom/domexception.rs index 4f2c076ec66..92debdc825e 100644 --- a/components/script/dom/domexception.rs +++ b/components/script/dom/domexception.rs @@ -53,9 +53,11 @@ impl DOMException { } pub fn new(global: &GlobalScope, code: DOMErrorName) -> DomRoot { - reflect_dom_object(Box::new(DOMException::new_inherited(code)), - global, - DOMExceptionBinding::Wrap) + reflect_dom_object( + Box::new(DOMException::new_inherited(code)), + global, + DOMExceptionBinding::Wrap, + ) } } @@ -74,7 +76,9 @@ impl DOMExceptionMethods for DOMException { fn Message(&self) -> DOMString { let message = match self.code { DOMErrorName::IndexSizeError => "The index is not in the allowed range.", - DOMErrorName::HierarchyRequestError => "The operation would yield an incorrect node tree.", + DOMErrorName::HierarchyRequestError => { + "The operation would yield an incorrect node tree." + }, DOMErrorName::WrongDocumentError => "The object is in the wrong document.", DOMErrorName::InvalidCharacterError => "The string contains invalid characters.", DOMErrorName::NoModificationAllowedError => "The object can not be modified.", @@ -85,17 +89,20 @@ impl DOMExceptionMethods for DOMException { DOMErrorName::SyntaxError => "The string did not match the expected pattern.", DOMErrorName::InvalidModificationError => "The object can not be modified in this way.", DOMErrorName::NamespaceError => "The operation is not allowed by Namespaces in XML.", - DOMErrorName::InvalidAccessError => "The object does not support the operation or argument.", + DOMErrorName::InvalidAccessError => { + "The object does not support the operation or argument." + }, DOMErrorName::SecurityError => "The operation is insecure.", DOMErrorName::NetworkError => "A network error occurred.", DOMErrorName::AbortError => "The operation was aborted.", DOMErrorName::TypeMismatchError => "The given type does not match any expected type.", DOMErrorName::QuotaExceededError => "The quota has been exceeded.", DOMErrorName::TimeoutError => "The operation timed out.", - DOMErrorName::InvalidNodeTypeError => - "The supplied node is incorrect or has an incorrect ancestor for this operation.", + DOMErrorName::InvalidNodeTypeError => { + "The supplied node is incorrect or has an incorrect ancestor for this operation." + }, DOMErrorName::DataCloneError => "The object can not be cloned.", - DOMErrorName::NotReadableError => "The I/O read operation failed." + DOMErrorName::NotReadableError => "The I/O read operation failed.", }; DOMString::from(message) diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index c93182aab6e..f20cc61f3df 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -44,57 +44,79 @@ impl DOMImplementation { pub fn new(document: &Document) -> DomRoot { let window = document.window(); - reflect_dom_object(Box::new(DOMImplementation::new_inherited(document)), - window, - DOMImplementationBinding::Wrap) + reflect_dom_object( + Box::new(DOMImplementation::new_inherited(document)), + window, + DOMImplementationBinding::Wrap, + ) } } // https://dom.spec.whatwg.org/#domimplementation impl DOMImplementationMethods for DOMImplementation { // https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype - fn CreateDocumentType(&self, - qualified_name: DOMString, - pubid: DOMString, - sysid: DOMString) - -> Fallible> { + fn CreateDocumentType( + &self, + qualified_name: DOMString, + pubid: DOMString, + sysid: DOMString, + ) -> Fallible> { validate_qualified_name(&qualified_name)?; - Ok(DocumentType::new(qualified_name, Some(pubid), Some(sysid), &self.document)) + Ok(DocumentType::new( + qualified_name, + Some(pubid), + Some(sysid), + &self.document, + )) } // https://dom.spec.whatwg.org/#dom-domimplementation-createdocument - fn CreateDocument(&self, - maybe_namespace: Option, - qname: DOMString, - maybe_doctype: Option<&DocumentType>) - -> Fallible> { + fn CreateDocument( + &self, + maybe_namespace: Option, + qname: DOMString, + maybe_doctype: Option<&DocumentType>, + ) -> Fallible> { let win = self.document.window(); let loader = DocumentLoader::new(&self.document.loader()); let namespace = namespace_from_domstring(maybe_namespace.to_owned()); let content_type = match namespace { - ns!(html) => Mime(TopLevel::Application, SubLevel::Ext("xhtml+xml".to_string()), vec![]), - ns!(svg) => Mime(TopLevel::Image, SubLevel::Ext("svg+xml".to_string()), vec![]), - _ => Mime(TopLevel::Application, SubLevel::Xml, vec![]) + ns!(html) => Mime( + TopLevel::Application, + SubLevel::Ext("xhtml+xml".to_string()), + vec![], + ), + ns!(svg) => Mime( + TopLevel::Image, + SubLevel::Ext("svg+xml".to_string()), + vec![], + ), + _ => Mime(TopLevel::Application, SubLevel::Xml, vec![]), }; // Step 1. - let doc = XMLDocument::new(win, - HasBrowsingContext::No, - None, - self.document.origin().clone(), - IsHTMLDocument::NonHTMLDocument, - Some(content_type), - None, - DocumentActivity::Inactive, - DocumentSource::NotFromParser, - loader); + let doc = XMLDocument::new( + win, + HasBrowsingContext::No, + None, + self.document.origin().clone(), + IsHTMLDocument::NonHTMLDocument, + Some(content_type), + None, + DocumentActivity::Inactive, + DocumentSource::NotFromParser, + loader, + ); // Step 2-3. let maybe_elem = if qname.is_empty() { None } else { let options = ElementCreationOptions { is: None }; - match doc.upcast::().CreateElementNS(maybe_namespace, qname, &options) { + match doc + .upcast::() + .CreateElementNS(maybe_namespace, qname, &options) + { Err(error) => return Err(error), Ok(elem) => Some(elem), } @@ -127,19 +149,21 @@ impl DOMImplementationMethods for DOMImplementation { let loader = DocumentLoader::new(&self.document.loader()); // Step 1-2. - let doc = Document::new(win, - HasBrowsingContext::No, - None, - self.document.origin().clone(), - IsHTMLDocument::HTMLDocument, - None, - None, - DocumentActivity::Inactive, - DocumentSource::NotFromParser, - loader, - None, - None, - Default::default()); + let doc = Document::new( + win, + HasBrowsingContext::No, + None, + self.document.origin().clone(), + IsHTMLDocument::HTMLDocument, + None, + None, + DocumentActivity::Inactive, + DocumentSource::NotFromParser, + loader, + None, + None, + Default::default(), + ); { // Step 3. @@ -151,25 +175,24 @@ impl DOMImplementationMethods for DOMImplementation { { // Step 4. let doc_node = doc.upcast::(); - let doc_html = DomRoot::upcast::(HTMLHtmlElement::new(local_name!("html"), - None, - &doc)); + let doc_html = + DomRoot::upcast::(HTMLHtmlElement::new(local_name!("html"), None, &doc)); doc_node.AppendChild(&doc_html).expect("Appending failed"); { // Step 5. - let doc_head = DomRoot::upcast::(HTMLHeadElement::new(local_name!("head"), - None, - &doc)); + let doc_head = + DomRoot::upcast::(HTMLHeadElement::new(local_name!("head"), None, &doc)); doc_html.AppendChild(&doc_head).unwrap(); // Step 6. if let Some(title_str) = title { // Step 6.1. - let doc_title = - DomRoot::upcast::(HTMLTitleElement::new(local_name!("title"), - None, - &doc)); + let doc_title = DomRoot::upcast::(HTMLTitleElement::new( + local_name!("title"), + None, + &doc, + )); doc_head.AppendChild(&doc_title).unwrap(); // Step 6.2. diff --git a/components/script/dom/dommatrix.rs b/components/script/dom/dommatrix.rs index 5cbe4ad9b68..6e6a2098774 100644 --- a/components/script/dom/dommatrix.rs +++ b/components/script/dom/dommatrix.rs @@ -17,7 +17,7 @@ use js::typedarray::{Float32Array, Float64Array}; #[dom_struct] pub struct DOMMatrix { - parent: DOMMatrixReadOnly + parent: DOMMatrixReadOnly, } impl DOMMatrix { @@ -29,7 +29,7 @@ impl DOMMatrix { pub fn new_inherited(is2D: bool, matrix: Transform3D) -> Self { DOMMatrix { - parent: DOMMatrixReadOnly::new_inherited(is2D, matrix) + parent: DOMMatrixReadOnly::new_inherited(is2D, matrix), } } @@ -40,18 +40,12 @@ impl DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-dommatrix-numbersequence pub fn Constructor_(global: &GlobalScope, entries: Vec) -> Fallible> { - entries_to_matrix(&entries[..]) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + entries_to_matrix(&entries[..]).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-frommatrix pub fn FromMatrix(global: &GlobalScope, other: &DOMMatrixInit) -> Fallible> { - dommatrixinit_to_matrix(&other) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + dommatrixinit_to_matrix(&other).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } pub fn from_readonly(global: &GlobalScope, ro: &DOMMatrixReadOnly) -> DomRoot { @@ -299,7 +293,7 @@ impl DOMMatrixMethods for DOMMatrix { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-multiplyself - fn MultiplySelf(&self, other:&DOMMatrixInit) -> Fallible> { + fn MultiplySelf(&self, other: &DOMMatrixInit) -> Fallible> { // Steps 1-3. self.upcast::().multiply_self(other) // Step 4. @@ -307,7 +301,7 @@ impl DOMMatrixMethods for DOMMatrix { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-premultiplyself - fn PreMultiplySelf(&self, other:&DOMMatrixInit) -> Fallible> { + fn PreMultiplySelf(&self, other: &DOMMatrixInit) -> Fallible> { // Steps 1-3. self.upcast::().pre_multiply_self(other) // Step 4. @@ -317,24 +311,40 @@ impl DOMMatrixMethods for DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-translateself fn TranslateSelf(&self, tx: f64, ty: f64, tz: f64) -> DomRoot { // Steps 1-2. - self.upcast::().translate_self(tx, ty, tz); + self.upcast::() + .translate_self(tx, ty, tz); // Step 3. DomRoot::from_ref(&self) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-scaleself - fn ScaleSelf(&self, scaleX: f64, scaleY: Option, scaleZ: f64, - originX: f64, originY: f64, originZ: f64) -> DomRoot { + fn ScaleSelf( + &self, + scaleX: f64, + scaleY: Option, + scaleZ: f64, + originX: f64, + originY: f64, + originZ: f64, + ) -> DomRoot { // Steps 1-6. - self.upcast::().scale_self(scaleX, scaleY, scaleZ, originX, originY, originZ); + self.upcast::() + .scale_self(scaleX, scaleY, scaleZ, originX, originY, originZ); // Step 7. DomRoot::from_ref(&self) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-scale3dself - fn Scale3dSelf(&self, scale: f64, originX: f64, originY: f64, originZ: f64) -> DomRoot { + fn Scale3dSelf( + &self, + scale: f64, + originX: f64, + originY: f64, + originZ: f64, + ) -> DomRoot { // Steps 1-4. - self.upcast::().scale_3d_self(scale, originX, originY, originZ); + self.upcast::() + .scale_3d_self(scale, originX, originY, originZ); // Step 5. DomRoot::from_ref(&self) } @@ -342,7 +352,8 @@ impl DOMMatrixMethods for DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-rotateself fn RotateSelf(&self, rotX: f64, rotY: Option, rotZ: Option) -> DomRoot { // Steps 1-7. - self.upcast::().rotate_self(rotX, rotY, rotZ); + self.upcast::() + .rotate_self(rotX, rotY, rotZ); // Step 8. DomRoot::from_ref(&self) } @@ -350,7 +361,8 @@ impl DOMMatrixMethods for DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-rotatefromvectorself fn RotateFromVectorSelf(&self, x: f64, y: f64) -> DomRoot { // Step 1. - self.upcast::().rotate_from_vector_self(x, y); + self.upcast::() + .rotate_from_vector_self(x, y); // Step 2. DomRoot::from_ref(&self) } @@ -358,7 +370,8 @@ impl DOMMatrixMethods for DOMMatrix { // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-rotateaxisangleself fn RotateAxisAngleSelf(&self, x: f64, y: f64, z: f64, angle: f64) -> DomRoot { // Steps 1-2. - self.upcast::().rotate_axis_angle_self(x, y, z, angle); + self.upcast::() + .rotate_axis_angle_self(x, y, z, angle); // Step 3. DomRoot::from_ref(&self) } diff --git a/components/script/dom/dommatrixreadonly.rs b/components/script/dom/dommatrixreadonly.rs index 4996cf428b2..a698ba81111 100644 --- a/components/script/dom/dommatrixreadonly.rs +++ b/components/script/dom/dommatrixreadonly.rs @@ -53,18 +53,12 @@ impl DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly-numbersequence pub fn Constructor_(global: &GlobalScope, entries: Vec) -> Fallible> { - entries_to_matrix(&entries[..]) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + entries_to_matrix(&entries[..]).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-frommatrix pub fn FromMatrix(global: &GlobalScope, other: &DOMMatrixInit) -> Fallible> { - dommatrixinit_to_matrix(&other) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + dommatrixinit_to_matrix(&other).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } pub fn matrix(&self) -> Ref> { @@ -155,7 +149,6 @@ impl DOMMatrixReadOnly { self.matrix.borrow_mut().m44 = value; } - // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-multiplyself pub fn multiply_self(&self, other: &DOMMatrixInit) -> Fallible<()> { // Step 1. @@ -200,8 +193,15 @@ impl DOMMatrixReadOnly { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-scaleself - pub fn scale_self(&self, scaleX: f64, scaleY: Option, scaleZ: f64, - mut originX: f64, mut originY: f64, mut originZ: f64) { + pub fn scale_self( + &self, + scaleX: f64, + scaleY: Option, + scaleZ: f64, + mut originX: f64, + mut originY: f64, + mut originZ: f64, + ) { // Step 1. self.translate_self(originX, originY, originZ); // Step 2. @@ -262,19 +262,22 @@ impl DOMMatrixReadOnly { } if rotZ != 0.0 { // Step 5. - let rotation = Transform3D::create_rotation(0.0, 0.0, 1.0, Angle::radians(rotZ.to_radians())); + let rotation = + Transform3D::create_rotation(0.0, 0.0, 1.0, Angle::radians(rotZ.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } if rotY != 0.0 { // Step 6. - let rotation = Transform3D::create_rotation(0.0, 1.0, 0.0, Angle::radians(rotY.to_radians())); + let rotation = + Transform3D::create_rotation(0.0, 1.0, 0.0, Angle::radians(rotY.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } if rotX != 0.0 { // Step 7. - let rotation = Transform3D::create_rotation(1.0, 0.0, 0.0, Angle::radians(rotX.to_radians())); + let rotation = + Transform3D::create_rotation(1.0, 0.0, 0.0, Angle::radians(rotX.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } @@ -298,7 +301,12 @@ impl DOMMatrixReadOnly { pub fn rotate_axis_angle_self(&self, x: f64, y: f64, z: f64, angle: f64) { // Step 1. let (norm_x, norm_y, norm_z) = normalize_point(x, y, z); - let rotation = Transform3D::create_rotation(norm_x, norm_y, norm_z, Angle::radians(angle.to_radians())); + let rotation = Transform3D::create_rotation( + norm_x, + norm_y, + norm_z, + Angle::radians(angle.to_radians()), + ); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); // Step 2. @@ -333,10 +341,24 @@ impl DOMMatrixReadOnly { *matrix = matrix.inverse().unwrap_or_else(|| { // Step 2. self.is2D.set(false); - Transform3D::row_major(f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN) + Transform3D::row_major( + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + ) }) // Step 3 in DOMMatrix.InvertSelf } @@ -362,7 +384,6 @@ impl DOMMatrixReadOnly { } } - impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-m11 fn M11(&self) -> f64 { @@ -482,10 +503,22 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-isidentity fn IsIdentity(&self) -> bool { let matrix = self.matrix.borrow(); - matrix.m12 == 0.0 && matrix.m13 == 0.0 && matrix.m14 == 0.0 && matrix.m21 == 0.0 && - matrix.m23 == 0.0 && matrix.m24 == 0.0 && matrix.m31 == 0.0 && matrix.m32 == 0.0 && - matrix.m34 == 0.0 && matrix.m41 == 0.0 && matrix.m42 == 0.0 && matrix.m43 == 0.0 && - matrix.m11 == 1.0 && matrix.m22 == 1.0 && matrix.m33 == 1.0 && matrix.m44 == 1.0 + matrix.m12 == 0.0 && + matrix.m13 == 0.0 && + matrix.m14 == 0.0 && + matrix.m21 == 0.0 && + matrix.m23 == 0.0 && + matrix.m24 == 0.0 && + matrix.m31 == 0.0 && + matrix.m32 == 0.0 && + matrix.m34 == 0.0 && + matrix.m41 == 0.0 && + matrix.m42 == 0.0 && + matrix.m43 == 0.0 && + matrix.m11 == 1.0 && + matrix.m22 == 1.0 && + matrix.m33 == 1.0 && + matrix.m44 == 1.0 } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-translate @@ -494,16 +527,22 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-scale - fn Scale(&self, scaleX: f64, scaleY: Option, scaleZ: f64, - originX: f64, originY: f64, originZ: f64) -> DomRoot { + fn Scale( + &self, + scaleX: f64, + scaleY: Option, + scaleZ: f64, + originX: f64, + originY: f64, + originZ: f64, + ) -> DomRoot { DOMMatrix::from_readonly(&self.global(), self) .ScaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-scale3d fn Scale3d(&self, scale: f64, originX: f64, originY: f64, originZ: f64) -> DomRoot { - DOMMatrix::from_readonly(&self.global(), self) - .Scale3dSelf(scale, originX, originY, originZ) + DOMMatrix::from_readonly(&self.global(), self).Scale3dSelf(scale, originX, originY, originZ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-rotate @@ -539,10 +578,9 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-flipx fn FlipX(&self) -> DomRoot { let is2D = self.is2D.get(); - let flip = Transform3D::row_major(-1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0); + let flip = Transform3D::row_major( + -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, + ); let matrix = flip.post_mul(&self.matrix.borrow()); DOMMatrix::new(&self.global(), is2D, matrix) } @@ -550,10 +588,9 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-flipy fn FlipY(&self) -> DomRoot { let is2D = self.is2D.get(); - let flip = Transform3D::row_major(1.0, 0.0, 0.0, 0.0, - 0.0, -1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0); + let flip = Transform3D::row_major( + 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, + ); let matrix = flip.post_mul(&self.matrix.borrow()); DOMMatrix::new(&self.global(), is2D, matrix) } @@ -583,11 +620,15 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-tofloat32array #[allow(unsafe_code)] unsafe fn ToFloat32Array(&self, cx: *mut JSContext) -> NonNull { - let vec: Vec = self.matrix - .borrow().to_row_major_array().iter().map(|&x| x as f32).collect(); + let vec: Vec = self + .matrix + .borrow() + .to_row_major_array() + .iter() + .map(|&x| x as f32) + .collect(); rooted!(in (cx) let mut array = ptr::null_mut::()); - let _ = Float32Array::create(cx, CreateWith::Slice(&vec), array.handle_mut()) - .unwrap(); + let _ = Float32Array::create(cx, CreateWith::Slice(&vec), array.handle_mut()).unwrap(); NonNull::new_unchecked(array.get()) } @@ -596,28 +637,39 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { unsafe fn ToFloat64Array(&self, cx: *mut JSContext) -> NonNull { let arr = self.matrix.borrow().to_row_major_array(); rooted!(in (cx) let mut array = ptr::null_mut::()); - let _ = Float64Array::create(cx, CreateWith::Slice(&arr), array.handle_mut()) - .unwrap(); + let _ = Float64Array::create(cx, CreateWith::Slice(&arr), array.handle_mut()).unwrap(); NonNull::new_unchecked(array.get()) } } - // https://drafts.fxtf.org/geometry-1/#create-a-2d-matrix fn create_2d_matrix(entries: &[f64]) -> Transform3D { - Transform3D::row_major(entries[0], entries[1], 0.0, 0.0, - entries[2], entries[3], 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - entries[4], entries[5], 0.0, 1.0) + Transform3D::row_major( + entries[0], entries[1], 0.0, 0.0, entries[2], entries[3], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, + entries[4], entries[5], 0.0, 1.0, + ) } - // https://drafts.fxtf.org/geometry-1/#create-a-3d-matrix fn create_3d_matrix(entries: &[f64]) -> Transform3D { - Transform3D::row_major(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13], entries[14], entries[15]) + Transform3D::row_major( + entries[0], + entries[1], + entries[2], + entries[3], + entries[4], + entries[5], + entries[6], + entries[7], + entries[8], + entries[9], + entries[10], + entries[11], + entries[12], + entries[13], + entries[14], + entries[15], + ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly-numbersequence @@ -632,21 +684,29 @@ pub fn entries_to_matrix(entries: &[f64]) -> Fallible<(bool, Transform3D)> } } - // https://drafts.fxtf.org/geometry-1/#validate-and-fixup pub fn dommatrixinit_to_matrix(dict: &DOMMatrixInit) -> Fallible<(bool, Transform3D)> { // Step 1. if dict.a.is_some() && dict.m11.is_some() && dict.a.unwrap() != dict.m11.unwrap() || - dict.b.is_some() && dict.m12.is_some() && dict.b.unwrap() != dict.m12.unwrap() || - dict.c.is_some() && dict.m21.is_some() && dict.c.unwrap() != dict.m21.unwrap() || - dict.d.is_some() && dict.m22.is_some() && dict.d.unwrap() != dict.m22.unwrap() || - dict.e.is_some() && dict.m41.is_some() && dict.e.unwrap() != dict.m41.unwrap() || - dict.f.is_some() && dict.m42.is_some() && dict.f.unwrap() != dict.m42.unwrap() || - dict.is2D.is_some() && dict.is2D.unwrap() && - (dict.m31 != 0.0 || dict.m32 != 0.0 || dict.m13 != 0.0 || dict.m23 != 0.0 || - dict.m43 != 0.0 || dict.m14 != 0.0 || dict.m24 != 0.0 || dict.m34 != 0.0 || - dict.m33 != 1.0 || dict.m44 != 1.0) { - Err(error::Error::Type("Invalid matrix initializer.".to_owned())) + dict.b.is_some() && dict.m12.is_some() && dict.b.unwrap() != dict.m12.unwrap() || + dict.c.is_some() && dict.m21.is_some() && dict.c.unwrap() != dict.m21.unwrap() || + dict.d.is_some() && dict.m22.is_some() && dict.d.unwrap() != dict.m22.unwrap() || + dict.e.is_some() && dict.m41.is_some() && dict.e.unwrap() != dict.m41.unwrap() || + dict.f.is_some() && dict.m42.is_some() && dict.f.unwrap() != dict.m42.unwrap() || + dict.is2D.is_some() && + dict.is2D.unwrap() && + (dict.m31 != 0.0 || + dict.m32 != 0.0 || + dict.m13 != 0.0 || + dict.m23 != 0.0 || + dict.m43 != 0.0 || + dict.m14 != 0.0 || + dict.m24 != 0.0 || + dict.m34 != 0.0 || + dict.m33 != 1.0 || + dict.m44 != 1.0) + { + Err(error::Error::Type("Invalid matrix initializer.".to_owned())) } else { let mut is2D = dict.is2D; // Step 2. @@ -663,25 +723,31 @@ pub fn dommatrixinit_to_matrix(dict: &DOMMatrixInit) -> Fallible<(bool, Transfor let m42 = dict.m42.unwrap_or(dict.f.unwrap_or(0.0)); // Step 8. if is2D.is_none() && - (dict.m31 != 0.0 || dict.m32 != 0.0 || dict.m13 != 0.0 || - dict.m23 != 0.0 || dict.m43 != 0.0 || dict.m14 != 0.0 || - dict.m24 != 0.0 || dict.m34 != 0.0 || - dict.m33 != 1.0 || dict.m44 != 1.0) { - is2D = Some(false); + (dict.m31 != 0.0 || + dict.m32 != 0.0 || + dict.m13 != 0.0 || + dict.m23 != 0.0 || + dict.m43 != 0.0 || + dict.m14 != 0.0 || + dict.m24 != 0.0 || + dict.m34 != 0.0 || + dict.m33 != 1.0 || + dict.m44 != 1.0) + { + is2D = Some(false); } // Step 9. if is2D.is_none() { is2D = Some(true); } - let matrix = Transform3D::row_major(m11, m12, dict.m13, dict.m14, - m21, m22, dict.m23, dict.m24, - dict.m31, dict.m32, dict.m33, dict.m34, - m41, m42, dict.m43, dict.m44); + let matrix = Transform3D::row_major( + m11, m12, dict.m13, dict.m14, m21, m22, dict.m23, dict.m24, dict.m31, dict.m32, + dict.m33, dict.m34, m41, m42, dict.m43, dict.m44, + ); Ok((is2D.unwrap(), matrix)) } } - #[inline] fn normalize_point(x: f64, y: f64, z: f64) -> (f64, f64, f64) { let len = (x * x + y * y + z * z).sqrt(); diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index 2d293d0a184..d2b5ac80b95 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -37,9 +37,11 @@ impl DOMParser { } pub fn new(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(DOMParser::new_inherited(window)), - window, - DOMParserBinding::Wrap) + reflect_dom_object( + Box::new(DOMParser::new_inherited(window)), + window, + DOMParserBinding::Wrap, + ) } pub fn Constructor(window: &Window) -> Fallible> { @@ -49,51 +51,59 @@ impl DOMParser { impl DOMParserMethods for DOMParser { // https://w3c.github.io/DOM-Parsing/#the-domparser-interface - fn ParseFromString(&self, - s: DOMString, - ty: DOMParserBinding::SupportedType) - -> Fallible> { + fn ParseFromString( + &self, + s: DOMString, + ty: DOMParserBinding::SupportedType, + ) -> Fallible> { let url = self.window.get_url(); - let content_type = ty.as_str().parse().expect("Supported type is not a MIME type"); + let content_type = ty + .as_str() + .parse() + .expect("Supported type is not a MIME type"); let doc = self.window.Document(); let loader = DocumentLoader::new(&*doc.loader()); match ty { Text_html => { - let document = Document::new(&self.window, - HasBrowsingContext::No, - Some(url.clone()), - doc.origin().clone(), - IsHTMLDocument::HTMLDocument, - Some(content_type), - None, - DocumentActivity::Inactive, - DocumentSource::FromParser, - loader, - None, - None, - Default::default()); + let document = Document::new( + &self.window, + HasBrowsingContext::No, + Some(url.clone()), + doc.origin().clone(), + IsHTMLDocument::HTMLDocument, + Some(content_type), + None, + DocumentActivity::Inactive, + DocumentSource::FromParser, + loader, + None, + None, + Default::default(), + ); ServoParser::parse_html_document(&document, s, url); document.set_ready_state(DocumentReadyState::Complete); Ok(document) - } + }, Text_xml | Application_xml | Application_xhtml_xml => { - let document = Document::new(&self.window, - HasBrowsingContext::No, - Some(url.clone()), - doc.origin().clone(), - IsHTMLDocument::NonHTMLDocument, - Some(content_type), - None, - DocumentActivity::Inactive, - DocumentSource::FromParser, - loader, - None, - None, - Default::default()); + let document = Document::new( + &self.window, + HasBrowsingContext::No, + Some(url.clone()), + doc.origin().clone(), + IsHTMLDocument::NonHTMLDocument, + Some(content_type), + None, + DocumentActivity::Inactive, + DocumentSource::FromParser, + loader, + None, + None, + Default::default(), + ); ServoParser::parse_xml_document(&document, s, url); document.set_ready_state(DocumentReadyState::Complete); Ok(document) - } + }, } } } diff --git a/components/script/dom/dompoint.rs b/components/script/dom/dompoint.rs index 9653c08a120..ec0e96062bd 100644 --- a/components/script/dom/dompoint.rs +++ b/components/script/dom/dompoint.rs @@ -28,12 +28,13 @@ impl DOMPoint { reflect_dom_object(Box::new(DOMPoint::new_inherited(x, y, z, w)), global, Wrap) } - pub fn Constructor(global: &GlobalScope, - x: f64, - y: f64, - z: f64, - w: f64) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + x: f64, + y: f64, + z: f64, + w: f64, + ) -> Fallible> { Ok(DOMPoint::new(global, x, y, z, w)) } diff --git a/components/script/dom/dompointreadonly.rs b/components/script/dom/dompointreadonly.rs index 03570b27362..28b3fea458f 100644 --- a/components/script/dom/dompointreadonly.rs +++ b/components/script/dom/dompointreadonly.rs @@ -32,17 +32,20 @@ impl DOMPointReadOnly { } pub fn new(global: &GlobalScope, x: f64, y: f64, z: f64, w: f64) -> DomRoot { - reflect_dom_object(Box::new(DOMPointReadOnly::new_inherited(x, y, z, w)), - global, - Wrap) + reflect_dom_object( + Box::new(DOMPointReadOnly::new_inherited(x, y, z, w)), + global, + Wrap, + ) } - pub fn Constructor(global: &GlobalScope, - x: f64, - y: f64, - z: f64, - w: f64) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + x: f64, + y: f64, + z: f64, + w: f64, + ) -> Fallible> { Ok(DOMPointReadOnly::new(global, x, y, z, w)) } } diff --git a/components/script/dom/domquad.rs b/components/script/dom/domquad.rs index 49c882db9bd..b4270898d3f 100644 --- a/components/script/dom/domquad.rs +++ b/components/script/dom/domquad.rs @@ -24,11 +24,7 @@ pub struct DOMQuad { } impl DOMQuad { - fn new_inherited(p1: &DOMPoint, - p2: &DOMPoint, - p3: &DOMPoint, - p4: &DOMPoint) - -> DOMQuad { + fn new_inherited(p1: &DOMPoint, p2: &DOMPoint, p3: &DOMPoint, p4: &DOMPoint) -> DOMQuad { DOMQuad { reflector_: Reflector::new(), p1: Dom::from_ref(p1), @@ -38,45 +34,62 @@ impl DOMQuad { } } - pub fn new(global: &GlobalScope, - p1: &DOMPoint, - p2: &DOMPoint, - p3: &DOMPoint, - p4: &DOMPoint) -> DomRoot { - reflect_dom_object(Box::new(DOMQuad::new_inherited(p1, p2, p3, p4)), - global, - Wrap) + pub fn new( + global: &GlobalScope, + p1: &DOMPoint, + p2: &DOMPoint, + p3: &DOMPoint, + p4: &DOMPoint, + ) -> DomRoot { + reflect_dom_object( + Box::new(DOMQuad::new_inherited(p1, p2, p3, p4)), + global, + Wrap, + ) } - pub fn Constructor(global: &GlobalScope, - p1: &DOMPointInit, - p2: &DOMPointInit, - p3: &DOMPointInit, - p4: &DOMPointInit) - -> Fallible> { - Ok(DOMQuad::new(global, - &*DOMPoint::new_from_init(global, p1), - &*DOMPoint::new_from_init(global, p2), - &*DOMPoint::new_from_init(global, p3), - &*DOMPoint::new_from_init(global, p4))) + pub fn Constructor( + global: &GlobalScope, + p1: &DOMPointInit, + p2: &DOMPointInit, + p3: &DOMPointInit, + p4: &DOMPointInit, + ) -> Fallible> { + Ok(DOMQuad::new( + global, + &*DOMPoint::new_from_init(global, p1), + &*DOMPoint::new_from_init(global, p2), + &*DOMPoint::new_from_init(global, p3), + &*DOMPoint::new_from_init(global, p4), + )) } // https://drafts.fxtf.org/geometry/#dom-domquad-fromrect pub fn FromRect(global: &GlobalScope, other: &DOMRectInit) -> DomRoot { - DOMQuad::new(global, - &*DOMPoint::new(global, other.x, other.y, 0f64, 1f64), - &*DOMPoint::new(global, other.x + other.width, other.y, 0f64, 1f64), - &*DOMPoint::new(global, other.x + other.width, other.y + other.height, 0f64, 1f64), - &*DOMPoint::new(global, other.x, other.y + other.height, 0f64, 1f64)) + DOMQuad::new( + global, + &*DOMPoint::new(global, other.x, other.y, 0f64, 1f64), + &*DOMPoint::new(global, other.x + other.width, other.y, 0f64, 1f64), + &*DOMPoint::new( + global, + other.x + other.width, + other.y + other.height, + 0f64, + 1f64, + ), + &*DOMPoint::new(global, other.x, other.y + other.height, 0f64, 1f64), + ) } // https://drafts.fxtf.org/geometry/#dom-domquad-fromquad pub fn FromQuad(global: &GlobalScope, other: &DOMQuadInit) -> DomRoot { - DOMQuad::new(global, - &DOMPoint::new_from_init(global, &other.p1), - &DOMPoint::new_from_init(global, &other.p2), - &DOMPoint::new_from_init(global, &other.p3), - &DOMPoint::new_from_init(global, &other.p4)) + DOMQuad::new( + global, + &DOMPoint::new_from_init(global, &other.p1), + &DOMPoint::new_from_init(global, &other.p2), + &DOMPoint::new_from_init(global, &other.p3), + &DOMPoint::new_from_init(global, &other.p4), + ) } } @@ -103,15 +116,31 @@ impl DOMQuadMethods for DOMQuad { // https://drafts.fxtf.org/geometry/#dom-domquad-getbounds fn GetBounds(&self) -> DomRoot { - let left = self.p1.X().min(self.p2.X()).min(self.p3.X()).min(self.p4.X()); - let top = self.p1.Y().min(self.p2.Y()).min(self.p3.Y()).min(self.p4.Y()); - let right = self.p1.X().max(self.p2.X()).max(self.p3.X()).max(self.p4.X()); - let bottom = self.p1.Y().max(self.p2.Y()).max(self.p3.Y()).max(self.p4.Y()); + let left = self + .p1 + .X() + .min(self.p2.X()) + .min(self.p3.X()) + .min(self.p4.X()); + let top = self + .p1 + .Y() + .min(self.p2.Y()) + .min(self.p3.Y()) + .min(self.p4.Y()); + let right = self + .p1 + .X() + .max(self.p2.X()) + .max(self.p3.X()) + .max(self.p4.X()); + let bottom = self + .p1 + .Y() + .max(self.p2.Y()) + .max(self.p3.Y()) + .max(self.p4.Y()); - DOMRect::new(&self.global(), - left, - top, - right - left, - bottom - top) + DOMRect::new(&self.global(), left, top, right - left, bottom - top) } } diff --git a/components/script/dom/domrect.rs b/components/script/dom/domrect.rs index 8944b0d28df..cb5b3caadb9 100644 --- a/components/script/dom/domrect.rs +++ b/components/script/dom/domrect.rs @@ -25,17 +25,20 @@ impl DOMRect { } pub fn new(global: &GlobalScope, x: f64, y: f64, width: f64, height: f64) -> DomRoot { - reflect_dom_object(Box::new(DOMRect::new_inherited(x, y, width, height)), - global, - DOMRectBinding::Wrap) + reflect_dom_object( + Box::new(DOMRect::new_inherited(x, y, width, height)), + global, + DOMRectBinding::Wrap, + ) } - pub fn Constructor(global: &GlobalScope, - x: f64, - y: f64, - width: f64, - height: f64) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + x: f64, + y: f64, + width: f64, + height: f64, + ) -> Fallible> { Ok(DOMRect::new(global, x, y, width, height)) } } diff --git a/components/script/dom/domrectreadonly.rs b/components/script/dom/domrectreadonly.rs index f5e92812080..86eeab0b2fd 100644 --- a/components/script/dom/domrectreadonly.rs +++ b/components/script/dom/domrectreadonly.rs @@ -30,23 +30,27 @@ impl DOMRectReadOnly { } } - pub fn new(global: &GlobalScope, - x: f64, - y: f64, - width: f64, - height: f64) - -> DomRoot { - reflect_dom_object(Box::new(DOMRectReadOnly::new_inherited(x, y, width, height)), - global, - Wrap) + pub fn new( + global: &GlobalScope, + x: f64, + y: f64, + width: f64, + height: f64, + ) -> DomRoot { + reflect_dom_object( + Box::new(DOMRectReadOnly::new_inherited(x, y, width, height)), + global, + Wrap, + ) } - pub fn Constructor(global: &GlobalScope, - x: f64, - y: f64, - width: f64, - height: f64) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + x: f64, + y: f64, + width: f64, + height: f64, + ) -> Fallible> { Ok(DOMRectReadOnly::new(global, x, y, width, height)) } diff --git a/components/script/dom/domstringmap.rs b/components/script/dom/domstringmap.rs index c64375e0bdb..514781c9a1d 100644 --- a/components/script/dom/domstringmap.rs +++ b/components/script/dom/domstringmap.rs @@ -28,9 +28,11 @@ impl DOMStringMap { pub fn new(element: &HTMLElement) -> DomRoot { let window = window_from_node(element); - reflect_dom_object(Box::new(DOMStringMap::new_inherited(element)), - &*window, - DOMStringMapBinding::Wrap) + reflect_dom_object( + Box::new(DOMStringMap::new_inherited(element)), + &*window, + DOMStringMapBinding::Wrap, + ) } } @@ -53,6 +55,10 @@ impl DOMStringMapMethods for DOMStringMap { // https://html.spec.whatwg.org/multipage/#the-domstringmap-interface:supported-property-names fn SupportedPropertyNames(&self) -> Vec { - self.element.supported_prop_names_custom_attr().iter().cloned().collect() + self.element + .supported_prop_names_custom_attr() + .iter() + .cloned() + .collect() } } diff --git a/components/script/dom/domtokenlist.rs b/components/script/dom/domtokenlist.rs index 18999f59f13..f1244ab4936 100644 --- a/components/script/dom/domtokenlist.rs +++ b/components/script/dom/domtokenlist.rs @@ -34,9 +34,11 @@ impl DOMTokenList { pub fn new(element: &Element, local_name: &LocalName) -> DomRoot { let window = window_from_node(element); - reflect_dom_object(Box::new(DOMTokenList::new_inherited(element, local_name.clone())), - &*window, - DOMTokenListBinding::Wrap) + reflect_dom_object( + Box::new(DOMTokenList::new_inherited(element, local_name.clone())), + &*window, + DOMTokenListBinding::Wrap, + ) } fn attribute(&self) -> Option> { @@ -56,16 +58,18 @@ impl DOMTokenList { impl DOMTokenListMethods for DOMTokenList { // https://dom.spec.whatwg.org/#dom-domtokenlist-length fn Length(&self) -> u32 { - self.attribute().map_or(0, |attr| { - attr.value().as_tokens().len() - }) as u32 + self.attribute() + .map_or(0, |attr| attr.value().as_tokens().len()) as u32 } // https://dom.spec.whatwg.org/#dom-domtokenlist-item fn Item(&self, index: u32) -> Option { self.attribute().and_then(|attr| { // FIXME(ajeffrey): Convert directly from Atom to DOMString - attr.value().as_tokens().get(index as usize).map(|token| DOMString::from(&**token)) + attr.value() + .as_tokens() + .get(index as usize) + .map(|token| DOMString::from(&**token)) }) } @@ -89,7 +93,8 @@ impl DOMTokenListMethods for DOMTokenList { atoms.push(token); } } - self.element.set_atomic_tokenlist_attribute(&self.local_name, atoms); + self.element + .set_atomic_tokenlist_attribute(&self.local_name, atoms); Ok(()) } @@ -98,9 +103,13 @@ impl DOMTokenListMethods for DOMTokenList { let mut atoms = self.element.get_tokenlist_attribute(&self.local_name); for token in &tokens { let token = self.check_token_exceptions(&token)?; - atoms.iter().position(|atom| *atom == token).map(|index| atoms.remove(index)); + atoms + .iter() + .position(|atom| *atom == token) + .map(|index| atoms.remove(index)); } - self.element.set_atomic_tokenlist_attribute(&self.local_name, atoms); + self.element + .set_atomic_tokenlist_attribute(&self.local_name, atoms); Ok(()) } @@ -113,17 +122,19 @@ impl DOMTokenListMethods for DOMTokenList { Some(true) => Ok(true), _ => { atoms.remove(index); - self.element.set_atomic_tokenlist_attribute(&self.local_name, atoms); + self.element + .set_atomic_tokenlist_attribute(&self.local_name, atoms); Ok(false) - } + }, }, None => match force { Some(false) => Ok(false), _ => { atoms.push(token); - self.element.set_atomic_tokenlist_attribute(&self.local_name, atoms); + self.element + .set_atomic_tokenlist_attribute(&self.local_name, atoms); Ok(true) - } + }, }, } } @@ -135,7 +146,8 @@ impl DOMTokenListMethods for DOMTokenList { // https://dom.spec.whatwg.org/#dom-domtokenlist-value fn SetValue(&self, value: DOMString) { - self.element.set_tokenlist_attribute(&self.local_name, value); + self.element + .set_tokenlist_attribute(&self.local_name, value); } // https://dom.spec.whatwg.org/#dom-domtokenlist-replace @@ -159,7 +171,8 @@ impl DOMTokenListMethods for DOMTokenList { atoms.remove(pos); } // Step 5. - self.element.set_atomic_tokenlist_attribute(&self.local_name, atoms); + self.element + .set_atomic_tokenlist_attribute(&self.local_name, atoms); } Ok(()) } diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 2101b1e6a7f..4144bb972ca 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -237,26 +237,38 @@ impl FromStr for AdjacentPosition { // Element methods // impl Element { - pub fn create(name: QualName, - is: Option, - document: &Document, - creator: ElementCreator, - mode: CustomElementCreationMode) - -> DomRoot { + pub fn create( + name: QualName, + is: Option, + document: &Document, + creator: ElementCreator, + mode: CustomElementCreationMode, + ) -> DomRoot { create_element(name, is, document, creator, mode) } - pub fn new_inherited(local_name: LocalName, - namespace: Namespace, prefix: Option, - document: &Document) -> Element { - Element::new_inherited_with_state(ElementState::empty(), local_name, - namespace, prefix, document) + pub fn new_inherited( + local_name: LocalName, + namespace: Namespace, + prefix: Option, + document: &Document, + ) -> Element { + Element::new_inherited_with_state( + ElementState::empty(), + local_name, + namespace, + prefix, + document, + ) } - pub fn new_inherited_with_state(state: ElementState, local_name: LocalName, - namespace: Namespace, prefix: Option, - document: &Document) - -> Element { + pub fn new_inherited_with_state( + state: ElementState, + local_name: LocalName, + namespace: Namespace, + prefix: Option, + document: &Document, + ) -> Element { Element { node: Node::new_inherited(document), local_name: local_name, @@ -277,14 +289,19 @@ impl Element { } } - pub fn new(local_name: LocalName, - namespace: Namespace, - prefix: Option, - document: &Document) -> DomRoot { + pub fn new( + local_name: LocalName, + namespace: Namespace, + prefix: Option, + document: &Document, + ) -> DomRoot { Node::reflect_node( - Box::new(Element::new_inherited(local_name, namespace, prefix, document)), + Box::new(Element::new_inherited( + local_name, namespace, prefix, document, + )), document, - ElementBinding::Wrap) + ElementBinding::Wrap, + ) } pub fn restyle(&self, damage: NodeDamage) { @@ -325,11 +342,15 @@ impl Element { } pub fn push_callback_reaction(&self, function: Rc, args: Box<[Heap]>) { - self.custom_element_reaction_queue.borrow_mut().push(CustomElementReaction::Callback(function, args)); + self.custom_element_reaction_queue + .borrow_mut() + .push(CustomElementReaction::Callback(function, args)); } pub fn push_upgrade_reaction(&self, definition: Rc) { - self.custom_element_reaction_queue.borrow_mut().push(CustomElementReaction::Upgrade(definition)); + self.custom_element_reaction_queue + .borrow_mut() + .push(CustomElementReaction::Upgrade(definition)); } pub fn clear_reaction_queue(&self) { @@ -341,7 +362,10 @@ impl Element { // after clear_reaction_queue has been called. rooted_vec!(let mut reactions); while !self.custom_element_reaction_queue.borrow().is_empty() { - mem::swap(&mut *reactions, &mut *self.custom_element_reaction_queue.borrow_mut()); + mem::swap( + &mut *reactions, + &mut *self.custom_element_reaction_queue.borrow_mut(), + ); for reaction in reactions.iter() { reaction.invoke(self); } @@ -352,9 +376,7 @@ impl Element { /// style will be `None` for elements in a `display: none` subtree. otherwise, the element has a /// layout box iff it doesn't have `display: none`. pub fn style(&self) -> Option> { - window_from_node(self).style_query( - self.upcast::().to_trusted_node_address() - ) + window_from_node(self).style_query(self.upcast::().to_trusted_node_address()) } // https://drafts.csswg.org/cssom-view/#css-layout-box @@ -376,8 +398,7 @@ impl Element { } fn has_overflow(&self) -> bool { - self.ScrollHeight() > self.ClientHeight() || - self.ScrollWidth() > self.ClientWidth() + self.ScrollHeight() > self.ClientHeight() || self.ScrollWidth() > self.ClientWidth() } // TODO: Once #19183 is closed (overflow-x/y types moved out of mako), then we could implement @@ -408,55 +429,69 @@ impl Element { #[allow(unsafe_code)] pub trait RawLayoutElementHelpers { - unsafe fn get_attr_for_layout<'a>(&'a self, namespace: &Namespace, name: &LocalName) - -> Option<&'a AttrValue>; - unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &LocalName) - -> Option<&'a str>; + unsafe fn get_attr_for_layout<'a>( + &'a self, + namespace: &Namespace, + name: &LocalName, + ) -> Option<&'a AttrValue>; + unsafe fn get_attr_val_for_layout<'a>( + &'a self, + namespace: &Namespace, + name: &LocalName, + ) -> Option<&'a str>; unsafe fn get_attr_vals_for_layout<'a>(&'a self, name: &LocalName) -> Vec<&'a AttrValue>; } #[inline] #[allow(unsafe_code)] -pub unsafe fn get_attr_for_layout<'a>(elem: &'a Element, namespace: &Namespace, name: &LocalName) - -> Option> { +pub unsafe fn get_attr_for_layout<'a>( + elem: &'a Element, + namespace: &Namespace, + name: &LocalName, +) -> Option> { // cast to point to T in RefCell directly let attrs = elem.attrs.borrow_for_layout(); - attrs.iter().find(|attr| { - let attr = attr.to_layout(); - *name == attr.local_name_atom_forever() && - (*attr.unsafe_get()).namespace() == namespace - }).map(|attr| attr.to_layout()) + attrs + .iter() + .find(|attr| { + let attr = attr.to_layout(); + *name == attr.local_name_atom_forever() && (*attr.unsafe_get()).namespace() == namespace + }).map(|attr| attr.to_layout()) } #[allow(unsafe_code)] impl RawLayoutElementHelpers for Element { #[inline] - unsafe fn get_attr_for_layout<'a>(&'a self, namespace: &Namespace, name: &LocalName) - -> Option<&'a AttrValue> { - get_attr_for_layout(self, namespace, name).map(|attr| { - attr.value_forever() - }) + unsafe fn get_attr_for_layout<'a>( + &'a self, + namespace: &Namespace, + name: &LocalName, + ) -> Option<&'a AttrValue> { + get_attr_for_layout(self, namespace, name).map(|attr| attr.value_forever()) } #[inline] - unsafe fn get_attr_val_for_layout<'a>(&'a self, namespace: &Namespace, name: &LocalName) - -> Option<&'a str> { - get_attr_for_layout(self, namespace, name).map(|attr| { - attr.value_ref_forever() - }) + unsafe fn get_attr_val_for_layout<'a>( + &'a self, + namespace: &Namespace, + name: &LocalName, + ) -> Option<&'a str> { + get_attr_for_layout(self, namespace, name).map(|attr| attr.value_ref_forever()) } #[inline] unsafe fn get_attr_vals_for_layout<'a>(&'a self, name: &LocalName) -> Vec<&'a AttrValue> { let attrs = self.attrs.borrow_for_layout(); - attrs.iter().filter_map(|attr| { - let attr = attr.to_layout(); - if *name == attr.local_name_atom_forever() { - Some(attr.value_forever()) - } else { - None - } - }).collect() + attrs + .iter() + .filter_map(|attr| { + let attr = attr.to_layout(); + if *name == attr.local_name_atom_forever() { + Some(attr.value_forever()) + } else { + None + } + }).collect() } } @@ -468,7 +503,8 @@ pub trait LayoutElementHelpers { #[allow(unsafe_code)] unsafe fn synthesize_presentational_hints_for_legacy_attributes(&self, &mut V) - where V: Push; + where + V: Push; #[allow(unsafe_code)] unsafe fn get_colspan(self) -> u32; #[allow(unsafe_code)] @@ -491,9 +527,15 @@ impl LayoutElementHelpers for LayoutDom { #[allow(unsafe_code)] #[inline] unsafe fn has_class_for_layout(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool { - get_attr_for_layout(&*self.unsafe_get(), &ns!(), &local_name!("class")).map_or(false, |attr| { - attr.value_tokens_forever().unwrap().iter().any(|atom| case_sensitivity.eq_atom(atom, name)) - }) + get_attr_for_layout(&*self.unsafe_get(), &ns!(), &local_name!("class")).map_or( + false, + |attr| { + attr.value_tokens_forever() + .unwrap() + .iter() + .any(|atom| case_sensitivity.eq_atom(atom, name)) + }, + ) } #[allow(unsafe_code)] @@ -505,17 +547,22 @@ impl LayoutElementHelpers for LayoutDom { #[allow(unsafe_code)] unsafe fn synthesize_presentational_hints_for_legacy_attributes(&self, hints: &mut V) - where V: Push + where + V: Push, { // FIXME(emilio): Just a single PDB should be enough. #[inline] - fn from_declaration(shared_lock: &SharedRwLock, declaration: PropertyDeclaration) - -> ApplicableDeclarationBlock { + fn from_declaration( + shared_lock: &SharedRwLock, + declaration: PropertyDeclaration, + ) -> ApplicableDeclarationBlock { ApplicableDeclarationBlock::from_declarations( Arc::new(shared_lock.wrap(PropertyDeclarationBlock::with_one( - declaration, Importance::Normal + declaration, + Importance::Normal, ))), - CascadeLevel::PresHints) + CascadeLevel::PresHints, + ) } let document = self.upcast::().owner_doc_for_layout(); @@ -538,7 +585,7 @@ impl LayoutElementHelpers for LayoutDom { if let Some(color) = bgcolor { hints.push(from_declaration( shared_lock, - PropertyDeclaration::BackgroundColor(color.into()) + PropertyDeclaration::BackgroundColor(color.into()), )); } @@ -551,10 +598,10 @@ impl LayoutElementHelpers for LayoutDom { if let Some(url) = background { hints.push(from_declaration( shared_lock, - PropertyDeclaration::BackgroundImage( - background_image::SpecifiedValue(vec![ - Either::Second(specified::Image::for_cascade(url.into())) - ])))); + PropertyDeclaration::BackgroundImage(background_image::SpecifiedValue(vec![ + Either::Second(specified::Image::for_cascade(url.into())), + ])), + )); } let color = if let Some(this) = self.downcast::() { @@ -572,9 +619,7 @@ impl LayoutElementHelpers for LayoutDom { if let Some(color) = color { hints.push(from_declaration( shared_lock, - PropertyDeclaration::Color( - longhands::color::SpecifiedValue(color.into()) - ) + PropertyDeclaration::Color(longhands::color::SpecifiedValue(color.into())), )); } @@ -587,21 +632,24 @@ impl LayoutElementHelpers for LayoutDom { if let Some(font_family) = font_family { hints.push(from_declaration( shared_lock, - PropertyDeclaration::FontFamily( - font_family::SpecifiedValue::Values( - computed::font::FontFamilyList::new(Box::new([ - computed::font::SingleFontFamily::from_atom( - font_family)])))))); + PropertyDeclaration::FontFamily(font_family::SpecifiedValue::Values( + computed::font::FontFamilyList::new(Box::new([ + computed::font::SingleFontFamily::from_atom(font_family), + ])), + )), + )); } - let font_size = self.downcast::().and_then(|this| this.get_size()); + let font_size = self + .downcast::() + .and_then(|this| this.get_size()); if let Some(font_size) = font_size { hints.push(from_declaration( shared_lock, - PropertyDeclaration::FontSize( - font_size::SpecifiedValue::from_html_size(font_size as u8) - ) + PropertyDeclaration::FontSize(font_size::SpecifiedValue::from_html_size( + font_size as u8, + )), )) } @@ -615,32 +663,37 @@ impl LayoutElementHelpers for LayoutDom { let width_value = specified::Length::from_px(cellspacing as f32); hints.push(from_declaration( shared_lock, - PropertyDeclaration::BorderSpacing( - Box::new(border_spacing::SpecifiedValue::new( - width_value.clone().into(), - width_value.into() - )) - ) + PropertyDeclaration::BorderSpacing(Box::new(border_spacing::SpecifiedValue::new( + width_value.clone().into(), + width_value.into(), + ))), )); } - let size = if let Some(this) = self.downcast::() { // FIXME(pcwalton): More use of atoms, please! match (*self.unsafe_get()).get_attr_val_for_layout(&ns!(), &local_name!("type")) { // Not text entry widget - Some("hidden") | Some("date") | Some("month") | Some("week") | - Some("time") | Some("datetime-local") | Some("number") | Some("range") | - Some("color") | Some("checkbox") | Some("radio") | Some("file") | - Some("submit") | Some("image") | Some("reset") | Some("button") => { - None - }, + Some("hidden") | + Some("date") | + Some("month") | + Some("week") | + Some("time") | + Some("datetime-local") | + Some("number") | + Some("range") | + Some("color") | + Some("checkbox") | + Some("radio") | + Some("file") | + Some("submit") | + Some("image") | + Some("reset") | + Some("button") => None, // Others - _ => { - match this.size_for_layout() { - 0 => None, - s => Some(s as i32), - } + _ => match this.size_for_layout() { + 0 => None, + s => Some(s as i32), }, } } else { @@ -648,11 +701,12 @@ impl LayoutElementHelpers for LayoutDom { }; if let Some(size) = size { - let value = specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(size)); + let value = + specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(size)); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Width( - specified::LengthOrPercentageOrAuto::Length(value)))); + PropertyDeclaration::Width(specified::LengthOrPercentageOrAuto::Length(value)), + )); } let width = if let Some(this) = self.downcast::() { @@ -674,24 +728,28 @@ impl LayoutElementHelpers for LayoutDom { // FIXME(emilio): Use from_computed value here and below. match width { - LengthOrPercentageOrAuto::Auto => {} + LengthOrPercentageOrAuto::Auto => {}, LengthOrPercentageOrAuto::Percentage(percentage) => { - let width_value = - specified::LengthOrPercentageOrAuto::Percentage(computed::Percentage(percentage)); + let width_value = specified::LengthOrPercentageOrAuto::Percentage( + computed::Percentage(percentage), + ); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Width(width_value))); - } + PropertyDeclaration::Width(width_value), + )); + }, LengthOrPercentageOrAuto::Length(length) => { - let width_value = specified::LengthOrPercentageOrAuto::Length( - specified::NoCalcLength::Absolute(specified::AbsoluteLength::Px(length.to_f32_px()))); + let width_value = + specified::LengthOrPercentageOrAuto::Length(specified::NoCalcLength::Absolute( + specified::AbsoluteLength::Px(length.to_f32_px()), + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Width(width_value))); - } + PropertyDeclaration::Width(width_value), + )); + }, } - let height = if let Some(this) = self.downcast::() { this.get_height() } else if let Some(this) = self.downcast::() { @@ -703,24 +761,28 @@ impl LayoutElementHelpers for LayoutDom { }; match height { - LengthOrPercentageOrAuto::Auto => {} + LengthOrPercentageOrAuto::Auto => {}, LengthOrPercentageOrAuto::Percentage(percentage) => { - let height_value = - specified::LengthOrPercentageOrAuto::Percentage(computed::Percentage(percentage)); + let height_value = specified::LengthOrPercentageOrAuto::Percentage( + computed::Percentage(percentage), + ); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Height(height_value))); - } + PropertyDeclaration::Height(height_value), + )); + }, LengthOrPercentageOrAuto::Length(length) => { - let height_value = specified::LengthOrPercentageOrAuto::Length( - specified::NoCalcLength::Absolute(specified::AbsoluteLength::Px(length.to_f32_px()))); + let height_value = + specified::LengthOrPercentageOrAuto::Length(specified::NoCalcLength::Absolute( + specified::AbsoluteLength::Px(length.to_f32_px()), + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Height(height_value))); - } + PropertyDeclaration::Height(height_value), + )); + }, } - let cols = if let Some(this) = self.downcast::() { match this.get_cols() { 0 => None, @@ -736,10 +798,12 @@ impl LayoutElementHelpers for LayoutDom { // scrollbar size into consideration (but we don't have a scrollbar yet!) // // https://html.spec.whatwg.org/multipage/#textarea-effective-width - let value = specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(cols)); + let value = + specified::NoCalcLength::ServoCharacterWidth(specified::CharacterWidth(cols)); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Width(specified::LengthOrPercentageOrAuto::Length(value)))); + PropertyDeclaration::Width(specified::LengthOrPercentageOrAuto::Length(value)), + )); } let rows = if let Some(this) = self.downcast::() { @@ -755,13 +819,15 @@ impl LayoutElementHelpers for LayoutDom { // TODO(mttr) This should take scrollbar size into consideration. // // https://html.spec.whatwg.org/multipage/#textarea-effective-height - let value = specified::NoCalcLength::FontRelative(specified::FontRelativeLength::Em(rows as CSSFloat)); + let value = specified::NoCalcLength::FontRelative(specified::FontRelativeLength::Em( + rows as CSSFloat, + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::Height(specified::LengthOrPercentageOrAuto::Length(value)))); + PropertyDeclaration::Height(specified::LengthOrPercentageOrAuto::Length(value)), + )); } - let border = if let Some(this) = self.downcast::() { this.get_border() } else { @@ -769,19 +835,24 @@ impl LayoutElementHelpers for LayoutDom { }; if let Some(border) = border { - let width_value = specified::BorderSideWidth::Length(specified::Length::from_px(border as f32)); + let width_value = + specified::BorderSideWidth::Length(specified::Length::from_px(border as f32)); hints.push(from_declaration( shared_lock, - PropertyDeclaration::BorderTopWidth(width_value.clone()))); + PropertyDeclaration::BorderTopWidth(width_value.clone()), + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::BorderLeftWidth(width_value.clone()))); + PropertyDeclaration::BorderLeftWidth(width_value.clone()), + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::BorderBottomWidth(width_value.clone()))); + PropertyDeclaration::BorderBottomWidth(width_value.clone()), + )); hints.push(from_declaration( shared_lock, - PropertyDeclaration::BorderRightWidth(width_value))); + PropertyDeclaration::BorderRightWidth(width_value), + )); } } @@ -815,30 +886,22 @@ impl LayoutElementHelpers for LayoutDom { #[allow(unsafe_code)] fn id_attribute(&self) -> *const Option { - unsafe { - (*self.unsafe_get()).id_attribute.borrow_for_layout() - } + unsafe { (*self.unsafe_get()).id_attribute.borrow_for_layout() } } #[allow(unsafe_code)] fn style_attribute(&self) -> *const Option>> { - unsafe { - (*self.unsafe_get()).style_attribute.borrow_for_layout() - } + unsafe { (*self.unsafe_get()).style_attribute.borrow_for_layout() } } #[allow(unsafe_code)] fn local_name(&self) -> &LocalName { - unsafe { - &(*self.unsafe_get()).local_name - } + unsafe { &(*self.unsafe_get()).local_name } } #[allow(unsafe_code)] fn namespace(&self) -> &Namespace { - unsafe { - &(*self.unsafe_get()).namespace - } + unsafe { &(*self.unsafe_get()).namespace } } #[allow(unsafe_code)] @@ -849,14 +912,18 @@ impl LayoutElementHelpers for LayoutDom { current_node = node.parent_node_ref(); match node.downcast::().map(|el| el.unsafe_get()) { Some(elem) => { - if let Some(attr) = (*elem).get_attr_val_for_layout(&ns!(xml), &local_name!("lang")) { + if let Some(attr) = + (*elem).get_attr_val_for_layout(&ns!(xml), &local_name!("lang")) + { return attr.to_owned(); } - if let Some(attr) = (*elem).get_attr_val_for_layout(&ns!(), &local_name!("lang")) { + if let Some(attr) = + (*elem).get_attr_val_for_layout(&ns!(), &local_name!("lang")) + { return attr.to_owned(); } - } - None => continue + }, + None => continue, } } // TODO: Check meta tags for a pragma-set default language @@ -870,9 +937,7 @@ impl LayoutElementHelpers for LayoutDom { fn get_checked_state_for_layout(&self) -> bool { // TODO option and menuitem can also have a checked state. match self.downcast::() { - Some(input) => unsafe { - input.checked_state_for_layout() - }, + Some(input) => unsafe { input.checked_state_for_layout() }, None => false, } } @@ -882,9 +947,7 @@ impl LayoutElementHelpers for LayoutDom { fn get_indeterminate_state_for_layout(&self) -> bool { // TODO progress elements can also be matched with :indeterminate match self.downcast::() { - Some(input) => unsafe { - input.indeterminate_state_for_layout() - }, + Some(input) => unsafe { input.indeterminate_state_for_layout() }, None => false, } } @@ -892,9 +955,7 @@ impl LayoutElementHelpers for LayoutDom { #[inline] #[allow(unsafe_code)] fn get_state_for_layout(&self) -> ElementState { - unsafe { - (*self.unsafe_get()).state.get() - } + unsafe { (*self.unsafe_get()).state.get() } } #[inline] @@ -910,9 +971,7 @@ impl LayoutElementHelpers for LayoutDom { #[inline] #[allow(unsafe_code)] fn has_selector_flags(&self, flags: ElementSelectorFlags) -> bool { - unsafe { - (*self.unsafe_get()).selector_flags.get().contains(flags) - } + unsafe { (*self.unsafe_get()).selector_flags.get().contains(flags) } } } @@ -956,10 +1015,10 @@ impl Element { pub fn locate_namespace(&self, prefix: Option) -> Namespace { let prefix = prefix.map(String::from).map(LocalName::from); - let inclusive_ancestor_elements = - self.upcast::() - .inclusive_ancestors() - .filter_map(DomRoot::downcast::); + let inclusive_ancestor_elements = self + .upcast::() + .inclusive_ancestors() + .filter_map(DomRoot::downcast::); // Steps 3-4. for element in inclusive_ancestor_elements { @@ -999,39 +1058,53 @@ impl Element { } pub fn summarize(&self) -> Vec { - self.attrs.borrow().iter() - .map(|attr| attr.summarize()) - .collect() + self.attrs + .borrow() + .iter() + .map(|attr| attr.summarize()) + .collect() } pub fn is_void(&self) -> bool { if self.namespace != ns!(html) { - return false + return false; } match self.local_name { /* List of void elements from https://html.spec.whatwg.org/multipage/#html-fragment-serialisation-algorithm */ - - local_name!("area") | local_name!("base") | local_name!("basefont") | - local_name!("bgsound") | local_name!("br") | - local_name!("col") | local_name!("embed") | local_name!("frame") | - local_name!("hr") | local_name!("img") | - local_name!("input") | local_name!("keygen") | local_name!("link") | - local_name!("menuitem") | local_name!("meta") | - local_name!("param") | local_name!("source") | local_name!("track") | + local_name!("area") | + local_name!("base") | + local_name!("basefont") | + local_name!("bgsound") | + local_name!("br") | + local_name!("col") | + local_name!("embed") | + local_name!("frame") | + local_name!("hr") | + local_name!("img") | + local_name!("input") | + local_name!("keygen") | + local_name!("link") | + local_name!("menuitem") | + local_name!("meta") | + local_name!("param") | + local_name!("source") | + local_name!("track") | local_name!("wbr") => true, - _ => false + _ => false, } } pub fn serialize(&self, traversal_scope: TraversalScope) -> Fallible { let mut writer = vec![]; - match serialize(&mut writer, - &self.upcast::(), - SerializeOpts { - traversal_scope: traversal_scope, - ..Default::default() - }) { + match serialize( + &mut writer, + &self.upcast::(), + SerializeOpts { + traversal_scope: traversal_scope, + ..Default::default() + }, + ) { // FIXME(ajeffrey): Directly convert UTF8 to DOMString Ok(()) => Ok(DOMString::from(String::from_utf8(writer).unwrap())), Err(_) => panic!("Cannot serialize element"), @@ -1040,12 +1113,14 @@ impl Element { pub fn xmlSerialize(&self, traversal_scope: XmlTraversalScope) -> Fallible { let mut writer = vec![]; - match xmlSerialize::serialize(&mut writer, - &self.upcast::(), - XmlSerializeOpts { - traversal_scope: traversal_scope, - ..Default::default() - }) { + match xmlSerialize::serialize( + &mut writer, + &self.upcast::(), + XmlSerializeOpts { + traversal_scope: traversal_scope, + ..Default::default() + }, + ) { Ok(()) => Ok(DOMString::from(String::from_utf8(writer).unwrap())), Err(_) => panic!("Cannot serialize element"), } @@ -1080,7 +1155,8 @@ impl Element { // Step 2. for attr in element.attrs.borrow().iter() { if attr.prefix() == Some(&namespace_prefix!("xmlns")) && - **attr.value() == *namespace { + **attr.value() == *namespace + { return Some(attr.LocalName()); } } @@ -1115,12 +1191,18 @@ impl Element { } // https://html.spec.whatwg.org/multipage/#specially-focusable match node.type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => { - true - } + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLAnchorElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLInputElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLSelectElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLTextAreaElement, + )) => true, _ => false, } } @@ -1128,13 +1210,21 @@ impl Element { pub fn is_actually_disabled(&self) -> bool { let node = self.upcast::(); match node.type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLOptionElement)) => { - self.disabled_state() - } + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLButtonElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLInputElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLSelectElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLTextAreaElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLOptionElement, + )) => self.disabled_state(), // TODO: // an optgroup element that has a disabled attribute // a menuitem element that has a disabled attribute @@ -1143,20 +1233,24 @@ impl Element { } } - pub fn push_new_attribute(&self, - local_name: LocalName, - value: AttrValue, - name: LocalName, - namespace: Namespace, - prefix: Option) { + pub fn push_new_attribute( + &self, + local_name: LocalName, + value: AttrValue, + name: LocalName, + namespace: Namespace, + prefix: Option, + ) { let window = window_from_node(self); - let attr = Attr::new(&window, - local_name, - value, - name, - namespace, - prefix, - Some(self)); + let attr = Attr::new( + &window, + local_name, + value, + name, + namespace, + prefix, + Some(self), + ); self.push_attribute(&attr); } @@ -1185,7 +1279,11 @@ impl Element { } } - pub fn get_attribute(&self, namespace: &Namespace, local_name: &LocalName) -> Option> { + pub fn get_attribute( + &self, + namespace: &Namespace, + local_name: &LocalName, + ) -> Option> { self.attrs .borrow() .iter() @@ -1196,18 +1294,26 @@ impl Element { // https://dom.spec.whatwg.org/#concept-element-attributes-get-by-name pub fn get_attribute_by_name(&self, name: DOMString) -> Option> { let name = &self.parsed_name(name); - self.attrs.borrow().iter().find(|a| a.name() == name).map(|js| DomRoot::from_ref(&**js)) + self.attrs + .borrow() + .iter() + .find(|a| a.name() == name) + .map(|js| DomRoot::from_ref(&**js)) } - pub fn set_attribute_from_parser(&self, - qname: QualName, - value: DOMString, - prefix: Option) { + pub fn set_attribute_from_parser( + &self, + qname: QualName, + value: DOMString, + prefix: Option, + ) { // Don't set if the attribute already exists, so we can handle add_attrs_if_missing - if self.attrs - .borrow() - .iter() - .any(|a| *a.local_name() == qname.local && *a.namespace() == qname.ns) { + if self + .attrs + .borrow() + .iter() + .any(|a| *a.local_name() == qname.local && *a.namespace() == qname.ns) + { return; } @@ -1226,12 +1332,9 @@ impl Element { assert!(name == &name.to_ascii_lowercase()); assert!(!name.contains(":")); - self.set_first_matching_attribute(name.clone(), - value, - name.clone(), - ns!(), - None, - |attr| attr.local_name() == name); + self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| { + attr.local_name() == name + }); } // https://html.spec.whatwg.org/multipage/#attr-data-* @@ -1244,31 +1347,29 @@ impl Element { // Steps 2-5. let name = LocalName::from(name); let value = self.parse_attribute(&ns!(), &name, value); - self.set_first_matching_attribute(name.clone(), - value, - name.clone(), - ns!(), - None, - |attr| { - *attr.name() == name && *attr.namespace() == ns!() - }); + self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| { + *attr.name() == name && *attr.namespace() == ns!() + }); Ok(()) } - fn set_first_matching_attribute(&self, - local_name: LocalName, - value: AttrValue, - name: LocalName, - namespace: Namespace, - prefix: Option, - find: F) - where F: Fn(&Attr) -> bool + fn set_first_matching_attribute( + &self, + local_name: LocalName, + value: AttrValue, + name: LocalName, + namespace: Namespace, + prefix: Option, + find: F, + ) where + F: Fn(&Attr) -> bool, { - let attr = self.attrs - .borrow() - .iter() - .find(|attr| find(&attr)) - .map(|js| DomRoot::from_ref(&**js)); + let attr = self + .attrs + .borrow() + .iter() + .find(|attr| find(&attr)) + .map(|js| DomRoot::from_ref(&**js)); if let Some(attr) = attr { attr.set_value(value, self); } else { @@ -1276,11 +1377,12 @@ impl Element { }; } - pub fn parse_attribute(&self, - namespace: &Namespace, - local_name: &LocalName, - value: DOMString) - -> AttrValue { + pub fn parse_attribute( + &self, + namespace: &Namespace, + local_name: &LocalName, + value: DOMString, + ) -> AttrValue { if *namespace == ns!() { vtable_for(self.upcast()).parse_plain_attribute(local_name, value) } else { @@ -1288,7 +1390,11 @@ impl Element { } } - pub fn remove_attribute(&self, namespace: &Namespace, local_name: &LocalName) -> Option> { + pub fn remove_attribute( + &self, + namespace: &Namespace, + local_name: &LocalName, + ) -> Option> { self.remove_first_matching_attribute(|attr| { attr.namespace() == namespace && attr.local_name() == local_name }) @@ -1299,7 +1405,9 @@ impl Element { } fn remove_first_matching_attribute(&self, find: F) -> Option> - where F: Fn(&Attr) -> bool { + where + F: Fn(&Attr) -> bool, + { let idx = self.attrs.borrow().iter().position(|attr| find(&attr)); idx.map(|idx| { let attr = DomRoot::from_ref(&*(*self.attrs.borrow())[idx]); @@ -1316,7 +1424,8 @@ impl Element { MutationObserver::queue_a_mutation_record(&self.node, mutation); - let reaction = CallbackReaction::AttributeChanged(name, Some(old_value), None, namespace); + let reaction = + CallbackReaction::AttributeChanged(name, Some(old_value), None, namespace); ScriptThread::enqueue_callback_reaction(self, reaction, None); self.attrs.borrow_mut().remove(idx); @@ -1329,9 +1438,13 @@ impl Element { } pub fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool { - self.get_attribute(&ns!(), &local_name!("class")).map_or(false, |attr| { - attr.value().as_tokens().iter().any(|atom| case_sensitivity.eq_atom(name, atom)) - }) + self.get_attribute(&ns!(), &local_name!("class")) + .map_or(false, |attr| { + attr.value() + .as_tokens() + .iter() + .any(|atom| case_sensitivity.eq_atom(name, atom)) + }) } pub fn set_atomic_attribute(&self, local_name: &LocalName, value: DOMString) { @@ -1368,7 +1481,8 @@ impl Element { let value = &**attr.value(); // XXXManishearth this doesn't handle `javascript:` urls properly let base = document_from_node(self).base_url(); - let value = base.join(value) + let value = base + .join(value) .map(|parsed| parsed.into_string()) .unwrap_or_else(|_| value.to_owned()); DOMString::from(value) @@ -1387,17 +1501,17 @@ impl Element { } pub fn get_tokenlist_attribute(&self, local_name: &LocalName) -> Vec { - self.get_attribute(&ns!(), local_name).map(|attr| { - attr.value() - .as_tokens() - .to_vec() - }).unwrap_or(vec!()) + self.get_attribute(&ns!(), local_name) + .map(|attr| attr.value().as_tokens().to_vec()) + .unwrap_or(vec![]) } pub fn set_tokenlist_attribute(&self, local_name: &LocalName, value: DOMString) { assert!(*local_name == local_name.to_ascii_lowercase()); - self.set_attribute(local_name, - AttrValue::from_serialized_tokenlist(value.into())); + self.set_attribute( + local_name, + AttrValue::from_serialized_tokenlist(value.into()), + ); } pub fn set_atomic_tokenlist_attribute(&self, local_name: &LocalName, tokens: Vec) { @@ -1407,19 +1521,21 @@ impl Element { pub fn get_int_attribute(&self, local_name: &LocalName, default: i32) -> i32 { // TODO: Is this assert necessary? - assert!(local_name.chars().all(|ch| { - !ch.is_ascii() || ch.to_ascii_lowercase() == ch - })); + assert!( + local_name + .chars() + .all(|ch| !ch.is_ascii() || ch.to_ascii_lowercase() == ch) + ); let attribute = self.get_attribute(&ns!(), local_name); match attribute { - Some(ref attribute) => { - match *attribute.value() { - AttrValue::Int(_, value) => value, - _ => panic!("Expected an AttrValue::Int: \ - implement parse_plain_attribute"), - } - } + Some(ref attribute) => match *attribute.value() { + AttrValue::Int(_, value) => value, + _ => panic!( + "Expected an AttrValue::Int: \ + implement parse_plain_attribute" + ), + }, None => default, } } @@ -1430,15 +1546,17 @@ impl Element { } pub fn get_uint_attribute(&self, local_name: &LocalName, default: u32) -> u32 { - assert!(local_name.chars().all(|ch| !ch.is_ascii() || ch.to_ascii_lowercase() == ch)); + assert!( + local_name + .chars() + .all(|ch| !ch.is_ascii() || ch.to_ascii_lowercase() == ch) + ); let attribute = self.get_attribute(&ns!(), local_name); match attribute { - Some(ref attribute) => { - match *attribute.value() { - AttrValue::UInt(_, value) => value, - _ => panic!("Expected an AttrValue::UInt: implement parse_plain_attribute"), - } - } + Some(ref attribute) => match *attribute.value() { + AttrValue::UInt(_, value) => value, + _ => panic!("Expected an AttrValue::UInt: implement parse_plain_attribute"), + }, None => default, } } @@ -1453,8 +1571,11 @@ impl Element { } // https://dom.spec.whatwg.org/#insert-adjacent - pub fn insert_adjacent(&self, where_: AdjacentPosition, node: &Node) - -> Fallible>> { + pub fn insert_adjacent( + &self, + where_: AdjacentPosition, + node: &Node, + ) -> Fallible>> { let self_node = self.upcast::(); match where_ { AdjacentPosition::BeforeBegin => { @@ -1463,20 +1584,18 @@ impl Element { } else { Ok(None) } - } + }, AdjacentPosition::AfterBegin => { Node::pre_insert(node, &self_node, self_node.GetFirstChild().r()).map(Some) - } - AdjacentPosition::BeforeEnd => { - Node::pre_insert(node, &self_node, None).map(Some) - } + }, + AdjacentPosition::BeforeEnd => Node::pre_insert(node, &self_node, None).map(Some), AdjacentPosition::AfterEnd => { if let Some(parent) = self_node.GetParentNode() { Node::pre_insert(node, &parent, self_node.GetNextSibling().r()).map(Some) } else { Ok(None) } - } + }, } } @@ -1513,17 +1632,15 @@ impl Element { // Step 9 if doc.GetBody().r() == self.downcast::() && - doc.quirks_mode() == QuirksMode::Quirks && - !self.potentially_scrollable() { - win.scroll(x, y, behavior); - return; + doc.quirks_mode() == QuirksMode::Quirks && + !self.potentially_scrollable() + { + win.scroll(x, y, behavior); + return; } // Step 10 - if !self.has_css_layout_box() || - !self.has_scrolling_box() || - !self.has_overflow() - { + if !self.has_css_layout_box() || !self.has_scrolling_box() || !self.has_overflow() { return; } @@ -1549,19 +1666,20 @@ impl Element { pub fn fragment_parsing_context(owner_doc: &Document, element: Option<&Self>) -> DomRoot { match element { - Some(elem) if elem.local_name() != &local_name!("html") || !elem.html_element_in_html_document() => { + Some(elem) + if elem.local_name() != &local_name!("html") || + !elem.html_element_in_html_document() => + { DomRoot::from_ref(elem) }, - _ => { - DomRoot::upcast(HTMLBodyElement::new(local_name!("body"), None, owner_doc)) - } + _ => DomRoot::upcast(HTMLBodyElement::new(local_name!("body"), None, owner_doc)), } } // https://fullscreen.spec.whatwg.org/#fullscreen-element-ready-check pub fn fullscreen_element_ready_check(&self) -> bool { if !self.is_connected() { - return false + return false; } let document = document_from_node(self); document.get_allow_fullscreen() @@ -1569,7 +1687,8 @@ impl Element { // https://html.spec.whatwg.org/multipage/#home-subtree pub fn is_in_same_home_subtree(&self, other: &T) -> bool - where T: DerivedFrom + DomObject + where + T: DerivedFrom + DomObject, { let other = other.upcast::(); self.root_element() == other.root_element() @@ -1597,10 +1716,8 @@ impl ElementMethods for Element { fn TagName(&self) -> DOMString { let name = self.tag_name.or_init(|| { let qualified_name = match *self.prefix.borrow() { - Some(ref prefix) => { - Cow::Owned(format!("{}:{}", &**prefix, &*self.local_name)) - }, - None => Cow::Borrowed(&*self.local_name) + Some(ref prefix) => Cow::Owned(format!("{}:{}", &**prefix, &*self.local_name)), + None => Cow::Borrowed(&*self.local_name), }; if self.html_element_in_html_document() { LocalName::from(qualified_name.to_ascii_uppercase()) @@ -1633,12 +1750,14 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-classlist fn ClassList(&self) -> DomRoot { - self.class_list.or_init(|| DOMTokenList::new(self, &local_name!("class"))) + self.class_list + .or_init(|| DOMTokenList::new(self, &local_name!("class"))) } // https://dom.spec.whatwg.org/#dom-element-attributes fn Attributes(&self) -> DomRoot { - self.attr_list.or_init(|| NamedNodeMap::new(&window_from_node(self), self)) + self.attr_list + .or_init(|| NamedNodeMap::new(&window_from_node(self), self)) } // https://dom.spec.whatwg.org/#dom-element-hasattributes @@ -1653,15 +1772,15 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-getattribute fn GetAttribute(&self, name: DOMString) -> Option { - self.GetAttributeNode(name) - .map(|s| s.Value()) + self.GetAttributeNode(name).map(|s| s.Value()) } // https://dom.spec.whatwg.org/#dom-element-getattributens - fn GetAttributeNS(&self, - namespace: Option, - local_name: DOMString) - -> Option { + fn GetAttributeNS( + &self, + namespace: Option, + local_name: DOMString, + ) -> Option { self.GetAttributeNodeNS(namespace, local_name) .map(|attr| attr.Value()) } @@ -1672,10 +1791,11 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-getattributenodens - fn GetAttributeNodeNS(&self, - namespace: Option, - local_name: DOMString) - -> Option> { + fn GetAttributeNodeNS( + &self, + namespace: Option, + local_name: DOMString, + ) -> Option> { let namespace = &namespace_from_domstring(namespace); self.get_attribute(namespace, &LocalName::from(local_name)) } @@ -1698,8 +1818,13 @@ impl ElementMethods for Element { // Step 4.1. None | Some(true) => { self.set_first_matching_attribute( - name.clone(), AttrValue::String(String::new()), name.clone(), ns!(), None, - |attr| *attr.name() == name); + name.clone(), + AttrValue::String(String::new()), + name.clone(), + ns!(), + None, + |attr| *attr.name() == name, + ); Ok(true) }, // Step 4.2. @@ -1729,24 +1854,30 @@ impl ElementMethods for Element { // Step 3-5. let value = self.parse_attribute(&ns!(), &name, value); - self.set_first_matching_attribute( - name.clone(), value, name.clone(), ns!(), None, - |attr| *attr.name() == name); + self.set_first_matching_attribute(name.clone(), value, name.clone(), ns!(), None, |attr| { + *attr.name() == name + }); Ok(()) } // https://dom.spec.whatwg.org/#dom-element-setattributens - fn SetAttributeNS(&self, - namespace: Option, - qualified_name: DOMString, - value: DOMString) -> ErrorResult { - let (namespace, prefix, local_name) = - validate_and_extract(namespace, &qualified_name)?; + fn SetAttributeNS( + &self, + namespace: Option, + qualified_name: DOMString, + value: DOMString, + ) -> ErrorResult { + let (namespace, prefix, local_name) = validate_and_extract(namespace, &qualified_name)?; let qualified_name = LocalName::from(qualified_name); let value = self.parse_attribute(&namespace, &local_name, value); self.set_first_matching_attribute( - local_name.clone(), value, qualified_name, namespace.clone(), prefix, - |attr| *attr.local_name() == local_name && *attr.namespace() == namespace); + local_name.clone(), + value, + qualified_name, + namespace.clone(), + prefix, + |attr| *attr.local_name() == local_name && *attr.namespace() == namespace, + ); Ok(()) } @@ -1764,9 +1895,7 @@ impl ElementMethods for Element { // This ensures that the attribute is of the expected kind for this // specific element. This is inefficient and should probably be done // differently. - attr.swap_value( - &mut vtable.parse_plain_attribute(attr.local_name(), attr.Value()), - ); + attr.swap_value(&mut vtable.parse_plain_attribute(attr.local_name(), attr.Value())); // Step 2. let position = self.attrs.borrow().iter().position(|old_attr| { @@ -1787,8 +1916,12 @@ impl ElementMethods for Element { let old_value = DOMString::from(&**old_attr.value()); let new_value = DOMString::from(&**attr.value()); let namespace = old_attr.namespace().clone(); - let reaction = CallbackReaction::AttributeChanged(old_name, Some(old_value), - Some(new_value), namespace); + let reaction = CallbackReaction::AttributeChanged( + old_name, + Some(old_value), + Some(new_value), + namespace, + ); ScriptThread::enqueue_callback_reaction(self, reaction, None); } self.will_mutate_attr(attr); @@ -1796,8 +1929,7 @@ impl ElementMethods for Element { self.attrs.borrow_mut()[position] = Dom::from_ref(attr); old_attr.set_owner(None); if attr.namespace() == &ns!() { - vtable.attribute_mutated( - &attr, AttributeMutation::Set(Some(&old_attr.value()))); + vtable.attribute_mutated(&attr, AttributeMutation::Set(Some(&old_attr.value()))); } // Step 6. @@ -1853,10 +1985,11 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-getelementsbytagnamens - fn GetElementsByTagNameNS(&self, - maybe_ns: Option, - localname: DOMString) - -> DomRoot { + fn GetElementsByTagNameNS( + &self, + maybe_ns: Option, + localname: DOMString, + ) -> DomRoot { let window = window_from_node(self); HTMLCollection::by_tag_name_ns(&window, self.upcast(), localname, maybe_ns) } @@ -1871,24 +2004,30 @@ impl ElementMethods for Element { fn GetClientRects(&self) -> Vec> { let win = window_from_node(self); let raw_rects = self.upcast::().content_boxes(); - raw_rects.iter().map(|rect| { - DOMRect::new(win.upcast(), - rect.origin.x.to_f64_px(), - rect.origin.y.to_f64_px(), - rect.size.width.to_f64_px(), - rect.size.height.to_f64_px()) - }).collect() + raw_rects + .iter() + .map(|rect| { + DOMRect::new( + win.upcast(), + rect.origin.x.to_f64_px(), + rect.origin.y.to_f64_px(), + rect.size.width.to_f64_px(), + rect.size.height.to_f64_px(), + ) + }).collect() } // https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect fn GetBoundingClientRect(&self) -> DomRoot { let win = window_from_node(self); let rect = self.upcast::().bounding_content_box_or_zero(); - DOMRect::new(win.upcast(), - rect.origin.x.to_f64_px(), - rect.origin.y.to_f64_px(), - rect.size.width.to_f64_px(), - rect.size.height.to_f64_px()) + DOMRect::new( + win.upcast(), + rect.origin.x.to_f64_px(), + rect.origin.y.to_f64_px(), + rect.size.width.to_f64_px(), + rect.size.height.to_f64_px(), + ) } // https://drafts.csswg.org/cssom-view/#dom-element-scroll @@ -1921,8 +2060,7 @@ impl ElementMethods for Element { let delta_top = options.top.unwrap_or(0.0f64); let left = self.ScrollLeft(); let top = self.ScrollTop(); - self.scroll(left + delta_left, top + delta_top, - options.parent.behavior); + self.scroll(left + delta_left, top + delta_top, options.parent.behavior); } // https://drafts.csswg.org/cssom-view/#dom-element-scrollby @@ -1962,12 +2100,12 @@ impl ElementMethods for Element { // Step 7 if doc.GetBody().r() == self.downcast::() && - doc.quirks_mode() == QuirksMode::Quirks && - !self.potentially_scrollable() { - return win.ScrollY() as f64; + doc.quirks_mode() == QuirksMode::Quirks && + !self.potentially_scrollable() + { + return win.ScrollY() as f64; } - // Step 8 if !self.has_css_layout_box() { return 0.0; @@ -2012,17 +2150,15 @@ impl ElementMethods for Element { // Step 9 if doc.GetBody().r() == self.downcast::() && - doc.quirks_mode() == QuirksMode::Quirks && - !self.potentially_scrollable() { - win.scroll(win.ScrollX() as f64, y, behavior); - return; + doc.quirks_mode() == QuirksMode::Quirks && + !self.potentially_scrollable() + { + win.scroll(win.ScrollX() as f64, y, behavior); + return; } // Step 10 - if !self.has_css_layout_box() || - !self.has_scrolling_box() || - !self.has_overflow() - { + if !self.has_css_layout_box() || !self.has_scrolling_box() || !self.has_overflow() { return; } @@ -2060,12 +2196,12 @@ impl ElementMethods for Element { // Step 7 if doc.GetBody().r() == self.downcast::() && - doc.quirks_mode() == QuirksMode::Quirks && - !self.potentially_scrollable() { - return win.ScrollX() as f64; + doc.quirks_mode() == QuirksMode::Quirks && + !self.potentially_scrollable() + { + return win.ScrollX() as f64; } - // Step 8 if !self.has_css_layout_box() { return 0.0; @@ -2111,17 +2247,15 @@ impl ElementMethods for Element { // Step 9 if doc.GetBody().r() == self.downcast::() && - doc.quirks_mode() == QuirksMode::Quirks && - !self.potentially_scrollable() { - win.scroll(x, win.ScrollY() as f64, behavior); - return; + doc.quirks_mode() == QuirksMode::Quirks && + !self.potentially_scrollable() + { + win.scroll(x, win.ScrollY() as f64, behavior); + return; } // Step 10 - if !self.has_css_layout_box() || - !self.has_scrolling_box() || - !self.has_overflow() - { + if !self.has_css_layout_box() || !self.has_scrolling_box() || !self.has_overflow() { return; } @@ -2161,9 +2295,11 @@ impl ElementMethods for Element { /// fn GetInnerHTML(&self) -> Fallible { - let qname = QualName::new(self.prefix().clone(), - self.namespace().clone(), - self.local_name().clone()); + let qname = QualName::new( + self.prefix().clone(), + self.namespace().clone(), + self.local_name().clone(), + ); if document_from_node(self).is_html_document() { return self.serialize(ChildrenOnly(Some(qname))); } else { @@ -2214,14 +2350,16 @@ impl ElementMethods for Element { // Step 4. NodeTypeId::DocumentFragment => { - let body_elem = Element::create(QualName::new(None, ns!(html), local_name!("body")), - None, - &context_document, - ElementCreator::ScriptCreated, - CustomElementCreationMode::Synchronous); + let body_elem = Element::create( + QualName::new(None, ns!(html), local_name!("body")), + None, + &context_document, + ElementCreator::ScriptCreated, + CustomElementCreationMode::Synchronous, + ); DomRoot::upcast(body_elem) }, - _ => context_node.GetParentElement().unwrap() + _ => context_node.GetParentElement().unwrap(), }; // Step 5. @@ -2233,12 +2371,18 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-previouselementsibling fn GetPreviousElementSibling(&self) -> Option> { - self.upcast::().preceding_siblings().filter_map(DomRoot::downcast).next() + self.upcast::() + .preceding_siblings() + .filter_map(DomRoot::downcast) + .next() } // https://dom.spec.whatwg.org/#dom-nondocumenttypechildnode-nextelementsibling fn GetNextElementSibling(&self) -> Option> { - self.upcast::().following_siblings().filter_map(DomRoot::downcast).next() + self.upcast::() + .following_siblings() + .filter_map(DomRoot::downcast) + .next() } // https://dom.spec.whatwg.org/#dom-parentnode-children @@ -2254,7 +2398,10 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-parentnode-lastelementchild fn GetLastElementChild(&self) -> Option> { - self.upcast::().rev_children().filter_map(DomRoot::downcast::).next() + self.upcast::() + .rev_children() + .filter_map(DomRoot::downcast::) + .next() } // https://dom.spec.whatwg.org/#dom-parentnode-childelementcount @@ -2306,11 +2453,10 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-matches fn Matches(&self, selectors: DOMString) -> Fallible { - let selectors = - match SelectorParser::parse_author_origin_no_namespace(&selectors) { - Err(_) => return Err(Error::Syntax), - Ok(selectors) => selectors, - }; + let selectors = match SelectorParser::parse_author_origin_no_namespace(&selectors) { + Err(_) => return Err(Error::Syntax), + Ok(selectors) => selectors, + }; let quirks_mode = document_from_node(self).quirks_mode(); let element = DomRoot::from_ref(self); @@ -2325,11 +2471,10 @@ impl ElementMethods for Element { // https://dom.spec.whatwg.org/#dom-element-closest fn Closest(&self, selectors: DOMString) -> Fallible>> { - let selectors = - match SelectorParser::parse_author_origin_no_namespace(&selectors) { - Err(_) => return Err(Error::Syntax), - Ok(selectors) => selectors, - }; + let selectors = match SelectorParser::parse_author_origin_no_namespace(&selectors) { + Err(_) => return Err(Error::Syntax), + Ok(selectors) => selectors, + }; let quirks_mode = document_from_node(self).quirks_mode(); Ok(dom_apis::element_closest( @@ -2340,16 +2485,18 @@ impl ElementMethods for Element { } // https://dom.spec.whatwg.org/#dom-element-insertadjacentelement - fn InsertAdjacentElement(&self, where_: DOMString, element: &Element) - -> Fallible>> { + fn InsertAdjacentElement( + &self, + where_: DOMString, + element: &Element, + ) -> Fallible>> { let where_ = where_.parse::()?; let inserted_node = self.insert_adjacent(where_, element.upcast())?; Ok(inserted_node.map(|node| DomRoot::downcast(node).unwrap())) } // https://dom.spec.whatwg.org/#dom-element-insertadjacenttext - fn InsertAdjacentText(&self, where_: DOMString, data: DOMString) - -> ErrorResult { + fn InsertAdjacentText(&self, where_: DOMString, data: DOMString) -> ErrorResult { // Step 1. let text = Text::new(data, &document_from_node(self)); @@ -2359,35 +2506,34 @@ impl ElementMethods for Element { } // https://w3c.github.io/DOM-Parsing/#dom-element-insertadjacenthtml - fn InsertAdjacentHTML(&self, position: DOMString, text: DOMString) - -> ErrorResult { + fn InsertAdjacentHTML(&self, position: DOMString, text: DOMString) -> ErrorResult { // Step 1. let position = position.parse::()?; let context = match position { - AdjacentPosition::BeforeBegin | AdjacentPosition::AfterEnd => { - match self.upcast::().GetParentNode() { - Some(ref node) if node.is::() => { - return Err(Error::NoModificationAllowed) - } - None => return Err(Error::NoModificationAllowed), - Some(node) => node, - } - } + AdjacentPosition::BeforeBegin | AdjacentPosition::AfterEnd => match self + .upcast::() + .GetParentNode() + { + Some(ref node) if node.is::() => return Err(Error::NoModificationAllowed), + None => return Err(Error::NoModificationAllowed), + Some(node) => node, + }, AdjacentPosition::AfterBegin | AdjacentPosition::BeforeEnd => { DomRoot::from_ref(self.upcast::()) - } + }, }; // Step 2. - let context = Element::fragment_parsing_context( - &context.owner_doc(), context.downcast::()); + let context = + Element::fragment_parsing_context(&context.owner_doc(), context.downcast::()); // Step 3. let fragment = context.parse_fragment(text)?; // Step 4. - self.insert_adjacent(position, fragment.upcast()).map(|_| ()) + self.insert_adjacent(position, fragment.upcast()) + .map(|_| ()) } // check-tidy: no specs after this line @@ -2397,7 +2543,7 @@ impl ElementMethods for Element { a.enter_formal_activation_state(); return Ok(()); }, - None => return Err(Error::NotSupported) + None => return Err(Error::NotSupported), } } @@ -2407,7 +2553,7 @@ impl ElementMethods for Element { a.exit_formal_activation_state(); return Ok(()); }, - None => return Err(Error::NotSupported) + None => return Err(Error::NotSupported), } } @@ -2426,12 +2572,14 @@ impl VirtualMethods for Element { fn attribute_affects_presentational_hints(&self, attr: &Attr) -> bool { // FIXME: This should be more fine-grained, not all elements care about these. - if attr.local_name() == &local_name!("width") || - attr.local_name() == &local_name!("height") { + if attr.local_name() == &local_name!("width") || attr.local_name() == &local_name!("height") + { return true; } - self.super_type().unwrap().attribute_affects_presentational_hints(attr) + self.super_type() + .unwrap() + .attribute_affects_presentational_hints(attr) } fn attribute_mutated(&self, attr: &Attr, mutation: AttributeMutation) { @@ -2469,26 +2617,24 @@ impl VirtualMethods for Element { &attr.value(), &doc.base_url(), win.css_error_reporter(), - doc.quirks_mode()))) + doc.quirks_mode(), + ))) }; Some(block) - } - AttributeMutation::Removed => { - None - } + }, + AttributeMutation::Removed => None, }; }, &local_name!("id") => { - *self.id_attribute.borrow_mut() = - mutation.new_value(attr).and_then(|value| { - let value = value.as_atom(); - if value != &atom!("") { - Some(value.clone()) - } else { - None - } - }); + *self.id_attribute.borrow_mut() = mutation.new_value(attr).and_then(|value| { + let value = value.as_atom(); + if value != &atom!("") { + Some(value.clone()) + } else { + None + } + }); if node.is_in_doc() { let value = attr.value().as_atom().clone(); match mutation { @@ -2505,15 +2651,14 @@ impl VirtualMethods for Element { if value != atom!("") { doc.unregister_named_element(self, value); } - } + }, } } }, _ => { // FIXME(emilio): This is pretty dubious, and should be done in // the relevant super-classes. - if attr.namespace() == &ns!() && - attr.local_name() == &local_name!("src") { + if attr.namespace() == &ns!() && attr.local_name() == &local_name!("src") { node.dirty(NodeDamage::OtherNodeDamage); } }, @@ -2529,7 +2674,10 @@ impl VirtualMethods for Element { match name { &local_name!("id") => AttrValue::from_atomic(value.into()), &local_name!("class") => AttrValue::from_serialized_tokenlist(value.into()), - _ => self.super_type().unwrap().parse_plain_attribute(name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(name, value), } } @@ -2644,29 +2792,32 @@ impl<'a> SelectorsElement for DomRoot { } fn prev_sibling_element(&self) -> Option> { - self.node.preceding_siblings().filter_map(DomRoot::downcast).next() + self.node + .preceding_siblings() + .filter_map(DomRoot::downcast) + .next() } fn next_sibling_element(&self) -> Option> { - self.node.following_siblings().filter_map(DomRoot::downcast).next() + self.node + .following_siblings() + .filter_map(DomRoot::downcast) + .next() } - fn attr_matches(&self, - ns: &NamespaceConstraint<&Namespace>, - local_name: &LocalName, - operation: &AttrSelectorOperation<&String>) - -> bool { + fn attr_matches( + &self, + ns: &NamespaceConstraint<&Namespace>, + local_name: &LocalName, + operation: &AttrSelectorOperation<&String>, + ) -> bool { match *ns { - NamespaceConstraint::Specific(ref ns) => { - self.get_attribute(ns, local_name) - .map_or(false, |attr| attr.value().eval_selector(operation)) - } - NamespaceConstraint::Any => { - self.attrs.borrow().iter().any(|attr| { - attr.local_name() == local_name && - attr.value().eval_selector(operation) - }) - } + NamespaceConstraint::Specific(ref ns) => self + .get_attribute(ns, local_name) + .map_or(false, |attr| attr.value().eval_selector(operation)), + NamespaceConstraint::Any => self.attrs.borrow().iter().any(|attr| { + attr.local_name() == local_name && attr.value().eval_selector(operation) + }), } } @@ -2678,9 +2829,11 @@ impl<'a> SelectorsElement for DomRoot { } fn is_empty(&self) -> bool { - self.node.children().all(|node| !node.is::() && match node.downcast::() { - None => true, - Some(text) => text.upcast::().data().is_empty() + self.node.children().all(|node| { + !node.is::() && match node.downcast::() { + None => true, + Some(text) => text.upcast::().data().is_empty(), + } }) } @@ -2703,26 +2856,20 @@ impl<'a> SelectorsElement for DomRoot { { match *pseudo_class { // https://github.com/servo/servo/issues/8718 - NonTSPseudoClass::Link | - NonTSPseudoClass::AnyLink => self.is_link(), + NonTSPseudoClass::Link | NonTSPseudoClass::AnyLink => self.is_link(), NonTSPseudoClass::Visited => false, - NonTSPseudoClass::ServoNonZeroBorder => { - match self.downcast::() { - None => false, - Some(this) => { - match this.get_border() { - None | Some(0) => false, - Some(_) => true, - } - } - } + NonTSPseudoClass::ServoNonZeroBorder => match self.downcast::() { + None => false, + Some(this) => match this.get_border() { + None | Some(0) => false, + Some(_) => true, + }, }, - NonTSPseudoClass::ServoCaseSensitiveTypeAttr(ref expected_value) => { - self.get_attribute(&ns!(), &local_name!("type")) - .map_or(false, |attr| attr.value().eq(expected_value)) - } + NonTSPseudoClass::ServoCaseSensitiveTypeAttr(ref expected_value) => self + .get_attribute(&ns!(), &local_name!("type")) + .map_or(false, |attr| attr.value().eq(expected_value)), // FIXME(heycam): This is wrong, since extended_filtering accepts // a string containing commas (separating each language tag in @@ -2730,8 +2877,7 @@ impl<'a> SelectorsElement for DomRoot { // storing separate or s for each language tag. NonTSPseudoClass::Lang(ref lang) => extended_filtering(&*self.get_lang(), &*lang), - NonTSPseudoClass::ReadOnly => - !Element::state(self).contains(pseudo_class.state_flag()), + NonTSPseudoClass::ReadOnly => !Element::state(self).contains(pseudo_class.state_flag()), NonTSPseudoClass::Active | NonTSPseudoClass::Focus | @@ -2743,8 +2889,7 @@ impl<'a> SelectorsElement for DomRoot { NonTSPseudoClass::Indeterminate | NonTSPseudoClass::ReadWrite | NonTSPseudoClass::PlaceholderShown | - NonTSPseudoClass::Target => - Element::state(self).contains(pseudo_class.state_flag()), + NonTSPseudoClass::Target => Element::state(self).contains(pseudo_class.state_flag()), } } @@ -2753,7 +2898,9 @@ impl<'a> SelectorsElement for DomRoot { let node = self.upcast::(); match node.type_id() { // https://html.spec.whatwg.org/multipage/#selector-link - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLAnchorElement, + )) | NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) | NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => { self.has_attribute(&local_name!("href")) @@ -2763,7 +2910,10 @@ impl<'a> SelectorsElement for DomRoot { } fn has_id(&self, id: &Atom, case_sensitivity: CaseSensitivity) -> bool { - self.id_attribute.borrow().as_ref().map_or(false, |atom| case_sensitivity.eq_atom(id, atom)) + self.id_attribute + .borrow() + .as_ref() + .map_or(false, |atom| case_sensitivity.eq_atom(id, atom)) } fn has_class(&self, name: &Atom, case_sensitivity: CaseSensitivity) -> bool { @@ -2779,29 +2929,34 @@ impl<'a> SelectorsElement for DomRoot { } } - impl Element { pub fn as_maybe_activatable(&self) -> Option<&Activatable> { let element = match self.upcast::().type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLInputElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Activatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLButtonElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Activatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLAnchorElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Activatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLabelElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLLabelElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Activatable) }, - _ => { - None - } + _ => None, }; element.and_then(|elem| { if elem.is_instance_activatable() { @@ -2814,11 +2969,11 @@ impl Element { pub fn as_stylesheet_owner(&self) -> Option<&StylesheetOwner> { if let Some(s) = self.downcast::() { - return Some(s as &StylesheetOwner) + return Some(s as &StylesheetOwner); } if let Some(l) = self.downcast::() { - return Some(l as &StylesheetOwner) + return Some(l as &StylesheetOwner); } None @@ -2827,29 +2982,37 @@ impl Element { // https://html.spec.whatwg.org/multipage/#category-submit pub fn as_maybe_validatable(&self) -> Option<&Validatable> { let element = match self.upcast::().type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLInputElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLInputElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Validatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLButtonElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Validatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLObjectElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLObjectElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Validatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLSelectElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Validatable) }, - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLTextAreaElement, + )) => { let element = self.downcast::().unwrap(); Some(element as &Validatable) }, - _ => { - None - } + _ => None, }; element } @@ -2859,7 +3022,8 @@ impl Element { } pub fn set_click_in_progress(&self, click: bool) { - self.upcast::().set_flag(NodeFlags::CLICK_IN_PROGRESS, click) + self.upcast::() + .set_flag(NodeFlags::CLICK_IN_PROGRESS, click) } // https://html.spec.whatwg.org/multipage/#nearest-activatable-element @@ -2876,7 +3040,7 @@ impl Element { } } None - } + }, } } @@ -2911,16 +3075,16 @@ impl Element { } else { elem.canceled_activation(); } - } + }, // Step 6 None => { event.fire(target); - } + }, }, // Step 6 None => { event.fire(target); - } + }, } // Step 7 self.set_click_in_progress(false); @@ -2928,15 +3092,18 @@ impl Element { // https://html.spec.whatwg.org/multipage/#language pub fn get_lang(&self) -> String { - self.upcast::().inclusive_ancestors().filter_map(|node| { - node.downcast::().and_then(|el| { - el.get_attribute(&ns!(xml), &local_name!("lang")).or_else(|| { - el.get_attribute(&ns!(), &local_name!("lang")) - }).map(|attr| String::from(attr.Value())) - }) - // TODO: Check meta tags for a pragma-set default language - // TODO: Check HTTP Content-Language header - }).next().unwrap_or(String::new()) + self.upcast::() + .inclusive_ancestors() + .filter_map(|node| { + node.downcast::().and_then(|el| { + el.get_attribute(&ns!(xml), &local_name!("lang")) + .or_else(|| el.get_attribute(&ns!(), &local_name!("lang"))) + .map(|attr| String::from(attr.Value())) + }) + // TODO: Check meta tags for a pragma-set default language + // TODO: Check HTTP Content-Language header + }).next() + .unwrap_or(String::new()) } pub fn state(&self) -> ElementState { @@ -3013,7 +3180,9 @@ impl Element { } pub fn placeholder_shown_state(&self) -> bool { - self.state.get().contains(ElementState::IN_PLACEHOLDER_SHOWN_STATE) + self.state + .get() + .contains(ElementState::IN_PLACEHOLDER_SHOWN_STATE) } pub fn set_placeholder_shown_state(&self, value: bool) { @@ -3084,7 +3253,8 @@ impl Element { let node = self.upcast::(); if let Some(ref parent) = node.GetParentNode() { if parent.is::() && - parent.downcast::().unwrap().disabled_state() { + parent.downcast::().unwrap().disabled_state() + { self.set_disabled_state(true); self.set_enabled_state(false); } @@ -3135,13 +3305,16 @@ struct TagName { impl TagName { fn new() -> TagName { - TagName { ptr: DomRefCell::new(None) } + TagName { + ptr: DomRefCell::new(None), + } } /// Retrieve a copy of the current inner value. If it is `None`, it is /// initialized with the result of `cb` first. fn or_init(&self, cb: F) -> LocalName - where F: FnOnce() -> LocalName + where + F: FnOnce() -> LocalName, { match &mut *self.ptr.borrow_mut() { &mut Some(ref name) => name.clone(), @@ -3149,7 +3322,7 @@ impl TagName { let name = cb(); *ptr = Some(name.clone()); name - } + }, } } @@ -3167,7 +3340,11 @@ pub struct ElementPerformFullscreenEnter { } impl ElementPerformFullscreenEnter { - pub fn new(element: Trusted, promise: TrustedPromise, error: bool) -> Box { + pub fn new( + element: Trusted, + promise: TrustedPromise, + error: bool, + ) -> Box { Box::new(ElementPerformFullscreenEnter { element: element, promise: promise, @@ -3185,19 +3362,25 @@ impl TaskOnce for ElementPerformFullscreenEnter { // Step 7.1 if self.error || !element.fullscreen_element_ready_check() { - document.upcast::().fire_event(atom!("fullscreenerror")); + document + .upcast::() + .fire_event(atom!("fullscreenerror")); promise.reject_error(Error::Type(String::from("fullscreen is not connected"))); - return + return; } // TODO Step 7.2-4 // Step 7.5 element.set_fullscreen_state(true); document.set_fullscreen_element(Some(&element)); - document.window().reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); + document + .window() + .reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); // Step 7.6 - document.upcast::().fire_event(atom!("fullscreenchange")); + document + .upcast::() + .fire_event(atom!("fullscreenchange")); // Step 7.7 promise.resolve_native(&()); @@ -3210,7 +3393,10 @@ pub struct ElementPerformFullscreenExit { } impl ElementPerformFullscreenExit { - pub fn new(element: Trusted, promise: TrustedPromise) -> Box { + pub fn new( + element: Trusted, + promise: TrustedPromise, + ) -> Box { Box::new(ElementPerformFullscreenExit { element: element, promise: promise, @@ -3227,12 +3413,16 @@ impl TaskOnce for ElementPerformFullscreenExit { // Step 9.6 element.set_fullscreen_state(false); - document.window().reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); + document + .window() + .reflow(ReflowGoal::Full, ReflowReason::ElementStateChanged); document.set_fullscreen_element(None); // Step 9.8 - document.upcast::().fire_event(atom!("fullscreenchange")); + document + .upcast::() + .fire_event(atom!("fullscreenchange")); // Step 9.10 self.promise.root().resolve_native(&()); @@ -3257,16 +3447,14 @@ pub fn set_cross_origin_attribute(element: &Element, value: Option) { Some(val) => element.set_string_attribute(&local_name!("crossorigin"), val), None => { element.remove_attribute(&ns!(), &local_name!("crossorigin")); - } + }, } } pub fn cors_setting_for_element(element: &Element) -> Option { - reflect_cross_origin_attribute(element).map_or(None, |attr| { - match &*attr { - "anonymous" => Some(CorsSettings::Anonymous), - "use-credentials" => Some(CorsSettings::UseCredentials), - _ => unreachable!() - } + reflect_cross_origin_attribute(element).map_or(None, |attr| match &*attr { + "anonymous" => Some(CorsSettings::Anonymous), + "use-credentials" => Some(CorsSettings::UseCredentials), + _ => unreachable!(), }) } diff --git a/components/script/dom/errorevent.rs b/components/script/dom/errorevent.rs index 2571040aaac..3056175f89f 100644 --- a/components/script/dom/errorevent.rs +++ b/components/script/dom/errorevent.rs @@ -40,30 +40,33 @@ impl ErrorEvent { filename: DomRefCell::new(DOMString::new()), lineno: Cell::new(0), colno: Cell::new(0), - error: Heap::default() + error: Heap::default(), } } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(ErrorEvent::new_inherited()), - global, - ErrorEventBinding::Wrap) + reflect_dom_object( + Box::new(ErrorEvent::new_inherited()), + global, + ErrorEventBinding::Wrap, + ) } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable, - message: DOMString, - filename: DOMString, - lineno: u32, - colno: u32, - error: HandleValue) -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + message: DOMString, + filename: DOMString, + lineno: u32, + colno: u32, + error: HandleValue, + ) -> DomRoot { let ev = ErrorEvent::new_uninitialized(global); { let event = ev.upcast::(); - event.init_event(type_, bool::from(bubbles), - bool::from(cancelable)); + event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); *ev.message.borrow_mut() = message; *ev.filename.borrow_mut() = filename; ev.lineno.set(lineno); @@ -73,10 +76,11 @@ impl ErrorEvent { ev } - pub fn Constructor(global: &GlobalScope, - type_: DOMString, - init: RootedTraceableBox) - -> Fallible>{ + pub fn Constructor( + global: &GlobalScope, + type_: DOMString, + init: RootedTraceableBox, + ) -> Fallible> { let msg = match init.message.as_ref() { Some(message) => message.clone(), None => DOMString::new(), @@ -96,18 +100,18 @@ impl ErrorEvent { let cancelable = EventCancelable::from(init.parent.cancelable); let event = ErrorEvent::new( - global, - Atom::from(type_), - bubbles, - cancelable, - msg, - file_name, - line_num, - col_num, - init.error.handle()); + global, + Atom::from(type_), + bubbles, + cancelable, + msg, + file_name, + line_num, + col_num, + init.error.handle(), + ); Ok(event) } - } impl ErrorEventMethods for ErrorEvent { diff --git a/components/script/dom/event.rs b/components/script/dom/event.rs index 71b456e24cc..46150cee78c 100644 --- a/components/script/dom/event.rs +++ b/components/script/dom/event.rs @@ -65,23 +65,25 @@ impl Event { } pub fn new_uninitialized(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(Event::new_inherited()), - global, - EventBinding::Wrap) + reflect_dom_object(Box::new(Event::new_inherited()), global, EventBinding::Wrap) } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) -> DomRoot { let event = Event::new_uninitialized(global); event.init_event(type_, bool::from(bubbles), bool::from(cancelable)); event } - pub fn Constructor(global: &GlobalScope, - type_: DOMString, - init: &EventBinding::EventInit) -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + type_: DOMString, + init: &EventBinding::EventInit, + ) -> Fallible> { let bubbles = EventBubbles::from(init.bubbles); let cancelable = EventCancelable::from(init.cancelable); Ok(Event::new(global, Atom::from(type_), bubbles, cancelable)) @@ -110,7 +112,9 @@ impl Event { // https://dom.spec.whatwg.org/#event-listener-removed let mut event_path = self.construct_event_path(&target); event_path.push(DomRoot::from_ref(target)); - event_path.iter().any(|target| target.has_listeners_for(type_)) + event_path + .iter() + .any(|target| target.has_listeners_for(type_)) } // https://dom.spec.whatwg.org/#event-path @@ -122,8 +126,10 @@ impl Event { for ancestor in target_node.ancestors() { event_path.push(DomRoot::from_ref(ancestor.upcast::())); } - let top_most_ancestor_or_target = - event_path.last().cloned().unwrap_or(DomRoot::from_ref(target)); + let top_most_ancestor_or_target = event_path + .last() + .cloned() + .unwrap_or(DomRoot::from_ref(target)); if let Some(document) = DomRoot::downcast::(top_most_ancestor_or_target) { if self.type_() != atom!("load") && document.browsing_context().is_some() { event_path.push(DomRoot::from_ref(document.window().upcast())); @@ -134,10 +140,11 @@ impl Event { } // https://dom.spec.whatwg.org/#concept-event-dispatch - pub fn dispatch(&self, - target: &EventTarget, - target_override: Option<&EventTarget>) - -> EventStatus { + pub fn dispatch( + &self, + target: &EventTarget, + target_override: Option<&EventTarget>, + ) -> EventStatus { assert!(!self.dispatching()); assert!(self.initialized()); assert_eq!(self.phase.get(), EventPhase::None); @@ -184,7 +191,7 @@ impl Event { pub fn status(&self) -> EventStatus { match self.DefaultPrevented() { true => EventStatus::Canceled, - false => EventStatus::NotCanceled + false => EventStatus::NotCanceled, } } @@ -296,11 +303,8 @@ impl EventMethods for Event { } // https://dom.spec.whatwg.org/#dom-event-initevent - fn InitEvent(&self, - type_: DOMString, - bubbles: bool, - cancelable: bool) { - self.init_event(Atom::from(type_), bubbles, cancelable) + fn InitEvent(&self, type_: DOMString, bubbles: bool, cancelable: bool) { + self.init_event(Atom::from(type_), bubbles, cancelable) } // https://dom.spec.whatwg.org/#dom-event-istrusted @@ -312,14 +316,14 @@ impl EventMethods for Event { #[derive(Clone, Copy, MallocSizeOf, PartialEq)] pub enum EventBubbles { Bubbles, - DoesNotBubble + DoesNotBubble, } impl From for EventBubbles { fn from(boolean: bool) -> Self { match boolean { true => EventBubbles::Bubbles, - false => EventBubbles::DoesNotBubble + false => EventBubbles::DoesNotBubble, } } } @@ -328,7 +332,7 @@ impl From for bool { fn from(bubbles: EventBubbles) -> Self { match bubbles { EventBubbles::Bubbles => true, - EventBubbles::DoesNotBubble => false + EventBubbles::DoesNotBubble => false, } } } @@ -336,14 +340,14 @@ impl From for bool { #[derive(Clone, Copy, MallocSizeOf, PartialEq)] pub enum EventCancelable { Cancelable, - NotCancelable + NotCancelable, } impl From for EventCancelable { fn from(boolean: bool) -> Self { match boolean { true => EventCancelable::Cancelable, - false => EventCancelable::NotCancelable + false => EventCancelable::NotCancelable, } } } @@ -352,7 +356,7 @@ impl From for bool { fn from(bubbles: EventCancelable) -> Self { match bubbles { EventCancelable::Cancelable => true, - EventCancelable::NotCancelable => false + EventCancelable::NotCancelable => false, } } } @@ -361,10 +365,10 @@ impl From for bool { #[repr(u16)] #[derive(MallocSizeOf)] pub enum EventPhase { - None = EventConstants::NONE, + None = EventConstants::NONE, Capturing = EventConstants::CAPTURING_PHASE, - AtTarget = EventConstants::AT_TARGET, - Bubbling = EventConstants::BUBBLING_PHASE, + AtTarget = EventConstants::AT_TARGET, + Bubbling = EventConstants::BUBBLING_PHASE, } /// An enum to indicate whether the default action of an event is allowed. @@ -392,7 +396,7 @@ pub enum EventDefault { #[derive(PartialEq)] pub enum EventStatus { Canceled, - NotCanceled + NotCanceled, } // https://dom.spec.whatwg.org/#concept-event-fire @@ -483,10 +487,12 @@ fn dispatch_to_listeners(event: &Event, target: &EventTarget, event_path: &[&Eve } // https://dom.spec.whatwg.org/#concept-event-listener-invoke -fn invoke(window: Option<&Window>, - object: &EventTarget, - event: &Event, - specific_listener_phase: Option) { +fn invoke( + window: Option<&Window>, + object: &EventTarget, + event: &Event, + specific_listener_phase: Option, +) { // Step 1. assert!(!event.stop_propagation.get()); @@ -503,11 +509,12 @@ fn invoke(window: Option<&Window>, } // https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke -fn inner_invoke(window: Option<&Window>, - object: &EventTarget, - event: &Event, - listeners: &[CompiledEventListener]) - -> bool { +fn inner_invoke( + window: Option<&Window>, + object: &EventTarget, + event: &Event, + listeners: &[CompiledEventListener], +) -> bool { // Step 1. let mut found = false; diff --git a/components/script/dom/eventsource.rs b/components/script/dom/eventsource.rs index 072a3dd0080..574b39e0623 100644 --- a/components/script/dom/eventsource.rs +++ b/components/script/dom/eventsource.rs @@ -51,7 +51,7 @@ struct GenerationId(u32); enum ReadyState { Connecting = 0, Open = 1, - Closed = 2 + Closed = 2, } #[dom_struct] @@ -72,7 +72,7 @@ enum ParserState { Field, Comment, Value, - Eol + Eol, } struct EventSourceContext { @@ -177,12 +177,12 @@ impl EventSourceContext { "data" => { self.data.push_str(&self.value); self.data.push('\n'); - } + }, "id" => mem::swap(&mut self.last_event_id, &mut self.value), "retry" => if let Ok(time) = u64::from_str(&self.value) { self.event_source.root().reconnection_time.set(time); }, - _ => () + _ => (), } self.field.clear(); @@ -215,13 +215,24 @@ impl EventSourceContext { }; // Steps 4-5 let event = { - let _ac = JSAutoCompartment::new(event_source.global().get_cx(), - event_source.reflector().get_jsobject().get()); + let _ac = JSAutoCompartment::new( + event_source.global().get_cx(), + event_source.reflector().get_jsobject().get(), + ); rooted!(in(event_source.global().get_cx()) let mut data = UndefinedValue()); - unsafe { self.data.to_jsval(event_source.global().get_cx(), data.handle_mut()) }; - MessageEvent::new(&*event_source.global(), type_, false, false, data.handle(), - DOMString::from(self.origin.clone()), - event_source.last_event_id.borrow().clone()) + unsafe { + self.data + .to_jsval(event_source.global().get_cx(), data.handle_mut()) + }; + MessageEvent::new( + &*event_source.global(), + type_, + false, + false, + data.handle(), + DOMString::from(self.origin.clone()), + event_source.last_event_id.borrow().clone(), + ) }; // Step 7 self.event_type.clear(); @@ -255,31 +266,31 @@ impl EventSourceContext { if let Some(&' ') = stream.peek() { stream.next(); } - } + }, ('\n', &ParserState::Value) => { self.parser_state = ParserState::Eol; self.process_field(); - } + }, ('\r', &ParserState::Value) => { if let Some(&'\n') = stream.peek() { continue; } self.parser_state = ParserState::Eol; self.process_field(); - } + }, ('\n', &ParserState::Field) => { self.parser_state = ParserState::Eol; self.process_field(); - } + }, ('\r', &ParserState::Field) => { if let Some(&'\n') = stream.peek() { continue; } self.parser_state = ParserState::Eol; self.process_field(); - } + }, ('\n', &ParserState::Eol) => self.dispatch_event(), ('\r', &ParserState::Eol) => { @@ -287,7 +298,7 @@ impl EventSourceContext { continue; } self.dispatch_event(); - } + }, ('\n', &ParserState::Comment) => self.parser_state = ParserState::Eol, ('\r', &ParserState::Comment) => { @@ -295,14 +306,14 @@ impl EventSourceContext { continue; } self.parser_state = ParserState::Eol; - } + }, (_, &ParserState::Field) => self.field.push(ch), (_, &ParserState::Value) => self.value.push(ch), (_, &ParserState::Eol) => { self.parser_state = ParserState::Field; self.field.push(ch); - } + }, (_, &ParserState::Comment) => (), } } @@ -323,7 +334,7 @@ impl FetchResponseListener for EventSourceContext { Ok(fm) => { let meta = match fm { FetchMetadata::Unfiltered(m) => m, - FetchMetadata::Filtered { unsafe_, .. } => unsafe_ + FetchMetadata::Filtered { unsafe_, .. } => unsafe_, }; match meta.content_type { None => self.fail_the_connection(), @@ -331,14 +342,14 @@ impl FetchResponseListener for EventSourceContext { Mime(TopLevel::Text, SubLevel::EventStream, _) => { self.origin = meta.final_url.origin().unicode_serialization(); self.announce_the_connection(); - } - _ => self.fail_the_connection() - } + }, + _ => self.fail_the_connection(), + }, } - } + }, Err(_) => { self.reestablish_the_connection(); - } + }, } } @@ -350,7 +361,7 @@ impl FetchResponseListener for EventSourceContext { Some((result, remaining_input)) => { self.parse(result.unwrap_or("\u{FFFD}").chars()); input = remaining_input; - } + }, } } @@ -358,18 +369,25 @@ impl FetchResponseListener for EventSourceContext { match utf8::decode(&input) { Ok(s) => { self.parse(s.chars()); - return - } - Err(utf8::DecodeError::Invalid { valid_prefix, remaining_input, .. }) => { + return; + }, + Err(utf8::DecodeError::Invalid { + valid_prefix, + remaining_input, + .. + }) => { self.parse(valid_prefix.chars()); self.parse("\u{FFFD}".chars()); input = remaining_input; - } - Err(utf8::DecodeError::Incomplete { valid_prefix, incomplete_suffix }) => { + }, + Err(utf8::DecodeError::Incomplete { + valid_prefix, + incomplete_suffix, + }) => { self.parse(valid_prefix.chars()); self.incomplete_utf8 = Some(incomplete_suffix); - return - } + return; + }, } } } @@ -400,14 +418,16 @@ impl EventSource { ready_state: Cell::new(ReadyState::Connecting), with_credentials: with_credentials, - canceller: DomRefCell::new(Default::default()) + canceller: DomRefCell::new(Default::default()), } } fn new(global: &GlobalScope, url: ServoUrl, with_credentials: bool) -> DomRoot { - reflect_dom_object(Box::new(EventSource::new_inherited(url, with_credentials)), - global, - Wrap) + reflect_dom_object( + Box::new(EventSource::new_inherited(url, with_credentials)), + global, + Wrap, + ) } // https://html.spec.whatwg.org/multipage/#sse-processing-model:fail-the-connection-3 @@ -438,19 +458,25 @@ impl EventSource { } // https://html.spec.whatwg.org/multipage/#dom-eventsource - pub fn Constructor(global: &GlobalScope, - url: DOMString, - event_source_init: &EventSourceInit) -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + url: DOMString, + event_source_init: &EventSourceInit, + ) -> Fallible> { // TODO: Step 2 relevant settings object // Step 3 let base_url = global.api_base_url(); let url_record = match base_url.join(&*url) { Ok(u) => u, // Step 4 - Err(_) => return Err(Error::Syntax) + Err(_) => return Err(Error::Syntax), }; // Step 1, 5 - let ev = EventSource::new(global, url_record.clone(), event_source_init.withCredentials); + let ev = EventSource::new( + global, + url_record.clone(), + event_source_init.withCredentials, + ); global.track_event_source(&ev); // Steps 6-7 let cors_attribute_state = if event_source_init.withCredentials { @@ -475,7 +501,9 @@ impl EventSource { ..RequestInit::default() }; // Step 10 - request.headers.set(Accept(vec![qitem(mime!(Text / EventStream))])); + request + .headers + .set(Accept(vec![qitem(mime!(Text / EventStream))])); // Step 11 request.cache_mode = CacheMode::NoStore; // Step 12 @@ -501,14 +529,21 @@ impl EventSource { let listener = NetworkListener { context: Arc::new(Mutex::new(context)), task_source: global.networking_task_source(), - canceller: Some(global.task_canceller(TaskSourceName::Networking)) + canceller: Some(global.task_canceller(TaskSourceName::Networking)), }; - ROUTER.add_route(action_receiver.to_opaque(), Box::new(move |message| { - listener.notify_fetch(message.to().unwrap()); - })); + ROUTER.add_route( + action_receiver.to_opaque(), + Box::new(move |message| { + listener.notify_fetch(message.to().unwrap()); + }), + ); let cancel_receiver = ev.canceller.borrow_mut().initialize(); - global.core_resource_thread().send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(action_sender, Some(cancel_receiver)))).unwrap(); + global + .core_resource_thread() + .send(CoreResourceMsg::Fetch( + request, + FetchChannels::ResponseMsg(action_sender, Some(cancel_receiver)), + )).unwrap(); // Step 13 Ok(ev) } @@ -578,10 +613,16 @@ impl EventSourceTimeoutCallback { let mut request = event_source.request(); // Step 5.3 if !event_source.last_event_id.borrow().is_empty() { - request.headers.set(LastEventId(String::from(event_source.last_event_id.borrow().clone()))); + request.headers.set(LastEventId(String::from( + event_source.last_event_id.borrow().clone(), + ))); } // Step 5.4 - global.core_resource_thread().send( - CoreResourceMsg::Fetch(request, FetchChannels::ResponseMsg(self.action_sender, None))).unwrap(); + global + .core_resource_thread() + .send(CoreResourceMsg::Fetch( + request, + FetchChannels::ResponseMsg(self.action_sender, None), + )).unwrap(); } } diff --git a/components/script/dom/eventtarget.rs b/components/script/dom/eventtarget.rs index 3d028a00cdb..e012f2f13ff 100644 --- a/components/script/dom/eventtarget.rs +++ b/components/script/dom/eventtarget.rs @@ -52,17 +52,11 @@ use std::rc::Rc; #[derive(Clone, JSTraceable, MallocSizeOf, PartialEq)] pub enum CommonEventHandler { - EventHandler( - #[ignore_malloc_size_of = "Rc"] - Rc), + EventHandler(#[ignore_malloc_size_of = "Rc"] Rc), - ErrorEventHandler( - #[ignore_malloc_size_of = "Rc"] - Rc), + ErrorEventHandler(#[ignore_malloc_size_of = "Rc"] Rc), - BeforeUnloadEventHandler( - #[ignore_malloc_size_of = "Rc"] - Rc), + BeforeUnloadEventHandler(#[ignore_malloc_size_of = "Rc"] Rc), } impl CommonEventHandler { @@ -101,8 +95,11 @@ impl InlineEventListener { /// Get a compiled representation of this event handler, compiling it from its /// raw source if necessary. /// - fn get_compiled_handler(&mut self, owner: &EventTarget, ty: &Atom) - -> Option { + fn get_compiled_handler( + &mut self, + owner: &EventTarget, + ty: &Atom, + ) -> Option { match mem::replace(self, InlineEventListener::Null) { InlineEventListener::Null => None, InlineEventListener::Uncompiled(handler) => { @@ -111,11 +108,11 @@ impl InlineEventListener { *self = InlineEventListener::Compiled(compiled.clone()); } result - } + }, InlineEventListener::Compiled(handler) => { *self = InlineEventListener::Compiled(handler.clone()); Some(handler) - } + }, } } } @@ -127,14 +124,18 @@ enum EventListenerType { } impl EventListenerType { - fn get_compiled_listener(&mut self, owner: &EventTarget, ty: &Atom) - -> Option { + fn get_compiled_listener( + &mut self, + owner: &EventTarget, + ty: &Atom, + ) -> Option { match self { - &mut EventListenerType::Inline(ref mut inline) => - inline.get_compiled_handler(owner, ty) - .map(CompiledEventListener::Handler), - &mut EventListenerType::Additive(ref listener) => - Some(CompiledEventListener::Listener(listener.clone())), + &mut EventListenerType::Inline(ref mut inline) => inline + .get_compiled_handler(owner, ty) + .map(CompiledEventListener::Handler), + &mut EventListenerType::Additive(ref listener) => { + Some(CompiledEventListener::Listener(listener.clone())) + }, } } } @@ -149,10 +150,12 @@ pub enum CompiledEventListener { impl CompiledEventListener { #[allow(unsafe_code)] // https://html.spec.whatwg.org/multipage/#the-event-handler-processing-algorithm - pub fn call_or_handle_event(&self, - object: &T, - event: &Event, - exception_handle: ExceptionHandling) { + pub fn call_or_handle_event( + &self, + object: &T, + event: &Event, + exception_handle: ExceptionHandling, + ) { // Step 3 match *self { CompiledEventListener::Listener(ref listener) => { @@ -164,35 +167,46 @@ impl CompiledEventListener { if let Some(event) = event.downcast::() { let cx = object.global().get_cx(); rooted!(in(cx) let error = unsafe { event.Error(cx) }); - let return_value = handler.Call_(object, - EventOrString::String(event.Message()), - Some(event.Filename()), - Some(event.Lineno()), - Some(event.Colno()), - Some(error.handle()), - exception_handle); + let return_value = handler.Call_( + object, + EventOrString::String(event.Message()), + Some(event.Filename()), + Some(event.Lineno()), + Some(event.Colno()), + Some(error.handle()), + exception_handle, + ); // Step 4 if let Ok(return_value) = return_value { rooted!(in(cx) let return_value = return_value); - if return_value.handle().is_boolean() && return_value.handle().to_boolean() == true { + if return_value.handle().is_boolean() && + return_value.handle().to_boolean() == true + { event.upcast::().PreventDefault(); } } return; } - let _ = handler.Call_(object, EventOrString::Event(DomRoot::from_ref(event)), - None, None, None, None, exception_handle); - } + let _ = handler.Call_( + object, + EventOrString::Event(DomRoot::from_ref(event)), + None, + None, + None, + None, + exception_handle, + ); + }, CommonEventHandler::BeforeUnloadEventHandler(ref handler) => { if let Some(event) = event.downcast::() { // Step 5 - if let Ok(value) = handler.Call_(object, - event.upcast::(), - exception_handle) { + if let Ok(value) = + handler.Call_(object, event.upcast::(), exception_handle) + { let rv = event.ReturnValue(); - if let Some(v) = value { + if let Some(v) = value { if rv.is_empty() { event.SetReturnValue(v); } @@ -201,9 +215,10 @@ impl CompiledEventListener { } } else { // Step 5, "Otherwise" clause - let _ = handler.Call_(object, event.upcast::(), exception_handle); + let _ = + handler.Call_(object, event.upcast::(), exception_handle); } - } + }, CommonEventHandler::EventHandler(ref handler) => { if let Ok(value) = handler.Call_(object, event, exception_handle) { @@ -213,16 +228,18 @@ impl CompiledEventListener { //Step 4 let should_cancel = match event.type_() { - atom!("mouseover") => value.is_boolean() && value.to_boolean() == true, - _ => value.is_boolean() && value.to_boolean() == false + atom!("mouseover") => { + value.is_boolean() && value.to_boolean() == true + }, + _ => value.is_boolean() && value.to_boolean() == false, }; if should_cancel { event.PreventDefault(); } } - } + }, } - } + }, } } } @@ -231,7 +248,7 @@ impl CompiledEventListener { /// A listener in a collection of event listeners. struct EventListenerEntry { phase: ListenerPhase, - listener: EventListenerType + listener: EventListenerType, } #[derive(JSTraceable, MallocSizeOf)] @@ -253,7 +270,11 @@ impl DerefMut for EventListeners { impl EventListeners { // https://html.spec.whatwg.org/multipage/#getting-the-current-value-of-the-event-handler - fn get_inline_listener(&mut self, owner: &EventTarget, ty: &Atom) -> Option { + fn get_inline_listener( + &mut self, + owner: &EventTarget, + ty: &Atom, + ) -> Option { for entry in &mut self.0 { if let EventListenerType::Inline(ref mut inline) = entry.listener { // Step 1.1-1.8 and Step 2 @@ -266,16 +287,22 @@ impl EventListeners { } // https://html.spec.whatwg.org/multipage/#getting-the-current-value-of-the-event-handler - fn get_listeners(&mut self, phase: Option, owner: &EventTarget, ty: &Atom) - -> Vec { - self.0.iter_mut().filter_map(|entry| { - if phase.is_none() || Some(entry.phase) == phase { - // Step 1.1-1.8, 2 - entry.listener.get_compiled_listener(owner, ty) - } else { - None - } - }).collect() + fn get_listeners( + &mut self, + phase: Option, + owner: &EventTarget, + ty: &Atom, + ) -> Vec { + self.0 + .iter_mut() + .filter_map(|entry| { + if phase.is_none() || Some(entry.phase) == phase { + // Step 1.1-1.8, 2 + entry.listener.get_compiled_listener(owner, ty) + } else { + None + } + }).collect() } fn has_listeners(&self) -> bool { @@ -300,36 +327,34 @@ impl EventTarget { } fn new(global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(EventTarget::new_inherited()), - global, - Wrap) + reflect_dom_object(Box::new(EventTarget::new_inherited()), global, Wrap) } pub fn Constructor(global: &GlobalScope) -> Fallible> { Ok(EventTarget::new(global)) } - pub fn has_listeners_for(&self, - type_: &Atom) - -> bool { + pub fn has_listeners_for(&self, type_: &Atom) -> bool { match self.handlers.borrow().get(type_) { Some(listeners) => listeners.has_listeners(), - None => false + None => false, } } - pub fn get_listeners_for(&self, - type_: &Atom, - specific_phase: Option) - -> Vec { - self.handlers.borrow_mut().get_mut(type_).map_or(vec![], |listeners| { - listeners.get_listeners(specific_phase, self, type_) - }) - } - - pub fn dispatch_event_with_target(&self, - target: &EventTarget, - event: &Event) -> EventStatus { + pub fn get_listeners_for( + &self, + type_: &Atom, + specific_phase: Option, + ) -> Vec { + self.handlers + .borrow_mut() + .get_mut(type_) + .map_or(vec![], |listeners| { + listeners.get_listeners(specific_phase, self, type_) + }) + } + + pub fn dispatch_event_with_target(&self, target: &EventTarget, event: &Event) -> EventStatus { if let Some(window) = target.global().downcast::() { if window.has_document() { assert!(window.Document().can_invoke_script()); @@ -353,27 +378,23 @@ impl EventTarget { } /// - fn set_inline_event_listener(&self, - ty: Atom, - listener: Option) { + fn set_inline_event_listener(&self, ty: Atom, listener: Option) { let mut handlers = self.handlers.borrow_mut(); let entries = match handlers.entry(ty) { Occupied(entry) => entry.into_mut(), - Vacant(entry) => entry.insert(EventListeners(vec!())), + Vacant(entry) => entry.insert(EventListeners(vec![])), }; - let idx = entries.iter().position(|ref entry| { - match entry.listener { - EventListenerType::Inline(_) => true, - _ => false, - } + let idx = entries.iter().position(|ref entry| match entry.listener { + EventListenerType::Inline(_) => true, + _ => false, }); match idx { Some(idx) => { entries[idx].listener = EventListenerType::Inline(listener.unwrap_or(InlineEventListener::Null)); - } + }, None => { if let Some(listener) = listener { entries.push(EventListenerEntry { @@ -381,37 +402,44 @@ impl EventTarget { listener: EventListenerType::Inline(listener), }); } - } + }, } } fn get_inline_event_listener(&self, ty: &Atom) -> Option { let mut handlers = self.handlers.borrow_mut(); - handlers.get_mut(ty).and_then(|entry| entry.get_inline_listener(self, ty)) + handlers + .get_mut(ty) + .and_then(|entry| entry.get_inline_listener(self, ty)) } /// Store the raw uncompiled event handler for on-demand compilation later. /// - pub fn set_event_handler_uncompiled(&self, - url: ServoUrl, - line: usize, - ty: &str, - source: DOMString) { + pub fn set_event_handler_uncompiled( + &self, + url: ServoUrl, + line: usize, + ty: &str, + source: DOMString, + ) { let handler = InternalRawUncompiledHandler { source: source, line: line, url: url, }; - self.set_inline_event_listener(Atom::from(ty), - Some(InlineEventListener::Uncompiled(handler))); + self.set_inline_event_listener( + Atom::from(ty), + Some(InlineEventListener::Uncompiled(handler)), + ); } // https://html.spec.whatwg.org/multipage/#getting-the-current-value-of-the-event-handler #[allow(unsafe_code)] - fn get_compiled_event_handler(&self, - handler: InternalRawUncompiledHandler, - ty: &Atom) - -> Option { + fn get_compiled_event_handler( + &self, + handler: InternalRawUncompiledHandler, + ty: &Atom, + ) -> Option { // Step 1.1 let element = self.downcast::(); let document = match element { @@ -436,11 +464,13 @@ impl EventTarget { let name = CString::new(&**ty).unwrap(); static mut ARG_NAMES: [*const c_char; 1] = [b"event\0" as *const u8 as *const c_char]; - static mut ERROR_ARG_NAMES: [*const c_char; 5] = [b"event\0" as *const u8 as *const c_char, - b"source\0" as *const u8 as *const c_char, - b"lineno\0" as *const u8 as *const c_char, - b"colno\0" as *const u8 as *const c_char, - b"error\0" as *const u8 as *const c_char]; + static mut ERROR_ARG_NAMES: [*const c_char; 5] = [ + b"event\0" as *const u8 as *const c_char, + b"source\0" as *const u8 as *const c_char, + b"lineno\0" as *const u8 as *const c_char, + b"colno\0" as *const u8 as *const c_char, + b"error\0" as *const u8 as *const c_char, + ]; // step 10 let is_error = ty == &atom!("error") && self.is::(); let args = unsafe { @@ -460,15 +490,17 @@ impl EventTarget { let _ac = JSAutoCompartment::new(cx, window.reflector().get_jsobject().get()); rooted!(in(cx) let mut handler = ptr::null_mut::()); let rv = unsafe { - CompileFunction(cx, - scopechain.ptr, - options.ptr, - name.as_ptr(), - args.len() as u32, - args.as_ptr(), - body.as_ptr(), - body.len() as size_t, - handler.handle_mut().into()) + CompileFunction( + cx, + scopechain.ptr, + options.ptr, + name.as_ptr(), + args.len() as u32, + args.as_ptr(), + body.as_ptr(), + body.len() as size_t, + handler.handle_mut().into(), + ) }; if !rv || handler.get().is_null() { // Step 1.8.2 @@ -486,56 +518,48 @@ impl EventTarget { assert!(!funobj.is_null()); // Step 1.14 if is_error { - Some(CommonEventHandler::ErrorEventHandler( - unsafe { OnErrorEventHandlerNonNull::new(cx, funobj) }, - )) + Some(CommonEventHandler::ErrorEventHandler(unsafe { + OnErrorEventHandlerNonNull::new(cx, funobj) + })) } else { if ty == &atom!("beforeunload") { - Some(CommonEventHandler::BeforeUnloadEventHandler( - unsafe { OnBeforeUnloadEventHandlerNonNull::new(cx, funobj) }, - )) + Some(CommonEventHandler::BeforeUnloadEventHandler(unsafe { + OnBeforeUnloadEventHandlerNonNull::new(cx, funobj) + })) } else { - Some(CommonEventHandler::EventHandler( - unsafe { EventHandlerNonNull::new(cx, funobj) }, - )) + Some(CommonEventHandler::EventHandler(unsafe { + EventHandlerNonNull::new(cx, funobj) + })) } } } #[allow(unsafe_code)] - pub fn set_event_handler_common( - &self, - ty: &str, - listener: Option>, - ) + pub fn set_event_handler_common(&self, ty: &str, listener: Option>) where T: CallbackContainer, { let cx = self.global().get_cx(); let event_listener = listener.map(|listener| { - InlineEventListener::Compiled(CommonEventHandler::EventHandler( - unsafe { EventHandlerNonNull::new(cx, listener.callback()) }, - )) + InlineEventListener::Compiled(CommonEventHandler::EventHandler(unsafe { + EventHandlerNonNull::new(cx, listener.callback()) + })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); } #[allow(unsafe_code)] - pub fn set_error_event_handler( - &self, - ty: &str, - listener: Option>, - ) + pub fn set_error_event_handler(&self, ty: &str, listener: Option>) where T: CallbackContainer, { let cx = self.global().get_cx(); let event_listener = listener.map(|listener| { - InlineEventListener::Compiled(CommonEventHandler::ErrorEventHandler( - unsafe { OnErrorEventHandlerNonNull::new(cx, listener.callback()) } - )) + InlineEventListener::Compiled(CommonEventHandler::ErrorEventHandler(unsafe { + OnErrorEventHandlerNonNull::new(cx, listener.callback()) + })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); } @@ -545,16 +569,15 @@ impl EventTarget { &self, ty: &str, listener: Option>, - ) - where + ) where T: CallbackContainer, { let cx = self.global().get_cx(); let event_listener = listener.map(|listener| { - InlineEventListener::Compiled(CommonEventHandler::BeforeUnloadEventHandler( - unsafe { OnBeforeUnloadEventHandlerNonNull::new(cx, listener.callback()) } - )) + InlineEventListener::Compiled(CommonEventHandler::BeforeUnloadEventHandler(unsafe { + OnBeforeUnloadEventHandlerNonNull::new(cx, listener.callback()) + })) }); self.set_inline_event_listener(Atom::from(ty), event_listener); } @@ -564,8 +587,9 @@ impl EventTarget { let cx = self.global().get_cx(); let listener = self.get_inline_event_listener(&Atom::from(ty)); unsafe { - listener.map(|listener| - CallbackContainer::new(cx, listener.parent().callback_holder().get())) + listener.map(|listener| { + CallbackContainer::new(cx, listener.parent().callback_holder().get()) + }) } } @@ -575,38 +599,39 @@ impl EventTarget { // https://dom.spec.whatwg.org/#concept-event-fire pub fn fire_event(&self, name: Atom) -> DomRoot { - self.fire_event_with_params(name, - EventBubbles::DoesNotBubble, - EventCancelable::NotCancelable) + self.fire_event_with_params( + name, + EventBubbles::DoesNotBubble, + EventCancelable::NotCancelable, + ) } // https://dom.spec.whatwg.org/#concept-event-fire pub fn fire_bubbling_event(&self, name: Atom) -> DomRoot { - self.fire_event_with_params(name, - EventBubbles::Bubbles, - EventCancelable::NotCancelable) + self.fire_event_with_params(name, EventBubbles::Bubbles, EventCancelable::NotCancelable) } // https://dom.spec.whatwg.org/#concept-event-fire pub fn fire_cancelable_event(&self, name: Atom) -> DomRoot { - self.fire_event_with_params(name, - EventBubbles::DoesNotBubble, - EventCancelable::Cancelable) + self.fire_event_with_params( + name, + EventBubbles::DoesNotBubble, + EventCancelable::Cancelable, + ) } // https://dom.spec.whatwg.org/#concept-event-fire pub fn fire_bubbling_cancelable_event(&self, name: Atom) -> DomRoot { - self.fire_event_with_params(name, - EventBubbles::Bubbles, - EventCancelable::Cancelable) + self.fire_event_with_params(name, EventBubbles::Bubbles, EventCancelable::Cancelable) } // https://dom.spec.whatwg.org/#concept-event-fire - pub fn fire_event_with_params(&self, - name: Atom, - bubbles: EventBubbles, - cancelable: EventCancelable) - -> DomRoot { + pub fn fire_event_with_params( + &self, + name: Atom, + bubbles: EventBubbles, + cancelable: EventCancelable, + ) -> DomRoot { let event = Event::new(&self.global(), name, bubbles, cancelable); event.fire(self); event @@ -625,7 +650,7 @@ impl EventTarget { let mut handlers = self.handlers.borrow_mut(); let entry = match handlers.entry(Atom::from(ty)) { Occupied(entry) => entry.into_mut(), - Vacant(entry) => entry.insert(EventListeners(vec!())), + Vacant(entry) => entry.insert(EventListeners(vec![])), }; let phase = if options.parent.capture { @@ -635,7 +660,7 @@ impl EventTarget { }; let new_entry = EventListenerEntry { phase: phase, - listener: EventListenerType::Additive(listener) + listener: EventListenerType::Additive(listener), }; if !entry.contains(&new_entry) { entry.push(new_entry); @@ -663,7 +688,7 @@ impl EventTarget { }; let old_entry = EventListenerEntry { phase: phase, - listener: EventListenerType::Additive(listener.clone()) + listener: EventListenerType::Additive(listener.clone()), }; if let Some(position) = entry.iter().position(|e| *e == old_entry) { entry.remove(position); @@ -701,7 +726,7 @@ impl EventTargetMethods for EventTarget { event.set_trusted(false); Ok(match self.dispatch_event(event) { EventStatus::Canceled => false, - EventStatus::NotCanceled => true + EventStatus::NotCanceled => true, }) } } @@ -715,11 +740,9 @@ impl VirtualMethods for EventTarget { impl From for AddEventListenerOptions { fn from(options: AddEventListenerOptionsOrBoolean) -> Self { match options { - AddEventListenerOptionsOrBoolean::AddEventListenerOptions(options) => { - options - }, - AddEventListenerOptionsOrBoolean::Boolean(capture) => { - Self { parent: EventListenerOptions { capture } } + AddEventListenerOptionsOrBoolean::AddEventListenerOptions(options) => options, + AddEventListenerOptionsOrBoolean::Boolean(capture) => Self { + parent: EventListenerOptions { capture }, }, } } @@ -728,12 +751,8 @@ impl From for AddEventListenerOptions { impl From for EventListenerOptions { fn from(options: EventListenerOptionsOrBoolean) -> Self { match options { - EventListenerOptionsOrBoolean::EventListenerOptions(options) => { - options - }, - EventListenerOptionsOrBoolean::Boolean(capture) => { - Self { capture } - }, + EventListenerOptionsOrBoolean::EventListenerOptions(options) => options, + EventListenerOptionsOrBoolean::Boolean(capture) => Self { capture }, } } } diff --git a/components/script/dom/extendableevent.rs b/components/script/dom/extendableevent.rs index e1db24ffb01..4f7462746c2 100644 --- a/components/script/dom/extendableevent.rs +++ b/components/script/dom/extendableevent.rs @@ -20,25 +20,26 @@ use servo_atoms::Atom; #[dom_struct] pub struct ExtendableEvent { event: Event, - extensions_allowed: bool + extensions_allowed: bool, } impl ExtendableEvent { pub fn new_inherited() -> ExtendableEvent { ExtendableEvent { event: Event::new_inherited(), - extensions_allowed: true + extensions_allowed: true, } } - pub fn new(worker: &ServiceWorkerGlobalScope, - type_: Atom, - bubbles: bool, - cancelable: bool) - -> DomRoot { + pub fn new( + worker: &ServiceWorkerGlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + ) -> DomRoot { let ev = reflect_dom_object( Box::new(ExtendableEvent::new_inherited()), worker, - ExtendableEventBinding::Wrap + ExtendableEventBinding::Wrap, ); { let event = ev.upcast::(); @@ -47,13 +48,17 @@ impl ExtendableEvent { ev } - pub fn Constructor(worker: &ServiceWorkerGlobalScope, - type_: DOMString, - init: &ExtendableEventBinding::ExtendableEventInit) -> Fallible> { - Ok(ExtendableEvent::new(worker, - Atom::from(type_), - init.parent.bubbles, - init.parent.cancelable)) + pub fn Constructor( + worker: &ServiceWorkerGlobalScope, + type_: DOMString, + init: &ExtendableEventBinding::ExtendableEventInit, + ) -> Fallible> { + Ok(ExtendableEvent::new( + worker, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + )) } // https://w3c.github.io/ServiceWorker/#wait-until-method diff --git a/components/script/dom/extendablemessageevent.rs b/components/script/dom/extendablemessageevent.rs index 110fe7b9c17..0e3119db1f5 100644 --- a/components/script/dom/extendablemessageevent.rs +++ b/components/script/dom/extendablemessageevent.rs @@ -30,10 +30,15 @@ pub struct ExtendableMessageEvent { } impl ExtendableMessageEvent { - pub fn new(global: &GlobalScope, type_: Atom, - bubbles: bool, cancelable: bool, - data: HandleValue, origin: DOMString, lastEventId: DOMString) - -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + data: HandleValue, + origin: DOMString, + lastEventId: DOMString, + ) -> DomRoot { let ev = Box::new(ExtendableMessageEvent { event: ExtendableEvent::new_inherited(), data: Heap::default(), @@ -50,29 +55,36 @@ impl ExtendableMessageEvent { ev } - pub fn Constructor(worker: &ServiceWorkerGlobalScope, - type_: DOMString, - init: RootedTraceableBox) - -> Fallible> { + pub fn Constructor( + worker: &ServiceWorkerGlobalScope, + type_: DOMString, + init: RootedTraceableBox, + ) -> Fallible> { let global = worker.upcast::(); - let ev = ExtendableMessageEvent::new(global, - Atom::from(type_), - init.parent.parent.bubbles, - init.parent.parent.cancelable, - init.data.handle(), - init.origin.clone().unwrap(), - init.lastEventId.clone().unwrap()); + let ev = ExtendableMessageEvent::new( + global, + Atom::from(type_), + init.parent.parent.bubbles, + init.parent.parent.cancelable, + init.data.handle(), + init.origin.clone().unwrap(), + init.lastEventId.clone().unwrap(), + ); Ok(ev) } } impl ExtendableMessageEvent { - pub fn dispatch_jsval(target: &EventTarget, - scope: &GlobalScope, - message: HandleValue) { + pub fn dispatch_jsval(target: &EventTarget, scope: &GlobalScope, message: HandleValue) { let Extendablemessageevent = ExtendableMessageEvent::new( - scope, atom!("message"), false, false, message, - DOMString::new(), DOMString::new()); + scope, + atom!("message"), + false, + false, + message, + DOMString::new(), + DOMString::new(), + ); Extendablemessageevent.upcast::().fire(target); } } diff --git a/components/script/dom/file.rs b/components/script/dom/file.rs index 942fbb1a055..47fd4920bb6 100644 --- a/components/script/dom/file.rs +++ b/components/script/dom/file.rs @@ -26,8 +26,12 @@ pub struct File { impl File { #[allow(unrooted_must_root)] - fn new_inherited(blob_impl: BlobImpl, name: DOMString, - modified: Option, type_string: &str) -> File { + fn new_inherited( + blob_impl: BlobImpl, + name: DOMString, + modified: Option, + type_string: &str, + ) -> File { File { blob: Blob::new_inherited(blob_impl, type_string.to_owned()), name: name, @@ -37,33 +41,51 @@ impl File { None => { let time = time::get_time(); time.sec * 1000 + (time.nsec / 1000000) as i64 - } + }, }, } } #[allow(unrooted_must_root)] - pub fn new(global: &GlobalScope, blob_impl: BlobImpl, - name: DOMString, modified: Option, typeString: &str) -> DomRoot { - reflect_dom_object(Box::new(File::new_inherited(blob_impl, name, modified, typeString)), - global, - FileBinding::Wrap) + pub fn new( + global: &GlobalScope, + blob_impl: BlobImpl, + name: DOMString, + modified: Option, + typeString: &str, + ) -> DomRoot { + reflect_dom_object( + Box::new(File::new_inherited(blob_impl, name, modified, typeString)), + global, + FileBinding::Wrap, + ) } // Construct from selected file message from file manager thread pub fn new_from_selected(window: &Window, selected: SelectedFile) -> DomRoot { - let name = DOMString::from(selected.filename.to_str().expect("File name encoding error")); + let name = DOMString::from( + selected + .filename + .to_str() + .expect("File name encoding error"), + ); - File::new(window.upcast(), BlobImpl::new_from_file(selected.id, selected.filename, selected.size), - name, Some(selected.modified as i64), &selected.type_string) + File::new( + window.upcast(), + BlobImpl::new_from_file(selected.id, selected.filename, selected.size), + name, + Some(selected.modified as i64), + &selected.type_string, + ) } // https://w3c.github.io/FileAPI/#file-constructor - pub fn Constructor(global: &GlobalScope, - fileBits: Vec, - filename: DOMString, - filePropertyBag: &FileBinding::FilePropertyBag) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + fileBits: Vec, + filename: DOMString, + filePropertyBag: &FileBinding::FilePropertyBag, + ) -> Fallible> { let bytes: Vec = match blob_parts_to_bytes(fileBits) { Ok(bytes) => bytes, Err(_) => return Err(Error::InvalidCharacter), @@ -76,11 +98,13 @@ impl File { // NOTE: Following behaviour might be removed in future, // see https://github.com/w3c/FileAPI/issues/41 let replaced_filename = DOMString::from_string(filename.replace("/", ":")); - Ok(File::new(global, - BlobImpl::new_from_bytes(bytes), - replaced_filename, - modified, - typeString)) + Ok(File::new( + global, + BlobImpl::new_from_bytes(bytes), + replaced_filename, + modified, + typeString, + )) } pub fn name(&self) -> &DOMString { diff --git a/components/script/dom/filelist.rs b/components/script/dom/filelist.rs index 48dd5fdb9ca..92d39e5b539 100644 --- a/components/script/dom/filelist.rs +++ b/components/script/dom/filelist.rs @@ -15,7 +15,7 @@ use std::slice::Iter; #[dom_struct] pub struct FileList { reflector_: Reflector, - list: Vec> + list: Vec>, } impl FileList { @@ -23,15 +23,19 @@ impl FileList { fn new_inherited(files: Vec>) -> FileList { FileList { reflector_: Reflector::new(), - list: files + list: files, } } #[allow(unrooted_must_root)] pub fn new(window: &Window, files: Vec>) -> DomRoot { - reflect_dom_object(Box::new(FileList::new_inherited(files.iter().map(|r| Dom::from_ref(&**r)).collect())), - window, - FileListBinding::Wrap) + reflect_dom_object( + Box::new(FileList::new_inherited( + files.iter().map(|r| Dom::from_ref(&**r)).collect(), + )), + window, + FileListBinding::Wrap, + ) } pub fn iter_files(&self) -> Iter> { diff --git a/components/script/dom/filereader.rs b/components/script/dom/filereader.rs index 6b88c645bbd..c816c943303 100644 --- a/components/script/dom/filereader.rs +++ b/components/script/dom/filereader.rs @@ -466,8 +466,7 @@ impl FileReader { task_source, canceller, ) - }) - .expect("Thread spawning failed"); + }).expect("Thread spawning failed"); Ok(()) } diff --git a/components/script/dom/focusevent.rs b/components/script/dom/focusevent.rs index 7966e887b4c..ce751df8754 100644 --- a/components/script/dom/focusevent.rs +++ b/components/script/dom/focusevent.rs @@ -32,39 +32,50 @@ impl FocusEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(FocusEvent::new_inherited()), - window, - FocusEventBinding::Wrap) + reflect_dom_object( + Box::new(FocusEvent::new_inherited()), + window, + FocusEventBinding::Wrap, + ) } - pub fn new(window: &Window, - type_: DOMString, - can_bubble: EventBubbles, - cancelable: EventCancelable, - view: Option<&Window>, - detail: i32, - related_target: Option<&EventTarget>) -> DomRoot { + pub fn new( + window: &Window, + type_: DOMString, + can_bubble: EventBubbles, + cancelable: EventCancelable, + view: Option<&Window>, + detail: i32, + related_target: Option<&EventTarget>, + ) -> DomRoot { let ev = FocusEvent::new_uninitialized(window); - ev.upcast::().InitUIEvent(type_, - bool::from(can_bubble), - bool::from(cancelable), - view, detail); + ev.upcast::().InitUIEvent( + type_, + bool::from(can_bubble), + bool::from(cancelable), + view, + detail, + ); ev.related_target.set(related_target); ev } - pub fn Constructor(window: &Window, - type_: DOMString, - init: &FocusEventBinding::FocusEventInit) -> Fallible> { + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &FocusEventBinding::FocusEventInit, + ) -> Fallible> { let bubbles = EventBubbles::from(init.parent.parent.bubbles); let cancelable = EventCancelable::from(init.parent.parent.cancelable); - let event = FocusEvent::new(window, - type_, - bubbles, - cancelable, - init.parent.view.r(), - init.parent.detail, - init.relatedTarget.r()); + let event = FocusEvent::new( + window, + type_, + bubbles, + cancelable, + init.parent.view.r(), + init.parent.detail, + init.relatedTarget.r(), + ); Ok(event) } } diff --git a/components/script/dom/formdata.rs b/components/script/dom/formdata.rs index d856a6e26f7..1ec80600ba4 100644 --- a/components/script/dom/formdata.rs +++ b/components/script/dom/formdata.rs @@ -36,7 +36,9 @@ impl FormData { for datum in form.get_form_dataset(None) { match hashmap.entry(LocalName::from(datum.name.as_ref())) { Occupied(entry) => entry.into_mut().push(datum), - Vacant(entry) => { entry.insert(vec!(datum)); } + Vacant(entry) => { + entry.insert(vec![datum]); + }, } } } @@ -48,11 +50,17 @@ impl FormData { } pub fn new(form: Option<&HTMLFormElement>, global: &GlobalScope) -> DomRoot { - reflect_dom_object(Box::new(FormData::new_inherited(form)), - global, FormDataWrap) + reflect_dom_object( + Box::new(FormData::new_inherited(form)), + global, + FormDataWrap, + ) } - pub fn Constructor(global: &GlobalScope, form: Option<&HTMLFormElement>) -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + form: Option<&HTMLFormElement>, + ) -> Fallible> { // TODO: Construct form data set for form if it is supplied Ok(FormData::new(form, global)) } @@ -70,7 +78,9 @@ impl FormDataMethods for FormData { let mut data = self.data.borrow_mut(); match data.entry(LocalName::from(name.0)) { Occupied(entry) => entry.into_mut().push(datum), - Vacant(entry) => { entry.insert(vec!(datum)); } + Vacant(entry) => { + entry.insert(vec![datum]); + }, } } @@ -87,7 +97,9 @@ impl FormDataMethods for FormData { match data.entry(LocalName::from(name.0)) { Occupied(entry) => entry.into_mut().push(datum), - Vacant(entry) => { entry.insert(vec!(datum)); }, + Vacant(entry) => { + entry.insert(vec![datum]); + }, } } @@ -98,24 +110,33 @@ impl FormDataMethods for FormData { // https://xhr.spec.whatwg.org/#dom-formdata-get fn Get(&self, name: USVString) -> Option { - self.data.borrow() - .get(&LocalName::from(name.0)) - .map(|entry| match entry[0].value { - FormDatumValue::String(ref s) => FileOrUSVString::USVString(USVString(s.to_string())), - FormDatumValue::File(ref b) => FileOrUSVString::File(DomRoot::from_ref(&*b)), - }) + self.data + .borrow() + .get(&LocalName::from(name.0)) + .map(|entry| match entry[0].value { + FormDatumValue::String(ref s) => { + FileOrUSVString::USVString(USVString(s.to_string())) + }, + FormDatumValue::File(ref b) => FileOrUSVString::File(DomRoot::from_ref(&*b)), + }) } // https://xhr.spec.whatwg.org/#dom-formdata-getall fn GetAll(&self, name: USVString) -> Vec { - self.data.borrow() - .get(&LocalName::from(name.0)) - .map_or(vec![], |data| - data.iter().map(|item| match item.value { - FormDatumValue::String(ref s) => FileOrUSVString::USVString(USVString(s.to_string())), - FormDatumValue::File(ref b) => FileOrUSVString::File(DomRoot::from_ref(&*b)), + self.data + .borrow() + .get(&LocalName::from(name.0)) + .map_or(vec![], |data| { + data.iter() + .map(|item| match item.value { + FormDatumValue::String(ref s) => { + FileOrUSVString::USVString(USVString(s.to_string())) + }, + FormDatumValue::File(ref b) => { + FileOrUSVString::File(DomRoot::from_ref(&*b)) + }, }).collect() - ) + }) } // https://xhr.spec.whatwg.org/#dom-formdata-has @@ -125,26 +146,32 @@ impl FormDataMethods for FormData { // https://xhr.spec.whatwg.org/#dom-formdata-set fn Set(&self, name: USVString, str_value: USVString) { - self.data.borrow_mut().insert(LocalName::from(name.0.clone()), vec![FormDatum { - ty: DOMString::from("string"), - name: DOMString::from(name.0), - value: FormDatumValue::String(DOMString::from(str_value.0)), - }]); + self.data.borrow_mut().insert( + LocalName::from(name.0.clone()), + vec![FormDatum { + ty: DOMString::from("string"), + name: DOMString::from(name.0), + value: FormDatumValue::String(DOMString::from(str_value.0)), + }], + ); } #[allow(unrooted_must_root)] // https://xhr.spec.whatwg.org/#dom-formdata-set fn Set_(&self, name: USVString, blob: &Blob, filename: Option) { - self.data.borrow_mut().insert(LocalName::from(name.0.clone()), vec![FormDatum { - ty: DOMString::from("file"), - name: DOMString::from(name.0), - value: FormDatumValue::File(DomRoot::from_ref(&*self.create_an_entry(blob, filename))), - }]); + self.data.borrow_mut().insert( + LocalName::from(name.0.clone()), + vec![FormDatum { + ty: DOMString::from("file"), + name: DOMString::from(name.0), + value: FormDatumValue::File(DomRoot::from_ref( + &*self.create_an_entry(blob, filename), + )), + }], + ); } - } - impl FormData { // https://xhr.spec.whatwg.org/#create-an-entry // Steps 3-4. @@ -157,11 +184,19 @@ impl FormData { let bytes = blob.get_bytes().unwrap_or(vec![]); - File::new(&self.global(), BlobImpl::new_from_bytes(bytes), name, None, &blob.type_string()) + File::new( + &self.global(), + BlobImpl::new_from_bytes(bytes), + name, + None, + &blob.type_string(), + ) } pub fn datums(&self) -> Vec { - self.data.borrow().values() + self.data + .borrow() + .values() .flat_map(|value| value.iter()) .map(|value| value.clone()) .collect() @@ -173,16 +208,21 @@ impl Iterable for FormData { type Value = FileOrUSVString; fn get_iterable_length(&self) -> u32 { - self.data.borrow().values().map(|value| value.len()).sum::() as u32 + self.data + .borrow() + .values() + .map(|value| value.len()) + .sum::() as u32 } fn get_value_at_index(&self, n: u32) -> FileOrUSVString { let data = self.data.borrow(); - let value = &data.values() - .flat_map(|value| value.iter()) - .nth(n as usize) - .unwrap() - .value; + let value = &data + .values() + .flat_map(|value| value.iter()) + .nth(n as usize) + .unwrap() + .value; match *value { FormDatumValue::String(ref s) => FileOrUSVString::USVString(USVString(s.to_string())), FormDatumValue::File(ref b) => FileOrUSVString::File(DomRoot::from_ref(&*b)), @@ -191,10 +231,11 @@ impl Iterable for FormData { fn get_key_at_index(&self, n: u32) -> USVString { let data = self.data.borrow(); - let value = &data.iter() - .flat_map(|(key, value)| iter::repeat(key).take(value.len())) - .nth(n as usize) - .unwrap(); + let value = &data + .iter() + .flat_map(|(key, value)| iter::repeat(key).take(value.len())) + .nth(n as usize) + .unwrap(); USVString(value.to_string()) } } diff --git a/components/script/dom/gainnode.rs b/components/script/dom/gainnode.rs index 1b4859e28e5..ea81ac58535 100644 --- a/components/script/dom/gainnode.rs +++ b/components/script/dom/gainnode.rs @@ -31,9 +31,10 @@ impl GainNode { context: &BaseAudioContext, options: &GainOptions, ) -> Fallible { - let node_options = options.parent - .unwrap_or(2, ChannelCountMode::Max, - ChannelInterpretation::Speakers); + let node_options = + options + .parent + .unwrap_or(2, ChannelCountMode::Max, ChannelInterpretation::Speakers); let node = AudioNode::new_inherited( AudioNodeInit::GainNode(options.into()), context, @@ -64,7 +65,11 @@ impl GainNode { options: &GainOptions, ) -> Fallible> { let node = GainNode::new_inherited(window, context, options)?; - Ok(reflect_dom_object(Box::new(node), window, GainNodeBinding::Wrap)) + Ok(reflect_dom_object( + Box::new(node), + window, + GainNodeBinding::Wrap, + )) } pub fn Constructor( diff --git a/components/script/dom/gamepad.rs b/components/script/dom/gamepad.rs index 769b1ee548f..d4858de99f8 100644 --- a/components/script/dom/gamepad.rs +++ b/components/script/dom/gamepad.rs @@ -37,20 +37,22 @@ pub struct Gamepad { pose: Option>, #[ignore_malloc_size_of = "Defined in rust-webvr"] hand: WebVRGamepadHand, - display_id: u32 + display_id: u32, } impl Gamepad { - fn new_inherited(gamepad_id: u32, - id: String, - index: i32, - connected: bool, - timestamp: f64, - mapping_type: String, - buttons: &GamepadButtonList, - pose: Option<&VRPose>, - hand: WebVRGamepadHand, - display_id: u32) -> Gamepad { + fn new_inherited( + gamepad_id: u32, + id: String, + index: i32, + connected: bool, + timestamp: f64, + mapping_type: String, + buttons: &GamepadButtonList, + pose: Option<&VRPose>, + hand: WebVRGamepadHand, + display_id: u32, + ) -> Gamepad { Self { reflector_: Reflector::new(), gamepad_id: gamepad_id, @@ -63,15 +65,17 @@ impl Gamepad { buttons: Dom::from_ref(buttons), pose: pose.map(Dom::from_ref), hand: hand, - display_id: display_id + display_id: display_id, } } #[allow(unsafe_code)] - pub fn new_from_vr(global: &GlobalScope, - index: i32, - data: &WebVRGamepadData, - state: &WebVRGamepadState) -> DomRoot { + pub fn new_from_vr( + global: &GlobalScope, + index: i32, + data: &WebVRGamepadData, + state: &WebVRGamepadState, + ) -> DomRoot { let buttons = GamepadButtonList::new_from_vr(&global, &state.buttons); let pose = VRPose::new(&global, &state.pose); @@ -86,10 +90,10 @@ impl Gamepad { &buttons, Some(&pose), data.hand.clone(), - data.display_id + data.display_id, )), global, - GamepadBinding::Wrap + GamepadBinding::Wrap, ); let cx = global.get_cx(); @@ -145,7 +149,7 @@ impl GamepadMethods for Gamepad { let value = match self.hand { WebVRGamepadHand::Unknown => "", WebVRGamepadHand::Left => "left", - WebVRGamepadHand::Right => "right" + WebVRGamepadHand::Right => "right", }; value.into() } @@ -204,6 +208,8 @@ impl Gamepad { pub fn notify_event(&self, event_type: GamepadEventType) { let event = GamepadEvent::new_with_type(&self.global(), event_type, &self); - event.upcast::().fire(self.global().as_window().upcast::()); + event + .upcast::() + .fire(self.global().as_window().upcast::()); } } diff --git a/components/script/dom/gamepadbutton.rs b/components/script/dom/gamepadbutton.rs index fb5182b7cda..df28f9e6a8e 100644 --- a/components/script/dom/gamepadbutton.rs +++ b/components/script/dom/gamepadbutton.rs @@ -30,9 +30,11 @@ impl GamepadButton { } pub fn new(global: &GlobalScope, pressed: bool, touched: bool) -> DomRoot { - reflect_dom_object(Box::new(GamepadButton::new_inherited(pressed, touched)), - global, - GamepadButtonBinding::Wrap) + reflect_dom_object( + Box::new(GamepadButton::new_inherited(pressed, touched)), + global, + GamepadButtonBinding::Wrap, + ) } } diff --git a/components/script/dom/gamepadbuttonlist.rs b/components/script/dom/gamepadbuttonlist.rs index 24afa3b1bfe..22e79c98100 100644 --- a/components/script/dom/gamepadbuttonlist.rs +++ b/components/script/dom/gamepadbuttonlist.rs @@ -15,7 +15,7 @@ use webvr_traits::WebVRGamepadButton; #[dom_struct] pub struct GamepadButtonList { reflector_: Reflector, - list: Vec> + list: Vec>, } impl GamepadButtonList { @@ -27,13 +27,18 @@ impl GamepadButtonList { } } - pub fn new_from_vr(global: &GlobalScope, buttons: &[WebVRGamepadButton]) -> DomRoot { + pub fn new_from_vr( + global: &GlobalScope, + buttons: &[WebVRGamepadButton], + ) -> DomRoot { rooted_vec!(let list <- buttons.iter() .map(|btn| GamepadButton::new(&global, btn.pressed, btn.touched))); - reflect_dom_object(Box::new(GamepadButtonList::new_inherited(list.r())), - global, - GamepadButtonListBinding::Wrap) + reflect_dom_object( + Box::new(GamepadButtonList::new_inherited(list.r())), + global, + GamepadButtonListBinding::Wrap, + ) } pub fn sync_from_vr(&self, vr_buttons: &[WebVRGamepadButton]) { @@ -51,7 +56,9 @@ impl GamepadButtonListMethods for GamepadButtonList { // https://w3c.github.io/gamepad/#dom-gamepad-buttons fn Item(&self, index: u32) -> Option> { - self.list.get(index as usize).map(|button| DomRoot::from_ref(&**button)) + self.list + .get(index as usize) + .map(|button| DomRoot::from_ref(&**button)) } // https://w3c.github.io/gamepad/#dom-gamepad-buttons diff --git a/components/script/dom/gamepadevent.rs b/components/script/dom/gamepadevent.rs index f3badfdb8c4..b8bd371f088 100644 --- a/components/script/dom/gamepadevent.rs +++ b/components/script/dom/gamepadevent.rs @@ -25,7 +25,7 @@ pub struct GamepadEvent { pub enum GamepadEventType { Connected, - Disconnected + Disconnected, } impl GamepadEvent { @@ -36,14 +36,17 @@ impl GamepadEvent { } } - pub fn new(global: &GlobalScope, - type_: Atom, - bubbles: bool, - cancelable: bool, - gamepad: &Gamepad) - -> DomRoot { + pub fn new( + global: &GlobalScope, + type_: Atom, + bubbles: bool, + cancelable: bool, + gamepad: &Gamepad, + ) -> DomRoot { let ev = reflect_dom_object( - Box::new(GamepadEvent::new_inherited(&gamepad)), global, GamepadEventBinding::Wrap + Box::new(GamepadEvent::new_inherited(&gamepad)), + global, + GamepadEventBinding::Wrap, ); { let event = ev.upcast::(); @@ -52,30 +55,32 @@ impl GamepadEvent { ev } - pub fn new_with_type(global: &GlobalScope, event_type: GamepadEventType, gamepad: &Gamepad) - -> DomRoot { + pub fn new_with_type( + global: &GlobalScope, + event_type: GamepadEventType, + gamepad: &Gamepad, + ) -> DomRoot { let name = match event_type { GamepadEventType::Connected => "gamepadconnected", - GamepadEventType::Disconnected => "gamepaddisconnected" + GamepadEventType::Disconnected => "gamepaddisconnected", }; - GamepadEvent::new(&global, - name.into(), - false, - false, - &gamepad) + GamepadEvent::new(&global, name.into(), false, false, &gamepad) } // https://w3c.github.io/gamepad/#gamepadevent-interface - pub fn Constructor(window: &Window, - type_: DOMString, - init: &GamepadEventBinding::GamepadEventInit) - -> Fallible> { - Ok(GamepadEvent::new(&window.global(), - Atom::from(type_), - init.parent.bubbles, - init.parent.cancelable, - &init.gamepad)) + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &GamepadEventBinding::GamepadEventInit, + ) -> Fallible> { + Ok(GamepadEvent::new( + &window.global(), + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + &init.gamepad, + )) } } diff --git a/components/script/dom/gamepadlist.rs b/components/script/dom/gamepadlist.rs index f767d001343..1e48e7560ea 100644 --- a/components/script/dom/gamepadlist.rs +++ b/components/script/dom/gamepadlist.rs @@ -15,26 +15,33 @@ use dom_struct::dom_struct; #[dom_struct] pub struct GamepadList { reflector_: Reflector, - list: DomRefCell>> + list: DomRefCell>>, } impl GamepadList { fn new_inherited(list: &[&Gamepad]) -> GamepadList { GamepadList { reflector_: Reflector::new(), - list: DomRefCell::new(list.iter().map(|g| Dom::from_ref(&**g)).collect()) + list: DomRefCell::new(list.iter().map(|g| Dom::from_ref(&**g)).collect()), } } pub fn new(global: &GlobalScope, list: &[&Gamepad]) -> DomRoot { - reflect_dom_object(Box::new(GamepadList::new_inherited(list)), - global, - GamepadListBinding::Wrap) + reflect_dom_object( + Box::new(GamepadList::new_inherited(list)), + global, + GamepadListBinding::Wrap, + ) } pub fn add_if_not_exists(&self, gamepads: &[DomRoot]) { for gamepad in gamepads { - if !self.list.borrow().iter().any(|g| g.gamepad_id() == gamepad.gamepad_id()) { + if !self + .list + .borrow() + .iter() + .any(|g| g.gamepad_id() == gamepad.gamepad_id()) + { self.list.borrow_mut().push(Dom::from_ref(&*gamepad)); // Ensure that the gamepad has the correct index gamepad.update_index(self.list.borrow().len() as i32 - 1); @@ -51,7 +58,10 @@ impl GamepadListMethods for GamepadList { // https://w3c.github.io/gamepad/#dom-navigator-getgamepads fn Item(&self, index: u32) -> Option> { - self.list.borrow().get(index as usize).map(|gamepad| DomRoot::from_ref(&**gamepad)) + self.list + .borrow() + .get(index as usize) + .map(|gamepad| DomRoot::from_ref(&**gamepad)) } // https://w3c.github.io/gamepad/#dom-navigator-getgamepads diff --git a/components/script/dom/globalscope.rs b/components/script/dom/globalscope.rs index b2429948874..62eae2dedae 100644 --- a/components/script/dom/globalscope.rs +++ b/components/script/dom/globalscope.rs @@ -65,9 +65,7 @@ use timers::{IsInterval, OneshotTimerCallback, OneshotTimerHandle}; use timers::{OneshotTimers, TimerCallback}; #[derive(JSTraceable)] -pub struct AutoCloseWorker( - Arc, -); +pub struct AutoCloseWorker(Arc); impl Drop for AutoCloseWorker { fn drop(&mut self) { @@ -175,7 +173,9 @@ impl GlobalScope { } pub fn track_worker(&self, closing_worker: Arc) { - self.list_auto_close_worker.borrow_mut().push(AutoCloseWorker(closing_worker)); + self.list_auto_close_worker + .borrow_mut() + .push(AutoCloseWorker(closing_worker)); } pub fn track_event_source(&self, event_source: &EventSource) { @@ -184,15 +184,16 @@ impl GlobalScope { pub fn close_event_sources(&self) -> bool { let mut canceled_any_fetch = false; - self.event_source_tracker.for_each(|event_source: DomRoot| { - match event_source.ReadyState() { - 2 => {}, - _ => { - event_source.cancel(); - canceled_any_fetch = true; - } - } - }); + self.event_source_tracker + .for_each( + |event_source: DomRoot| match event_source.ReadyState() { + 2 => {}, + _ => { + event_source.cancel(); + canceled_any_fetch = true; + }, + }, + ); canceled_any_fetch } @@ -268,9 +269,11 @@ impl GlobalScope { } pub fn time_end(&self, label: &str) -> Result { - self.console_timers.borrow_mut().remove(label).ok_or(()).map(|start| { - timestamp_in_ms(get_time()) - start - }) + self.console_timers + .borrow_mut() + .remove(label) + .ok_or(()) + .map(|start| timestamp_in_ms(get_time()) - start) } /// Get an `&IpcSender` to send messages @@ -383,7 +386,6 @@ impl GlobalScope { dedicated.forward_error_to_worker_object(error_info); } } - } /// Get the `&ResourceThreads` for this global scope. @@ -444,15 +446,19 @@ impl GlobalScope { } /// Evaluate JS code on this global scope. - pub fn evaluate_js_on_global_with_result( - &self, code: &str, rval: MutableHandleValue) -> bool { + pub fn evaluate_js_on_global_with_result(&self, code: &str, rval: MutableHandleValue) -> bool { self.evaluate_script_on_global_with_result(code, "", rval, 1) } /// Evaluate a JS script on this global scope. #[allow(unsafe_code)] pub fn evaluate_script_on_global_with_result( - &self, code: &str, filename: &str, rval: MutableHandleValue, line_number: u32) -> bool { + &self, + code: &str, + filename: &str, + rval: MutableHandleValue, + line_number: u32, + ) -> bool { let metadata = time::TimerMetadata { url: if filename.is_empty() { self.get_url().as_str().into() @@ -478,9 +484,13 @@ impl GlobalScope { debug!("evaluating Dom string"); let result = unsafe { - Evaluate2(cx, options.ptr, code.as_ptr(), - code.len() as libc::size_t, - rval) + Evaluate2( + cx, + options.ptr, + code.as_ptr(), + code.len() as libc::size_t, + rval, + ) }; if !result { @@ -490,14 +500,17 @@ impl GlobalScope { maybe_resume_unwind(); result - } + }, ) } pub fn schedule_callback( - &self, callback: OneshotTimerCallback, duration: MsDuration) - -> OneshotTimerHandle { - self.timers.schedule_callback(callback, duration, self.timer_source()) + &self, + callback: OneshotTimerCallback, + duration: MsDuration, + ) -> OneshotTimerHandle { + self.timers + .schedule_callback(callback, duration, self.timer_source()) } pub fn unschedule_callback(&self, handle: OneshotTimerHandle) { @@ -505,14 +518,20 @@ impl GlobalScope { } pub fn set_timeout_or_interval( - &self, - callback: TimerCallback, - arguments: Vec, - timeout: i32, - is_interval: IsInterval) - -> i32 { + &self, + callback: TimerCallback, + arguments: Vec, + timeout: i32, + is_interval: IsInterval, + ) -> i32 { self.timers.set_timeout_or_interval( - self, callback, arguments, timeout, is_interval, self.timer_source()) + self, + callback, + arguments, + timeout, + is_interval, + self.timer_source(), + ) } pub fn clear_timeout_or_interval(&self, handle: i32) { @@ -566,7 +585,8 @@ impl GlobalScope { /// Perform a microtask checkpoint. pub fn perform_a_microtask_checkpoint(&self) { - self.microtask_queue.checkpoint(|_| Some(DomRoot::from_ref(self))); + self.microtask_queue + .checkpoint(|_| Some(DomRoot::from_ref(self))); } /// Enqueue a microtask for subsequent execution. @@ -668,7 +688,6 @@ impl GlobalScope { } unreachable!(); } - } fn timestamp_in_ms(time: Timespec) -> u64 { @@ -680,6 +699,9 @@ fn timestamp_in_ms(time: Timespec) -> u64 { unsafe fn global_scope_from_global(global: *mut JSObject) -> DomRoot { assert!(!global.is_null()); let clasp = get_object_class(global); - assert_ne!(((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)), 0); + assert_ne!( + ((*clasp).flags & (JSCLASS_IS_DOMJSCLASS | JSCLASS_IS_GLOBAL)), + 0 + ); root_from_object(global).unwrap() } diff --git a/components/script/dom/hashchangeevent.rs b/components/script/dom/hashchangeevent.rs index 98314305fd4..e32c64a779f 100644 --- a/components/script/dom/hashchangeevent.rs +++ b/components/script/dom/hashchangeevent.rs @@ -33,21 +33,26 @@ impl HashChangeEvent { } pub fn new_uninitialized(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(HashChangeEvent::new_inherited(String::new(), String::new())), - window, - HashChangeEventBinding::Wrap) + reflect_dom_object( + Box::new(HashChangeEvent::new_inherited(String::new(), String::new())), + window, + HashChangeEventBinding::Wrap, + ) } - pub fn new(window: &Window, - type_: Atom, - bubbles: bool, - cancelable: bool, - old_url: String, - new_url: String) - -> DomRoot { - let ev = reflect_dom_object(Box::new(HashChangeEvent::new_inherited(old_url, new_url)), - window, - HashChangeEventBinding::Wrap); + pub fn new( + window: &Window, + type_: Atom, + bubbles: bool, + cancelable: bool, + old_url: String, + new_url: String, + ) -> DomRoot { + let ev = reflect_dom_object( + Box::new(HashChangeEvent::new_inherited(old_url, new_url)), + window, + HashChangeEventBinding::Wrap, + ); { let event = ev.upcast::(); event.init_event(type_, bubbles, cancelable); @@ -55,16 +60,19 @@ impl HashChangeEvent { ev } - pub fn Constructor(window: &Window, - type_: DOMString, - init: &HashChangeEventBinding::HashChangeEventInit) - -> Fallible> { - Ok(HashChangeEvent::new(window, - Atom::from(type_), - init.parent.bubbles, - init.parent.cancelable, - init.oldURL.0.clone(), - init.newURL.0.clone())) + pub fn Constructor( + window: &Window, + type_: DOMString, + init: &HashChangeEventBinding::HashChangeEventInit, + ) -> Fallible> { + Ok(HashChangeEvent::new( + window, + Atom::from(type_), + init.parent.bubbles, + init.parent.cancelable, + init.oldURL.0.clone(), + init.newURL.0.clone(), + )) } } diff --git a/components/script/dom/headers.rs b/components/script/dom/headers.rs index b351e2b7f13..9ff08e7c07a 100644 --- a/components/script/dom/headers.rs +++ b/components/script/dom/headers.rs @@ -22,7 +22,7 @@ pub struct Headers { reflector_: Reflector, guard: Cell, #[ignore_malloc_size_of = "Defined in hyper"] - header_list: DomRefCell + header_list: DomRefCell, } // https://fetch.spec.whatwg.org/#concept-headers-guard @@ -49,8 +49,10 @@ impl Headers { } // https://fetch.spec.whatwg.org/#dom-headers - pub fn Constructor(global: &GlobalScope, init: Option) - -> Fallible> { + pub fn Constructor( + global: &GlobalScope, + init: Option, + ) -> Fallible> { let dom_headers_new = Headers::new(global); dom_headers_new.fill(init)?; Ok(dom_headers_new) @@ -74,7 +76,9 @@ impl HeadersMethods for Headers { return Ok(()); } // Step 5 - if self.guard.get() == Guard::RequestNoCors && !is_cors_safelisted_request_header(&valid_name, &valid_value) { + if self.guard.get() == Guard::RequestNoCors && + !is_cors_safelisted_request_header(&valid_name, &valid_value) + { return Ok(()); } // Step 6 @@ -88,7 +92,9 @@ impl HeadersMethods for Headers { combined_value.push(b','); } combined_value.extend(valid_value.iter().cloned()); - self.header_list.borrow_mut().set_raw(valid_name, vec![combined_value]); + self.header_list + .borrow_mut() + .set_raw(valid_name, vec![combined_value]); Ok(()) } @@ -106,9 +112,10 @@ impl HeadersMethods for Headers { } // Step 4 if self.guard.get() == Guard::RequestNoCors && - !is_cors_safelisted_request_header(&valid_name, &b"invalid".to_vec()) { - return Ok(()); - } + !is_cors_safelisted_request_header(&valid_name, &b"invalid".to_vec()) + { + return Ok(()); + } // Step 5 if self.guard.get() == Guard::Response && is_forbidden_response_header(&valid_name) { return Ok(()); @@ -122,9 +129,11 @@ impl HeadersMethods for Headers { fn Get(&self, name: ByteString) -> Fallible> { // Step 1 let valid_name = &validate_name(name)?; - Ok(self.header_list.borrow().get_raw(&valid_name).map(|v| { - ByteString::new(v[0].clone()) - })) + Ok(self + .header_list + .borrow() + .get_raw(&valid_name) + .map(|v| ByteString::new(v[0].clone()))) } // https://fetch.spec.whatwg.org/#dom-headers-has @@ -151,7 +160,9 @@ impl HeadersMethods for Headers { return Ok(()); } // Step 5 - if self.guard.get() == Guard::RequestNoCors && !is_cors_safelisted_request_header(&valid_name, &valid_value) { + if self.guard.get() == Guard::RequestNoCors && + !is_cors_safelisted_request_header(&valid_name, &valid_value) + { return Ok(()); } // Step 6 @@ -160,7 +171,9 @@ impl HeadersMethods for Headers { } // Step 7 // https://fetch.spec.whatwg.org/#concept-header-list-set - self.header_list.borrow_mut().set_raw(valid_name, vec![valid_value]); + self.header_list + .borrow_mut() + .set_raw(valid_name, vec![valid_value]); Ok(()) } } @@ -174,7 +187,7 @@ impl Headers { for header in h.header_list.borrow().iter() { self.Append( ByteString::new(Vec::from(header.name())), - ByteString::new(Vec::from(header.value_string().into_bytes())) + ByteString::new(Vec::from(header.value_string().into_bytes())), )?; } Ok(()) @@ -242,7 +255,10 @@ impl Headers { // https://fetch.spec.whatwg.org/#concept-header-extract-mime-type pub fn extract_mime_type(&self) -> Vec { - self.header_list.borrow().get_raw("content-type").map_or(vec![], |v| v[0].clone()) + self.header_list + .borrow() + .get_raw("content-type") + .map_or(vec![], |v| v[0].clone()) } pub fn sort_header_list(&self) -> Vec<(String, String)> { @@ -290,14 +306,12 @@ fn is_cors_safelisted_request_content_type(value: &[u8]) -> bool { let value_mime_result: Result = value_string.parse(); match value_mime_result { Err(_) => false, - Ok(value_mime) => { - match value_mime { - Mime(TopLevel::Application, SubLevel::WwwFormUrlEncoded, _) | - Mime(TopLevel::Multipart, SubLevel::FormData, _) | - Mime(TopLevel::Text, SubLevel::Plain, _) => true, - _ => false, - } - } + Ok(value_mime) => match value_mime { + Mime(TopLevel::Application, SubLevel::WwwFormUrlEncoded, _) | + Mime(TopLevel::Multipart, SubLevel::FormData, _) | + Mime(TopLevel::Text, SubLevel::Plain, _) => true, + _ => false, + }, } } @@ -306,9 +320,7 @@ fn is_cors_safelisted_request_content_type(value: &[u8]) -> bool { // https://fetch.spec.whatwg.org/#cors-safelisted-request-header fn is_cors_safelisted_request_header(name: &str, value: &[u8]) -> bool { match name { - "accept" | - "accept-language" | - "content-language" => true, + "accept" | "accept-language" | "content-language" => true, "content-type" => is_cors_safelisted_request_content_type(value), _ => false, } @@ -317,28 +329,41 @@ fn is_cors_safelisted_request_header(name: &str, value: &[u8]) -> bool { // https://fetch.spec.whatwg.org/#forbidden-response-header-name fn is_forbidden_response_header(name: &str) -> bool { match name { - "set-cookie" | - "set-cookie2" => true, + "set-cookie" | "set-cookie2" => true, _ => false, } } // https://fetch.spec.whatwg.org/#forbidden-header-name pub fn is_forbidden_header_name(name: &str) -> bool { - let disallowed_headers = - ["accept-charset", "accept-encoding", - "access-control-request-headers", - "access-control-request-method", - "connection", "content-length", - "cookie", "cookie2", "date", "dnt", - "expect", "host", "keep-alive", "origin", - "referer", "te", "trailer", "transfer-encoding", - "upgrade", "via"]; + let disallowed_headers = [ + "accept-charset", + "accept-encoding", + "access-control-request-headers", + "access-control-request-method", + "connection", + "content-length", + "cookie", + "cookie2", + "date", + "dnt", + "expect", + "host", + "keep-alive", + "origin", + "referer", + "te", + "trailer", + "transfer-encoding", + "upgrade", + "via", + ]; let disallowed_header_prefixes = ["sec-", "proxy-"]; - disallowed_headers.iter().any(|header| *header == name) || - disallowed_header_prefixes.iter().any(|prefix| name.starts_with(prefix)) + disallowed_headers.iter().any(|header| *header == name) || disallowed_header_prefixes + .iter() + .any(|prefix| name.starts_with(prefix)) } // There is some unresolved confusion over the definition of a name and a value. @@ -364,8 +389,7 @@ pub fn is_forbidden_header_name(name: &str) -> bool { // [2] https://tools.ietf.org/html/rfc7230#section-3.2 // [3] https://tools.ietf.org/html/rfc7230#section-3.2.6 // [4] https://www.rfc-editor.org/errata_search.php?rfc=7230 -fn validate_name_and_value(name: ByteString, value: ByteString) - -> Fallible<(String, Vec)> { +fn validate_name_and_value(name: ByteString, value: ByteString) -> Fallible<(String, Vec)> { let valid_name = validate_name(name)?; if !is_field_content(&value) { return Err(Error::Type("Value is not valid".to_string())); @@ -386,7 +410,10 @@ fn validate_name(name: ByteString) -> Fallible { // Removes trailing and leading HTTP whitespace bytes. // https://fetch.spec.whatwg.org/#concept-header-value-normalize pub fn normalize_value(value: ByteString) -> ByteString { - match (index_of_first_non_whitespace(&value), index_of_last_non_whitespace(&value)) { + match ( + index_of_first_non_whitespace(&value), + index_of_last_non_whitespace(&value), + ) { (Some(begin), Some(end)) => ByteString::new(value[begin..end + 1].to_owned()), _ => ByteString::new(vec![]), } diff --git a/components/script/dom/history.rs b/components/script/dom/history.rs index 939cf9a8c20..ee5c38e8c89 100644 --- a/components/script/dom/history.rs +++ b/components/script/dom/history.rs @@ -57,9 +57,11 @@ impl History { } pub fn new(window: &Window) -> DomRoot { - reflect_dom_object(Box::new(History::new_inherited(window)), - window, - HistoryBinding::Wrap) + reflect_dom_object( + Box::new(History::new_inherited(window)), + window, + HistoryBinding::Wrap, + ) } } @@ -69,7 +71,11 @@ impl History { return Err(Error::Security); } let msg = ScriptMsg::TraverseHistory(direction); - let _ = self.window.upcast::().script_to_constellation_chan().send(msg); + let _ = self + .window + .upcast::() + .script_to_constellation_chan() + .send(msg); Ok(()) } @@ -83,7 +89,7 @@ impl History { document.set_url(url.clone()); // Step 6 - let hash_changed = old_url.fragment() != url.fragment(); + let hash_changed = old_url.fragment() != url.fragment(); // Step 8 if let Some(fragment) = url.fragment() { @@ -96,7 +102,8 @@ impl History { let serialized_data = match state_id { Some(state_id) => { let (tx, rx) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let _ = self.window + let _ = self + .window .upcast::() .resource_threads() .send(CoreResourceMsg::GetHistoryState(state_id, tx)); @@ -109,12 +116,13 @@ impl History { Some(serialized_data) => { let global_scope = self.window.upcast::(); rooted!(in(global_scope.get_cx()) let mut state = UndefinedValue()); - StructuredCloneData::Vector(serialized_data).read(&global_scope, state.handle_mut()); + StructuredCloneData::Vector(serialized_data) + .read(&global_scope, state.handle_mut()); self.state.set(state.get()); }, None => { self.state.set(NullValue()); - } + }, } // TODO: Queue events on DOM Manipulation task source if non-blocking flag is set. @@ -123,7 +131,7 @@ impl History { PopStateEvent::dispatch_jsval( self.window.upcast::(), &*self.window, - unsafe { HandleValue::from_raw(self.state.handle()) } + unsafe { HandleValue::from_raw(self.state.handle()) }, ); } @@ -135,13 +143,17 @@ impl History { false, false, old_url.into_string(), - url.into_string()); - event.upcast::().fire(self.window.upcast::()); + url.into_string(), + ); + event + .upcast::() + .fire(self.window.upcast::()); } } pub fn remove_states(&self, states: Vec) { - let _ = self.window + let _ = self + .window .upcast::() .resource_threads() .send(CoreResourceMsg::RemoveHistoryStates(states)); @@ -149,12 +161,14 @@ impl History { // https://html.spec.whatwg.org/multipage/#dom-history-pushstate // https://html.spec.whatwg.org/multipage/#dom-history-replacestate - fn push_or_replace_state(&self, - cx: *mut JSContext, - data: HandleValue, - _title: DOMString, - url: Option, - push_or_replace: PushOrReplace) -> ErrorResult { + fn push_or_replace_state( + &self, + cx: *mut JSContext, + data: HandleValue, + _title: DOMString, + url: Option, + push_or_replace: PushOrReplace, + ) -> ErrorResult { // Step 1 let document = self.window.Document(); @@ -186,10 +200,10 @@ impl History { // Step 6.4 if new_url.scheme() != document_url.scheme() || - new_url.host() != document_url.host() || - new_url.port() != document_url.port() || - new_url.username() != document_url.username() || - new_url.password() != document_url.password() + new_url.host() != document_url.host() || + new_url.port() != document_url.port() || + new_url.username() != document_url.username() || + new_url.password() != document_url.password() { return Err(Error::Security); } @@ -202,9 +216,7 @@ impl History { new_url }, // Step 7 - None => { - document.url() - } + None => document.url(), }; // Step 8 @@ -213,7 +225,11 @@ impl History { let state_id = HistoryStateId::new(); self.state_id.set(Some(state_id)); let msg = ScriptMsg::PushHistoryState(state_id, new_url.clone()); - let _ = self.window.upcast::().script_to_constellation_chan().send(msg); + let _ = self + .window + .upcast::() + .script_to_constellation_chan() + .send(msg); state_id }, PushOrReplace::Replace => { @@ -226,16 +242,18 @@ impl History { }, }; let msg = ScriptMsg::ReplaceHistoryState(state_id, new_url.clone()); - let _ = self.window.upcast::().script_to_constellation_chan().send(msg); + let _ = self + .window + .upcast::() + .script_to_constellation_chan() + .send(msg); state_id }, }; - let _ = self.window - .upcast::() - .resource_threads() - .send(CoreResourceMsg::SetHistoryState(state_id, serialized_data.clone())); - + let _ = self.window.upcast::().resource_threads().send( + CoreResourceMsg::SetHistoryState(state_id, serialized_data.clone()), + ); // TODO: Step 9 Update current entry to represent a GET request // https://github.com/servo/servo/issues/19156 @@ -273,10 +291,14 @@ impl HistoryMethods for History { if !self.window.Document().is_fully_active() { return Err(Error::Security); } - let (sender, recv) = - channel(self.global().time_profiler_chan().clone()).expect("Failed to create channel to send jsh length."); + let (sender, recv) = channel(self.global().time_profiler_chan().clone()) + .expect("Failed to create channel to send jsh length."); let msg = ScriptMsg::JointSessionHistoryLength(sender); - let _ = self.window.upcast::().script_to_constellation_chan().send(msg); + let _ = self + .window + .upcast::() + .script_to_constellation_chan() + .send(msg); Ok(recv.recv().unwrap()) } @@ -305,21 +327,25 @@ impl HistoryMethods for History { // https://html.spec.whatwg.org/multipage/#dom-history-pushstate #[allow(unsafe_code)] - unsafe fn PushState(&self, - cx: *mut JSContext, - data: HandleValue, - title: DOMString, - url: Option) -> ErrorResult { + unsafe fn PushState( + &self, + cx: *mut JSContext, + data: HandleValue, + title: DOMString, + url: Option, + ) -> ErrorResult { self.push_or_replace_state(cx, data, title, url, PushOrReplace::Push) } // https://html.spec.whatwg.org/multipage/#dom-history-replacestate #[allow(unsafe_code)] - unsafe fn ReplaceState(&self, - cx: *mut JSContext, - data: HandleValue, - title: DOMString, - url: Option) -> ErrorResult { + unsafe fn ReplaceState( + &self, + cx: *mut JSContext, + data: HandleValue, + title: DOMString, + url: Option, + ) -> ErrorResult { self.push_or_replace_state(cx, data, title, url, PushOrReplace::Replace) } } diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 657ed992441..f813a4026f4 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -40,29 +40,38 @@ pub struct HTMLAnchorElement { } impl HTMLAnchorElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLAnchorElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLAnchorElement { HTMLAnchorElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document), + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), rel_list: Default::default(), url: DomRefCell::new(None), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLAnchorElement::new_inherited(local_name, prefix, document)), - document, - HTMLAnchorElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLAnchorElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLAnchorElementBinding::Wrap, + ) } // https://html.spec.whatwg.org/multipage/#concept-hyperlink-url-set fn set_url(&self) { - let attribute = self.upcast::().get_attribute(&ns!(), &local_name!("href")); + let attribute = self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")); *self.url.borrow_mut() = attribute.and_then(|attribute| { let document = document_from_node(self); document.base_url().join(&attribute.value()).ok() @@ -83,7 +92,8 @@ impl HTMLAnchorElement { // https://html.spec.whatwg.org/multipage/#update-href fn update_href(&self, url: DOMString) { - self.upcast::().set_string_attribute(&local_name!("href"), url); + self.upcast::() + .set_string_attribute(&local_name!("href"), url); } } @@ -95,7 +105,10 @@ impl VirtualMethods for HTMLAnchorElement { fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { match name { &local_name!("rel") => AttrValue::from_serialized_tokenlist(value.into()), - _ => self.super_type().unwrap().parse_plain_attribute(name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(name, value), } } } @@ -116,12 +129,14 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // https://html.spec.whatwg.org/multipage/#dom-a-rel fn SetRel(&self, rel: DOMString) { - self.upcast::().set_tokenlist_attribute(&local_name!("rel"), rel); + self.upcast::() + .set_tokenlist_attribute(&local_name!("rel"), rel); } // https://html.spec.whatwg.org/multipage/#dom-a-rellist fn RelList(&self) -> DomRoot { - self.rel_list.or_init(|| DOMTokenList::new(self.upcast(), &local_name!("rel"))) + self.rel_list + .or_init(|| DOMTokenList::new(self.upcast(), &local_name!("rel"))) } // https://html.spec.whatwg.org/multipage/#dom-a-coords @@ -165,7 +180,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(ref url) => { // Steps 3-4. UrlHelper::Hash(url) - } + }, } } @@ -183,7 +198,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetHash(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 6. self.update_href(url); @@ -204,7 +219,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Steps 4-5. UrlHelper::Host(url) } - } + }, } } @@ -222,7 +237,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetHost(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 5. self.update_href(url); @@ -239,7 +254,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(ref url) => { // Step 4. UrlHelper::Hostname(url) - } + }, } } @@ -257,7 +272,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetHostname(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 5. self.update_href(url); @@ -270,7 +285,10 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { USVString(match *self.url.borrow() { None => { - match self.upcast::().get_attribute(&ns!(), &local_name!("href")) { + match self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")) + { // Step 3. None => String::new(), // Step 4. @@ -284,8 +302,8 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // https://html.spec.whatwg.org/multipage/#dom-hyperlink-href fn SetHref(&self, value: USVString) { - self.upcast::().set_string_attribute(&local_name!("href"), - DOMString::from_string(value.0)); + self.upcast::() + .set_string_attribute(&local_name!("href"), DOMString::from_string(value.0)); self.set_url(); } @@ -315,13 +333,13 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 3. None => USVString(String::new()), // Steps 3-4. - Some(ref url) => UrlHelper::Password(url) + Some(ref url) => UrlHelper::Password(url), } } // https://html.spec.whatwg.org/multipage/#dom-hyperlink-password fn SetPassword(&self, value: USVString) { - // Step 1. + // Step 1. self.reinitialize_url(); // Step 2. @@ -333,7 +351,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetPassword(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 5. self.update_href(url); @@ -341,14 +359,14 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // https://html.spec.whatwg.org/multipage/#dom-hyperlink-pathname fn Pathname(&self) -> USVString { - // Step 1. + // Step 1. self.reinitialize_url(); match *self.url.borrow() { // Step 3. None => USVString(String::new()), // Steps 4-5. - Some(ref url) => UrlHelper::Pathname(url) + Some(ref url) => UrlHelper::Pathname(url), } } @@ -366,7 +384,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetPathname(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 6. self.update_href(url); @@ -381,7 +399,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 3. None => USVString(String::new()), // Step 4. - Some(ref url) => UrlHelper::Port(url) + Some(ref url) => UrlHelper::Port(url), } } @@ -392,15 +410,17 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 3. let url = match self.url.borrow_mut().as_mut() { - Some(ref url) if url.host().is_none() || - url.cannot_be_a_base() || - url.scheme() == "file" => return, + Some(ref url) + if url.host().is_none() || url.cannot_be_a_base() || url.scheme() == "file" => + { + return + }, None => return, // Step 4. Some(url) => { UrlHelper::SetPort(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 5. self.update_href(url); @@ -415,7 +435,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 2. None => USVString(":".to_owned()), // Step 3. - Some(ref url) => UrlHelper::Protocol(url) + Some(ref url) => UrlHelper::Protocol(url), } } @@ -431,7 +451,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetProtocol(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 4. self.update_href(url); @@ -446,7 +466,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 2. None => USVString(String::new()), // Step 3. - Some(ref url) => UrlHelper::Search(url) + Some(ref url) => UrlHelper::Search(url), } } @@ -465,7 +485,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetSearch(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 6. self.update_href(url); @@ -480,7 +500,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { // Step 2. None => USVString(String::new()), // Step 3. - Some(ref url) => UrlHelper::Username(url) + Some(ref url) => UrlHelper::Username(url), } } @@ -498,7 +518,7 @@ impl HTMLAnchorElementMethods for HTMLAnchorElement { Some(url) => { UrlHelper::SetUsername(url, value); DOMString::from(url.as_str()) - } + }, }; // Step 5. self.update_href(url); @@ -524,15 +544,12 @@ impl Activatable for HTMLAnchorElement { self.upcast::().has_attribute(&local_name!("href")) } - //TODO:https://html.spec.whatwg.org/multipage/#the-a-element - fn pre_click_activation(&self) { - } + fn pre_click_activation(&self) {} //TODO:https://html.spec.whatwg.org/multipage/#the-a-element // https://html.spec.whatwg.org/multipage/#run-canceled-activation-steps - fn canceled_activation(&self) { - } + fn canceled_activation(&self) {} //https://html.spec.whatwg.org/multipage/#the-a-element:activation-behaviour fn activation_behavior(&self, event: &Event, target: &EventTarget) { @@ -550,10 +567,11 @@ impl Activatable for HTMLAnchorElement { if target.is::() && element.has_attribute(&local_name!("ismap")) { let target_node = element.upcast::(); let rect = target_node.bounding_content_box_or_zero(); - ismap_suffix = Some( - format!("?{},{}", mouse_event.ClientX().to_f32().unwrap() - rect.origin.x.to_f32_px(), - mouse_event.ClientY().to_f32().unwrap() - rect.origin.y.to_f32_px()) - ) + ismap_suffix = Some(format!( + "?{},{}", + mouse_event.ClientX().to_f32().unwrap() - rect.origin.x.to_f32_px(), + mouse_event.ClientY().to_f32().unwrap() - rect.origin.y.to_f32_px() + )) } } @@ -570,12 +588,22 @@ impl Activatable for HTMLAnchorElement { } //TODO:https://html.spec.whatwg.org/multipage/#the-a-element - fn implicit_submission(&self, _ctrl_key: bool, _shift_key: bool, _alt_key: bool, _meta_key: bool) { + fn implicit_submission( + &self, + _ctrl_key: bool, + _shift_key: bool, + _alt_key: bool, + _meta_key: bool, + ) { } } /// -pub fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option, referrer_policy: Option) { +pub fn follow_hyperlink( + subject: &Element, + hyperlink_suffix: Option, + referrer_policy: Option, +) { // Step 1: TODO: If subject cannot navigate, then return. // Step 2, done in Step 7. @@ -600,8 +628,8 @@ pub fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option, ref // Step 7. let (maybe_chosen, replace) = match target_attribute_value { - Some(name) => source.choose_browsing_context(name.Value(), noopener), - None => (Some(window.window_proxy()), false) + Some(name) => source.choose_browsing_context(name.Value(), noopener), + None => (Some(window.window_proxy()), false), }; let chosen = match maybe_chosen { Some(proxy) => proxy, diff --git a/components/script/dom/htmlareaelement.rs b/components/script/dom/htmlareaelement.rs index e7120a20e08..303b72a55f2 100644 --- a/components/script/dom/htmlareaelement.rs +++ b/components/script/dom/htmlareaelement.rs @@ -27,12 +27,20 @@ use std::f32; use std::str; use style::attr::AttrValue; -#[derive(PartialEq)] -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum Area { - Circle { left: f32, top: f32, radius: f32 }, - Rectangle { top_left: (f32, f32), bottom_right: (f32, f32) }, - Polygon { points: Vec }, + Circle { + left: f32, + top: f32, + radius: f32, + }, + Rectangle { + top_left: (f32, f32), + bottom_right: (f32, f32), + }, + Polygon { + points: Vec, + }, } pub enum Shape { @@ -45,7 +53,7 @@ pub enum Shape { // https://html.spec.whatwg.org/multipage/#image-map-processing-model impl Area { pub fn parse(coord: &str, target: Shape) -> Option { - let points_count = match target { + let points_count = match target { Shape::Circle => 3, Shape::Rectangle => 4, Shape::Polygon => 0, @@ -59,7 +67,7 @@ impl Area { while index < size { let val = num[index]; match val { - b',' | b';' | b' ' | b'\t' | b'\n' | 0x0C | b'\r' => {}, + b',' | b';' | b' ' | b'\t' | b'\n' | 0x0C | b'\r' => {}, _ => break, } @@ -101,7 +109,10 @@ impl Area { } // Convert String to float - match str::from_utf8(&array).ok().and_then(|s| s.parse::().ok()) { + match str::from_utf8(&array) + .ok() + .and_then(|s| s.parse::().ok()) + { Some(v) => number_list.push(v), None => number_list.push(0.0), }; @@ -124,10 +135,10 @@ impl Area { None } else { Some(Area::Circle { - left: number_list[0], - top: number_list[1], - radius: number_list[2] - }) + left: number_list[0], + top: number_list[1], + radius: number_list[2], + }) } } else { None @@ -145,9 +156,9 @@ impl Area { } Some(Area::Rectangle { - top_left: (number_list[0], number_list[1]), - bottom_right: (number_list[2], number_list[3]) - }) + top_left: (number_list[0], number_list[1]), + bottom_right: (number_list[2], number_list[3]), + }) } else { None } @@ -159,7 +170,9 @@ impl Area { // Drop last element if there are odd number of coordinates number_list.remove(final_size - 1); } - Some(Area::Polygon { points: number_list }) + Some(Area::Polygon { + points: number_list, + }) } else { None } @@ -170,14 +183,17 @@ impl Area { pub fn hit_test(&self, p: &Point2D) -> bool { match *self { Area::Circle { left, top, radius } => { - (p.x - left) * (p.x - left) + - (p.y - top) * (p.y - top) - - radius * radius <= 0.0 + (p.x - left) * (p.x - left) + (p.y - top) * (p.y - top) - radius * radius <= 0.0 }, - Area::Rectangle { top_left, bottom_right } => { - p.x <= bottom_right.0 && p.x >= top_left.0 && - p.y <= bottom_right.1 && p.y >= top_left.1 + Area::Rectangle { + top_left, + bottom_right, + } => { + p.x <= bottom_right.0 && + p.x >= top_left.0 && + p.y <= bottom_right.1 && + p.y >= top_left.1 }, //TODO polygon hit_test @@ -187,28 +203,30 @@ impl Area { pub fn absolute_coords(&self, p: Point2D) -> Area { match *self { - Area::Rectangle { top_left, bottom_right } => { - Area::Rectangle { - top_left: (top_left.0 + p.x, top_left.1 + p.y), - bottom_right: (bottom_right.0 + p.x, bottom_right.1 + p.y) - } + Area::Rectangle { + top_left, + bottom_right, + } => Area::Rectangle { + top_left: (top_left.0 + p.x, top_left.1 + p.y), + bottom_right: (bottom_right.0 + p.x, bottom_right.1 + p.y), }, - Area::Circle { left, top, radius } => { - Area::Circle { - left: (left + p.x), - top: (top + p.y), - radius: radius - } + Area::Circle { left, top, radius } => Area::Circle { + left: (left + p.x), + top: (top + p.y), + radius: radius, }, Area::Polygon { ref points } => { -// let new_points = Vec::new(); - let iter = points.iter().enumerate().map(|(index, point)| { - match index % 2 { + // let new_points = Vec::new(); + let iter = points + .iter() + .enumerate() + .map(|(index, point)| match index % 2 { 0 => point + p.x as f32, _ => point + p.y as f32, - } - }); - Area::Polygon { points: iter.collect::>() } + }); + Area::Polygon { + points: iter.collect::>(), + } }, } } @@ -221,7 +239,11 @@ pub struct HTMLAreaElement { } impl HTMLAreaElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document) -> HTMLAreaElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLAreaElement { HTMLAreaElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), rel_list: Default::default(), @@ -229,18 +251,22 @@ impl HTMLAreaElement { } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLAreaElement::new_inherited(local_name, prefix, document)), - document, - HTMLAreaElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLAreaElement::new_inherited(local_name, prefix, document)), + document, + HTMLAreaElementBinding::Wrap, + ) } pub fn get_shape_from_coords(&self) -> Option { - let elem = self.upcast::(); - let shape = elem.get_string_attribute(&"shape".into()); - let shp: Shape = match_ignore_ascii_case! { &shape, + let elem = self.upcast::(); + let shape = elem.get_string_attribute(&"shape".into()); + let shp: Shape = match_ignore_ascii_case! { &shape, "circle" => Shape::Circle, "circ" => Shape::Circle, "rectangle" => Shape::Rectangle, @@ -266,7 +292,10 @@ impl VirtualMethods for HTMLAreaElement { fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { match name { &local_name!("rel") => AttrValue::from_serialized_tokenlist(value.into()), - _ => self.super_type().unwrap().parse_plain_attribute(name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(name, value), } } } @@ -274,9 +303,8 @@ impl VirtualMethods for HTMLAreaElement { impl HTMLAreaElementMethods for HTMLAreaElement { // https://html.spec.whatwg.org/multipage/#dom-area-rellist fn RelList(&self) -> DomRoot { - self.rel_list.or_init(|| { - DOMTokenList::new(self.upcast(), &local_name!("rel")) - }) + self.rel_list + .or_init(|| DOMTokenList::new(self.upcast(), &local_name!("rel"))) } } @@ -290,14 +318,17 @@ impl Activatable for HTMLAreaElement { self.as_element().has_attribute(&local_name!("href")) } - fn pre_click_activation(&self) { - } + fn pre_click_activation(&self) {} - fn canceled_activation(&self) { - } + fn canceled_activation(&self) {} - fn implicit_submission(&self, _ctrl_key: bool, _shift_key: bool, - _alt_key: bool, _meta_key: bool) { + fn implicit_submission( + &self, + _ctrl_key: bool, + _shift_key: bool, + _alt_key: bool, + _meta_key: bool, + ) { } fn activation_behavior(&self, _event: &Event, _target: &EventTarget) { diff --git a/components/script/dom/htmlaudioelement.rs b/components/script/dom/htmlaudioelement.rs index ed33f124819..354e138089b 100644 --- a/components/script/dom/htmlaudioelement.rs +++ b/components/script/dom/htmlaudioelement.rs @@ -12,25 +12,32 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLAudioElement { - htmlmediaelement: HTMLMediaElement + htmlmediaelement: HTMLMediaElement, } impl HTMLAudioElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLAudioElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLAudioElement { HTMLAudioElement { - htmlmediaelement: - HTMLMediaElement::new_inherited(local_name, prefix, document) + htmlmediaelement: HTMLMediaElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLAudioElement::new_inherited(local_name, prefix, document)), - document, - HTMLAudioElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLAudioElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLAudioElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmlbaseelement.rs b/components/script/dom/htmlbaseelement.rs index 54909e57e30..fbda8679239 100644 --- a/components/script/dom/htmlbaseelement.rs +++ b/components/script/dom/htmlbaseelement.rs @@ -19,30 +19,42 @@ use servo_url::ServoUrl; #[dom_struct] pub struct HTMLBaseElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLBaseElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document) -> HTMLBaseElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLBaseElement { HTMLBaseElement { - htmlelement: HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLBaseElement::new_inherited(local_name, prefix, document)), - document, - HTMLBaseElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLBaseElement::new_inherited(local_name, prefix, document)), + document, + HTMLBaseElementBinding::Wrap, + ) } /// pub fn frozen_base_url(&self) -> ServoUrl { - let href = self.upcast::().get_attribute(&ns!(), &local_name!("href")) - .expect("The frozen base url is only defined for base elements \ - that have a base url."); + let href = self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")) + .expect( + "The frozen base url is only defined for base elements \ + that have a base url.", + ); let document = document_from_node(self); let base = document.fallback_base_url(); let parsed = base.join(&href.value()); @@ -70,7 +82,9 @@ impl HTMLBaseElementMethods for HTMLBaseElement { let document = document_from_node(self); // Step 2. - let attr = self.upcast::().get_attribute(&ns!(), &local_name!("href")); + let attr = self + .upcast::() + .get_attribute(&ns!(), &local_name!("href")); let value = attr.as_ref().map(|attr| attr.value()); let url = value.as_ref().map_or("", |value| &**value); @@ -81,7 +95,7 @@ impl HTMLBaseElementMethods for HTMLBaseElement { Err(_) => { // Step 4. url.into() - } + }, Ok(url_record) => { // Step 5. url_record.into_string().into() diff --git a/components/script/dom/htmlbodyelement.rs b/components/script/dom/htmlbodyelement.rs index 7d921d57ce8..da0c641e5c3 100644 --- a/components/script/dom/htmlbodyelement.rs +++ b/components/script/dom/htmlbodyelement.rs @@ -32,19 +32,27 @@ pub struct HTMLBodyElement { } impl HTMLBodyElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document) - -> HTMLBodyElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLBodyElement { HTMLBodyElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, prefix: Option, document: &Document) - -> DomRoot { - Node::reflect_node(Box::new(HTMLBodyElement::new_inherited(local_name, prefix, document)), - document, - HTMLBodyElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLBodyElement::new_inherited(local_name, prefix, document)), + document, + HTMLBodyElementBinding::Wrap, + ) } /// @@ -52,10 +60,10 @@ impl HTMLBodyElement { let self_node = self.upcast::(); let root_elem = self.upcast::().root_element(); let root_node = root_elem.upcast::(); - root_node.is_parent_of(self_node) && - self_node.preceding_siblings().all(|n| !n.is::()) + root_node.is_parent_of(self_node) && self_node + .preceding_siblings() + .all(|n| !n.is::()) } - } impl HTMLBodyElementMethods for HTMLBodyElement { @@ -76,11 +84,10 @@ impl HTMLBodyElementMethods for HTMLBodyElement { // https://html.spec.whatwg.org/multipage/#dom-body-background fn SetBackground(&self, input: DOMString) { - let value = AttrValue::from_resolved_url( - &document_from_node(self).base_url(), - input.into(), - ); - self.upcast::().set_attribute(&local_name!("background"), value); + let value = + AttrValue::from_resolved_url(&document_from_node(self).base_url(), input.into()); + self.upcast::() + .set_attribute(&local_name!("background"), value); } // https://html.spec.whatwg.org/multipage/#windoweventhandlers @@ -135,7 +142,9 @@ impl VirtualMethods for HTMLBodyElement { return true; } - self.super_type().unwrap().attribute_affects_presentational_hints(attr) + self.super_type() + .unwrap() + .attribute_affects_presentational_hints(attr) } fn bind_to_tree(&self, tree_in_doc: bool) { @@ -144,7 +153,7 @@ impl VirtualMethods for HTMLBodyElement { } if !tree_in_doc { - return + return; } let window = window_from_node(self); @@ -158,15 +167,16 @@ impl VirtualMethods for HTMLBodyElement { fn parse_plain_attribute(&self, name: &LocalName, value: DOMString) -> AttrValue { match *name { - local_name!("bgcolor") | - local_name!("text") => AttrValue::from_legacy_color(value.into()), + local_name!("bgcolor") | local_name!("text") => { + AttrValue::from_legacy_color(value.into()) + }, local_name!("background") => { - AttrValue::from_resolved_url( - &document_from_node(self).base_url(), - value.into(), - ) + AttrValue::from_resolved_url(&document_from_node(self).base_url(), value.into()) }, - _ => self.super_type().unwrap().parse_plain_attribute(name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(name, value), } } @@ -177,23 +187,34 @@ impl VirtualMethods for HTMLBodyElement { // https://html.spec.whatwg.org/multipage/ // #event-handlers-on-elements,-document-objects,-and-window-objects:event-handlers-3 match name { - &local_name!("onfocus") | &local_name!("onload") | &local_name!("onscroll") | - &local_name!("onafterprint") | &local_name!("onbeforeprint") | - &local_name!("onbeforeunload") | &local_name!("onhashchange") | - &local_name!("onlanguagechange") | &local_name!("onmessage") | - &local_name!("onoffline") | &local_name!("ononline") | - &local_name!("onpagehide") | &local_name!("onpageshow") | - &local_name!("onpopstate") | &local_name!("onstorage") | - &local_name!("onresize") | &local_name!("onunload") | &local_name!("onerror") - => { - let evtarget = window.upcast::(); // forwarded event - let source_line = 1; //TODO(#9604) obtain current JS execution line - evtarget.set_event_handler_uncompiled(window.get_url(), - source_line, - &name[2..], - DOMString::from((**attr.value()).to_owned())); - false - } + &local_name!("onfocus") | + &local_name!("onload") | + &local_name!("onscroll") | + &local_name!("onafterprint") | + &local_name!("onbeforeprint") | + &local_name!("onbeforeunload") | + &local_name!("onhashchange") | + &local_name!("onlanguagechange") | + &local_name!("onmessage") | + &local_name!("onoffline") | + &local_name!("ononline") | + &local_name!("onpagehide") | + &local_name!("onpageshow") | + &local_name!("onpopstate") | + &local_name!("onstorage") | + &local_name!("onresize") | + &local_name!("onunload") | + &local_name!("onerror") => { + let evtarget = window.upcast::(); // forwarded event + let source_line = 1; //TODO(#9604) obtain current JS execution line + evtarget.set_event_handler_uncompiled( + window.get_url(), + source_line, + &name[2..], + DOMString::from((**attr.value()).to_owned()), + ); + false + }, _ => true, // HTMLElement::attribute_mutated will take care of this. } }, diff --git a/components/script/dom/htmlbrelement.rs b/components/script/dom/htmlbrelement.rs index 02845543e53..87e5c024901 100644 --- a/components/script/dom/htmlbrelement.rs +++ b/components/script/dom/htmlbrelement.rs @@ -16,18 +16,26 @@ pub struct HTMLBRElement { } impl HTMLBRElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document) -> HTMLBRElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLBRElement { HTMLBRElement { - htmlelement: HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLBRElement::new_inherited(local_name, prefix, document)), - document, - HTMLBRElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLBRElement::new_inherited(local_name, prefix, document)), + document, + HTMLBRElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmlbuttonelement.rs b/components/script/dom/htmlbuttonelement.rs index be2b26d2085..d404c13ff9d 100755 --- a/components/script/dom/htmlbuttonelement.rs +++ b/components/script/dom/htmlbuttonelement.rs @@ -29,13 +29,12 @@ use std::cell::Cell; use std::default::Default; use style::element_state::ElementState; -#[derive(Clone, Copy, JSTraceable, PartialEq)] -#[derive(MallocSizeOf)] +#[derive(Clone, Copy, JSTraceable, MallocSizeOf, PartialEq )] enum ButtonType { Submit, Reset, Button, - Menu + Menu, } #[dom_struct] @@ -46,25 +45,36 @@ pub struct HTMLButtonElement { } impl HTMLButtonElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLButtonElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLButtonElement { HTMLButtonElement { - htmlelement: - HTMLElement::new_inherited_with_state(ElementState::IN_ENABLED_STATE, - local_name, prefix, document), + htmlelement: HTMLElement::new_inherited_with_state( + ElementState::IN_ENABLED_STATE, + local_name, + prefix, + document, + ), button_type: Cell::new(ButtonType::Submit), form_owner: Default::default(), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLButtonElement::new_inherited(local_name, prefix, document)), - document, - HTMLButtonElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLButtonElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLButtonElementBinding::Wrap, + ) } } @@ -99,10 +109,12 @@ impl HTMLButtonElementMethods for HTMLButtonElement { make_setter!(SetFormAction, "formaction"); // https://html.spec.whatwg.org/multipage/#dom-fs-formenctype - make_enumerated_getter!(FormEnctype, - "formenctype", - "application/x-www-form-urlencoded", - "text/plain" | "multipart/form-data"); + make_enumerated_getter!( + FormEnctype, + "formenctype", + "application/x-www-form-urlencoded", + "text/plain" | "multipart/form-data" + ); // https://html.spec.whatwg.org/multipage/#dom-fs-formenctype make_setter!(SetFormEnctype, "formenctype"); @@ -152,10 +164,10 @@ impl HTMLButtonElement { // Step 3.1: only run steps if this is the submitter if let Some(FormSubmitter::ButtonElement(submitter)) = submitter { if submitter != self { - return None + return None; } } else { - return None + return None; } // Step 3.2 let ty = self.Type(); @@ -171,7 +183,7 @@ impl HTMLButtonElement { Some(FormDatum { ty: ty, name: name, - value: FormDatumValue::String(self.Value()) + value: FormDatumValue::String(self.Value()), }) } } @@ -187,7 +199,7 @@ impl VirtualMethods for HTMLButtonElement { &local_name!("disabled") => { let el = self.upcast::(); match mutation { - AttributeMutation::Set(Some(_)) => {} + AttributeMutation::Set(Some(_)) => {}, AttributeMutation::Set(None) => { el.set_disabled_state(true); el.set_enabled_state(false); @@ -196,28 +208,26 @@ impl VirtualMethods for HTMLButtonElement { el.set_disabled_state(false); el.set_enabled_state(true); el.check_ancestors_disabled_state_for_form_control(); - } + }, } }, - &local_name!("type") => { - match mutation { - AttributeMutation::Set(_) => { - let value = match &**attr.value() { - "reset" => ButtonType::Reset, - "button" => ButtonType::Button, - "menu" => ButtonType::Menu, - _ => ButtonType::Submit, - }; - self.button_type.set(value); - } - AttributeMutation::Removed => { - self.button_type.set(ButtonType::Submit); - } - } + &local_name!("type") => match mutation { + AttributeMutation::Set(_) => { + let value = match &**attr.value() { + "reset" => ButtonType::Reset, + "button" => ButtonType::Button, + "menu" => ButtonType::Menu, + _ => ButtonType::Submit, + }; + self.button_type.set(value); + }, + AttributeMutation::Removed => { + self.button_type.set(ButtonType::Submit); + }, }, &local_name!("form") => { self.form_attribute_mutated(mutation); - } + }, _ => {}, } } @@ -227,7 +237,8 @@ impl VirtualMethods for HTMLButtonElement { s.bind_to_tree(tree_in_doc); } - self.upcast::().check_ancestors_disabled_state_for_form_control(); + self.upcast::() + .check_ancestors_disabled_state_for_form_control(); } fn unbind_from_tree(&self, context: &UnbindContext) { @@ -235,7 +246,10 @@ impl VirtualMethods for HTMLButtonElement { let node = self.upcast::(); let el = self.upcast::(); - if node.ancestors().any(|ancestor| ancestor.is::()) { + if node + .ancestors() + .any(|ancestor| ancestor.is::()) + { el.check_ancestors_disabled_state_for_form_control(); } else { el.check_disabled_attribute(); @@ -280,12 +294,10 @@ impl Activatable for HTMLButtonElement { // https://html.spec.whatwg.org/multipage/#run-pre-click-activation-steps // https://html.spec.whatwg.org/multipage/#the-button-element:activation-behavior - fn pre_click_activation(&self) { - } + fn pre_click_activation(&self) {} // https://html.spec.whatwg.org/multipage/#run-canceled-activation-steps - fn canceled_activation(&self) { - } + fn canceled_activation(&self) {} // https://html.spec.whatwg.org/multipage/#run-post-click-activation-steps fn activation_behavior(&self, _event: &Event, _target: &EventTarget) { @@ -295,16 +307,18 @@ impl Activatable for HTMLButtonElement { ButtonType::Submit => { // TODO: is document owner fully active? if let Some(owner) = self.form_owner() { - owner.submit(SubmittedFrom::NotFromForm, - FormSubmitter::ButtonElement(self.clone())); + owner.submit( + SubmittedFrom::NotFromForm, + FormSubmitter::ButtonElement(self.clone()), + ); } - } + }, ButtonType::Reset => { // TODO: is document owner fully active? if let Some(owner) = self.form_owner() { owner.reset(ResetFrom::NotFromForm); } - } + }, _ => (), } } @@ -318,14 +332,19 @@ impl Activatable for HTMLButtonElement { if owner.is_none() || self.upcast::().click_in_progress() { return; } - node.query_selector_iter(DOMString::from("button[type=submit]")).unwrap() + node.query_selector_iter(DOMString::from("button[type=submit]")) + .unwrap() .filter_map(DomRoot::downcast::) .find(|r| r.form_owner() == owner) - .map(|s| synthetic_click_activation(s.as_element(), - ctrl_key, - shift_key, - alt_key, - meta_key, - ActivationSource::NotFromClick)); + .map(|s| { + synthetic_click_activation( + s.as_element(), + ctrl_key, + shift_key, + alt_key, + meta_key, + ActivationSource::NotFromClick, + ) + }); } } diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs index 7bc6a233e66..00b04db7ee8 100644 --- a/components/script/dom/htmlcanvaselement.rs +++ b/components/script/dom/htmlcanvaselement.rs @@ -61,9 +61,11 @@ pub struct HTMLCanvasElement { } impl HTMLCanvasElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLCanvasElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLCanvasElement { HTMLCanvasElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), context: DomRefCell::new(None), @@ -71,12 +73,18 @@ impl HTMLCanvasElement { } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLCanvasElement::new_inherited(local_name, prefix, document)), - document, - HTMLCanvasElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLCanvasElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLCanvasElementBinding::Wrap, + ) } fn recreate_contexts(&self) { @@ -124,13 +132,15 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom { Some(&CanvasContext::WebGL2(ref context)) => { context.to_layout().canvas_data_source() }, - None => { - HTMLCanvasDataSource::Image(None) - } + None => HTMLCanvasDataSource::Image(None), }; - let width_attr = canvas.upcast::().get_attr_for_layout(&ns!(), &local_name!("width")); - let height_attr = canvas.upcast::().get_attr_for_layout(&ns!(), &local_name!("height")); + let width_attr = canvas + .upcast::() + .get_attr_for_layout(&ns!(), &local_name!("width")); + let height_attr = canvas + .upcast::() + .get_attr_for_layout(&ns!(), &local_name!("height")); HTMLCanvasData { source: source, width: width_attr.map_or(DEFAULT_WIDTH, |val| val.as_uint()), @@ -164,7 +174,8 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom { fn get_canvas_id_for_layout(&self) -> CanvasId { unsafe { let canvas = &*self.unsafe_get(); - if let &Some(CanvasContext::Context2d(ref context)) = canvas.context.borrow_for_layout() { + if let &Some(CanvasContext::Context2d(ref context)) = canvas.context.borrow_for_layout() + { context.to_layout().get_canvas_id() } else { CanvasId(0) @@ -173,7 +184,6 @@ impl LayoutHTMLCanvasElementHelpers for LayoutDom { } } - impl HTMLCanvasElement { pub fn context(&self) -> Option> { ref_filter_map::ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref()) @@ -220,7 +230,7 @@ impl HTMLCanvasElement { options: HandleValue, ) -> Option> { if !PREFS.is_webgl2_enabled() { - return None + return None; } if let Some(ctx) = self.context() { return match *ctx { @@ -241,7 +251,7 @@ impl HTMLCanvasElement { match *self.context.borrow() { Some(CanvasContext::WebGL(ref context)) => Some(DomRoot::from_ref(&*context)), Some(CanvasContext::WebGL2(ref context)) => Some(context.base_context()), - _ => None + _ => None, } } @@ -255,11 +265,11 @@ impl HTMLCanvasElement { Ok(ConversionResult::Failure(ref error)) => { throw_type_error(cx, &error); None - } + }, _ => { debug!("Unexpected error on conversion of WebGLContextAttributes"); None - } + }, } } @@ -271,13 +281,17 @@ impl HTMLCanvasElement { let size = self.get_size(); if size.width == 0 || size.height == 0 { - return None + return None; } let data = match self.context.borrow().as_ref() { Some(&CanvasContext::Context2d(ref context)) => { - let (sender, receiver) = ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); - let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender), context.get_canvas_id()); + let (sender, receiver) = + ipc::channel(self.global().time_profiler_chan().clone()).unwrap(); + let msg = CanvasMsg::FromScript( + FromScriptMsg::SendPixels(sender), + context.get_canvas_id(), + ); context.get_ipc_renderer().send(msg).unwrap(); receiver.recv().unwrap()?.into() @@ -319,19 +333,16 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement { options: HandleValue, ) -> Option { match &*id { - "2d" => { - self.get_or_init_2d_context() - .map(RenderingContext::CanvasRenderingContext2D) - } - "webgl" | "experimental-webgl" => { - self.get_or_init_webgl_context(cx, options) - .map(RenderingContext::WebGLRenderingContext) - } - "webgl2" | "experimental-webgl2" => { - self.get_or_init_webgl2_context(cx, options) - .map(RenderingContext::WebGL2RenderingContext) - } - _ => None + "2d" => self + .get_or_init_2d_context() + .map(RenderingContext::CanvasRenderingContext2D), + "webgl" | "experimental-webgl" => self + .get_or_init_webgl_context(cx, options) + .map(RenderingContext::WebGLRenderingContext), + "webgl2" | "experimental-webgl2" => self + .get_or_init_webgl2_context(cx, options) + .map(RenderingContext::WebGL2RenderingContext), + _ => None, } } @@ -358,27 +369,31 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement { // Step 3. let raw_data = match *self.context.borrow() { Some(CanvasContext::Context2d(ref context)) => { - let image_data = context.GetImageData(Finite::wrap(0f64), Finite::wrap(0f64), - Finite::wrap(self.Width() as f64), - Finite::wrap(self.Height() as f64))?; + let image_data = context.GetImageData( + Finite::wrap(0f64), + Finite::wrap(0f64), + Finite::wrap(self.Width() as f64), + Finite::wrap(self.Height() as f64), + )?; image_data.get_data_array() - } + }, Some(CanvasContext::WebGL(ref context)) => { match context.get_image_data(self.Width(), self.Height()) { Some(data) => data, None => return Ok(USVString("data:,".into())), } - } - Some(CanvasContext::WebGL2(ref context)) => { - match context.base_context().get_image_data(self.Width(), self.Height()) { - Some(data) => data, - None => return Ok(USVString("data:,".into())), - } - } + }, + Some(CanvasContext::WebGL2(ref context)) => match context + .base_context() + .get_image_data(self.Width(), self.Height()) + { + Some(data) => data, + None => return Ok(USVString("data:,".into())), + }, None => { // Each pixel is fully-transparent black. vec![0; (self.Width() * self.Height() * 4) as usize] - } + }, }; // Only handle image/png for now. @@ -387,7 +402,9 @@ impl HTMLCanvasElementMethods for HTMLCanvasElement { let mut encoded = Vec::new(); { let encoder: PNGEncoder<&mut Vec> = PNGEncoder::new(&mut encoded); - encoder.encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8)).unwrap(); + encoder + .encode(&raw_data, self.Width(), self.Height(), ColorType::RGBA(8)) + .unwrap(); } let encoded = base64::encode(&encoded); @@ -412,7 +429,10 @@ impl VirtualMethods for HTMLCanvasElement { match name { &local_name!("width") => AttrValue::from_u32(value.into(), DEFAULT_WIDTH), &local_name!("height") => AttrValue::from_u32(value.into(), DEFAULT_HEIGHT), - _ => self.super_type().unwrap().parse_plain_attribute(name, value), + _ => self + .super_type() + .unwrap() + .parse_plain_attribute(name, value), } } } @@ -438,13 +458,15 @@ pub mod utils { pub fn request_image_from_cache(window: &Window, url: ServoUrl) -> ImageResponse { let image_cache = window.image_cache(); - let response = - image_cache.find_image_or_metadata(url.into(), - UsePlaceholder::No, - CanRequestImages::No); + let response = image_cache.find_image_or_metadata( + url.into(), + UsePlaceholder::No, + CanRequestImages::No, + ); match response { - Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) => - ImageResponse::Loaded(image, url), + Ok(ImageOrMetadataAvailable::ImageAvailable(image, url)) => { + ImageResponse::Loaded(image, url) + }, _ => ImageResponse::None, } } diff --git a/components/script/dom/htmlcollection.rs b/components/script/dom/htmlcollection.rs index 5d3f01a03a0..d94607635e4 100644 --- a/components/script/dom/htmlcollection.rs +++ b/components/script/dom/htmlcollection.rs @@ -19,7 +19,7 @@ use servo_atoms::Atom; use std::cell::Cell; use style::str::split_html_space_chars; -pub trait CollectionFilter : JSTraceable { +pub trait CollectionFilter: JSTraceable { fn filter<'a>(&self, elem: &'a Element, root: &'a Node) -> bool; } @@ -46,7 +46,9 @@ impl OptionU32 { } fn none() -> OptionU32 { - OptionU32 { bits: u32::max_value() } + OptionU32 { + bits: u32::max_value(), + } } } @@ -94,13 +96,23 @@ impl HTMLCollection { } #[allow(unrooted_must_root)] - pub fn new(window: &Window, root: &Node, filter: Box) -> DomRoot { - reflect_dom_object(Box::new(HTMLCollection::new_inherited(root, filter)), - window, HTMLCollectionBinding::Wrap) + pub fn new( + window: &Window, + root: &Node, + filter: Box, + ) -> DomRoot { + reflect_dom_object( + Box::new(HTMLCollection::new_inherited(root, filter)), + window, + HTMLCollectionBinding::Wrap, + ) } - pub fn create(window: &Window, root: &Node, - filter: Box) -> DomRoot { + pub fn create( + window: &Window, + root: &Node, + filter: Box, + ) -> DomRoot { HTMLCollection::new(window, root, filter) } @@ -117,7 +129,11 @@ impl HTMLCollection { } } - fn set_cached_cursor(&self, index: u32, element: Option>) -> Option> { + fn set_cached_cursor( + &self, + index: u32, + element: Option>, + ) -> Option> { if let Some(element) = element { self.cached_cursor_index.set(OptionU32::some(index)); self.cached_cursor_element.set(Some(&element)); @@ -128,8 +144,11 @@ impl HTMLCollection { } // https://dom.spec.whatwg.org/#concept-getelementsbytagname - pub fn by_qualified_name(window: &Window, root: &Node, qualified_name: LocalName) - -> DomRoot { + pub fn by_qualified_name( + window: &Window, + root: &Node, + qualified_name: LocalName, + ) -> DomRoot { // case 1 if qualified_name == local_name!("*") { #[derive(JSTraceable, MallocSizeOf)] @@ -149,9 +168,11 @@ impl HTMLCollection { } impl CollectionFilter for HtmlDocumentFilter { fn filter(&self, elem: &Element, root: &Node) -> bool { - if root.is_in_html_doc() && elem.namespace() == &ns!(html) { // case 2 + if root.is_in_html_doc() && elem.namespace() == &ns!(html) { + // case 2 HTMLCollection::match_element(elem, &self.ascii_lower_qualified_name) - } else { // case 2 and 3 + } else { + // case 2 and 3 HTMLCollection::match_element(elem, &self.qualified_name) } } @@ -167,60 +188,75 @@ impl HTMLCollection { fn match_element(elem: &Element, qualified_name: &LocalName) -> bool { match elem.prefix().as_ref() { None => elem.local_name() == qualified_name, - Some(prefix) => qualified_name.starts_with(&**prefix) && - qualified_name.find(":") == Some(prefix.len()) && - qualified_name.ends_with(&**elem.local_name()), + Some(prefix) => { + qualified_name.starts_with(&**prefix) && + qualified_name.find(":") == Some(prefix.len()) && + qualified_name.ends_with(&**elem.local_name()) + }, } } - pub fn by_tag_name_ns(window: &Window, root: &Node, tag: DOMString, - maybe_ns: Option) -> DomRoot { + pub fn by_tag_name_ns( + window: &Window, + root: &Node, + tag: DOMString, + maybe_ns: Option, + ) -> DomRoot { let local = LocalName::from(tag); let ns = namespace_from_domstring(maybe_ns); let qname = QualName::new(None, ns, local); HTMLCollection::by_qual_tag_name(window, root, qname) } - pub fn by_qual_tag_name(window: &Window, root: &Node, qname: QualName) -> DomRoot { + pub fn by_qual_tag_name( + window: &Window, + root: &Node, + qname: QualName, + ) -> DomRoot { #[derive(JSTraceable, MallocSizeOf)] struct TagNameNSFilter { - qname: QualName + qname: QualName, } impl CollectionFilter for TagNameNSFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { - ((self.qname.ns == namespace_url!("*")) || (self.qname.ns == *elem.namespace())) && - ((self.qname.local == local_name!("*")) || (self.qname.local == *elem.local_name())) + ((self.qname.ns == namespace_url!("*")) || (self.qname.ns == *elem.namespace())) && + ((self.qname.local == local_name!("*")) || + (self.qname.local == *elem.local_name())) } } - let filter = TagNameNSFilter { - qname: qname - }; + let filter = TagNameNSFilter { qname: qname }; HTMLCollection::create(window, root, Box::new(filter)) } - pub fn by_class_name(window: &Window, root: &Node, classes: DOMString) - -> DomRoot { + pub fn by_class_name( + window: &Window, + root: &Node, + classes: DOMString, + ) -> DomRoot { let class_atoms = split_html_space_chars(&classes).map(Atom::from).collect(); HTMLCollection::by_atomic_class_name(window, root, class_atoms) } - pub fn by_atomic_class_name(window: &Window, root: &Node, classes: Vec) - -> DomRoot { + pub fn by_atomic_class_name( + window: &Window, + root: &Node, + classes: Vec, + ) -> DomRoot { #[derive(JSTraceable, MallocSizeOf)] struct ClassNameFilter { - classes: Vec + classes: Vec, } impl CollectionFilter for ClassNameFilter { fn filter(&self, elem: &Element, _root: &Node) -> bool { let case_sensitivity = document_from_node(elem) .quirks_mode() .classes_and_ids_case_sensitivity(); - self.classes.iter().all(|class| elem.has_class(class, case_sensitivity)) + self.classes + .iter() + .all(|class| elem.has_class(class, case_sensitivity)) } } - let filter = ClassNameFilter { - classes: classes - }; + let filter = ClassNameFilter { classes: classes }; HTMLCollection::create(window, root, Box::new(filter)) } @@ -235,21 +271,29 @@ impl HTMLCollection { HTMLCollection::create(window, root, Box::new(ElementChildFilter)) } - pub fn elements_iter_after<'a>(&'a self, after: &'a Node) -> impl Iterator> + 'a { + pub fn elements_iter_after<'a>( + &'a self, + after: &'a Node, + ) -> impl Iterator> + 'a { // Iterate forwards from a node. - after.following_nodes(&self.root) + after + .following_nodes(&self.root) .filter_map(DomRoot::downcast) .filter(move |element| self.filter.filter(&element, &self.root)) } - pub fn elements_iter<'a>(&'a self) -> impl Iterator> + 'a { + pub fn elements_iter<'a>(&'a self) -> impl Iterator> + 'a { // Iterate forwards from the root. self.elements_iter_after(&*self.root) } - pub fn elements_iter_before<'a>(&'a self, before: &'a Node) -> impl Iterator> + 'a { + pub fn elements_iter_before<'a>( + &'a self, + before: &'a Node, + ) -> impl Iterator> + 'a { // Iterate backwards from a node. - before.preceding_nodes(&self.root) + before + .preceding_nodes(&self.root) .filter_map(DomRoot::downcast) .filter(move |element| self.filter.filter(&element, &self.root)) } @@ -322,7 +366,8 @@ impl HTMLCollectionMethods for HTMLCollection { // Step 2. self.elements_iter().find(|elem| { elem.get_string_attribute(&local_name!("id")) == key || - (elem.namespace() == &ns!(html) && elem.get_string_attribute(&local_name!("name")) == key) + (elem.namespace() == &ns!(html) && + elem.get_string_attribute(&local_name!("name")) == key) }) } @@ -350,7 +395,10 @@ impl HTMLCollectionMethods for HTMLCollection { } // Step 2.2 let name_attr = elem.get_string_attribute(&local_name!("name")); - if !name_attr.is_empty() && !result.contains(&name_attr) && *elem.namespace() == ns!(html) { + if !name_attr.is_empty() && + !result.contains(&name_attr) && + *elem.namespace() == ns!(html) + { result.push(name_attr) } } diff --git a/components/script/dom/htmldataelement.rs b/components/script/dom/htmldataelement.rs index 98aa078993c..07a2d0f2442 100644 --- a/components/script/dom/htmldataelement.rs +++ b/components/script/dom/htmldataelement.rs @@ -14,25 +14,31 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLDataElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLDataElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDataElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDataElement { HTMLDataElement { - htmlelement: HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDataElement::new_inherited(local_name, prefix, document)), - document, - HTMLDataElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDataElement::new_inherited(local_name, prefix, document)), + document, + HTMLDataElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmldatalistelement.rs b/components/script/dom/htmldatalistelement.rs index 43e2eaa4928..e99a9324520 100644 --- a/components/script/dom/htmldatalistelement.rs +++ b/components/script/dom/htmldatalistelement.rs @@ -17,26 +17,33 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLDataListElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLDataListElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDataListElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDataListElement { HTMLDataListElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDataListElement::new_inherited(local_name, prefix, document)), - document, - HTMLDataListElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDataListElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLDataListElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmldetailselement.rs b/components/script/dom/htmldetailselement.rs index 61ef9b4a0d0..b764b0174ca 100644 --- a/components/script/dom/htmldetailselement.rs +++ b/components/script/dom/htmldetailselement.rs @@ -22,27 +22,34 @@ use task_source::TaskSource; #[dom_struct] pub struct HTMLDetailsElement { htmlelement: HTMLElement, - toggle_counter: Cell + toggle_counter: Cell, } impl HTMLDetailsElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDetailsElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDetailsElement { HTMLDetailsElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document), - toggle_counter: Cell::new(0) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), + toggle_counter: Cell::new(0), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDetailsElement::new_inherited(local_name, prefix, document)), - document, - HTMLDetailsElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDetailsElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLDetailsElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmldialogelement.rs b/components/script/dom/htmldialogelement.rs index 9762a6c3c97..97643bf691f 100644 --- a/components/script/dom/htmldialogelement.rs +++ b/components/script/dom/htmldialogelement.rs @@ -23,23 +23,30 @@ pub struct HTMLDialogElement { } impl HTMLDialogElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDialogElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDialogElement { HTMLDialogElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document), + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), return_value: DomRefCell::new(DOMString::new()), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDialogElement::new_inherited(local_name, prefix, document)), - document, - HTMLDialogElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDialogElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLDialogElementBinding::Wrap, + ) } } @@ -68,7 +75,10 @@ impl HTMLDialogElementMethods for HTMLDialogElement { let win = window_from_node(self); // Step 1 & 2 - if element.remove_attribute(&ns!(), &local_name!("open")).is_none() { + if element + .remove_attribute(&ns!(), &local_name!("open")) + .is_none() + { return; } @@ -80,6 +90,7 @@ impl HTMLDialogElementMethods for HTMLDialogElement { // TODO: Step 4 implement pending dialog stack removal // Step 5 - win.dom_manipulation_task_source().queue_simple_event(target, atom!("close"), &win); + win.dom_manipulation_task_source() + .queue_simple_event(target, atom!("close"), &win); } } diff --git a/components/script/dom/htmldirectoryelement.rs b/components/script/dom/htmldirectoryelement.rs index 1665202b4ec..541a8abfa03 100644 --- a/components/script/dom/htmldirectoryelement.rs +++ b/components/script/dom/htmldirectoryelement.rs @@ -12,25 +12,32 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLDirectoryElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLDirectoryElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDirectoryElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDirectoryElement { HTMLDirectoryElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDirectoryElement::new_inherited(local_name, prefix, document)), - document, - HTMLDirectoryElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDirectoryElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLDirectoryElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmldivelement.rs b/components/script/dom/htmldivelement.rs index 48fd3afb951..3de1af4e568 100644 --- a/components/script/dom/htmldivelement.rs +++ b/components/script/dom/htmldivelement.rs @@ -13,25 +13,31 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLDivElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLDivElement { - fn new_inherited(local_name: LocalName, - prefix: Option, - document: &Document) -> HTMLDivElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDivElement { HTMLDivElement { - htmlelement: HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDivElement::new_inherited(local_name, prefix, document)), - document, - HTMLDivElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDivElement::new_inherited(local_name, prefix, document)), + document, + HTMLDivElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmldlistelement.rs b/components/script/dom/htmldlistelement.rs index 5ad4e8f27f7..b63f0225095 100644 --- a/components/script/dom/htmldlistelement.rs +++ b/components/script/dom/htmldlistelement.rs @@ -12,23 +12,32 @@ use html5ever::{LocalName, Prefix}; #[dom_struct] pub struct HTMLDListElement { - htmlelement: HTMLElement + htmlelement: HTMLElement, } impl HTMLDListElement { - fn new_inherited(local_name: LocalName, prefix: Option, document: &Document) -> HTMLDListElement { + fn new_inherited( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLDListElement { HTMLDListElement { - htmlelement: - HTMLElement::new_inherited(local_name, prefix, document) + htmlelement: HTMLElement::new_inherited(local_name, prefix, document), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, - prefix: Option, - document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLDListElement::new_inherited(local_name, prefix, document)), - document, - HTMLDListElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLDListElement::new_inherited( + local_name, prefix, document, + )), + document, + HTMLDListElementBinding::Wrap, + ) } } diff --git a/components/script/dom/htmlelement.rs b/components/script/dom/htmlelement.rs index e28ff1053a2..9279f8fdbe1 100644 --- a/components/script/dom/htmlelement.rs +++ b/components/script/dom/htmlelement.rs @@ -49,27 +49,44 @@ pub struct HTMLElement { } impl HTMLElement { - pub fn new_inherited(tag_name: LocalName, prefix: Option, - document: &Document) -> HTMLElement { + pub fn new_inherited( + tag_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLElement { HTMLElement::new_inherited_with_state(ElementState::empty(), tag_name, prefix, document) } - pub fn new_inherited_with_state(state: ElementState, tag_name: LocalName, - prefix: Option, document: &Document) - -> HTMLElement { + pub fn new_inherited_with_state( + state: ElementState, + tag_name: LocalName, + prefix: Option, + document: &Document, + ) -> HTMLElement { HTMLElement { - element: - Element::new_inherited_with_state(state, tag_name, ns!(html), prefix, document), + element: Element::new_inherited_with_state( + state, + tag_name, + ns!(html), + prefix, + document, + ), style_decl: Default::default(), dataset: Default::default(), } } #[allow(unrooted_must_root)] - pub fn new(local_name: LocalName, prefix: Option, document: &Document) -> DomRoot { - Node::reflect_node(Box::new(HTMLElement::new_inherited(local_name, prefix, document)), - document, - HTMLElementBinding::Wrap) + pub fn new( + local_name: LocalName, + prefix: Option, + document: &Document, + ) -> DomRoot { + Node::reflect_node( + Box::new(HTMLElement::new_inherited(local_name, prefix, document)), + document, + HTMLElementBinding::Wrap, + ) } fn is_body_or_frameset(&self) -> bool { @@ -84,13 +101,24 @@ impl HTMLElement { node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true); } else { match node.type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLButtonElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLSelectElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLIFrameElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLTextAreaElement)) - => node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true), - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) => { + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLButtonElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLSelectElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLIFrameElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLTextAreaElement, + )) => node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true), + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLLinkElement, + )) | + NodeTypeId::Element(ElementTypeId::HTMLElement( + HTMLElementTypeId::HTMLAnchorElement, + )) => { if element.has_attribute(&local_name!("href")) { node.set_flag(NodeFlags::SEQUENTIALLY_FOCUSABLE, true); } @@ -119,10 +147,12 @@ impl HTMLElementMethods for HTMLElement { fn Style(&self) -> DomRoot { self.style_decl.or_init(|| { let global = window_from_node(self); - CSSStyleDeclaration::new(&global, - CSSStyleOwner::Element(Dom::from_ref(self.upcast())), - None, - CSSModificationAccess::ReadWrite) + CSSStyleDeclaration::new( + &global, + CSSStyleOwner::Element(Dom::from_ref(self.upcast())), + None, + CSSModificationAccess::ReadWrite, + ) }) } @@ -162,7 +192,8 @@ impl HTMLElementMethods for HTMLElement { None } } else { - self.upcast::().get_event_handler_common("load") + self.upcast::() + .get_event_handler_common("load") } } @@ -174,7 +205,8 @@ impl HTMLElementMethods for HTMLElement { document.window().SetOnload(listener) } } else { - self.upcast::().set_event_handler_common("load", listener) + self.upcast::() + .set_event_handler_common("load", listener) } } @@ -188,7 +220,8 @@ impl HTMLElementMethods for HTMLElement { None } } else { - self.upcast::().get_event_handler_common("resize") + self.upcast::() + .get_event_handler_common("resize") } } @@ -200,7 +233,8 @@ impl HTMLElementMethods for HTMLElement { document.window().SetOnresize(listener); } } else { - self.upcast::().set_event_handler_common("resize", listener) + self.upcast::() + .set_event_handler_common("resize", listener) } } @@ -214,7 +248,8 @@ impl HTMLElementMethods for HTMLElement { None } } else { - self.upcast::().get_event_handler_common("blur") + self.upcast::() + .get_event_handler_common("blur") } } @@ -226,7 +261,8 @@ impl HTMLElementMethods for HTMLElement { document.window().SetOnblur(listener) } } else { - self.upcast::().set_event_handler_common("blur", listener) + self.upcast::() + .set_event_handler_common("blur", listener) } } @@ -240,7 +276,8 @@ impl HTMLElementMethods for HTMLElement { None } } else { - self.upcast::().get_event_handler_common("focus") + self.upcast::() + .get_event_handler_common("focus") } } @@ -252,7 +289,8 @@ impl HTMLElementMethods for HTMLElement { document.window().SetOnfocus(listener) } } else { - self.upcast::().set_event_handler_common("focus", listener) + self.upcast::() + .set_event_handler_common("focus", listener) } } @@ -266,7 +304,8 @@ impl HTMLElementMethods for HTMLElement { None } } else { - self.upcast::().get_event_handler_common("scroll") + self.upcast::() + .get_event_handler_common("scroll") } } @@ -278,13 +317,16 @@ impl HTMLElementMethods for HTMLElement { document.window().SetOnscroll(listener) } } else { - self.upcast::().set_event_handler_common("scroll", listener) + self.upcast::() + .set_event_handler_common("scroll", listener) } } // https://html.spec.whatwg.org/multipage/#attr-itemtype fn Itemtypes(&self) -> Option> { - let atoms = self.element.get_tokenlist_attribute(&local_name!("itemtype"), ); + let atoms = self + .element + .get_tokenlist_attribute(&local_name!("itemtype")); if atoms.is_empty() { return None; @@ -300,7 +342,9 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#names:-the-itemprop-attribute fn PropertyNames(&self) -> Option> { - let atoms = self.element.get_tokenlist_attribute(&local_name!("itemprop"), ); + let atoms = self + .element + .get_tokenlist_attribute(&local_name!("itemprop")); if atoms.is_empty() { return None; @@ -317,12 +361,14 @@ impl HTMLElementMethods for HTMLElement { // https://html.spec.whatwg.org/multipage/#dom-click fn Click(&self) { if !self.upcast::().disabled_state() { - synthetic_click_activation(self.upcast::(), - false, - false, - false, - false, - ActivationSource::FromClick) + synthetic_click_activation( + self.upcast::(), + false, + false, + false, + false, + ActivationSource::FromClick, + ) } } @@ -418,7 +464,9 @@ impl HTMLElementMethods for HTMLElement { return node.GetTextContent().unwrap(); } - window.layout_reflow(QueryMsg::ElementInnerTextQuery(node.to_trusted_node_address())); + window.layout_reflow(QueryMsg::ElementInnerTextQuery( + node.to_trusted_node_address(), + )); DOMString::from(window.layout().element_inner_text()) } @@ -458,7 +506,7 @@ impl HTMLElementMethods for HTMLElement { }, _ => { text.push(ch); - } + }, } } @@ -471,13 +519,12 @@ impl HTMLElementMethods for HTMLElement { } } -fn append_text_node_to_fragment( - document: &Document, - fragment: &DocumentFragment, - text: String -) { +fn append_text_node_to_fragment(document: &Document, fragment: &DocumentFragment, text: String) { let text = Text::new(DOMString::from(text), document); - fragment.upcast::().AppendChild(&text.upcast()).unwrap(); + fragment + .upcast::() + .AppendChild(&text.upcast()) + .unwrap(); } // https://html.spec.whatwg.org/multipage/#attr-data-* @@ -507,7 +554,6 @@ fn to_snake_case(name: DOMString) -> DOMString { DOMString::from(attr_name) } - // https://html.spec.whatwg.org/multipage/#attr-data-* // if this attribute is in snake case with a data- prefix, // this function returns a name converted to camel case @@ -546,44 +592,51 @@ fn to_camel_case(name: &str) -> Option { impl HTMLElement { pub fn set_custom_attr(&self, name: DOMString, value: DOMString) -> ErrorResult { - if name.chars() - .skip_while(|&ch| ch != '\u{2d}') - .nth(1).map_or(false, |ch| ch >= 'a' && ch <= 'z') { + if name + .chars() + .skip_while(|&ch| ch != '\u{2d}') + .nth(1) + .map_or(false, |ch| ch >= 'a' && ch <= 'z') + { return Err(Error::Syntax); } - self.upcast::().set_custom_attribute(to_snake_case(name), value) + self.upcast::() + .set_custom_attribute(to_snake_case(name), value) } pub fn get_custom_attr(&self, local_name: DOMString) -> Option { // FIXME(ajeffrey): Convert directly from DOMString to LocalName let local_name = LocalName::from(to_snake_case(local_name)); - self.upcast::().get_attribute(&ns!(), &local_name).map(|attr| { - DOMString::from(&**attr.value()) // FIXME(ajeffrey): Convert directly from AttrValue to DOMString - }) + self.upcast::() + .get_attribute(&ns!(), &local_name) + .map(|attr| { + DOMString::from(&**attr.value()) // FIXME(ajeffrey): Convert directly from AttrValue to DOMString + }) } pub fn delete_custom_attr(&self, local_name: DOMString) { // FIXME(ajeffrey): Convert directly from DOMString to LocalName let local_name = LocalName::from(to_snake_case(local_name)); - self.upcast::().remove_attribute(&ns!(), &local_name); + self.upcast::() + .remove_attribute(&ns!(), &local_name); } // https://html.spec.whatwg.org/multipage/#category-label pub fn is_labelable_element(&self) -> bool { // Note: HTMLKeygenElement is omitted because Servo doesn't currently implement it match self.upcast::().type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => - match type_id { - HTMLElementTypeId::HTMLInputElement => - self.downcast::().unwrap().input_type() != InputType::Hidden, - HTMLElementTypeId::HTMLButtonElement | - HTMLElementTypeId::HTMLMeterElement | - HTMLElementTypeId::HTMLOutputElement | - HTMLElementTypeId::HTMLProgressElement | - HTMLElementTypeId::HTMLSelectElement | - HTMLElementTypeId::HTMLTextAreaElement => true, - _ => false, + NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => match type_id { + HTMLElementTypeId::HTMLInputElement => { + self.downcast::().unwrap().input_type() != InputType::Hidden }, + HTMLElementTypeId::HTMLButtonElement | + HTMLElementTypeId::HTMLMeterElement | + HTMLElementTypeId::HTMLOutputElement | + HTMLElementTypeId::HTMLProgressElement | + HTMLElementTypeId::HTMLSelectElement | + HTMLElementTypeId::HTMLTextAreaElement => true, + _ => false, + }, _ => false, } } @@ -597,27 +650,29 @@ impl HTMLElement { } match self.upcast::().type_id() { - NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => - match type_id { - HTMLElementTypeId::HTMLButtonElement | - HTMLElementTypeId::HTMLFieldSetElement | - HTMLElementTypeId::HTMLInputElement | - HTMLElementTypeId::HTMLObjectElement | - HTMLElementTypeId::HTMLOutputElement | - HTMLElementTypeId::HTMLSelectElement | - HTMLElementTypeId::HTMLTextAreaElement => true, - _ => false, - }, + NodeTypeId::Element(ElementTypeId::HTMLElement(type_id)) => match type_id { + HTMLElementTypeId::HTMLButtonElement | + HTMLElementTypeId::HTMLFieldSetElement | + HTMLElementTypeId::HTMLInputElement | + HTMLElementTypeId::HTMLObjectElement | + HTMLElementTypeId::HTMLOutputElement | + HTMLElementTypeId::HTMLSelectElement | + HTMLElementTypeId::HTMLTextAreaElement => true, + _ => false, + }, _ => false, } } pub fn supported_prop_names_custom_attr(&self) -> Vec { let element = self.upcast::(); - element.attrs().iter().filter_map(|attr| { - let raw_name = attr.local_name(); - to_camel_case(&raw_name) - }).collect() + element + .attrs() + .iter() + .filter_map(|attr| { + let raw_name = attr.local_name(); + to_camel_case(&raw_name) + }).collect() } // https://html.spec.whatwg.org/multipage/#dom-lfe-labels @@ -629,8 +684,7 @@ impl HTMLElement { // Traverse ancestors for implicitly associated