diff --git a/tools/winscope/src/app/components/timeline/timeline_component.ts b/tools/winscope/src/app/components/timeline/timeline_component.ts index 92ddfc07c..a763c35f5 100644 --- a/tools/winscope/src/app/components/timeline/timeline_component.ts +++ b/tools/winscope/src/app/components/timeline/timeline_component.ts @@ -30,6 +30,7 @@ import {FormControl, FormGroup, Validators} from '@angular/forms'; import {DomSanitizer, SafeUrl} from '@angular/platform-browser'; import {TimelineData} from 'app/timeline_data'; import {TRACE_INFO} from 'app/trace_info'; +import {StringUtils} from 'common/string_utils'; import {TimeUtils} from 'common/time_utils'; import {TimestampChangeListener} from 'interfaces/timestamp_change_listener'; import {ElapsedTimestamp, RealTimestamp, Timestamp, TimestampType} from 'trace/timestamp'; @@ -526,7 +527,10 @@ export class TimelineComponent implements TimestampChangeListener { } const target = event.target as HTMLInputElement; - const timestamp = new Timestamp(this.timelineData.getTimestampType()!, BigInt(target.value)); + const timestamp = new Timestamp( + this.timelineData.getTimestampType()!, + StringUtils.parseBigIntStrippingUnit(target.value) + ); this.timelineData.setCurrentTimestamp(timestamp); this.updateTimeInputValuesToCurrentTimestamp(); } diff --git a/tools/winscope/src/common/string_utils.ts b/tools/winscope/src/common/string_utils.ts new file mode 100644 index 000000000..98192ca9c --- /dev/null +++ b/tools/winscope/src/common/string_utils.ts @@ -0,0 +1,27 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class StringUtils { + static parseBigIntStrippingUnit(s: string): bigint { + const match = s.match(/^\s*(-?\d+)\D*.*$/); + if (!match) { + throw new Error(`Cannot parse '${s}' as bigint`); + } + return BigInt(match[1]); + } +} + +export {StringUtils}; diff --git a/tools/winscope/src/common/string_utils_test.ts b/tools/winscope/src/common/string_utils_test.ts new file mode 100644 index 000000000..2536c44e1 --- /dev/null +++ b/tools/winscope/src/common/string_utils_test.ts @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {StringUtils} from './string_utils'; + +describe('StringUtils', () => { + it('parses bigint', () => { + expect(StringUtils.parseBigIntStrippingUnit('-10')).toEqual(-10n); + expect(StringUtils.parseBigIntStrippingUnit('-10 unit')).toEqual(-10n); + expect(StringUtils.parseBigIntStrippingUnit('-10unit')).toEqual(-10n); + expect(StringUtils.parseBigIntStrippingUnit(' -10 unit ')).toEqual(-10n); + + expect(StringUtils.parseBigIntStrippingUnit('0')).toEqual(0n); + expect(StringUtils.parseBigIntStrippingUnit('0 unit')).toEqual(0n); + expect(StringUtils.parseBigIntStrippingUnit('0unit')).toEqual(0n); + expect(StringUtils.parseBigIntStrippingUnit(' 0 unit ')).toEqual(0n); + + expect(StringUtils.parseBigIntStrippingUnit('10')).toEqual(10n); + expect(StringUtils.parseBigIntStrippingUnit('10 unit')).toEqual(10n); + expect(StringUtils.parseBigIntStrippingUnit('10unit')).toEqual(10n); + expect(StringUtils.parseBigIntStrippingUnit(' 10 unit ')).toEqual(10n); + + expect(() => StringUtils.parseBigIntStrippingUnit('invalid')).toThrow(); + expect(() => StringUtils.parseBigIntStrippingUnit('invalid 10 unit')).toThrow(); + }); +});