diff --git a/dom/html/HTMLHRElement.cpp b/dom/html/HTMLHRElement.cpp index 56a52ad78730..9191c9bc4012 100644 --- a/dom/html/HTMLHRElement.cpp +++ b/dom/html/HTMLHRElement.cpp @@ -139,14 +139,14 @@ HTMLHRElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes, if (!aDecls.PropertyIsSet(eCSSProperty_border_top_style)) aDecls.SetKeywordValue(eCSSProperty_border_top_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); if (allSides) { aDecls.SetKeywordValueIfUnset(eCSSProperty_border_right_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_bottom_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_left_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); // If it would be noticeable, set the border radius to // 10000px on all corners; this triggers the clamping to make diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp index ec023505dac2..b5161af18fb7 100644 --- a/dom/html/nsGenericHTMLElement.cpp +++ b/dom/html/nsGenericHTMLElement.cpp @@ -1442,13 +1442,13 @@ nsGenericHTMLElement::MapImageBorderAttributeInto(const nsMappedAttributes* aAtt aDecls.SetPixelValueIfUnset(eCSSProperty_border_left_width, (float)val); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_top_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_right_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_bottom_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetKeywordValueIfUnset(eCSSProperty_border_left_style, - NS_STYLE_BORDER_STYLE_SOLID); + StyleBorderStyle::Solid); aDecls.SetCurrentColorIfUnset(eCSSProperty_border_top_color); aDecls.SetCurrentColorIfUnset(eCSSProperty_border_right_color); diff --git a/dom/payments/MerchantValidationEvent.cpp b/dom/payments/MerchantValidationEvent.cpp index 45d4cd947595..f596cfc1a38f 100644 --- a/dom/payments/MerchantValidationEvent.cpp +++ b/dom/payments/MerchantValidationEvent.cpp @@ -134,7 +134,7 @@ MerchantValidationEvent::ResolvedCallback(JSContext* aCx, // conformance, which is why at this point we throw a // NS_ERROR_DOM_NOT_SUPPORTED_ERR. - mRequest->AbortUpdate(NS_ERROR_DOM_NOT_SUPPORTED_ERR, false); + mRequest->AbortUpdate(NS_ERROR_DOM_NOT_SUPPORTED_ERR); mRequest->SetUpdating(false); } @@ -147,7 +147,7 @@ MerchantValidationEvent::RejectedCallback(JSContext* aCx, return; } mWaitForUpdate = false; - mRequest->AbortUpdate(NS_ERROR_DOM_ABORT_ERR, false); + mRequest->AbortUpdate(NS_ERROR_DOM_ABORT_ERR); mRequest->SetUpdating(false); } diff --git a/dom/payments/PaymentRequest.cpp b/dom/payments/PaymentRequest.cpp index 22424aaee174..10efca26fd36 100644 --- a/dom/payments/PaymentRequest.cpp +++ b/dom/payments/PaymentRequest.cpp @@ -664,7 +664,6 @@ PaymentRequest::PaymentRequest(nsPIDOMWindowInner* aWindow, const nsAString& aIn , mShippingAddress(nullptr) , mUpdating(false) , mRequestShipping(false) - , mDeferredShow(false) , mUpdateError(NS_OK) , mState(eCreated) , mIPC(nullptr) @@ -756,7 +755,6 @@ PaymentRequest::Show(const Optional>& aDetailsPromise, if (aDetailsPromise.WasPassed()) { aDetailsPromise.Value().AppendNativeHandler(this); mUpdating = true; - mDeferredShow = true; } RefPtr manager = PaymentRequestManager::GetSingleton(); @@ -858,9 +856,7 @@ PaymentRequest::Abort(ErrorResult& aRv) RefPtr manager = PaymentRequestManager::GetSingleton(); MOZ_ASSERT(manager); - // It's possible to be called between show and its promise resolving. - nsresult rv = manager->AbortPayment(this, mDeferredShow); - mDeferredShow = false; + nsresult rv = manager->AbortPayment(this); if (NS_WARN_IF(NS_FAILED(rv))) { aRv.Throw(NS_ERROR_FAILURE); return nullptr; @@ -905,8 +901,7 @@ PaymentRequest::RespondAbortPayment(bool aSuccess) } nsresult -PaymentRequest::UpdatePayment(JSContext* aCx, const PaymentDetailsUpdate& aDetails, - bool aDeferredShow) +PaymentRequest::UpdatePayment(JSContext* aCx, const PaymentDetailsUpdate& aDetails) { NS_ENSURE_ARG_POINTER(aCx); if (mState != eInteractive) { @@ -916,8 +911,7 @@ PaymentRequest::UpdatePayment(JSContext* aCx, const PaymentDetailsUpdate& aDetai if (NS_WARN_IF(!manager)) { return NS_ERROR_FAILURE; } - nsresult rv = manager->UpdatePayment(aCx, this, aDetails, mRequestShipping, - aDeferredShow); + nsresult rv = manager->UpdatePayment(aCx, this, aDetails, mRequestShipping); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -925,7 +919,7 @@ PaymentRequest::UpdatePayment(JSContext* aCx, const PaymentDetailsUpdate& aDetai } void -PaymentRequest::AbortUpdate(nsresult aRv, bool aDeferredShow) +PaymentRequest::AbortUpdate(nsresult aRv) { MOZ_ASSERT(NS_FAILED(aRv)); @@ -935,7 +929,7 @@ PaymentRequest::AbortUpdate(nsresult aRv, bool aDeferredShow) // Close down any remaining user interface. RefPtr manager = PaymentRequestManager::GetSingleton(); MOZ_ASSERT(manager); - nsresult rv = manager->AbortPayment(this, aDeferredShow); + nsresult rv = manager->AbortPayment(this); if (NS_WARN_IF(NS_FAILED(rv))) { return; } @@ -1138,33 +1132,29 @@ PaymentRequest::ResolvedCallback(JSContext* aCx, JS::Handle aValue) // Converting value to a PaymentDetailsUpdate dictionary PaymentDetailsUpdate details; if (!details.Init(aCx, aValue)) { - AbortUpdate(NS_ERROR_DOM_TYPE_ERR, mDeferredShow); + AbortUpdate(NS_ERROR_DOM_TYPE_ERR); JS_ClearPendingException(aCx); return; } nsresult rv = IsValidDetailsUpdate(details, mRequestShipping); if (NS_FAILED(rv)) { - AbortUpdate(rv, mDeferredShow); + AbortUpdate(rv); return; } // Update the PaymentRequest with the new details - if (NS_FAILED(UpdatePayment(aCx, details, mDeferredShow))) { - AbortUpdate(NS_ERROR_DOM_ABORT_ERR, mDeferredShow); + if (NS_FAILED(UpdatePayment(aCx, details))) { + AbortUpdate(NS_ERROR_DOM_ABORT_ERR); return; } - - mDeferredShow = false; } void PaymentRequest::RejectedCallback(JSContext* aCx, JS::Handle aValue) { - MOZ_ASSERT(mDeferredShow); mUpdating = false; - AbortUpdate(NS_ERROR_DOM_ABORT_ERR, mDeferredShow); - mDeferredShow = false; + AbortUpdate(NS_ERROR_DOM_ABORT_ERR); } void diff --git a/dom/payments/PaymentRequest.h b/dom/payments/PaymentRequest.h index 085602ec1905..1dff862cfe9e 100644 --- a/dom/payments/PaymentRequest.h +++ b/dom/payments/PaymentRequest.h @@ -143,9 +143,8 @@ public: nsresult UpdateShippingOption(const nsAString& aShippingOption); nsresult UpdatePayment(JSContext* aCx, - const PaymentDetailsUpdate& aDetails, - bool aDeferredShow); - void AbortUpdate(nsresult aRv, bool aDeferredShow); + const PaymentDetailsUpdate& aDetails); + void AbortUpdate(nsresult aRv); void SetShippingType(const Nullable& aShippingType); Nullable GetShippingType() const; @@ -210,10 +209,6 @@ protected: // but we don't actually store the full [[options]] internal slot. bool mRequestShipping; - // True if the user passed a promise to show, causing us to defer telling the - // front end about it. - bool mDeferredShow; - // The error is set in AbortUpdate(). The value is NS_OK by default. nsresult mUpdateError; diff --git a/dom/payments/PaymentRequestManager.cpp b/dom/payments/PaymentRequestManager.cpp index 0883ca9fc917..de1409f709b8 100644 --- a/dom/payments/PaymentRequestManager.cpp +++ b/dom/payments/PaymentRequestManager.cpp @@ -537,33 +537,25 @@ PaymentRequestManager::CanMakePayment(PaymentRequest* aRequest) nsAutoString requestId; aRequest->GetInternalId(requestId); IPCPaymentCanMakeActionRequest action(requestId); - return SendRequestPayment(aRequest, action); } nsresult PaymentRequestManager::ShowPayment(PaymentRequest* aRequest) { - nsresult rv = NS_OK; - if (!aRequest->IsUpdating()) { - nsAutoString requestId; - aRequest->GetInternalId(requestId); - IPCPaymentShowActionRequest action(requestId); - rv = SendRequestPayment(aRequest, action); - } - return rv; + nsAutoString requestId; + aRequest->GetInternalId(requestId); + IPCPaymentShowActionRequest action(requestId, aRequest->IsUpdating()); + return SendRequestPayment(aRequest, action); } nsresult -PaymentRequestManager::AbortPayment(PaymentRequest* aRequest, bool aDeferredShow) +PaymentRequestManager::AbortPayment(PaymentRequest* aRequest) { nsAutoString requestId; aRequest->GetInternalId(requestId); IPCPaymentAbortActionRequest action(requestId); - - // If aDeferredShow is true, then show was called with a promise that was - // rejected. In that case, we need to remember that we called show earlier. - return SendRequestPayment(aRequest, action, aDeferredShow); + return SendRequestPayment(aRequest, action); } nsresult @@ -585,7 +577,6 @@ PaymentRequestManager::CompletePayment(PaymentRequest* aRequest, nsAutoString requestId; aRequest->GetInternalId(requestId); IPCPaymentCompleteActionRequest action(requestId, completeStatusString); - return SendRequestPayment(aRequest, action, false); } @@ -593,8 +584,7 @@ nsresult PaymentRequestManager::UpdatePayment(JSContext* aCx, PaymentRequest* aRequest, const PaymentDetailsUpdate& aDetails, - bool aRequestShipping, - bool aDeferredShow) + bool aRequestShipping) { NS_ENSURE_ARG_POINTER(aCx); IPCPaymentDetails details; @@ -613,10 +603,7 @@ PaymentRequestManager::UpdatePayment(JSContext* aCx, nsAutoString requestId; aRequest->GetInternalId(requestId); IPCPaymentUpdateActionRequest action(requestId, details, shippingOption); - - // If aDeferredShow is true, then this call serves as the ShowUpdate call for - // this request. - return SendRequestPayment(aRequest, action, aDeferredShow); + return SendRequestPayment(aRequest, action, false); } nsresult diff --git a/dom/payments/PaymentRequestManager.h b/dom/payments/PaymentRequestManager.h index d0e1cb172a11..aead5cf7e9c5 100644 --- a/dom/payments/PaymentRequestManager.h +++ b/dom/payments/PaymentRequestManager.h @@ -48,15 +48,14 @@ public: nsresult CanMakePayment(PaymentRequest* aRequest); nsresult ShowPayment(PaymentRequest* aRequest); - nsresult AbortPayment(PaymentRequest* aRequest, bool aDeferredShow); + nsresult AbortPayment(PaymentRequest* aRequest); nsresult CompletePayment(PaymentRequest* aRequest, const PaymentComplete& aComplete, bool aTimedOut = false); nsresult UpdatePayment(JSContext* aCx, PaymentRequest* aRequest, const PaymentDetailsUpdate& aDetails, - bool aRequestShipping, - bool aDeferredShow); + bool aRequestShipping); nsresult ClosePayment(PaymentRequest* aRequest); nsresult RetryPayment(JSContext* aCx, PaymentRequest* aRequest, diff --git a/dom/payments/PaymentRequestService.cpp b/dom/payments/PaymentRequestService.cpp index 392272ecc0eb..edbdc862f54e 100644 --- a/dom/payments/PaymentRequestService.cpp +++ b/dom/payments/PaymentRequestService.cpp @@ -279,7 +279,8 @@ PaymentRequestService::RequestPayment(const nsAString& aRequestId, break; } case IPCPaymentActionRequest::TIPCPaymentShowActionRequest: { - rv = ShowPayment(aRequestId); + const IPCPaymentShowActionRequest& action = aAction; + rv = ShowPayment(aRequestId, action.isUpdating()); if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } @@ -316,21 +317,18 @@ PaymentRequestService::RequestPayment(const nsAString& aRequestId, if (NS_WARN_IF(NS_FAILED(rv))) { return rv; } - - // mShowingRequest exists and it equals to the updated PaymentRequest - // Call UI::UpdatePayment - if (mShowingRequest && mShowingRequest == request) { - rv = LaunchUIAction(aRequestId, type); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } - } else { - // mShowingRequest does not equal to the updated PaymentRequest, try to - // show the updated one. - rv = ShowPayment(aRequestId); - if (NS_WARN_IF(NS_FAILED(rv))) { - return rv; - } + nsAutoString completeStatus; + rv = request->GetCompleteStatus(completeStatus); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; + } + if (completeStatus.Equals(NS_LITERAL_STRING("initial"))) { + request->SetCompleteStatus(EmptyString()); + } + MOZ_ASSERT(mShowingRequest && mShowingRequest == request); + rv = LaunchUIAction(aRequestId, type); + if (NS_WARN_IF(NS_FAILED(rv))) { + return rv; } break; } @@ -516,7 +514,7 @@ PaymentRequestService::CanMakePayment(const nsAString& aRequestId) } nsresult -PaymentRequestService::ShowPayment(const nsAString& aRequestId) +PaymentRequestService::ShowPayment(const nsAString& aRequestId, bool aIsUpdating) { nsresult rv; RefPtr request; @@ -526,6 +524,9 @@ PaymentRequestService::ShowPayment(const nsAString& aRequestId) } MOZ_ASSERT(request); request->SetState(payments::PaymentRequest::eInteractive); + if (aIsUpdating) { + request->SetCompleteStatus(NS_LITERAL_STRING("initial")); + } if (mShowingRequest || !CanMakePayment(aRequestId)) { uint32_t responseStatus; diff --git a/dom/payments/PaymentRequestService.h b/dom/payments/PaymentRequestService.h index 1305b29fe4be..8b728ae38455 100644 --- a/dom/payments/PaymentRequestService.h +++ b/dom/payments/PaymentRequestService.h @@ -50,7 +50,7 @@ private: CanMakePayment(const nsAString& aRequestId); nsresult - ShowPayment(const nsAString& aRequestId); + ShowPayment(const nsAString& aRequestId, bool aIsUpdating); bool IsBasicCardPayment(const nsAString& aRequestId); diff --git a/dom/payments/PaymentRequestUpdateEvent.cpp b/dom/payments/PaymentRequestUpdateEvent.cpp index d5c631f949d2..4245174297cf 100644 --- a/dom/payments/PaymentRequestUpdateEvent.cpp +++ b/dom/payments/PaymentRequestUpdateEvent.cpp @@ -64,7 +64,7 @@ PaymentRequestUpdateEvent::ResolvedCallback(JSContext* aCx, JS::HandleAbortUpdate(NS_ERROR_TYPE_ERR, false); + mRequest->AbortUpdate(NS_ERROR_TYPE_ERR); JS_ClearPendingException(aCx); return; } @@ -76,13 +76,13 @@ PaymentRequestUpdateEvent::ResolvedCallback(JSContext* aCx, JS::HandleIsValidDetailsUpdate(details, true/*aRequestShipping*/); if (NS_FAILED(rv)) { - mRequest->AbortUpdate(rv, false); + mRequest->AbortUpdate(rv); return; } // Update the PaymentRequest with the new details - if (NS_FAILED(mRequest->UpdatePayment(aCx, details, false))) { - mRequest->AbortUpdate(NS_ERROR_DOM_ABORT_ERR, false); + if (NS_FAILED(mRequest->UpdatePayment(aCx, details))) { + mRequest->AbortUpdate(NS_ERROR_DOM_ABORT_ERR); return; } mWaitForUpdate = false; @@ -94,7 +94,7 @@ PaymentRequestUpdateEvent::RejectedCallback(JSContext* aCx, JS::HandleAbortUpdate(NS_ERROR_DOM_ABORT_ERR, false); + mRequest->AbortUpdate(NS_ERROR_DOM_ABORT_ERR); mWaitForUpdate = false; mRequest->SetUpdating(false); } diff --git a/dom/payments/ipc/PPaymentRequest.ipdl b/dom/payments/ipc/PPaymentRequest.ipdl index 0a20f91af9e8..cb6de4b4cb1e 100644 --- a/dom/payments/ipc/PPaymentRequest.ipdl +++ b/dom/payments/ipc/PPaymentRequest.ipdl @@ -87,6 +87,7 @@ struct IPCPaymentCanMakeActionRequest struct IPCPaymentShowActionRequest { nsString requestId; + bool isUpdating; }; struct IPCPaymentAbortActionRequest diff --git a/dom/payments/test/ShowPaymentChromeScript.js b/dom/payments/test/ShowPaymentChromeScript.js index 2d980aed0b9e..4d86a4d52074 100644 --- a/dom/payments/test/ShowPaymentChromeScript.js +++ b/dom/payments/test/ShowPaymentChromeScript.js @@ -6,15 +6,12 @@ const { XPCOMUtils } = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm"); const paymentSrv = Cc["@mozilla.org/dom/payments/payment-request-service;1"].getService(Ci.nsIPaymentRequestService); -let expectedCompleteStatus = null; -let expectedShowAction = "accept"; -let expectedUpdateAction = "accept"; function emitTestFail(message) { - sendAsyncMessage("test-fail", message); + sendAsyncMessage("test-fail", `${DummyUIService.testName}: ${message}`); } function emitTestPass(message) { - sendAsyncMessage("test-pass", message); + sendAsyncMessage("test-pass", `${DummyUIService.testName}: ${message}`); } const shippingAddress = Cc["@mozilla.org/dom/payments/payment-address;1"]. @@ -68,24 +65,29 @@ function rejectShow(requestId) { } function updateShow(requestId) { - if (expectedUpdateAction == "updateaddress") { + if (DummyUIService.expectedUpdateAction == "updateaddress") { paymentSrv.changeShippingAddress(requestId, shippingAddress); - } else if (expectedUpdateAction == "accept" || expectedUpdateAction == "error"){ + } else if (DummyUIService.expectedUpdateAction == "accept" || + DummyUIService.expectedUpdateAction == "error"){ paymentSrv.changeShippingOption(requestId, "FastShipping"); } else { - emitTestFail("Unknown expected update action: " + expectedUpdateAction); + emitTestFail("Unknown expected update action: " + DummyUIService.expectedUpdateAction); } } function showRequest(requestId) { - if (expectedShowAction == "accept") { + const request = paymentSrv.getPaymentRequestById(requestId); + if (request.completeStatus == "initial") { + return; + } + if (DummyUIService.expectedShowAction == "accept") { acceptShow(requestId); - } else if (expectedShowAction == "reject") { + } else if (DummyUIService.expectedShowAction == "reject") { rejectShow(requestId); - } else if (expectedShowAction == "update") { + } else if (DummyUIService.expectedShowAction == "update") { updateShow(requestId); } else { - emitTestFail("Unknown expected show action: " + expectedShowAction); + emitTestFail("Unknown expected show action: " + DummyUIService.expectedShowAction); } } @@ -97,14 +99,14 @@ function abortRequest(requestId) { } function completeRequest(requestId) { - let payRequest = paymentSrv.getPaymentRequestById(requestId); - if (expectedCompleteStatus) { - if (payRequest.completeStatus == expectedCompleteStatus) { + let request = paymentSrv.getPaymentRequestById(requestId); + if (DummyUIService.expectedCompleteStatus) { + if (request.completeStatus == DummyUIService.expectedCompleteStatus) { emitTestPass("request.completeStatus matches expectation of " + - expectedCompleteStatus); + DummyUIService.expectedCompleteStatus); } else { emitTestFail("request.completeStatus incorrect. Expected " + - expectedCompleteStatus + ", got " + payRequest.completeStatus); + DummyUIService.expectedCompleteStatus + ", got " + request.completeStatus); } } let completeResponse = Cc["@mozilla.org/dom/payments/payment-complete-action-response;1"]. @@ -115,7 +117,10 @@ function completeRequest(requestId) { function updateRequest(requestId) { let request = paymentSrv.getPaymentRequestById(requestId); - if (expectedUpdateAction == "accept") { + if (request.completeStatus !== "") { + emitTestFail("request.completeStatus should be empty, but got '" + request.completeStatus + "'."); + } + if (DummyUIService.expectedUpdateAction == "accept") { if (request.paymentDetails.error != "") { emitTestFail("updatedDetails should not have errors(" + request.paymentDetails.error + ")."); } @@ -129,23 +134,27 @@ function updateRequest(requestId) { emitTestFail(shippingOption.label + " should be selected."); } acceptShow(requestId); - } else if (expectedUpdateAction == "error") { + } else if (DummyUIService.expectedUpdateAction == "error") { if (request.paymentDetails.error != "Update with Error") { emitTestFail("details.error should be 'Update with Error', but got " + request.paymentDetails.error + "."); } rejectShow(requestId); - } else if (expectedUpdateAction == "updateaddress") { + } else if (DummyUIService.expectedUpdateAction == "updateaddress") { if (request.paymentDetails.error != "") { emitTestFail("updatedDetails should not have errors(" + request.paymentDetails.error + ")."); } - expectedUpdateAction = "accept"; + DummyUIService.expectedUpdateAction = "accept"; paymentSrv.changeShippingOption(requestId, "FastShipping"); } else { - emitTestFail("Unknown expected update aciton: " + expectedUpdateAction); + emitTestFail("Unknown expected update aciton: " + DummyUIService.expectedUpdateAction); } } const DummyUIService = { + testName: "", + expectedCompleteStatus: null, + expectedShowAction: "accept", + expectedUpdateAction: "accept", showPayment: showRequest, abortPayment: abortRequest, completePayment: completeRequest, @@ -214,48 +223,61 @@ function testShowResponseInit() { sendAsyncMessage("test-show-response-init-complete"); } -addMessageListener("set-simple-ui-service", function() { - expectedCompleteStatus = null; - expectedShowAction = "accept"; - expectedUpdateAction = "accept"; +addMessageListener("set-simple-ui-service", function(testName) { + DummyUIService.testName = testName; + DummyUIService.expectedCompleteStatus = null; + DummyUIService.expectedShowAction = "accept"; + DummyUIService.expectedUpdateAction = "accept"; + sendAsyncMessage("set-simple-ui-service-complete"); }); -addMessageListener("set-normal-ui-service", function() { - expectedCompleteStatus = null; - expectedShowAction = "update"; - expectedUpdateAction = "updateaddress"; +addMessageListener("set-normal-ui-service", function(testName) { + DummyUIService.testName = testName; + DummyUIService.expectedCompleteStatus = null; + DummyUIService.expectedShowAction = "update"; + DummyUIService.expectedUpdateAction = "updateaddress"; + sendAsyncMessage("set-normal-ui-service-complete"); }); -addMessageListener("set-reject-ui-service", function() { - expectedCompleteStatus = null; - expectedShowAction = "reject"; - expectedUpdateAction = "accept"; +addMessageListener("set-reject-ui-service", function(testName) { + DummyUIService.testName = testName; + DummyUIService.expectedCompleteStatus = null; + DummyUIService.expectedShowAction = "reject"; + DummyUIService.expectedUpdateAction = "error"; + sendAsyncMessage("set-reject-ui-service-complete"); }); -addMessageListener("set-update-with-ui-service", function() { - expectedCompleteStatus = null; - expectedShowAction = "update"; - expectedUpdateAction = "accept"; +addMessageListener("set-update-with-ui-service", function(testName) { + DummyUIService.testName = testName; + DummyUIService.expectedCompleteStatus = null; + DummyUIService.expectedShowAction = "update"; + DummyUIService.expectedUpdateAction = "accept"; + sendAsyncMessage("set-update-with-ui-service-complete"); }); -addMessageListener("set-update-with-error-ui-service", function() { - expectedCompleteStatus = null; - expectedShowAction = "update"; - expectedUpdateAction = "error"; +addMessageListener("set-update-with-error-ui-service", function(testName) { + DummyUIService.testName = testName; + DummyUIService.expectedCompleteStatus = null; + DummyUIService.expectedShowAction = "update"; + DummyUIService.expectedUpdateAction = "error"; + sendAsyncMessage("set-update-with-error-ui-service-complete"); }); addMessageListener("test-show-response-init", testShowResponseInit); addMessageListener("set-complete-status-success", function() { - expectedCompleteStatus = "success"; + DummyUIService.expectedCompleteStatus = "success"; + sendAsyncMessage("set-complete-status-success-complete"); }); addMessageListener("set-complete-status-fail", function() { - expectedCompleteStatus = "fail"; + DummyUIService.expectedCompleteStatus = "fail"; + sendAsyncMessage("set-complete-status-fail-complete"); }); addMessageListener("set-complete-status-unknown", function() { - expectedCompleteStatus = "unknown"; + DummyUIService.expectedCompleteStatus = "unknown"; + sendAsyncMessage("set-complete-status-unknown-complete"); }); addMessageListener("teardown", function() { diff --git a/dom/payments/test/test_showPayment.html b/dom/payments/test/test_showPayment.html index de957679c6d0..75c60c8764d0 100644 --- a/dom/payments/test/test_showPayment.html +++ b/dom/payments/test/test_showPayment.html @@ -25,6 +25,16 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1345366 gScript.addMessageListener("test-fail", testFailHandler); gScript.addMessageListener("test-pass", testPassHandler); + async function requestChromeAction(action, params) { + await new Promise(resolve => { + gScript.addMessageListener(`${action}-complete`, function completeListener() { + gScript.removeMessageListener(`${action}-complete`, completeListener); + resolve(); + }); + gScript.sendAsyncMessage(action, params); + }); + } + // testing data declaration // default parameters for PaymentRequest construction const defaultMethods = [{ @@ -127,303 +137,335 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1345366 // checking functions - function checkAddress(address, fromEvent) { - is(address.country, "USA", "address.country should be 'USA'."); - is(address.region, "CA", "address.region should be 'CA'."); - is(address.city, "San Bruno", "address.city should be 'San Bruno'."); - is(address.dependentLocality, "Test locality", - "address.dependentLocality should be 'Test locality'."); - is(address.postalCode, "94066", "address.postalCode should be '94066'."); - is(address.sortingCode, "123456", "address.sortingCode should be '123456'."); + function checkAddress(testName, address, fromEvent) { + is(address.country, + "USA", + `${testName}: address.country should be 'USA'.`); + is(address.region, + "CA", + `${testName}: address.region should be 'CA'.`); + is(address.city, + "San Bruno", + `${testName}: address.city should be 'San Bruno'.`); + is(address.dependentLocality, + "Test locality", + `${testName}: address.dependentLocality should be 'Test locality'.`); + is(address.postalCode, + "94066", + `${testName}: address.postalCode should be '94066'.`); + is(address.sortingCode, + "123456", + `${testName}: address.sortingCode should be '123456'.`); if (fromEvent) { - is(address.addressLine.length, 0, "address.addressLine.length should be 0 from event."); - is(address.organization, "", "address.organization should be empty from event."); - is(address.recipient, "", "address.recipient should be empty from event."); - is(address.phone, "", "address.phone should be empty from event."); + is(address.addressLine.length, + 0, + `${testName}: address.addressLine.length should be 0 from event.`); + is(address.organization, + "", + `${testName}: address.organization should be empty from event.`); + is(address.recipient, + "", + `${testName}: address.recipient should be empty from event.`); + is(address.phone, + "", + `${testName}: address.phone should be empty from event.`); } else { - is(address.addressLine.length, 1, "address.addressLine.length should be 1 from promise."); - is(address.addressLine[0], "Easton Ave", "address.addressLine[0] should be 'Easton Ave' from promise."); - is(address.organization, "Testing Org", "address.organization should be 'Testing Org' from promise."); - is(address.recipient, "Bill A. Pacheco", "address.recipient should be 'Bill A. Pacheco' from promise."); - is(address.phone, "+1-434-441-3879", "address.phone should be '+1-434-441-3879' from promise."); + is(address.addressLine.length, + 1, + `${testName}: address.addressLine.length should be 1 from promise.`); + is(address.addressLine[0], + "Easton Ave", + `${testName}: address.addressLine[0] should be 'Easton Ave' from promise.`); + is(address.organization, + "Testing Org", + `${testName}: address.organization should be 'Testing Org' from promise.`); + is(address.recipient, + "Bill A. Pacheco", + `${testName}: address.recipient should be 'Bill A. Pacheco' from promise.`); + is(address.phone, + "+1-434-441-3879", + `${testName}: address.phone should be '+1-434-441-3879' from promise.`); } } - function checkResponse(response) { - is(response.requestId, "test payment", "response.requestId should be 'test payment'."); - is(response.methodName, "testing-payment-method", "response.methodName should be 'testing-payment-method'."); - is(response.details.paymentToken, "6880281f-0df3-4b8e-916f-66575e2457c1", "response.details.paymentToken should be '6880281f-0df3-4b8e-916f-66575e2457c1'."); - checkAddress(response.shippingAddress, false/*fromEvent*/); - is(response.shippingOption, "FastShipping", "response.shippingOption should be 'FastShipping'."); - is(response.payerName, "Bill A. Pacheco", "response.payerName should be 'Bill A. Pacheco'."); - ok(!response.payerEmail, "response.payerEmail should be empty"); - ok(!response.payerPhone, "response.payerPhone should be empty"); + function checkResponse(testName, response) { + is(response.requestId, + "test payment", + `${testName}: response.requestId should be 'test payment'.`); + is(response.methodName, + "testing-payment-method", + `${testName}: response.methodName should be 'testing-payment-method'.`); + is(response.details.paymentToken, + "6880281f-0df3-4b8e-916f-66575e2457c1", + `${testName}: response.details.paymentToken should be '6880281f-0df3-4b8e-916f-66575e2457c1'.`); + checkAddress(testName, response.shippingAddress, false/*fromEvent*/); + is(response.shippingOption, + "FastShipping", + `${testName}: response.shippingOption should be 'FastShipping'.`); + is(response.payerName, + "Bill A. Pacheco", + `${testName}: response.payerName should be 'Bill A. Pacheco'.`); + ok(!response.payerEmail, + `${testName}: response.payerEmail should be empty`); + ok(!response.payerPhone, + `${testName}: response.payerPhone should be empty`); } // testing functions - function testShowNormalFlow() { - gScript.sendAsyncMessage("set-normal-ui-service"); - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); - payRequest.addEventListener("shippingaddresschange", event => { - checkAddress(payRequest.shippingAddress, true/*fromEvent*/); + async function testShowNormalFlow() { + const testName = "testShowNormalFlow"; + await requestChromeAction("set-normal-ui-service", testName); + return new Promise(async (resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); + request.addEventListener("shippingaddresschange", event => { + checkAddress(testName, request.shippingAddress, true/*fromEvent*/); event.updateWith(updateWithPromise(defaultDetails)); }); - payRequest.addEventListener("shippingoptionchange", event => { + request.addEventListener("shippingoptionchange", event => { event.updateWith(updateWithPromise(updatedShippingOptionsDetails)); }); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.show().then(response => { - checkResponse(response, false); - checkAddress(payRequest.shippingAddress, false); - response.complete().then(() =>{ - resolve(); - }).catch(e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }); - }).catch( e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }).finally(handler.destruct); + try { + let response = await request.show(); + checkResponse(testName, response, false); + await response.complete(); + } catch (error) { + ok(false, `${testName} Unexpected error: ${e.name}`); + } + await handler.destruct(); + resolve(); }); } // testing show with nonsupported methods - function testCannotMakePaymentShow() { - gScript.sendAsyncMessage("set-simple-ui-service"); - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(nonSupportedMethods, defaultDetails); + async function testCannotMakePaymentShow() { + const testName = "testCannotMakePaymentShow"; + await requestChromeAction("set-simple-ui-service", testName); + return new Promise(async (resolve) => { + const request = new PaymentRequest(nonSupportedMethods, defaultDetails); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.canMakePayment().then(result => { - ok(!result, "canMakePayment() should return false, but got " + result + "."); - payRequest.show().then( () => { - ok(false, "Should be rejected with 'NotSupportedError', but got resolved"); - resolve(); - }).catch( e => { - is(e.name, "NotSupportedError", "Should be rejected with 'NotSupportedError', but got " + e.name + "."); - resolve(); - }); - }).finally(handler.destruct); + let result = await request.canMakePayment(); + ok(!result, `${testName}: canMakePayment() should return false.`); + try { + await request.show(); + ok(false, `${testName}: should be rejected with 'NotSupportedError' but got resolved.`); + } catch (error) { + is(error.name, "NotSupportedError", `${testName}: should be rejected with 'NotSupportedError'.`); + } + await handler.destruct(); + resolve(); }); } // testing show rejected by user - function testRejectShow() { - gScript.sendAsyncMessage("set-reject-ui-service"); - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); + async function testRejectShow() { + const testName = "testRejectShow"; + await requestChromeAction("set-reject-ui-service", testName); + return new Promise(async(resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.show().then((result) => { - ok(false, "Should be rejected with 'AbortError', but got resolved"); - resolve(); - }, (result) => { - is(result.name, "AbortError", "Should be rejected with 'AbortError', but got " + result.name + "."); - resolve(); - }).catch(e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }).finally(handler.destruct); + try { + await request.show(); + ok(false, `${testName}: Should be rejected with 'AbortError' but got resolved.`); + } catch(error) { + is(error.name, "AbortError", `${testName}: Should be rejected with 'AbortError'.`); + } + await handler.destruct(); + resolve(); }); } // testing PaymentResponse.complete() with specified result - function testCompleteStatus(result) { - gScript.sendAsyncMessage("set-simple-ui-service"); + async function testCompleteStatus(testName, result) { + await requestChromeAction("set-simple-ui-service", testName); if (result) { - gScript.sendAsyncMessage("set-complete-status-"+result); + await requestChromeAction(`set-complete-status-${result}`); } else { - gScript.sendAsyncMessage("set-complete-status-unknown"); + await requestChromeAction(`set-complete-status-unknown`); } - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); + return new Promise(async (resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.show().then(response => { - response.complete(result).then(() => { - resolve(); - }).catch(e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }); - }).catch( e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }).finally(handler.destruct); + try { + let response = await request.show(); + await response.complete(result); + } catch (error) { + ok(false, `${testName}: Unexpected error ${error.name}.`); + } + await handler.destruct(); + resolve(); }); } - function testCompleteFail() { - return testCompleteStatus("fail"); + async function testCompleteFail() { + const testName = "testCompleteFail"; + return testCompleteStatus(testName, "fail"); } - function testCompleteSuccess() { - return testCompleteStatus("success"); + async function testCompleteSuccess() { + const testName = "testCompleteSuccess"; + return testCompleteStatus(testName, "success"); } - function testCompleteUnknown() { - return testCompleteStatus("unknown"); + async function testCompleteUnknown() { + const testName = "testCompleteUnknown" + return testCompleteStatus(testName, "unknown"); } - function testCompleteEmpty() { - return testCompleteStatus(); + async function testCompleteEmpty() { + const testName = "testCompleteEmpty"; + return testCompleteStatus(testName); } // testing PaymentRequestUpdateEvent.updateWith with specified details and error - function testUpdateWith(detailsUpdate, expectedError) { + async function testUpdateWith(testName, detailsUpdate, expectedError) { if (expectedError) { - gScript.sendAsyncMessage("set-update-with-error-ui-service"); + await requestChromeAction("set-update-with-error-ui-service", testName); } else { - gScript.sendAsyncMessage("set-update-with-ui-service"); + await requestChromeAction("set-update-with-ui-service", testName); } - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); - payRequest.addEventListener("shippingaddresschange", event => { + return new Promise(async (resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); + request.addEventListener("shippingaddresschange", event => { event.updateWith(updateWithPromise(detailsUpdate)); }); - payRequest.addEventListener("shippingoptionchange", event => { + request.addEventListener("shippingoptionchange", event => { event.updateWith(updateWithPromise(detailsUpdate)); }); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.show().then(response => { + try { + const response = await request.show(); if (expectedError) { - ok(false, "Should be rejected with " + expectedError + ", but got resolved"); - resolve(); - } else { - response.complete("success").then(() => { - resolve(); - }) - } - }, response => { + ok(false, `${testName}: Should be rejected with ${expectedError} but got resolved.`); + } else { + await response.complete("success"); + } + } catch(error) { if (expectedError) { - is(response.name, expectedError, - "Should be rejected with " + expectedError + ", but got " + response.name); - } else { - ok(false, "Unexpected error: " + response.name); - } - resolve(); - }).catch(e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }).finally(handler.destruct); + is(error.name, expectedError, `${testName}: Should be rejected with ${expectedError}.`); + } else { + ok(false, `${testName}: Unexpected error ${error.name}.`); + } + } + await handler.destruct(); + resolve(); }); } - function testUpdateWithReject() { - return testUpdateWith(null, "AbortError"); + async function testUpdateWithReject() { + const testName = "testUpdateWithReject"; + return testUpdateWith(testName, null, "AbortError"); } - function testUpdateWithValidDetails() { - return testUpdateWith(updatedShippingOptionsDetails, null); + async function testUpdateWithValidDetails() { + const testName = "testUpdateWithValidDetails"; + return testUpdateWith(testName, updatedShippingOptionsDetails, null); } - function testUpdateWithInvalidDetails() { - return testUpdateWith({total: "invalid details"}, "TypeError"); + async function testUpdateWithInvalidDetails() { + const testName = "testUpdateWithInvalidDetails"; + return testUpdateWith(testName, {total: "invalid details"}, "TypeError"); } - function testUpdateWithError() { - return testUpdateWith(updatedErrorDetails, "AbortError"); + async function testUpdateWithError() { + const testName = "testUpdateWithError"; + return testUpdateWith(testName, updatedErrorDetails, "AbortError"); } // testing show with detailsUpdate promise - function testShowWithDetailsPromise(detailsUpdate, expectedError) { + async function testShowWithDetailsPromise(testName, detailsUpdate, expectedError) { if (expectedError) { - gScript.sendAsyncMessage("set-reject-ui-service"); + await requestChromeAction("set-reject-ui-service", testName); } else { - gScript.sendAsyncMessage("set-simple-ui-service"); + await requestChromeAction("set-simple-ui-service", testName); } - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); - ok(!payRequest.shippingOption, "payRequest.shippingOption should be null."); + return new Promise(async (resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); + ok(!request.shippingOption, `${testName}: request.shippingOption should be null.`); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); - payRequest.show(updateWithPromise(detailsUpdate)).then(response => { + try { + let response = await request.show(updateWithPromise(detailsUpdate)); if (expectedError) { - ok(false, "Should be rejected with " + expectedError + ", but got resolved"); - resolve(); - } else { - ok(response.shippingOption, "response.shippingOption should not be null."); - response.complete().then(() => { - resolve(); - }) - } - }, response => { + ok(false, `${testName}: Should be rejected with ${expectedError} but got resolved.`); + } else { + ok(response.shippingOption, + `${testName}: response.shippingOption should not be null.`); + } + await response.complete(); + } catch(error) { if (expectedError) { - is(response.name, expectedError, - "Should be rejected with " + expectedError + ", but got " + response.name); - } else { - ok(false, "Unexpected error: " + response.name); - } - resolve(); - }).catch(e => { - ok(false, "Unexpected error: " + e.name); - resolve(); - }).finally(handler.destruct); + is(error.name, expectedError, `${testName}: Should be rejected with ${expectedError}.`); + } else { + ok(false, `${testName}: Unexpected error ${error.name}.`); + } + } + await handler.destruct(); + resolve(); }); } - function testShowWithValidPromise() { - return testShowWithDetailsPromise(updatedShippingOptionsDetails, null); + async function testShowWithValidPromise() { + const testName = "testShowWithValidPromise"; + return testShowWithDetailsPromise(testName, updatedShippingOptionsDetails, null); } - function testShowWithRejectedPromise() { - return testShowWithDetailsPromise(null, "AbortError"); + async function testShowWithRejectedPromise() { + const testName = "testShowWithRejectedPromise"; + return testShowWithDetailsPromise(testName, null, "AbortError"); } - function testShowWithInvalidPromise() { - return testShowWithDetailsPromise({total: "invalid details"}, "TypeError"); + async function testShowWithInvalidPromise() { + const testName = "testShowWithInvalidPromise"; + return testShowWithDetailsPromise(testName, {total: "invalid details"}, "TypeError"); } - function testShowWithErrorPromise() { - return testShowWithDetailsPromise(updatedErrorDetails, "AbortError"); + async function testShowWithErrorPromise() { + const testName = "testShowWithErrorPromise"; + return testShowWithDetailsPromise(testName, updatedErrorDetails, "AbortError"); } - function testShowWithPromiseResolvedByRejectedPromise() { - gScript.sendAsyncMessage("set-reject-ui-service"); - return new Promise((resolve, reject)=> { + async function testShowWithPromiseResolvedByRejectedPromise() { + const testName = "testShowWithPromiseResolvedByRejectedPromise"; + await requestChromeAction("set-reject-ui-service", testName); + return new Promise(async (resolve)=> { const request = new PaymentRequest(defaultMethods, defaultDetails, defaultOptions); const handler = SpecialPowers.getDOMWindowUtils(window).setHandlingUserInput(true); let rejectPromise = Promise.reject(new TypeError()); let detailsUpdatePromise = Promise.resolve(rejectPromise); - request.show(detailsUpdatePromise).then(response => { - ok(false, "should be rejected with 'AbortError', but got resolved."); - resolve(); - }, response => { - is(response.name, "AbortError", "Exepcted 'AbortError', but got " + response.name + "."); - resolve(); - }).catch(error => { - ok(false, "Unexpected error: " + error.name + "."); - }).finally(handler.destruct); + try { + await request.show(detailsUpdatePromise); + ok(false, `${testName}: should be rejected with AbortError but got resolved.`); + } catch(error) { + is(error.name, "AbortError", `${testName}: should be rejected with AbortError.`); + } + await handler.destruct(); + resolve(); }); } // testing show response initialization in chrome process - function testShowResponseInit() { - return new Promise((resolve, reject) => { - gScript.addMessageListener("test-show-response-init-complete", - function showResponseInitCompleteHandler() { - gScript.removeMessageListener("test-show-response-init-complete", - showResponseInitCompleteHandler); - resolve(); - }); - gScript.sendAsyncMessage("test-show-response-init"); - }); + async function testShowResponseInit() { + const testName = "testShowResponseInit"; + await requestChromeAction("test-show-response-init", testName); } // testing show that is not triggered by user. - function testShowNotTriggeredByUser() { - gScript.sendAsyncMessage("set-simple-ui-service"); - return new Promise((resolve, reject) => { - const payRequest = new PaymentRequest(defaultMethods, defaultDetails); - payRequest.show().then(() => { - ok(false, "Expected 'SecurityError', but got resolved") - resolve(); - }).catch((err) => { - is(err.name, "SecurityError", `Should be rejected with 'SecurityError', but got ${err.name}`); - resolve(); - }); + async function testShowNotTriggeredByUser() { + const testName = "testShowNotTriggeredByUser"; + await requestChromeAction("set-simple-ui-service", testName); + return new Promise(async (resolve) => { + const request = new PaymentRequest(defaultMethods, defaultDetails); + try { + await request.show(); + ok(false, `${testName}: should be rejected with SecurityError, but got resolved.`); + } catch (error) { + is(error.name, "SecurityError", `${testName}: should be rejected with SecurityError.`); + } + resolve(); }); } // teardown function - function teardown() { + async function teardown() { gScript.addMessageListener("teardown-complete", function teardownCompleteHandler() { gScript.removeMessageListener("teardown-complete", teardownCompleteHandler); gScript.removeMessageListener("test-fail", testFailHandler); @@ -435,30 +477,31 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1345366 } // test main body - function runTests() { - testCannotMakePaymentShow() - .then(testRejectShow) - .then(testShowNormalFlow) - .then(testCompleteSuccess) - .then(testCompleteFail) - .then(testCompleteUnknown) - .then(testCompleteEmpty) - .then(testUpdateWithReject) - .then(testUpdateWithValidDetails) - .then(testUpdateWithInvalidDetails) - .then(testUpdateWithError) - .then(testShowWithValidPromise) - .then(testShowWithInvalidPromise) - .then(testShowWithRejectedPromise) - .then(testShowWithErrorPromise) - .then(testShowWithPromiseResolvedByRejectedPromise) - .then(testShowResponseInit) - .then(testShowNotTriggeredByUser) - .then(teardown) - .catch( e => { - ok(false, "Unexpected error: " + e.name); + async function runTests() { + try { + await testCannotMakePaymentShow(); + await testRejectShow(); + await testShowNormalFlow(); + await testCompleteSuccess(); + await testCompleteFail(); + await testCompleteUnknown(); + await testCompleteEmpty(); + await testUpdateWithReject(); + await testUpdateWithValidDetails(); + await testUpdateWithInvalidDetails(); + await testUpdateWithError(); + await testShowWithValidPromise(); + await testShowWithInvalidPromise(); + await testShowWithRejectedPromise(); + await testShowWithErrorPromise(); + await testShowWithPromiseResolvedByRejectedPromise(); + await testShowResponseInit(); + await testShowNotTriggeredByUser(); + await teardown(); + } catch (error) { + ok(false, `test_showPayment: Unexpected error: ${error.name}`); SimpleTest.finish(); - }); + } } window.addEventListener('load', function() { diff --git a/gfx/layers/LayersTypes.h b/gfx/layers/LayersTypes.h index a44603833899..1138c220c17f 100644 --- a/gfx/layers/LayersTypes.h +++ b/gfx/layers/LayersTypes.h @@ -15,6 +15,7 @@ #include "mozilla/Maybe.h" #include "mozilla/TypedEnumBits.h" #include "nsRegion.h" +#include "nsStyleConsts.h" #include // FILE #include "mozilla/Logging.h" // for PR_LOG @@ -392,7 +393,7 @@ typedef gfx::Matrix4x4Typed AsyncTra typedef Array BorderColors; typedef Array BorderCorners; typedef Array BorderWidths; -typedef Array BorderStyles; +typedef Array BorderStyles; typedef Maybe MaybeLayerRect; diff --git a/gfx/webrender_bindings/WebRenderTypes.h b/gfx/webrender_bindings/WebRenderTypes.h index 6da2d041b6de..44494113b54d 100644 --- a/gfx/webrender_bindings/WebRenderTypes.h +++ b/gfx/webrender_bindings/WebRenderTypes.h @@ -452,28 +452,28 @@ static inline wr::LayoutTransform ToLayoutTransform(const gfx::Matrix4x4TypedmColor)); nscoord onePixel = nsPresContext::CSSPixelsToAppUnits(1); clipRect.width -= onePixel; diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp index fcd71bc8a376..6e22e3cd1db4 100644 --- a/layout/generic/nsColumnSetFrame.cpp +++ b/layout/generic/nsColumnSetFrame.cpp @@ -195,13 +195,13 @@ nsColumnSetFrame::CreateBorderRenderers(nsTArray& aBorderRe WritingMode wm = GetWritingMode(); bool isVertical = wm.IsVertical(); const nsStyleColumn* colStyle = StyleColumn(); - uint8_t ruleStyle; + StyleBorderStyle ruleStyle; // Per spec, inset => ridge and outset => groove - if (colStyle->mColumnRuleStyle == NS_STYLE_BORDER_STYLE_INSET) - ruleStyle = NS_STYLE_BORDER_STYLE_RIDGE; - else if (colStyle->mColumnRuleStyle == NS_STYLE_BORDER_STYLE_OUTSET) - ruleStyle = NS_STYLE_BORDER_STYLE_GROOVE; + if (colStyle->mColumnRuleStyle == StyleBorderStyle::Inset) + ruleStyle = StyleBorderStyle::Ridge; + else if (colStyle->mColumnRuleStyle == StyleBorderStyle::Outset) + ruleStyle = StyleBorderStyle::Groove; else ruleStyle = colStyle->mColumnRuleStyle; diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 5222bab2060c..1f9983aad20d 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -9480,7 +9480,7 @@ ComputeAndIncludeOutlineArea(nsIFrame* aFrame, nsOverflowAreas& aOverflowAreas, nsRect outerRect(innerRect); bool useOutlineAuto = false; if (nsLayoutUtils::IsOutlineStyleAutoEnabled()) { - useOutlineAuto = outline->mOutlineStyle == NS_STYLE_BORDER_STYLE_AUTO; + useOutlineAuto = outline->mOutlineStyle == StyleBorderStyle::Auto; if (MOZ_UNLIKELY(useOutlineAuto)) { nsPresContext* presContext = aFrame->PresContext(); nsITheme* theme = presContext->GetTheme(); diff --git a/layout/generic/nsImageFrame.cpp b/layout/generic/nsImageFrame.cpp index db3b8edef982..b0703ea64c0c 100644 --- a/layout/generic/nsImageFrame.cpp +++ b/layout/generic/nsImageFrame.cpp @@ -1365,7 +1365,7 @@ struct nsRecessedBorder : public nsStyleBorder { mBorder.Side(side) = aBorderWidth; // Note: use SetBorderStyle here because we want to affect // mComputedBorder - SetBorderStyle(side, NS_STYLE_BORDER_STYLE_INSET); + SetBorderStyle(side, StyleBorderStyle::Inset); } } }; @@ -1912,7 +1912,7 @@ nsImageFrame::PaintImage(gfxContext& aRenderingContext, nsPoint aPt, // then dashed black stroke over the top: ColorPattern black(ToDeviceColor(Color(0.f, 0.f, 0.f, 1.f))); StrokeOptions strokeOptions; - nsLayoutUtils::InitDashPattern(strokeOptions, NS_STYLE_BORDER_STYLE_DOTTED); + nsLayoutUtils::InitDashPattern(strokeOptions, StyleBorderStyle::Dotted); map->Draw(this, *drawTarget, black, strokeOptions); } diff --git a/layout/mathml/nsMathMLmtableFrame.cpp b/layout/mathml/nsMathMLmtableFrame.cpp index b6f61c403b12..baf647c6d291 100644 --- a/layout/mathml/nsMathMLmtableFrame.cpp +++ b/layout/mathml/nsMathMLmtableFrame.cpp @@ -51,11 +51,11 @@ ParseStyleValue(nsAtom* aAttribute, const nsAString& aAttributeValue) } else if (aAttribute == nsGkAtoms::rowlines_ || aAttribute == nsGkAtoms::columnlines_) { if (aAttributeValue.EqualsLiteral("solid")) - return NS_STYLE_BORDER_STYLE_SOLID; + return static_cast(StyleBorderStyle::Solid); else if (aAttributeValue.EqualsLiteral("dashed")) - return NS_STYLE_BORDER_STYLE_DASHED; + return static_cast(StyleBorderStyle::Dashed); else - return NS_STYLE_BORDER_STYLE_NONE; + return static_cast(StyleBorderStyle::None); } else { MOZ_CRASH("Unrecognized attribute."); } @@ -200,11 +200,11 @@ ApplyBorderToStyle(const nsMathMLmtdFrame* aFrame, // values, we simply repeat the last value. uint32_t listLength = rowLinesList->Length(); if (rowIndex < listLength) { - aStyleBorder.SetBorderStyle(eSideTop, - rowLinesList->ElementAt(rowIndex - 1)); + aStyleBorder.SetBorderStyle(eSideTop, static_cast( + rowLinesList->ElementAt(rowIndex - 1))); } else { - aStyleBorder.SetBorderStyle(eSideTop, - rowLinesList->ElementAt(listLength - 1)); + aStyleBorder.SetBorderStyle(eSideTop, static_cast( + rowLinesList->ElementAt(listLength - 1))); } aStyleBorder.SetBorderWidth(eSideTop, borderWidth); } @@ -215,11 +215,11 @@ ApplyBorderToStyle(const nsMathMLmtdFrame* aFrame, // values, we simply repeat the last value. uint32_t listLength = columnLinesList->Length(); if (columnIndex < listLength) { - aStyleBorder.SetBorderStyle(eSideLeft, - columnLinesList->ElementAt(columnIndex - 1)); + aStyleBorder.SetBorderStyle(eSideLeft, static_cast( + columnLinesList->ElementAt(columnIndex - 1))); } else { - aStyleBorder.SetBorderStyle(eSideLeft, - columnLinesList->ElementAt(listLength - 1)); + aStyleBorder.SetBorderStyle(eSideLeft, static_cast( + columnLinesList->ElementAt(listLength - 1))); } aStyleBorder.SetBorderWidth(eSideLeft, borderWidth); } diff --git a/layout/painting/nsCSSRendering.cpp b/layout/painting/nsCSSRendering.cpp index e10bea08de9b..32290e6e41c5 100644 --- a/layout/painting/nsCSSRendering.cpp +++ b/layout/painting/nsCSSRendering.cpp @@ -456,7 +456,7 @@ nsCSSRendering::Shutdown() */ static nscolor MakeBevelColor(mozilla::Side whichSide, - uint8_t style, + StyleBorderStyle style, nscolor aBorderColor) { @@ -467,8 +467,8 @@ MakeBevelColor(mozilla::Side whichSide, // calculate the color used for the shading NS_GetSpecial3DColors(colors, aBorderColor); - if ((style == NS_STYLE_BORDER_STYLE_OUTSET) || - (style == NS_STYLE_BORDER_STYLE_RIDGE)) { + if ((style == StyleBorderStyle::Outset) || + (style == StyleBorderStyle::Ridge)) { // Flip colors for these two border styles switch (whichSide) { case eSideBottom: @@ -894,7 +894,7 @@ ConstructBorderRenderer(nsPresContext* aPresContext, Float(border.left) / oneDevPixel }; Rect dirtyRect = NSRectToRect(aDirtyRect, oneDevPixel); - uint8_t borderStyles[4]; + StyleBorderStyle borderStyles[4]; nscolor borderColors[4]; // pull out styles, colors @@ -905,10 +905,10 @@ ConstructBorderRenderer(nsPresContext* aPresContext, } PrintAsFormatString(" borderStyles: %d %d %d %d\n", - borderStyles[0], - borderStyles[1], - borderStyles[2], - borderStyles[3]); + static_cast(borderStyles[0]), + static_cast(borderStyles[1]), + static_cast(borderStyles[2]), + static_cast(borderStyles[3])); nsIDocument* document = nullptr; nsIContent* content = aForFrame->GetContent(); @@ -1153,8 +1153,8 @@ nsCSSRendering::CreateBorderRendererForOutline(nsPresContext* aPresContext, RectCornerRadii outlineRadii; ComputePixelRadii(twipsRadii, oneDevPixel, &outlineRadii); - uint8_t outlineStyle = ourOutline->mOutlineStyle; - if (outlineStyle == NS_STYLE_BORDER_STYLE_AUTO) { + StyleBorderStyle outlineStyle = ourOutline->mOutlineStyle; + if (outlineStyle == StyleBorderStyle::Auto) { if (nsLayoutUtils::IsOutlineStyleAutoEnabled()) { nsITheme* theme = aPresContext->GetTheme(); if (theme && theme->ThemeSupportsWidget( @@ -1172,10 +1172,10 @@ nsCSSRendering::CreateBorderRendererForOutline(nsPresContext* aPresContext, } // http://dev.w3.org/csswg/css-ui/#outline // "User agents may treat 'auto' as 'solid'." - outlineStyle = NS_STYLE_BORDER_STYLE_SOLID; + outlineStyle = StyleBorderStyle::Solid; } - uint8_t outlineStyles[4] = { + StyleBorderStyle outlineStyles[4] = { outlineStyle, outlineStyle, outlineStyle, outlineStyle }; @@ -1263,10 +1263,10 @@ nsCSSRendering::PaintFocus(nsPresContext* aPresContext, Float(oneCSSPixel) / oneDevPixel, Float(oneCSSPixel) / oneDevPixel }; - uint8_t focusStyles[4] = { NS_STYLE_BORDER_STYLE_DOTTED, - NS_STYLE_BORDER_STYLE_DOTTED, - NS_STYLE_BORDER_STYLE_DOTTED, - NS_STYLE_BORDER_STYLE_DOTTED }; + StyleBorderStyle focusStyles[4] = { StyleBorderStyle::Dotted, + StyleBorderStyle::Dotted, + StyleBorderStyle::Dotted, + StyleBorderStyle::Dotted }; nscolor focusColors[4] = { aColor, aColor, aColor, aColor }; // Because this renders a dotted border, the background color @@ -2230,11 +2230,11 @@ IsOpaqueBorderEdge(const nsStyleBorder& aBorder, mozilla::Side aSide) if (aBorder.GetComputedBorder().Side(aSide) == 0) return true; switch (aBorder.GetBorderStyle(aSide)) { - case NS_STYLE_BORDER_STYLE_SOLID: - case NS_STYLE_BORDER_STYLE_GROOVE: - case NS_STYLE_BORDER_STYLE_RIDGE: - case NS_STYLE_BORDER_STYLE_INSET: - case NS_STYLE_BORDER_STYLE_OUTSET: + case StyleBorderStyle::Solid: + case StyleBorderStyle::Groove: + case StyleBorderStyle::Ridge: + case StyleBorderStyle::Inset: + case StyleBorderStyle::Outset: break; default: return false; @@ -3751,7 +3751,7 @@ GetDashInfo(nscoord aBorderLength, void nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, - uint8_t aBorderStyle, + StyleBorderStyle aBorderStyle, nscolor aBorderColor, const nsRect& aBorder, int32_t aAppUnitsPerDevPixel, @@ -3765,28 +3765,28 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, nscoord oneDevPixel = NSIntPixelsToAppUnits(1, aAppUnitsPerDevPixel); if ((oneDevPixel >= aBorder.width) || (oneDevPixel >= aBorder.height) || - (NS_STYLE_BORDER_STYLE_DASHED == aBorderStyle) || - (NS_STYLE_BORDER_STYLE_DOTTED == aBorderStyle)) { + (StyleBorderStyle::Dashed == aBorderStyle) || + (StyleBorderStyle::Dotted == aBorderStyle)) { // no beveling for 1 pixel border, dash or dot aStartBevelOffset = 0; aEndBevelOffset = 0; } switch (aBorderStyle) { - case NS_STYLE_BORDER_STYLE_NONE: - case NS_STYLE_BORDER_STYLE_HIDDEN: + case StyleBorderStyle::None: + case StyleBorderStyle::Hidden: // NS_ASSERTION(false, "style of none or hidden"); break; - case NS_STYLE_BORDER_STYLE_DOTTED: - case NS_STYLE_BORDER_STYLE_DASHED: { - nscoord dashLength = (NS_STYLE_BORDER_STYLE_DASHED == aBorderStyle) + case StyleBorderStyle::Dotted: + case StyleBorderStyle::Dashed: { + nscoord dashLength = (StyleBorderStyle::Dashed == aBorderStyle) ? DASH_LENGTH : DOT_LENGTH; // make the dash length proportional to the border thickness dashLength *= (horizontal) ? aBorder.height : aBorder.width; // make the min dash length for the ends 1/2 the dash length nscoord minDashLength = - (NS_STYLE_BORDER_STYLE_DASHED == aBorderStyle) + (StyleBorderStyle::Dashed == aBorderStyle) ? RoundFloatToPixel(((float)dashLength) / 2.0f, aAppUnitsPerDevPixel) : dashLength; minDashLength = std::max(minDashLength, oneDevPixel); @@ -3874,28 +3874,28 @@ nsCSSRendering::DrawTableBorderSegment(DrawTarget& aDrawTarget, void nsCSSRendering::GetTableBorderSolidSegments( nsTArray& aSegments, - uint8_t aBorderStyle, - nscolor aBorderColor, - const nsRect& aBorder, - int32_t aAppUnitsPerDevPixel, - mozilla::Side aStartBevelSide, - nscoord aStartBevelOffset, - mozilla::Side aEndBevelSide, - nscoord aEndBevelOffset) + StyleBorderStyle aBorderStyle, + nscolor aBorderColor, + const nsRect& aBorder, + int32_t aAppUnitsPerDevPixel, + mozilla::Side aStartBevelSide, + nscoord aStartBevelOffset, + mozilla::Side aEndBevelSide, + nscoord aEndBevelOffset) { const bool horizontal = eSideTop == aStartBevelSide || eSideBottom == aStartBevelSide; const nscoord oneDevPixel = NSIntPixelsToAppUnits(1, aAppUnitsPerDevPixel); switch (aBorderStyle) { - case NS_STYLE_BORDER_STYLE_NONE: - case NS_STYLE_BORDER_STYLE_HIDDEN: + case StyleBorderStyle::None: + case StyleBorderStyle::Hidden: return; - case NS_STYLE_BORDER_STYLE_DOTTED: - case NS_STYLE_BORDER_STYLE_DASHED: + case StyleBorderStyle::Dotted: + case StyleBorderStyle::Dashed: MOZ_ASSERT_UNREACHABLE("Caller should have checked"); return; - case NS_STYLE_BORDER_STYLE_GROOVE: - case NS_STYLE_BORDER_STYLE_RIDGE: + case StyleBorderStyle::Groove: + case StyleBorderStyle::Ridge: if ((horizontal && (oneDevPixel >= aBorder.height)) || (!horizontal && (oneDevPixel >= aBorder.width))) { aSegments.AppendElement(SolidBeveledBorderSegment { @@ -3995,7 +3995,7 @@ nsCSSRendering::GetTableBorderSolidSegments( } } break; - case NS_STYLE_BORDER_STYLE_DOUBLE: + case StyleBorderStyle::Double: // We can only do "double" borders if the thickness of the border // is more than 2px. Otherwise, we fall through to painting a // solid border. @@ -4086,7 +4086,7 @@ nsCSSRendering::GetTableBorderSolidSegments( } // else fall through to solid MOZ_FALLTHROUGH; - case NS_STYLE_BORDER_STYLE_SOLID: + case StyleBorderStyle::Solid: aSegments.AppendElement(SolidBeveledBorderSegment { aBorder, aBorderColor, @@ -4094,11 +4094,11 @@ nsCSSRendering::GetTableBorderSolidSegments( { aEndBevelSide, aEndBevelOffset } }); break; - case NS_STYLE_BORDER_STYLE_OUTSET: - case NS_STYLE_BORDER_STYLE_INSET: + case StyleBorderStyle::Outset: + case StyleBorderStyle::Inset: MOZ_ASSERT_UNREACHABLE("inset, outset should have been converted to groove, ridge"); break; - case NS_STYLE_BORDER_STYLE_AUTO: + case StyleBorderStyle::Auto: MOZ_ASSERT_UNREACHABLE("Unexpected 'auto' table border"); break; } diff --git a/layout/painting/nsCSSRendering.h b/layout/painting/nsCSSRendering.h index 9c7e8b9e43f9..32ccd482045a 100644 --- a/layout/painting/nsCSSRendering.h +++ b/layout/painting/nsCSSRendering.h @@ -595,7 +595,7 @@ struct nsCSSRendering // corners. static void DrawTableBorderSegment( DrawTarget& aDrawTarget, - uint8_t aBorderStyle, + mozilla::StyleBorderStyle aBorderStyle, nscolor aBorderColor, const nsRect& aBorderRect, int32_t aAppUnitsPerDevPixel, @@ -624,7 +624,7 @@ struct nsCSSRendering // dashed / dotted borders, since we don't support beveling those. static void GetTableBorderSolidSegments( nsTArray& aSegments, - uint8_t aBorderStyle, + mozilla::StyleBorderStyle aBorderStyle, nscolor aBorderColor, const nsRect& aBorderRect, int32_t aAppUnitsPerDevPixel, diff --git a/layout/painting/nsCSSRenderingBorders.cpp b/layout/painting/nsCSSRenderingBorders.cpp index 504153e62715..2facb3fff5af 100644 --- a/layout/painting/nsCSSRenderingBorders.cpp +++ b/layout/painting/nsCSSRenderingBorders.cpp @@ -174,7 +174,7 @@ nsCSSBorderRenderer::nsCSSBorderRenderer(nsPresContext* aPresContext, DrawTarget* aDrawTarget, const Rect& aDirtyRect, Rect& aOuterRect, - const uint8_t* aBorderStyles, + const StyleBorderStyle* aBorderStyles, const Float* aBorderWidths, RectCornerRadii& aBorderRadii, const nscolor* aBorderColors, @@ -194,10 +194,10 @@ nsCSSBorderRenderer::nsCSSBorderRenderer(nsPresContext* aPresContext, PodCopy(mBorderColors, aBorderColors, 4); mInnerRect = mOuterRect; mInnerRect.Deflate(Margin( - mBorderStyles[0] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[0] : 0, - mBorderStyles[1] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[1] : 0, - mBorderStyles[2] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[2] : 0, - mBorderStyles[3] != NS_STYLE_BORDER_STYLE_NONE ? mBorderWidths[3] : 0)); + mBorderStyles[0] != StyleBorderStyle::None ? mBorderWidths[0] : 0, + mBorderStyles[1] != StyleBorderStyle::None ? mBorderWidths[1] : 0, + mBorderStyles[2] != StyleBorderStyle::None ? mBorderWidths[2] : 0, + mBorderStyles[3] != StyleBorderStyle::None ? mBorderWidths[3] : 0)); ComputeBorderCornerDimensions( mBorderWidths, mBorderRadii, &mBorderCornerDimensions); @@ -338,34 +338,34 @@ nsCSSBorderRenderer::AreBorderSideFinalStylesSame(uint8_t aSides) /* Then if it's one of the two-tone styles and we're not * just comparing the TL or BR sides */ switch (mBorderStyles[firstStyle]) { - case NS_STYLE_BORDER_STYLE_GROOVE: - case NS_STYLE_BORDER_STYLE_RIDGE: - case NS_STYLE_BORDER_STYLE_INSET: - case NS_STYLE_BORDER_STYLE_OUTSET: + case StyleBorderStyle::Groove: + case StyleBorderStyle::Ridge: + case StyleBorderStyle::Inset: + case StyleBorderStyle::Outset: return ((aSides & ~(eSideBitsTop | eSideBitsLeft)) == 0 || (aSides & ~(eSideBitsBottom | eSideBitsRight)) == 0); + default: + return true; } - - return true; } bool -nsCSSBorderRenderer::IsSolidCornerStyle(uint8_t aStyle, Corner aCorner) +nsCSSBorderRenderer::IsSolidCornerStyle(StyleBorderStyle aStyle, Corner aCorner) { switch (aStyle) { - case NS_STYLE_BORDER_STYLE_SOLID: + case StyleBorderStyle::Solid: return true; - case NS_STYLE_BORDER_STYLE_INSET: - case NS_STYLE_BORDER_STYLE_OUTSET: + case StyleBorderStyle::Inset: + case StyleBorderStyle::Outset: return (aCorner == eCornerTopLeft || aCorner == eCornerBottomRight); - case NS_STYLE_BORDER_STYLE_GROOVE: - case NS_STYLE_BORDER_STYLE_RIDGE: + case StyleBorderStyle::Groove: + case StyleBorderStyle::Ridge: return mOneUnitBorder && (aCorner == eCornerTopLeft || aCorner == eCornerBottomRight); - case NS_STYLE_BORDER_STYLE_DOUBLE: + case StyleBorderStyle::Double: return mOneUnitBorder; default: @@ -406,9 +406,9 @@ nsCSSBorderRenderer::IsCornerMergeable(Corner aCorner) // | | mozilla::Side sideH(GetHorizontalSide(aCorner)); mozilla::Side sideV(GetVerticalSide(aCorner)); - uint8_t styleH = mBorderStyles[sideH]; - uint8_t styleV = mBorderStyles[sideV]; - if (styleH != styleV || styleH != NS_STYLE_BORDER_STYLE_DOTTED) { + StyleBorderStyle styleH = mBorderStyles[sideH]; + StyleBorderStyle styleV = mBorderStyles[sideV]; + if (styleH != styleV || styleH != StyleBorderStyle::Dotted) { return false; } @@ -424,31 +424,33 @@ nsCSSBorderRenderer::IsCornerMergeable(Corner aCorner) } BorderColorStyle -nsCSSBorderRenderer::BorderColorStyleForSolidCorner(uint8_t aStyle, +nsCSSBorderRenderer::BorderColorStyleForSolidCorner(StyleBorderStyle aStyle, Corner aCorner) { // note that this function assumes that the corner is already solid, // as per the earlier function switch (aStyle) { - case NS_STYLE_BORDER_STYLE_SOLID: - case NS_STYLE_BORDER_STYLE_DOUBLE: + case StyleBorderStyle::Solid: + case StyleBorderStyle::Double: return BorderColorStyleSolid; - case NS_STYLE_BORDER_STYLE_INSET: - case NS_STYLE_BORDER_STYLE_GROOVE: + case StyleBorderStyle::Inset: + case StyleBorderStyle::Groove: if (aCorner == eCornerTopLeft) return BorderColorStyleDark; else if (aCorner == eCornerBottomRight) return BorderColorStyleLight; break; - case NS_STYLE_BORDER_STYLE_OUTSET: - case NS_STYLE_BORDER_STYLE_RIDGE: + case StyleBorderStyle::Outset: + case StyleBorderStyle::Ridge: if (aCorner == eCornerTopLeft) return BorderColorStyleLight; else if (aCorner == eCornerBottomRight) return BorderColorStyleDark; break; + default: + return BorderColorStyleNone; } return BorderColorStyleNone; @@ -616,7 +618,7 @@ nsCSSBorderRenderer::GetSideClipSubPath(mozilla::Side aSide) Point start[2]; Point end[2]; -#define IS_DOTTED(_s) ((_s) == NS_STYLE_BORDER_STYLE_DOTTED) +#define IS_DOTTED(_s) ((_s) == StyleBorderStyle::Dotted) bool isDotted = IS_DOTTED(mBorderStyles[aSide]); bool startIsDotted = IS_DOTTED(mBorderStyles[PREV_SIDE(aSide)]); bool endIsDotted = IS_DOTTED(mBorderStyles[NEXT_SIDE(aSide)]); @@ -736,7 +738,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, *aIsUnfilled = false; Point P = mOuterRect.AtCorner(aCorner); - uint8_t style = mBorderStyles[aSide]; + StyleBorderStyle style = mBorderStyles[aSide]; Float borderWidth = mBorderWidths[aSide]; Size dim = mBorderCornerDimensions[aCorner]; bool isHorizontal = IsHorizontalSide(aSide); @@ -750,14 +752,14 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, // | | mozilla::Side otherSide = ((uint8_t)aSide == (uint8_t)aCorner) ? PREV_SIDE(aSide) : NEXT_SIDE(aSide); - uint8_t otherStyle = mBorderStyles[otherSide]; + StyleBorderStyle otherStyle = mBorderStyles[otherSide]; Float otherBorderWidth = mBorderWidths[otherSide]; Size radius = mBorderRadii[aCorner]; if (IsZeroSize(radius)) { radius.width = 0.0f; radius.height = 0.0f; } - if (style == NS_STYLE_BORDER_STYLE_DOTTED) { + if (style == StyleBorderStyle::Dotted) { // Offset the dot's location along the side toward the corner by a // multiple of its width. if (isHorizontal) { @@ -766,8 +768,8 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, P.y -= signs[1] * aDotOffset * borderWidth; } } - if (style == NS_STYLE_BORDER_STYLE_DOTTED && - otherStyle == NS_STYLE_BORDER_STYLE_DOTTED) { + if (style == StyleBorderStyle::Dotted && + otherStyle == StyleBorderStyle::Dotted) { if (borderWidth == otherBorderWidth) { if (radius.width < borderWidth / 2.0f && radius.height < borderWidth / 2.0f) { @@ -963,7 +965,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, return P; } - if (style == NS_STYLE_BORDER_STYLE_DOTTED) { + if (style == StyleBorderStyle::Dotted) { // If only this side is dotted, other side draws the corner. // // otherBorderWidth + borderWidth / 2.0 @@ -1024,7 +1026,7 @@ nsCSSBorderRenderer::GetStraightBorderPoint(mozilla::Side aSide, return P; } - if (otherStyle == NS_STYLE_BORDER_STYLE_DOTTED && IsZeroSize(radius)) { + if (otherStyle == StyleBorderStyle::Dotted && IsZeroSize(radius)) { // If other side is dotted and radius=0, draw side to the end of corner. // // +------------------------------- @@ -1290,7 +1292,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) return; } - uint8_t borderRenderStyle = NS_STYLE_BORDER_STYLE_NONE; + StyleBorderStyle borderRenderStyle = StyleBorderStyle::None; nscolor borderRenderColor; uint32_t borderColorStyleCount = 0; @@ -1306,12 +1308,12 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) break; } - if (borderRenderStyle == NS_STYLE_BORDER_STYLE_NONE || - borderRenderStyle == NS_STYLE_BORDER_STYLE_HIDDEN) + if (borderRenderStyle == StyleBorderStyle::None || + borderRenderStyle == StyleBorderStyle::Hidden) return; - if (borderRenderStyle == NS_STYLE_BORDER_STYLE_DASHED || - borderRenderStyle == NS_STYLE_BORDER_STYLE_DOTTED) { + if (borderRenderStyle == StyleBorderStyle::Dashed || + borderRenderStyle == StyleBorderStyle::Dotted) { // Draw each corner separately, with the given side's color. if (aSides & eSideBitsTop) { DrawDashedOrDottedCorner(eSideTop, C_TL); @@ -1344,13 +1346,13 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) // If the border width is 1, we need to change the borderRenderStyle // a bit to make sure that we get the right colors -- e.g. 'ridge' // with a 1px border needs to look like solid, not like 'outset'. - if (mOneUnitBorder && (borderRenderStyle == NS_STYLE_BORDER_STYLE_RIDGE || - borderRenderStyle == NS_STYLE_BORDER_STYLE_GROOVE || - borderRenderStyle == NS_STYLE_BORDER_STYLE_DOUBLE)) - borderRenderStyle = NS_STYLE_BORDER_STYLE_SOLID; + if (mOneUnitBorder && (borderRenderStyle == StyleBorderStyle::Ridge || + borderRenderStyle == StyleBorderStyle::Groove || + borderRenderStyle == StyleBorderStyle::Double)) + borderRenderStyle = StyleBorderStyle::Solid; switch (borderRenderStyle) { - case NS_STYLE_BORDER_STYLE_SOLID: + case StyleBorderStyle::Solid: borderColorStyleTopLeft[0] = BorderColorStyleSolid; borderColorStyleBottomRight[0] = BorderColorStyleSolid; @@ -1358,7 +1360,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) borderColorStyleCount = 1; break; - case NS_STYLE_BORDER_STYLE_GROOVE: + case StyleBorderStyle::Groove: borderColorStyleTopLeft[0] = BorderColorStyleDark; borderColorStyleTopLeft[1] = BorderColorStyleLight; @@ -1368,7 +1370,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) borderColorStyleCount = 2; break; - case NS_STYLE_BORDER_STYLE_RIDGE: + case StyleBorderStyle::Ridge: borderColorStyleTopLeft[0] = BorderColorStyleLight; borderColorStyleTopLeft[1] = BorderColorStyleDark; @@ -1378,7 +1380,7 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) borderColorStyleCount = 2; break; - case NS_STYLE_BORDER_STYLE_DOUBLE: + case StyleBorderStyle::Double: borderColorStyleTopLeft[0] = BorderColorStyleSolid; borderColorStyleTopLeft[1] = BorderColorStyleNone; borderColorStyleTopLeft[2] = BorderColorStyleSolid; @@ -1390,14 +1392,14 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) borderColorStyleCount = 3; break; - case NS_STYLE_BORDER_STYLE_INSET: + case StyleBorderStyle::Inset: borderColorStyleTopLeft[0] = BorderColorStyleDark; borderColorStyleBottomRight[0] = BorderColorStyleLight; borderColorStyleCount = 1; break; - case NS_STYLE_BORDER_STYLE_OUTSET: + case StyleBorderStyle::Outset: borderColorStyleTopLeft[0] = BorderColorStyleLight; borderColorStyleBottomRight[0] = BorderColorStyleDark; @@ -1492,38 +1494,38 @@ nsCSSBorderRenderer::DrawBorderSides(int aSides) // If there is at least one dotted side, every side is rendered separately. if (IsSingleSide(aSides)) { if (aSides == eSideBitsTop) { - if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideRight] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_TR])) { noMarginRight = true; } - if (mBorderStyles[eSideLeft] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideLeft] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_TL])) { noMarginLeft = true; } } else if (aSides == eSideBitsRight) { - if (mBorderStyles[eSideTop] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideTop] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_TR])) { noMarginTop = true; } - if (mBorderStyles[eSideBottom] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideBottom] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_BR])) { noMarginBottom = true; } } else if (aSides == eSideBitsBottom) { - if (mBorderStyles[eSideRight] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideRight] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_BR])) { noMarginRight = true; } - if (mBorderStyles[eSideLeft] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideLeft] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_BL])) { noMarginLeft = true; } } else { - if (mBorderStyles[eSideTop] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideTop] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_TL])) { noMarginTop = true; } - if (mBorderStyles[eSideBottom] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[eSideBottom] == StyleBorderStyle::Dotted && IsZeroSize(mBorderRadii[C_BL])) { noMarginBottom = true; } @@ -1580,11 +1582,11 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, Float aBorderLength, bool isCorner) { - MOZ_ASSERT(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED || - mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + MOZ_ASSERT(mBorderStyles[aSide] == StyleBorderStyle::Dashed || + mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dashed or dotted."); - uint8_t style = mBorderStyles[aSide]; + StyleBorderStyle style = mBorderStyles[aSide]; Float borderWidth = mBorderWidths[aSide]; // Dashed line starts and ends with half segment in most case. @@ -1614,7 +1616,7 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, // | | | | bool fullStart = false, fullEnd = false; Float halfDash; - if (style == NS_STYLE_BORDER_STYLE_DASHED) { + if (style == StyleBorderStyle::Dashed) { // If either end of the side is not connecting onto a corner then we want a // full dash at that end. // @@ -1626,7 +1628,7 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, if (mBorderRadii[GetCCWCorner(aSide)].IsEmpty() && (mBorderCornerDimensions[GetCCWCorner(aSide)].IsEmpty() || - mBorderStyles[PREV_SIDE(aSide)] == NS_STYLE_BORDER_STYLE_DOTTED || + mBorderStyles[PREV_SIDE(aSide)] == StyleBorderStyle::Dotted || // XXX why this <=1 check? borderWidth <= 1.0f)) { fullStart = true; @@ -1634,7 +1636,7 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, if (mBorderRadii[GetCWCorner(aSide)].IsEmpty() && (mBorderCornerDimensions[GetCWCorner(aSide)].IsEmpty() || - mBorderStyles[NEXT_SIDE(aSide)] == NS_STYLE_BORDER_STYLE_DOTTED)) { + mBorderStyles[NEXT_SIDE(aSide)] == StyleBorderStyle::Dotted)) { fullEnd = true; } @@ -1643,7 +1645,7 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, halfDash = borderWidth * DOT_LENGTH / 2.0f; } - if (style == NS_STYLE_BORDER_STYLE_DASHED && aBorderLength > 0.0f) { + if (style == StyleBorderStyle::Dashed && aBorderLength > 0.0f) { // The number of half segments, with maximum dash length. int32_t count = floor(aBorderLength / halfDash); Float minHalfDash = borderWidth * DOT_LENGTH / 2.0f; @@ -1735,12 +1737,12 @@ nsCSSBorderRenderer::SetupDashedOptions(StrokeOptions* aStrokeOptions, aDash[0] = fullDash; aDash[1] = fullDash; - if (style == NS_STYLE_BORDER_STYLE_DASHED && fullDash > 1.0f) { + if (style == StyleBorderStyle::Dashed && fullDash > 1.0f) { if (!fullStart) { // Draw half segments on both ends. aStrokeOptions->mDashOffset = halfDash; } - } else if (style != NS_STYLE_BORDER_STYLE_DOTTED && isCorner) { + } else if (style != StyleBorderStyle::Dotted && isCorner) { // If side ends with filled full segment, corner should start with unfilled // full segment. Not needed for dotted corners, as they overlap one dot with // the side's end. @@ -1809,8 +1811,8 @@ nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::Side aSide) // the line ends with unfilled dot. // (see comment for GetStraightBorderPoint for more detail) - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED || - mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dashed || + mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dashed or dotted."); Float borderWidth = mBorderWidths[aSide]; @@ -1818,7 +1820,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::Side aSide) return; } - if (mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED && + if (mBorderStyles[aSide] == StyleBorderStyle::Dotted && borderWidth > 2.0f) { DrawDottedSideSlow(aSide); return; @@ -1881,7 +1883,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedSide(mozilla::Side aSide) } DrawOptions drawOptions; - if (mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED) { + if (mBorderStyles[aSide] == StyleBorderStyle::Dotted) { drawOptions.mAntialiasMode = AntialiasMode::NONE; } @@ -1898,7 +1900,7 @@ nsCSSBorderRenderer::DrawDottedSideSlow(mozilla::Side aSide) // Draw each circles separately for dotted with borderWidth > 2.0. // Dashed line with CapStyle::ROUND doesn't render perfect circles. - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dotted."); Float borderWidth = mBorderWidths[aSide]; @@ -2302,8 +2304,8 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, // DrawDashedOrDottedSide. So this may draw no circles if there's no space // between 2 dots at both ends. - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED || - mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dashed || + mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dashed or dotted."); if (IsCornerMergeable(aCorner)) { @@ -2319,13 +2321,13 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, return; } - Float styleH = mBorderStyles[sideH]; - Float styleV = mBorderStyles[sideV]; + StyleBorderStyle styleH = mBorderStyles[sideH]; + StyleBorderStyle styleV = mBorderStyles[sideV]; // Corner between dotted and others with radius=0 is drawn by side. if (IsZeroSize(mBorderRadii[aCorner]) && - (styleV == NS_STYLE_BORDER_STYLE_DOTTED || - styleH == NS_STYLE_BORDER_STYLE_DOTTED)) { + (styleV == StyleBorderStyle::Dotted || + styleH == StyleBorderStyle::Dotted)) { return; } @@ -2337,8 +2339,8 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, } if (borderWidthH != borderWidthV || borderWidthH > 2.0f) { - uint8_t style = mBorderStyles[aSide]; - if (style == NS_STYLE_BORDER_STYLE_DOTTED) { + StyleBorderStyle style = mBorderStyles[aSide]; + if (style == StyleBorderStyle::Dotted) { DrawDottedCornerSlow(aSide, aCorner); } else { DrawDashedCornerSlow(aSide, aCorner); @@ -2384,7 +2386,7 @@ nsCSSBorderRenderer::DrawDashedOrDottedCorner(mozilla::Side aSide, void nsCSSBorderRenderer::DrawDottedCornerSlow(mozilla::Side aSide, Corner aCorner) { - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dotted."); mozilla::Side sideH(GetHorizontalSide(aCorner)); @@ -2468,7 +2470,7 @@ DashedPathOverlapsRect(Rect& pathRect, void nsCSSBorderRenderer::DrawDashedCornerSlow(mozilla::Side aSide, Corner aCorner) { - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dashed, "Style should be dashed."); mozilla::Side sideH(GetHorizontalSide(aCorner)); @@ -2589,8 +2591,8 @@ nsCSSBorderRenderer::DrawFallbackSolidCorner(mozilla::Side aSide, // Render too large dashed or dotted corner with solid style, to avoid hangup // inside DashedCornerFinder and DottedCornerFinder. - NS_ASSERTION(mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DASHED || - mBorderStyles[aSide] == NS_STYLE_BORDER_STYLE_DOTTED, + NS_ASSERTION(mBorderStyles[aSide] == StyleBorderStyle::Dashed || + mBorderStyles[aSide] == StyleBorderStyle::Dotted, "Style should be dashed or dotted."); nscolor borderColor = mBorderColors[aSide]; @@ -2619,7 +2621,7 @@ nsCSSBorderRenderer::DrawFallbackSolidCorner(mozilla::Side aSide, mDocument, nsContentUtils::eCSS_PROPERTIES, mBorderStyles[aSide] == - NS_STYLE_BORDER_STYLE_DASHED + StyleBorderStyle::Dashed ? "TooLargeDashedRadius" : "TooLargeDottedRadius"); } @@ -2643,9 +2645,9 @@ nsCSSBorderRenderer::AllBordersSolid() { NS_FOR_CSS_SIDES(i) { - if (mBorderStyles[i] == NS_STYLE_BORDER_STYLE_SOLID || - mBorderStyles[i] == NS_STYLE_BORDER_STYLE_NONE || - mBorderStyles[i] == NS_STYLE_BORDER_STYLE_HIDDEN) { + if (mBorderStyles[i] == StyleBorderStyle::Solid || + mBorderStyles[i] == StyleBorderStyle::None || + mBorderStyles[i] == StyleBorderStyle::Hidden) { continue; } return false; @@ -2655,10 +2657,10 @@ nsCSSBorderRenderer::AllBordersSolid() } static bool -IsVisible(int aStyle) +IsVisible(StyleBorderStyle aStyle) { - if (aStyle != NS_STYLE_BORDER_STYLE_NONE && - aStyle != NS_STYLE_BORDER_STYLE_HIDDEN) { + if (aStyle != StyleBorderStyle::None && + aStyle != StyleBorderStyle::Hidden) { return true; } return false; @@ -3157,8 +3159,8 @@ void nsCSSBorderRenderer::DrawBorders() { if (mAllBordersSameStyle && - (mBorderStyles[0] == NS_STYLE_BORDER_STYLE_NONE || - mBorderStyles[0] == NS_STYLE_BORDER_STYLE_HIDDEN || + (mBorderStyles[0] == StyleBorderStyle::None || + mBorderStyles[0] == StyleBorderStyle::Hidden || mBorderColors[0] == NS_RGBA(0, 0, 0, 0))) { // All borders are the same style, and the style is either none or hidden, // or the color is transparent. @@ -3206,7 +3208,7 @@ nsCSSBorderRenderer::DrawBorders() // drawing paths, when none of these can be used we move on to the generalized // border drawing code. if (mAllBordersSameStyle && mAllBordersSameWidth && - mBorderStyles[0] == NS_STYLE_BORDER_STYLE_SOLID && mNoBorderRadius && + mBorderStyles[0] == StyleBorderStyle::Solid && mNoBorderRadius && !mAvoidStroke) { // Very simple case. Rect rect = mOuterRect; @@ -3215,7 +3217,7 @@ nsCSSBorderRenderer::DrawBorders() return; } - if (mAllBordersSameStyle && mBorderStyles[0] == NS_STYLE_BORDER_STYLE_SOLID && + if (mAllBordersSameStyle && mBorderStyles[0] == StyleBorderStyle::Solid && !mAvoidStroke && !mNoBorderRadius) { // Relatively simple case. RoundedRect borderInnerRect(mOuterRect, mBorderRadii); @@ -3288,9 +3290,9 @@ nsCSSBorderRenderer::DrawBorders() NS_FOR_CSS_SIDES(i) { - uint8_t style = mBorderStyles[i]; - if (style == NS_STYLE_BORDER_STYLE_DASHED || - style == NS_STYLE_BORDER_STYLE_DOTTED) { + StyleBorderStyle style = mBorderStyles[i]; + if (style == StyleBorderStyle::Dashed || + style == StyleBorderStyle::Dotted) { // we need to draw things separately for dashed/dotting forceSeparateCorners = true; dashedSides |= (1 << i); @@ -3430,13 +3432,13 @@ nsCSSBorderRenderer::DrawBorders() for (int cornerSide = 0; cornerSide < 2; cornerSide++) { mozilla::Side side = mozilla::Side(sides[cornerSide]); - uint8_t style = mBorderStyles[side]; + StyleBorderStyle style = mBorderStyles[side]; PrintAsFormatString("corner: %d cornerSide: %d side: %d style: %d\n", corner, cornerSide, side, - style); + static_cast(style)); RefPtr path = GetSideClipSubPath(side); mDrawTarget->PushClip(path); @@ -3488,8 +3490,8 @@ nsCSSBorderRenderer::DrawBorders() // If there's no border on this side, skip it if (mBorderWidths[side] == 0.0 || - mBorderStyles[side] == NS_STYLE_BORDER_STYLE_HIDDEN || - mBorderStyles[side] == NS_STYLE_BORDER_STYLE_NONE) + mBorderStyles[side] == StyleBorderStyle::Hidden || + mBorderStyles[side] == StyleBorderStyle::None) continue; if (dashedSides & (1 << side)) { diff --git a/layout/painting/nsCSSRenderingBorders.h b/layout/painting/nsCSSRenderingBorders.h index deefed22b622..ef24314e0908 100644 --- a/layout/painting/nsCSSRenderingBorders.h +++ b/layout/painting/nsCSSRenderingBorders.h @@ -92,7 +92,7 @@ public: DrawTarget* aDrawTarget, const Rect& aDirtyRect, Rect& aOuterRect, - const uint8_t* aBorderStyles, + const mozilla::StyleBorderStyle* aBorderStyles, const Float* aBorderWidths, RectCornerRadii& aBorderRadii, const nscolor* aBorderColors, @@ -139,7 +139,7 @@ private: Rect mInnerRect; // the style and size of the border - uint8_t mBorderStyles[4]; + mozilla::StyleBorderStyle mBorderStyles[4]; Float mBorderWidths[4]; RectCornerRadii mBorderRadii; @@ -160,13 +160,13 @@ private: bool AreBorderSideFinalStylesSame(uint8_t aSides); // For the given style, is the given corner a solid color? - bool IsSolidCornerStyle(uint8_t aStyle, mozilla::Corner aCorner); + bool IsSolidCornerStyle(mozilla::StyleBorderStyle aStyle, mozilla::Corner aCorner); // For the given corner, is the given corner mergeable into one dot? bool IsCornerMergeable(mozilla::Corner aCorner); // For the given solid corner, what color style should be used? - BorderColorStyle BorderColorStyleForSolidCorner(uint8_t aStyle, + BorderColorStyle BorderColorStyleForSolidCorner(mozilla::StyleBorderStyle aStyle, mozilla::Corner aCorner); // diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp index 3497228809ac..3ac7e83a23ef 100644 --- a/layout/painting/nsDisplayList.cpp +++ b/layout/painting/nsDisplayList.cpp @@ -5307,8 +5307,8 @@ nsDisplayOutline::CreateWebRenderCommands( { ContainerLayerParameters parameter; - uint8_t outlineStyle = mFrame->Style()->StyleOutline()->mOutlineStyle; - if (outlineStyle == NS_STYLE_BORDER_STYLE_AUTO && + StyleBorderStyle outlineStyle = mFrame->Style()->StyleOutline()->mOutlineStyle; + if (outlineStyle == StyleBorderStyle::Auto && nsLayoutUtils::IsOutlineStyleAutoEnabled()) { nsITheme* theme = mFrame->PresContext()->GetTheme(); if (theme && theme->ThemeSupportsWidget(mFrame->PresContext(), diff --git a/layout/style/ServoBindings.toml b/layout/style/ServoBindings.toml index 809668a43048..4fb56f546cec 100644 --- a/layout/style/ServoBindings.toml +++ b/layout/style/ServoBindings.toml @@ -133,6 +133,7 @@ rusty-enums = [ "mozilla::StyleImageLayerRepeat", "mozilla::StyleImageLayerAttachment", "mozilla::StyleBoxDecorationBreak", + "mozilla::StyleBorderStyle", "mozilla::StyleRuleInclusion", "mozilla::StyleGridTrackBreadth", "mozilla::StyleOverscrollBehavior", diff --git a/layout/style/nsCSSProps.cpp b/layout/style/nsCSSProps.cpp index b29eb035d349..c401de8c5e6c 100644 --- a/layout/style/nsCSSProps.cpp +++ b/layout/style/nsCSSProps.cpp @@ -189,16 +189,16 @@ nsCSSProps::GetStringValue(nsCSSCounterDesc aCounterDesc) /***************************************************************************/ const KTableEntry nsCSSProps::kBorderStyleKTable[] = { - { eCSSKeyword_none, NS_STYLE_BORDER_STYLE_NONE }, - { eCSSKeyword_hidden, NS_STYLE_BORDER_STYLE_HIDDEN }, - { eCSSKeyword_dotted, NS_STYLE_BORDER_STYLE_DOTTED }, - { eCSSKeyword_dashed, NS_STYLE_BORDER_STYLE_DASHED }, - { eCSSKeyword_solid, NS_STYLE_BORDER_STYLE_SOLID }, - { eCSSKeyword_double, NS_STYLE_BORDER_STYLE_DOUBLE }, - { eCSSKeyword_groove, NS_STYLE_BORDER_STYLE_GROOVE }, - { eCSSKeyword_ridge, NS_STYLE_BORDER_STYLE_RIDGE }, - { eCSSKeyword_inset, NS_STYLE_BORDER_STYLE_INSET }, - { eCSSKeyword_outset, NS_STYLE_BORDER_STYLE_OUTSET }, + { eCSSKeyword_none, StyleBorderStyle::None }, + { eCSSKeyword_hidden, StyleBorderStyle::Hidden }, + { eCSSKeyword_dotted, StyleBorderStyle::Dotted }, + { eCSSKeyword_dashed, StyleBorderStyle::Dashed }, + { eCSSKeyword_solid, StyleBorderStyle::Solid }, + { eCSSKeyword_double, StyleBorderStyle::Double }, + { eCSSKeyword_groove, StyleBorderStyle::Groove }, + { eCSSKeyword_ridge, StyleBorderStyle::Ridge }, + { eCSSKeyword_inset, StyleBorderStyle::Inset }, + { eCSSKeyword_outset, StyleBorderStyle::Outset }, { eCSSKeyword_UNKNOWN, -1 } }; @@ -498,16 +498,16 @@ const KTableEntry nsCSSProps::kContainKTable[] = { // Same as kBorderStyleKTable except 'hidden'. const KTableEntry nsCSSProps::kOutlineStyleKTable[] = { - { eCSSKeyword_none, NS_STYLE_BORDER_STYLE_NONE }, - { eCSSKeyword_auto, NS_STYLE_BORDER_STYLE_AUTO }, - { eCSSKeyword_dotted, NS_STYLE_BORDER_STYLE_DOTTED }, - { eCSSKeyword_dashed, NS_STYLE_BORDER_STYLE_DASHED }, - { eCSSKeyword_solid, NS_STYLE_BORDER_STYLE_SOLID }, - { eCSSKeyword_double, NS_STYLE_BORDER_STYLE_DOUBLE }, - { eCSSKeyword_groove, NS_STYLE_BORDER_STYLE_GROOVE }, - { eCSSKeyword_ridge, NS_STYLE_BORDER_STYLE_RIDGE }, - { eCSSKeyword_inset, NS_STYLE_BORDER_STYLE_INSET }, - { eCSSKeyword_outset, NS_STYLE_BORDER_STYLE_OUTSET }, + { eCSSKeyword_none, StyleBorderStyle::None }, + { eCSSKeyword_auto, StyleBorderStyle::Auto }, + { eCSSKeyword_dotted, StyleBorderStyle::Dotted }, + { eCSSKeyword_dashed, StyleBorderStyle::Dashed }, + { eCSSKeyword_solid, StyleBorderStyle::Solid }, + { eCSSKeyword_double, StyleBorderStyle::Double }, + { eCSSKeyword_groove, StyleBorderStyle::Groove }, + { eCSSKeyword_ridge, StyleBorderStyle::Ridge }, + { eCSSKeyword_inset, StyleBorderStyle::Inset }, + { eCSSKeyword_outset, StyleBorderStyle::Outset }, { eCSSKeyword_UNKNOWN, -1 } }; diff --git a/layout/style/nsComputedDOMStyle.cpp b/layout/style/nsComputedDOMStyle.cpp index ff0d6d4349eb..4d494f5a0f1d 100644 --- a/layout/style/nsComputedDOMStyle.cpp +++ b/layout/style/nsComputedDOMStyle.cpp @@ -2205,7 +2205,7 @@ nsComputedDOMStyle::DoGetOutlineWidth() const nsStyleOutline* outline = StyleOutline(); nscoord width; - if (outline->mOutlineStyle == NS_STYLE_BORDER_STYLE_NONE) { + if (outline->mOutlineStyle == StyleBorderStyle::None) { NS_ASSERTION(outline->GetOutlineWidth() == 0, "unexpected width"); width = 0; } else { diff --git a/layout/style/nsStyleConsts.h b/layout/style/nsStyleConsts.h index fe862238af62..0e07c8bcff95 100644 --- a/layout/style/nsStyleConsts.h +++ b/layout/style/nsStyleConsts.h @@ -306,18 +306,19 @@ enum class StyleImageLayerRepeat : uint8_t { #define NS_STYLE_BORDER_WIDTH_THICK 2 // XXX chopping block #define NS_STYLE_BORDER_WIDTH_LENGTH_VALUE 3 -// See nsStyleBorder mBorderStyle -#define NS_STYLE_BORDER_STYLE_NONE 0 -#define NS_STYLE_BORDER_STYLE_GROOVE 1 -#define NS_STYLE_BORDER_STYLE_RIDGE 2 -#define NS_STYLE_BORDER_STYLE_DOTTED 3 -#define NS_STYLE_BORDER_STYLE_DASHED 4 -#define NS_STYLE_BORDER_STYLE_SOLID 5 -#define NS_STYLE_BORDER_STYLE_DOUBLE 6 -#define NS_STYLE_BORDER_STYLE_INSET 7 -#define NS_STYLE_BORDER_STYLE_OUTSET 8 -#define NS_STYLE_BORDER_STYLE_HIDDEN 9 -#define NS_STYLE_BORDER_STYLE_AUTO 10 // for outline-style only +enum class StyleBorderStyle : uint8_t { + None, + Groove, + Ridge, + Dotted, + Dashed, + Solid, + Double, + Inset, + Outset, + Hidden, + Auto, // for outline-style only +}; // border-image-repeat enum class StyleBorderImageRepeat : uint8_t { diff --git a/layout/style/nsStyleStruct.cpp b/layout/style/nsStyleStruct.cpp index e86027c9d872..37d243abbdc6 100644 --- a/layout/style/nsStyleStruct.cpp +++ b/layout/style/nsStyleStruct.cpp @@ -291,7 +291,7 @@ nsStyleBorder::nsStyleBorder(const nsPresContext* aContext) mBorderImageOutset.Set(side, nsStyleCoord(0.0f, eStyleUnit_Factor)); mBorder.Side(side) = medium; - mBorderStyle[side] = NS_STYLE_BORDER_STYLE_NONE; + mBorderStyle[side] = StyleBorderStyle::None; } mTwipsPerPixel = aContext->DevPixelsToAppUnits(1); @@ -449,7 +449,7 @@ nsStyleOutline::nsStyleOutline(const nsPresContext* aContext) ->GetBorderWidthTable())[NS_STYLE_BORDER_WIDTH_MEDIUM]) , mOutlineOffset(0) , mOutlineColor(StyleComplexColor::CurrentColor()) - , mOutlineStyle(NS_STYLE_BORDER_STYLE_NONE) + , mOutlineStyle(StyleBorderStyle::None) , mActualOutlineWidth(0) , mTwipsPerPixel(aContext->DevPixelsToAppUnits(1)) { @@ -476,7 +476,7 @@ nsStyleOutline::nsStyleOutline(const nsStyleOutline& aSrc) void nsStyleOutline::RecalcData() { - if (NS_STYLE_BORDER_STYLE_NONE == mOutlineStyle) { + if (StyleBorderStyle::None == mOutlineStyle) { mActualOutlineWidth = 0; } else { mActualOutlineWidth = @@ -667,7 +667,7 @@ nsStyleXUL::CalcDifference(const nsStyleXUL& aNewData) const nsStyleColumn::nsStyleColumn(const nsPresContext* aContext) : mColumnWidth(eStyleUnit_Auto) , mColumnRuleColor(StyleComplexColor::CurrentColor()) - , mColumnRuleStyle(NS_STYLE_BORDER_STYLE_NONE) + , mColumnRuleStyle(StyleBorderStyle::None) , mColumnRuleWidth((StaticPresData::Get() ->GetBorderWidthTable())[NS_STYLE_BORDER_WIDTH_MEDIUM]) , mTwipsPerPixel(aContext->AppUnitsPerDevPixel()) diff --git a/layout/style/nsStyleStruct.h b/layout/style/nsStyleStruct.h index 662e65667402..f3925bad9494 100644 --- a/layout/style/nsStyleStruct.h +++ b/layout/style/nsStyleStruct.h @@ -965,10 +965,10 @@ private: ((l) == 0) ? 0 : std::max((tpp), (l) / (tpp) * (tpp)) // Returns if the given border style type is visible or not -static bool IsVisibleBorderStyle(uint8_t aStyle) +static bool IsVisibleBorderStyle(mozilla::StyleBorderStyle aStyle) { - return (aStyle != NS_STYLE_BORDER_STYLE_NONE && - aStyle != NS_STYLE_BORDER_STYLE_HIDDEN); + return (aStyle != mozilla::StyleBorderStyle::None && + aStyle != mozilla::StyleBorderStyle::Hidden); } struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder @@ -1028,13 +1028,13 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleBorder return GetComputedBorder().Side(aSide); } - uint8_t GetBorderStyle(mozilla::Side aSide) const + mozilla::StyleBorderStyle GetBorderStyle(mozilla::Side aSide) const { NS_ASSERTION(aSide <= mozilla::eSideLeft, "bad side"); return mBorderStyle[aSide]; } - void SetBorderStyle(mozilla::Side aSide, uint8_t aStyle) + void SetBorderStyle(mozilla::Side aSide, mozilla::StyleBorderStyle aStyle) { NS_ASSERTION(aSide <= mozilla::eSideLeft, "bad side"); mBorderStyle[aSide] = aStyle; @@ -1071,7 +1071,7 @@ public: mozilla::StyleBoxDecorationBreak mBoxDecorationBreak; protected: - uint8_t mBorderStyle[4]; // NS_STYLE_BORDER_STYLE_* + mozilla::StyleBorderStyle mBorderStyle[4]; // StyleBorderStyle::* public: // the colors to use for a simple border. @@ -1172,7 +1172,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleOutline nscoord mOutlineWidth; nscoord mOutlineOffset; mozilla::StyleComplexColor mOutlineColor; - uint8_t mOutlineStyle; // NS_STYLE_BORDER_STYLE_* + mozilla::StyleBorderStyle mOutlineStyle; // StyleBorderStyle::* nscoord GetOutlineWidth() const { @@ -1181,9 +1181,9 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleOutline bool ShouldPaintOutline() const { - return mOutlineStyle == NS_STYLE_BORDER_STYLE_AUTO || + return mOutlineStyle == mozilla::StyleBorderStyle::Auto || (GetOutlineWidth() > 0 && - mOutlineStyle != NS_STYLE_BORDER_STYLE_NONE); + mOutlineStyle != mozilla::StyleBorderStyle::None); } protected: @@ -2781,7 +2781,7 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsStyleColumn nsStyleCoord mColumnWidth; // coord, auto mozilla::StyleComplexColor mColumnRuleColor; - uint8_t mColumnRuleStyle; // NS_STYLE_BORDER_STYLE_* + mozilla::StyleBorderStyle mColumnRuleStyle; // StyleborderStyle::* mozilla::StyleColumnFill mColumnFill = mozilla::StyleColumnFill::Balance; mozilla::StyleColumnSpan mColumnSpan = mozilla::StyleColumnSpan::None; diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index eda849a298f8..adf3206bd862 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -4425,8 +4425,8 @@ struct BCCellBorder void Reset(uint32_t aRowIndex, uint32_t aRowSpan); nscolor color; // border segment color BCPixelSize width; // border segment width in pixel coordinates !! - uint8_t style; // border segment style, possible values are defined - // in nsStyleConsts.h as NS_STYLE_BORDER_STYLE_* + StyleBorderStyle style; // border segment style, possible values are defined + // in nsStyleConsts.h as StyleBorderStyle::* BCBorderOwner owner; // border segment owner, possible values are defined // in celldata.h. In the cellmap for each border // segment we store the owner and later when @@ -4442,7 +4442,7 @@ void BCCellBorder::Reset(uint32_t aRowIndex, uint32_t aRowSpan) { - style = NS_STYLE_BORDER_STYLE_NONE; + style = StyleBorderStyle::None; color = 0; width = 0; owner = eTableOwner; @@ -5002,18 +5002,18 @@ BCMapCellIterator::PeekBEnd(BCMapCellInfo& aRefInfo, aAjaInfo.SetInfo(nextRow, aColIndex, cellData, this, cellMap); } -// Assign priorities to border styles. For example, styleToPriority(NS_STYLE_BORDER_STYLE_SOLID) -// will return the priority of NS_STYLE_BORDER_STYLE_SOLID. -static uint8_t styleToPriority[13] = { 0, // NS_STYLE_BORDER_STYLE_NONE - 2, // NS_STYLE_BORDER_STYLE_GROOVE - 4, // NS_STYLE_BORDER_STYLE_RIDGE - 5, // NS_STYLE_BORDER_STYLE_DOTTED - 6, // NS_STYLE_BORDER_STYLE_DASHED - 7, // NS_STYLE_BORDER_STYLE_SOLID - 8, // NS_STYLE_BORDER_STYLE_DOUBLE - 1, // NS_STYLE_BORDER_STYLE_INSET - 3, // NS_STYLE_BORDER_STYLE_OUTSET - 9 };// NS_STYLE_BORDER_STYLE_HIDDEN +// Assign priorities to border styles. For example, styleToPriority(StyleBorderStyle::Solid) +// will return the priority of StyleBorderStyle::Solid. +static uint8_t styleToPriority[13] = { 0, // StyleBorderStyle::None + 2, // StyleBorderStyle::Groove + 4, // StyleBorderStyle::Ridge + 5, // StyleBorderStyle::Dotted + 6, // StyleBorderStyle::Dashed + 7, // StyleBorderStyle::Solid + 8, // StyleBorderStyle::Double + 1, // StyleBorderStyle::Inset + 3, // StyleBorderStyle::Outset + 9 };// StyleBorderStyle::Hidden // priority rules follow CSS 2.1 spec // 'hidden', 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', 'groove', // and the lowest: 'inset'. none is even weaker @@ -5032,7 +5032,7 @@ static void GetColorAndStyle(const nsIFrame* aFrame, WritingMode aTableWM, LogicalSide aSide, - uint8_t* aStyle, + StyleBorderStyle* aStyle, nscolor* aColor, BCPixelSize* aWidth = nullptr) { @@ -5049,8 +5049,8 @@ GetColorAndStyle(const nsIFrame* aFrame, mozilla::Side physicalSide = aTableWM.PhysicalSide(aSide); *aStyle = styleData->GetBorderStyle(physicalSide); - if ((NS_STYLE_BORDER_STYLE_NONE == *aStyle) || - (NS_STYLE_BORDER_STYLE_HIDDEN == *aStyle)) { + if ((StyleBorderStyle::None == *aStyle) || + (StyleBorderStyle::Hidden == *aStyle)) { return; } *aColor = aFrame->Style()-> @@ -5073,14 +5073,14 @@ static void GetPaintStyleInfo(const nsIFrame* aFrame, WritingMode aTableWM, LogicalSide aSide, - uint8_t* aStyle, + StyleBorderStyle* aStyle, nscolor* aColor) { GetColorAndStyle(aFrame, aTableWM, aSide, aStyle, aColor); - if (NS_STYLE_BORDER_STYLE_INSET == *aStyle) { - *aStyle = NS_STYLE_BORDER_STYLE_RIDGE; - } else if (NS_STYLE_BORDER_STYLE_OUTSET == *aStyle) { - *aStyle = NS_STYLE_BORDER_STYLE_GROOVE; + if (StyleBorderStyle::Inset == *aStyle) { + *aStyle = StyleBorderStyle::Ridge; + } else if (StyleBorderStyle::Outset == *aStyle) { + *aStyle = StyleBorderStyle::Groove; } } @@ -5151,20 +5151,22 @@ CompareBorders(bool aIsCorner, // Pass true for corner calculatio { bool firstDominates = true; - if (NS_STYLE_BORDER_STYLE_HIDDEN == aBorder1.style) { + if (StyleBorderStyle::Hidden == aBorder1.style) { firstDominates = (aIsCorner) ? false : true; } - else if (NS_STYLE_BORDER_STYLE_HIDDEN == aBorder2.style) { + else if (StyleBorderStyle::Hidden == aBorder2.style) { firstDominates = (aIsCorner) ? true : false; } else if (aBorder1.width < aBorder2.width) { firstDominates = false; } else if (aBorder1.width == aBorder2.width) { - if (styleToPriority[aBorder1.style] < styleToPriority[aBorder2.style]) { + if (styleToPriority[static_cast(aBorder1.style)] < + styleToPriority[static_cast(aBorder2.style)]) { firstDominates = false; } - else if (styleToPriority[aBorder1.style] == styleToPriority[aBorder2.style]) { + else if (styleToPriority[static_cast(aBorder1.style)] == + styleToPriority[static_cast(aBorder2.style)]) { if (aBorder1.owner == aBorder2.owner) { firstDominates = !aSecondIsInlineDir; } @@ -5220,7 +5222,7 @@ CompareBorders(const nsIFrame* aTableFrame, GetColorAndStyle(aTableFrame, aTableWM, aSide, &border.style, &border.color, &border.width); border.owner = eTableOwner; - if (NS_STYLE_BORDER_STYLE_HIDDEN == border.style) { + if (StyleBorderStyle::Hidden == border.style) { return border; } } @@ -5231,7 +5233,7 @@ CompareBorders(const nsIFrame* aTableFrame, tempBorder.owner = aAja && !inlineAxis ? eAjaColGroupOwner : eColGroupOwner; // pass here and below false for aSecondIsInlineDir as it is only used for corner calculations. border = CompareBorders(!CELL_CORNER, border, tempBorder, false); - if (NS_STYLE_BORDER_STYLE_HIDDEN == border.style) { + if (StyleBorderStyle::Hidden == border.style) { return border; } } @@ -5241,7 +5243,7 @@ CompareBorders(const nsIFrame* aTableFrame, &tempBorder.style, &tempBorder.color, &tempBorder.width); tempBorder.owner = aAja && !inlineAxis ? eAjaColOwner : eColOwner; border = CompareBorders(!CELL_CORNER, border, tempBorder, false); - if (NS_STYLE_BORDER_STYLE_HIDDEN == border.style) { + if (StyleBorderStyle::Hidden == border.style) { return border; } } @@ -5251,7 +5253,7 @@ CompareBorders(const nsIFrame* aTableFrame, &tempBorder.style, &tempBorder.color, &tempBorder.width); tempBorder.owner = aAja && inlineAxis ? eAjaRowGroupOwner : eRowGroupOwner; border = CompareBorders(!CELL_CORNER, border, tempBorder, false); - if (NS_STYLE_BORDER_STYLE_HIDDEN == border.style) { + if (StyleBorderStyle::Hidden == border.style) { return border; } } @@ -5261,7 +5263,7 @@ CompareBorders(const nsIFrame* aTableFrame, &tempBorder.style, &tempBorder.color, &tempBorder.width); tempBorder.owner = aAja && inlineAxis ? eAjaRowOwner : eRowOwner; border = CompareBorders(!CELL_CORNER, border, tempBorder, false); - if (NS_STYLE_BORDER_STYLE_HIDDEN == border.style) { + if (StyleBorderStyle::Hidden == border.style) { return border; } } @@ -5283,7 +5285,7 @@ Perpendicular(mozilla::LogicalSide aSide1, } // Initial value indicating that BCCornerInfo's ownerStyle hasn't been set yet. -#define BORDER_STYLE_UNSET 0xF +#define BORDER_STYLE_UNSET static_cast(255) // XXX allocate this as number-of-cols+1 instead of number-of-cols+1 * number-of-rows+1 struct BCCornerInfo @@ -5291,7 +5293,7 @@ struct BCCornerInfo BCCornerInfo() { ownerColor = 0; ownerWidth = subWidth = ownerElem = subSide = subElem = hasDashDot = numSegs = bevel = 0; ownerSide = eLogicalSideBStart; ownerStyle = BORDER_STYLE_UNSET; - subStyle = NS_STYLE_BORDER_STYLE_SOLID; } + subStyle = StyleBorderStyle::Solid; } void Set(mozilla::LogicalSide aSide, BCCellBorder border); @@ -5299,20 +5301,20 @@ struct BCCornerInfo void Update(mozilla::LogicalSide aSide, BCCellBorder border); - nscolor ownerColor; // color of borderOwner - uint16_t ownerWidth; // pixel width of borderOwner - uint16_t subWidth; // pixel width of the largest border intersecting the border perpendicular - // to ownerSide - uint32_t ownerSide:2; // LogicalSide (e.g eLogicalSideBStart, etc) of the border - // owning the corner relative to the corner - uint32_t ownerElem:4; // elem type (e.g. eTable, eGroup, etc) owning the corner - uint32_t ownerStyle:4; // border style of ownerElem - uint32_t subSide:2; // side of border with subWidth relative to the corner - uint32_t subElem:4; // elem type (e.g. eTable, eGroup, etc) of sub owner - uint32_t subStyle:4; // border style of subElem - uint32_t hasDashDot:1; // does a dashed, dotted segment enter the corner, they cannot be beveled - uint32_t numSegs:3; // number of segments entering corner - uint32_t bevel:1; // is the corner beveled (uses the above two fields together with subWidth) + nscolor ownerColor; // color of borderOwner + uint16_t ownerWidth; // pixel width of borderOwner + uint16_t subWidth; // pixel width of the largest border intersecting the border perpendicular + // to ownerSide + StyleBorderStyle subStyle; // border style of subElem + StyleBorderStyle ownerStyle;// border style of ownerElem + uint16_t ownerSide:2; // LogicalSide (e.g eLogicalSideBStart, etc) of the border + // owning the corner relative to the corner + uint16_t ownerElem:4; // elem type (e.g. eTable, eGroup, etc) owning the corner + uint16_t subSide:2; // side of border with subWidth relative to the corner + uint16_t subElem:4; // elem type (e.g. eTable, eGroup, etc) of sub owner + uint16_t hasDashDot:1; // does a dashed, dotted segment enter the corner, they cannot be beveled + uint16_t numSegs:3; // number of segments entering corner + uint16_t bevel:1; // is the corner beveled (uses the above two fields together with subWidth) // 7 bits are unused }; @@ -5332,15 +5334,15 @@ BCCornerInfo::Set(mozilla::LogicalSide aSide, numSegs = 0; if (aBorder.width > 0) { numSegs++; - hasDashDot = (NS_STYLE_BORDER_STYLE_DASHED == aBorder.style) || - (NS_STYLE_BORDER_STYLE_DOTTED == aBorder.style); + hasDashDot = (StyleBorderStyle::Dashed == aBorder.style) || + (StyleBorderStyle::Dotted == aBorder.style); } bevel = 0; subWidth = 0; // the following will get set later subSide = IsInline(aSide) ? eLogicalSideBStart : eLogicalSideIStart; subElem = eTableOwner; - subStyle = NS_STYLE_BORDER_STYLE_SOLID; + subStyle = StyleBorderStyle::Solid; } void @@ -5398,8 +5400,8 @@ BCCornerInfo::Update(mozilla::LogicalSide aSide, } if (aBorder.width > 0) { numSegs++; - if (!hasDashDot && ((NS_STYLE_BORDER_STYLE_DASHED == aBorder.style) || - (NS_STYLE_BORDER_STYLE_DOTTED == aBorder.style))) { + if (!hasDashDot && ((StyleBorderStyle::Dashed == aBorder.style) || + (StyleBorderStyle::Dotted == aBorder.style))) { hasDashDot = 1; } } @@ -6503,7 +6505,7 @@ class BCPaintBorderIterator; struct BCBorderParameters { - uint8_t mBorderStyle; + StyleBorderStyle mBorderStyle; nscolor mBorderColor; nsRect mBorderRect; int32_t mAppUnitsPerDevPixel; @@ -6519,8 +6521,8 @@ struct BCBorderParameters return false; } - if (mBorderStyle == NS_STYLE_BORDER_STYLE_DASHED || - mBorderStyle == NS_STYLE_BORDER_STYLE_DOTTED) { + if (mBorderStyle == StyleBorderStyle::Dashed || + mBorderStyle == StyleBorderStyle::Dotted) { return false; } @@ -7384,7 +7386,7 @@ BCBlockDirSeg::BuildBorderParameters(BCPaintBorderIterator& aIter, nsTableColFrame* col = mCol; if (!col) ABORT1(Nothing()); nsTableCellFrame* cell = mFirstCell; // ??? nsIFrame* owner = nullptr; - result.mBorderStyle = NS_STYLE_BORDER_STYLE_SOLID; + result.mBorderStyle = StyleBorderStyle::Solid; result.mBorderColor = 0xFFFFFFFF; result.mBackfaceIsVisible = true; @@ -7534,7 +7536,7 @@ AdjustAndPushBevel(wr::DisplayListBuilder& aBuilder, wr::LayoutRect bevelRect = aRect; wr::BorderSide bevelBorder[4]; NS_FOR_CSS_SIDES(i) { - bevelBorder[i] = wr::ToBorderSide(ToDeviceColor(aColor), NS_STYLE_BORDER_STYLE_SOLID); + bevelBorder[i] = wr::ToBorderSide(ToDeviceColor(aColor), StyleBorderStyle::Solid); } // We're creating a half-transparent triangle using the border primitive. @@ -7669,7 +7671,7 @@ CreateWRCommandsForBorderSegment(const BCBorderParameters& aBorderParams, wr::LayoutRect roundedRect = wr::ToRoundedLayoutRect(borderRect); wr::BorderSide wrSide[4]; NS_FOR_CSS_SIDES(i) { - wrSide[i] = wr::ToBorderSide(ToDeviceColor(aBorderParams.mBorderColor), NS_STYLE_BORDER_STYLE_NONE); + wrSide[i] = wr::ToBorderSide(ToDeviceColor(aBorderParams.mBorderColor), StyleBorderStyle::None); } const bool horizontal = aBorderParams.mStartBevelSide == eSideTop || aBorderParams.mStartBevelSide == eSideBottom; @@ -7833,7 +7835,7 @@ BCInlineDirSeg::BuildBorderParameters(BCPaintBorderIterator& aIter) nsPresContext* presContext = aIter.mTable->PresContext(); result.mAppUnitsPerDevPixel = presContext->AppUnitsPerDevPixel(); - result.mBorderStyle = NS_STYLE_BORDER_STYLE_SOLID; + result.mBorderStyle = StyleBorderStyle::Solid; result.mBorderColor = 0xFFFFFFFF; switch (mOwner) { diff --git a/layout/xul/tree/nsTreeBodyFrame.cpp b/layout/xul/tree/nsTreeBodyFrame.cpp index 3f50ebf653c7..ce60586de6dd 100644 --- a/layout/xul/tree/nsTreeBodyFrame.cpp +++ b/layout/xul/tree/nsTreeBodyFrame.cpp @@ -3227,7 +3227,7 @@ nsTreeBodyFrame::PaintCell(int32_t aRowIndex, nscolor color = borderStyle->mBorderLeftColor.CalcColor(lineContext); ColorPattern colorPatt(ToDeviceColor(color)); - uint8_t style = borderStyle->GetBorderStyle(eSideLeft); + StyleBorderStyle style = borderStyle->GetBorderStyle(eSideLeft); StrokeOptions strokeOptions; nsLayoutUtils::InitDashPattern(strokeOptions, style); diff --git a/servo/components/style/properties/gecko.mako.rs b/servo/components/style/properties/gecko.mako.rs index f0b8cef22acb..956e324675d4 100644 --- a/servo/components/style/properties/gecko.mako.rs +++ b/servo/components/style/properties/gecko.mako.rs @@ -1516,7 +1516,9 @@ fn static_assert() { <% border_style_keyword = Keyword("border-style", - "none solid double dotted dashed hidden groove ridge inset outset") %> + "none solid double dotted dashed hidden groove ridge inset outset", + gecko_enum_prefix="StyleBorderStyle", + gecko_inexhaustive=True) %> <% skip_border_longhands = " ".join(["border-{0}-{1}".format(x.ident, y) for x in SIDES diff --git a/servo/components/style/properties/longhands/border.mako.rs b/servo/components/style/properties/longhands/border.mako.rs index 81e5fa647b16..6ce48afe6b07 100644 --- a/servo/components/style/properties/longhands/border.mako.rs +++ b/servo/components/style/properties/longhands/border.mako.rs @@ -63,7 +63,9 @@ ${helpers.gecko_keyword_conversion( Keyword('border-style', - "none solid double dotted dashed hidden groove ridge inset outset"), + "none solid double dotted dashed hidden groove ridge inset outset", + gecko_enum_prefix="StyleBorderStyle", + gecko_inexhaustive=True), type="crate::values::specified::BorderStyle", )} diff --git a/servo/components/style/properties/longhands/column.mako.rs b/servo/components/style/properties/longhands/column.mako.rs index d4bae90c96b7..84820f403ce6 100644 --- a/servo/components/style/properties/longhands/column.mako.rs +++ b/servo/components/style/properties/longhands/column.mako.rs @@ -83,7 +83,8 @@ ${helpers.single_keyword( "none hidden dotted dashed solid double groove ridge inset outset", products="gecko", extra_prefixes="moz", - gecko_constant_prefix="NS_STYLE_BORDER_STYLE", + gecko_enum_prefix="StyleBorderStyle", + gecko_inexhaustive=True, animation_value_type="discrete", spec="https://drafts.csswg.org/css-multicol/#propdef-column-rule-style", )} diff --git a/widget/cocoa/nsNativeThemeCocoa.mm b/widget/cocoa/nsNativeThemeCocoa.mm index 06dcab0b15fa..b4b8cbd3b962 100644 --- a/widget/cocoa/nsNativeThemeCocoa.mm +++ b/widget/cocoa/nsNativeThemeCocoa.mm @@ -3925,10 +3925,10 @@ nsNativeThemeCocoa::CreateWebRenderCommandsForWidget(mozilla::wr::DisplayListBui wr::ToColorF(Color(1.0, 1.0, 1.0, 1.0))); wr::BorderSide side[4] = { - wr::ToBorderSide(kMultilineTextFieldTopBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), + wr::ToBorderSide(kMultilineTextFieldTopBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kMultilineTextFieldSidesAndBottomBorderColor, StyleBorderStyle::Solid), }; wr::BorderRadius borderRadius = wr::EmptyBorderRadius(); @@ -3948,10 +3948,10 @@ nsNativeThemeCocoa::CreateWebRenderCommandsForWidget(mozilla::wr::DisplayListBui wr::ToColorF(Color(1.0, 1.0, 1.0, 1.0))); wr::BorderSide side[4] = { - wr::ToBorderSide(kListboxTopBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), - wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, NS_STYLE_BORDER_STYLE_SOLID), + wr::ToBorderSide(kListboxTopBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, StyleBorderStyle::Solid), + wr::ToBorderSide(kListBoxSidesAndBottomBorderColor, StyleBorderStyle::Solid), }; wr::BorderRadius borderRadius = wr::EmptyBorderRadius();