summaryrefslogtreecommitdiffstats
path: root/chrome/common/extensions/extension.h
Commit message (Collapse)AuthorAgeFilesLines
* Load the bookmark manager extension at Chrome startup.aa@chromium.org2010-03-041-8/+14
| | | | | | Review URL: http://codereview.chromium.org/660232 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40683 0039d316-1c4b-4281-b951-d872f2087c98
* Reset the default quota limit for extensions to 5MB, but add adumi@chromium.org2010-02-271-0/+1
| | | | | | | | | | | | | unlimited_quota permission that extensions can use to request unlimited quota. TEST=ExtensionsServiceTest.StorageQuota BUG=27688 Review URL: http://codereview.chromium.org/660113 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@40190 0039d316-1c4b-4281-b951-d872f2087c98
* Pull gallery special case down into Extension::CanAccessHost() to avoid ↵aa@chromium.org2010-02-201-3/+5
| | | | | | | | | | | | duplicating it in multiple places. Also rename that method to better reflect what it is used for. BUG=35382 Review URL: http://codereview.chromium.org/650086 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39550 0039d316-1c4b-4281-b951-d872f2087c98
* Initial work on making extensions work in incognito mode.mpcomplete@chromium.org2010-02-111-0/+1
| | | | | | | | | | | | This merely adds a way to enable content scripts and browser actions in incognito windows. They still don't work properly because none of the APIs work with incognito tabs. The way to enable an extension is to add an "incognito" bit in the user prefs file. My plan is to add UI for this later. BUG=32365 Review URL: http://codereview.chromium.org/567037 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38852 0039d316-1c4b-4281-b951-d872f2087c98
* [GTTF] Reduce header dependencies in chrome.phajdan.jr@chromium.org2010-02-091-1/+1
| | | | | | | | | BUG=none TEST=If it compiles it is perfect. Review URL: http://codereview.chromium.org/585008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38463 0039d316-1c4b-4281-b951-d872f2087c98
* Preserve order of extensions when they auto-update.finnur@chromium.org2010-02-081-0/+8
| | | | | | | | | | | Also added tests for the ExtensionToolbarModel. BUG=33401 TEST=ExtensionToolbarModelTest (new test). Review URL: http://codereview.chromium.org/587002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38407 0039d316-1c4b-4281-b951-d872f2087c98
* linux: build with -Wextraevan@chromium.org2010-02-051-2/+2
| | | | | | | | | | | | 95% of this is removing "const" from return types, but turning this on found one bug! (A "for" loop that expected its iterator to go negative but which was using an unsigned type.) BUG=34160 Review URL: http://codereview.chromium.org/570012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38266 0039d316-1c4b-4281-b951-d872f2087c98
* Wires TabContents to app extensions.sky@chromium.org2010-02-051-2/+3
| | | | | | | | | BUG=32845 TEST=none Review URL: http://codereview.chromium.org/566032 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38212 0039d316-1c4b-4281-b951-d872f2087c98
* Implement launch disposition for extension-apps.rafaelw@chromium.org2010-02-051-2/+12
| | | | | | | | | | | | This change adds an --app-id command switch that signifies that the extension-app with the given id should be launched according to its configuration. It also adds parsing for app.window_type in the manifest and the behavior that when installed and a desktop shortcut is created, the --app-id switch is used rather than the --app switch. BUG=32361 Review URL: http://codereview.chromium.org/573016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@38184 0039d316-1c4b-4281-b951-d872f2087c98
* Replace the "origins" key in the manifest with "extent". The items in the ↵aa@chromium.org2010-01-291-6/+6
| | | | | | | | extent are URLPatterns, like other parts of the extension system. Review URL: http://codereview.chromium.org/552209 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37559 0039d316-1c4b-4281-b951-d872f2087c98
* Drop the code allowing privacy blacklists to be shipped in extensions.phajdan.jr@chromium.org2010-01-201-10/+0
| | | | | | | | | | | The plan is to implement it in a different way. TEST=Covered by unit_tests. BUG=21541 Review URL: http://codereview.chromium.org/552025 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36626 0039d316-1c4b-4281-b951-d872f2087c98
* Reland 36337: Add launch configuration to apps. Create a desktop shortcut if ↵aa@chromium.org2010-01-151-2/+6
| | | | | | | | | | | launch configuration is present. Future changes will add UI asking if the user wants to create a shortcut first, and change the presentation when the shortcut is launched. TBR=erikkay@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36340 0039d316-1c4b-4281-b951-d872f2087c98
* Revert 36337 and 36338. Compile failure.aa@chromium.org2010-01-151-6/+2
| | | | | | TBR=erikkay@chromium.org git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36339 0039d316-1c4b-4281-b951-d872f2087c98
* Add launch configuration to apps. Create a desktop shortcutaa@chromium.org2010-01-151-2/+6
| | | | | | | | | | | | if launch configuration is present. Future changes will add UI asking if the user wants to create a shortcut first, and change the presentation when the shortcut is launched. Review URL: http://codereview.chromium.org/543055 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36337 0039d316-1c4b-4281-b951-d872f2087c98
* initial manifest hooks for app experimenterikkay@chromium.org2010-01-121-0/+15
| | | | | | | | | BUG=none TEST=none Review URL: http://codereview.chromium.org/550016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36050 0039d316-1c4b-4281-b951-d872f2087c98
* Fix issue where we weren't requiring the command-line flag forerikkay@chromium.org2010-01-071-3/+1
| | | | | | | | | | | | experimental API use and weren't requiring that it be declared in the manifest. BUG=31537 TEST=none Review URL: http://codereview.chromium.org/526011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@35673 0039d316-1c4b-4281-b951-d872f2087c98
* Extensions: file handling clean up.estade@chromium.org2009-12-181-12/+9
| | | | | | | | | | | | | | | - remove various invalid uses of ASCII functions - properly escape resource requests - clean up file path handling Some work remains to be done on the last bullet point but this is enough to fix the bug. BUG=30509 TEST=see bug Review URL: http://codereview.chromium.org/501046 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34923 0039d316-1c4b-4281-b951-d872f2087c98
* Load message catalogs on demand when chrome.i18n.getMessage needs them.cira@chromium.org2009-12-171-12/+0
| | | | | | | | | | | | | 1. Added default locale to the url context 2. Removed old code that was uploading catalogs on load (to renderer) 3. Removed message bundle object from Extension class. BUG=27361 TEST=Open Chrome with --lang=sr and load src\chrome\common\extensions\docs\examples\api\i18n\getMessage extension from chrome://extensions page. Click on icon and text in popup should be localized. Review URL: http://codereview.chromium.org/463011 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34846 0039d316-1c4b-4281-b951-d872f2087c98
* Add the right-click context menu for Browser actions and Page Actions.finnur@chromium.org2009-12-171-0/+12
| | | | | | | | | | BUG=29538 TEST=Right-click an extension icon and make sure all the options work for both Page and Browser actions (Options should be grayed out when there is no Options page specified in the manifest). Review URL: http://codereview.chromium.org/486022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34812 0039d316-1c4b-4281-b951-d872f2087c98
* Localizing manifest for installed or unpacked extensions.cira@chromium.org2009-12-161-0/+23
| | | | | | | | | | | | | | | 1. Use _MSG_ format for manifest fields instead of hard-coded names. 2. Localize manifest during installation procedure -> save localized version to prefs. 3. Add current_locale field to manifest so we can detect when chrome locale changes and re-localize manifest. 4. Adds prefs method to MigratePrefs&Write to disk. 5. General refactor of extension_file_util wrt l10n code. 6. Don't localize themes (we can revert this by adding default_locale and current_locale keys to allowed keys for theme section). BUG=27360 Review URL: http://codereview.chromium.org/434015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34749 0039d316-1c4b-4281-b951-d872f2087c98
* Revert "Allow silent extension installations from the extensions gallery - ↵rafaelw@chromium.org2009-12-081-8/+0
| | | | | | | | | | | | | | | Part 1." Original CL: http://codereview.chromium.org/400018/show Looks like we're no longer hoping to get this approach into mstone4 release, so I'm unwinding this. BUG=27431 TBR=aa Review URL: http://codereview.chromium.org/467042 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34025 0039d316-1c4b-4281-b951-d872f2087c98
* Allow silent extension installations from the extensions gallery - Part 1.rafaelw@chromium.org2009-12-071-0/+8
| | | | | | | | | | | | | | | | In this episode we: -Create a new ChildProcess privilege (SILENT_INSTALL_EXTENSION) which is granted to the extension gallery pages. -Ensure that extension gallery pages are isolated into their own process which is never shared with other urls. Important: The SILENT_INSTALL_EXTENSION privilege is never granted any additional abilities in this patch, so this patch only has the effect of grouping gallery URLs into a separate process. In subsequent patch(es) we plan to (a) observe this new privilege and allow gallery urls to install extensions bypassing the normal prompts, (b) polish this UI flow [in particular, do not show the black "loading" dilaog, (c) check the id of the extension to be installed (from the crx) matches the expected id (from gallery url). BUG=27431 Review URL: http://codereview.chromium.org/400018 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33952 0039d316-1c4b-4281-b951-d872f2087c98
* [GTTF] Reduce header dependencies in chrome.phajdan.jr@chromium.org2009-11-301-0/+2
| | | | | | | | | TEST=none BUG=none Review URL: http://codereview.chromium.org/454004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33324 0039d316-1c4b-4281-b951-d872f2087c98
* Revert 33301 and 33305 due to unit_tests breakage.maruel@chromium.org2009-11-301-2/+0
| | | | | | | | TBR=pawel Review URL: http://codereview.chromium.org/453007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33309 0039d316-1c4b-4281-b951-d872f2087c98
* [GTTF] Reduce header dependencies in chrome.phajdan.jr@chromium.org2009-11-301-0/+2
| | | | | | | | | TEST=none BUG=none Review URL: http://codereview.chromium.org/454004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@33301 0039d316-1c4b-4281-b951-d872f2087c98
* Make notifications permission available in the extension manifest and hook ↵johnnyg@chromium.org2009-11-241-0/+1
| | | | | | | | | | | up to the desktop notification service. BUG=27249 TEST=none Review URL: http://codereview.chromium.org/432005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32979 0039d316-1c4b-4281-b951-d872f2087c98
* Special case the gallery to not show the scary download roadblock.aa@chromium.org2009-11-201-3/+0
| | | | | | | | | | That was only needed because of clickjacking. BUG=28227 Review URL: http://codereview.chromium.org/411004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32588 0039d316-1c4b-4281-b951-d872f2087c98
* Parse messages.json in ExtensionUnpacker (like we do for manifest) and pass ↵cira@chromium.org2009-11-181-0/+5
| | | | | | | | | | | | | them to sandboxed_extension_unpacker. Added unittest files for unpacker and sandboxed unpacker. TEST=Try loading any of the unpacker samples added in this CL. They should either pass, or show error and fail. BUG=27362 Review URL: http://codereview.chromium.org/390019 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32345 0039d316-1c4b-4281-b951-d872f2087c98
* Fixes almost all of the rest of lint errors in the chrome/ directory (minus ↵erg@google.com2009-11-131-1/+1
| | | | | | | | the really hard ones which will need actual review instead of rubber-stamping.) Review URL: http://codereview.chromium.org/386026 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31932 0039d316-1c4b-4281-b951-d872f2087c98
* Improve text on management UI. Still waiting for a treatmentaa@chromium.org2009-11-121-0/+3
| | | | | | | | | from the design team, but I wanted to at least get the words in before the string freeze. Review URL: http://codereview.chromium.org/385075 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@31842 0039d316-1c4b-4281-b951-d872f2087c98
* Add first class support for user scripts.aa@chromium.org2009-11-041-0/+16
| | | | | | | | | | | | Original review: http://codereview.chromium.org/340057 TBR=mpcomplete@chromium.org BUG=22103 TEST=Install a user script (such as from userscripts.org). You should get the extension install UI and the script should show up in the extension management UI. It should also work, though some scripts use Firefox-specific APIs and those won't work in Chromium. git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30925 0039d316-1c4b-4281-b951-d872f2087c98
* Implement the Extension History API, v 0.1.The first version is a weak ↵brg@chromium.com2009-10-301-0/+3
| | | | | | | | wrapper around the HistoryServices object in Chrome.BUG=22952TEST=browser_tests.exe --gtest_filer=ExtensionApiTest.History Review URL: http://codereview.chromium.org/313001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30561 0039d316-1c4b-4281-b951-d872f2087c98
* Only dispatch tab events when there is someone listening.aa@chromium.org2009-10-291-0/+9
| | | | | | | | | | This should cut down on the number of occurrences of a crash that happens in JSON serialization. BUG=25558,26169 Review URL: http://codereview.chromium.org/341029 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30444 0039d316-1c4b-4281-b951-d872f2087c98
* Replace ExtensionAction with ExtensionAction2.aa@chromium.org2009-10-271-15/+6
| | | | | | | | BUG=24472 Review URL: http://codereview.chromium.org/337035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30172 0039d316-1c4b-4281-b951-d872f2087c98
* Move page actions over to ExtensionAction2 and get rid ofaa@chromium.org2009-10-271-3/+3
| | | | | | | | | | | | | extension_action.*. Final bit of refactor will be to rename ExtensionAction2 to ExtensionAction will be the next CL. BUG=24472,25844 Review URL: http://codereview.chromium.org/332021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@30133 0039d316-1c4b-4281-b951-d872f2087c98
* Refactor BrowserActions, and add support foraa@chromium.org2009-10-241-8/+9
| | | | | | | | | | | | | | | | | tab-specific state. Future changelists will move Page Actions over to ExtensionAction2, then replace ExtensionAction and ExtensionActionState with ExtensionAction2. Also, fix a bug in setIcon({path:...}) where it would work only the first time. BUG=24669,24472 Review URL: http://codereview.chromium.org/306044 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29997 0039d316-1c4b-4281-b951-d872f2087c98
* The Management UI now fetches the icon for each extensionfinnur@chromium.org2009-10-211-1/+1
| | | | | | | | | | | | | | and shows it on the page. BUG=12119 TEST=Open chrome://extensions and all extensions that have an icon associated with them, should show the icon and those that don't have the generic plugin icon. Review URL: http://codereview.chromium.org/292048 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29714 0039d316-1c4b-4281-b951-d872f2087c98
* Delete unused themes from disk on shutdown.tony@chromium.org2009-10-191-1/+1
| | | | | | | | | | | | This reduces the size of the Preferences file and frees up some disk space. The smaller Preferences file should help improve startup time for users who have installed lots of themes. BUG=24377 Review URL: http://codereview.chromium.org/303006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29468 0039d316-1c4b-4281-b951-d872f2087c98
* Fix chrome_url_overides to work with packed extensions.erikkay@chromium.org2009-10-171-3/+4
| | | | | | | | | | | | | | The InitFromValue code was modifying the JSON with some local data which was then being re-used by the unpacker and sent up to the browser which caused it to use this temporary local data as if it was the original manifest source. BUG=24398 TEST=pack and install override_igoogle extension Review URL: http://codereview.chromium.org/276074 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29376 0039d316-1c4b-4281-b951-d872f2087c98
* Allow slightly larger browser and page action icons.aa@chromium.org2009-10-171-0/+4
| | | | | | | | | | | | | | | | | | | | | | | This allows 19px icons to be able to be used for both browser and page icons. I think it looks nicer with the page actions slightly smaller, and that is what we also usually do in Chrome, but some Chrome location bar icons use 18px for soft edges, so I guess this will just have to be something we advise developers on. We can actually fit up to 21 (whoa nelly) pixels on Windows, but apparently the space is slightly smaller on mac. Also minor layout fix. We were sizing the browser action buttons 1px too short. BUG=24881 TEST=Load chrome/test/data/extensions/samples/icon_size_test. Icons should be 17px for the page action and 19px for the browser action and centered nicely in the space. Review URL: http://codereview.chromium.org/286001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29365 0039d316-1c4b-4281-b951-d872f2087c98
* Add concept of an options page to Extensions.asargent@chromium.org2009-10-161-0/+4
| | | | | | | | | | | BUG=23801 TEST=Create an extension with an "options_page" entry in its manifest with a value the name of a html file in the extension dir. Load that extension and go to chrome://extensions, there should be an "Options" button that takes you to the page specified in the manifest. Review URL: http://codereview.chromium.org/271114 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@29297 0039d316-1c4b-4281-b951-d872f2087c98
* Update page action manifest parsing to match the new format.mpcomplete@chromium.org2009-10-131-8/+3
| | | | | | | | | | Preserves backwards compatability with the old manifest format. BUG=24635 Review URL: http://codereview.chromium.org/275007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28912 0039d316-1c4b-4281-b951-d872f2087c98
* Loads local resources from current locale subtree if available, if not it ↵cira@chromium.org2009-10-071-9/+9
| | | | | | | | | | | | | | | | | falls back to extension subtree. We look for ext_root/foo/bar.js under ext_root/_locales/fr/foo/bar.js if current locale is fr. If there is no fr specific resource we load ext_root/foo/bar.js instead. Lots of small refactoring to replace FilePath with ExtensionResource. BUG=12131 TEST=See unittest for sample tree. Review URL: http://codereview.chromium.org/256022 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28333 0039d316-1c4b-4281-b951-d872f2087c98
* Generate IDs for --load-extension by hashing the path insteadaa@chromium.org2009-10-061-20/+3
| | | | | | | | | | | | | of incrementing a static counter. BUG=21281 TEST=Load an unpacked extension from chrome://extensions/ that does not have an ID in its manifest. The resulting ID should be random-looking, not something like "aaaaaa". Review URL: http://codereview.chromium.org/256049 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@28095 0039d316-1c4b-4281-b951-d872f2087c98
* Add chrome.browserAction.setName and .setIcon.mpcomplete@chromium.org2009-10-011-0/+6
| | | | | | | | | BUG=23379 TEST=Load the print_browser_action extension from the samples test dir and click it. The icon and name should update. Review URL: http://codereview.chromium.org/242081 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27741 0039d316-1c4b-4281-b951-d872f2087c98
* Moving ContextualAction class to common/extensions and in the process ↵finnur@chromium.org2009-09-281-10/+10
| | | | | | | | | | | | | renaming it ExtensionAction. No code change. BUG=None TEST=Page actions and browser actions should work as before (no change) Review URL: http://codereview.chromium.org/242035 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27406 0039d316-1c4b-4281-b951-d872f2087c98
* Implementing chrome.i18n.getMessage call, that loads message from the ↵cira@chromium.org2009-09-281-1/+1
| | | | | | | | | | | | | | | | | | | extension catalog, and if necessary replaces placeholders (up to 9). I have 3 forms of getMessage call: getMessage("name") for simple messages without placeholders. getMessage("name", "one param") for messages with only one placeholder. getMessage("name", ["one", "two"]) for messages with only one or more placeholders. getMessage returns string. BUG=12131 TEST=Load samples/i18n extension (switch Chrome to sr locale) and observe ext. name, description and toolstrip texts should be in Serbian. Review URL: http://codereview.chromium.org/225009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27393 0039d316-1c4b-4281-b951-d872f2087c98
* Implement Browser Actions extensions.finnur@chromium.org2009-09-261-10/+18
| | | | | | | | | | | | | | | | Browser Actions are like Page Actions, except they appear next to the Omnibox and are always visible. For details see http://code.google.com/p/chromium/wiki/BrowserActions. Added a simple browser action sample that adds a Print button to the chrome toolbar (which brings up the Print dialog for the current page). Removed |type| from PageActions, which is currently ignored and was already removed from the docs. Each extension can only have 1 browser_action. Each browser action can specify more than one icon, but only the first is used. And no API has been added yet (besides the event definition). BUG=22099 TEST=Install the sample browser action, navigate to google.com, press the print button. A print dialog should come up. Review URL: http://codereview.chromium.org/243001 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@27319 0039d316-1c4b-4281-b951-d872f2087c98
* CL is the same as http://codereview.chromium.org/173487, but had to be moved ↵cira@chromium.org2009-09-181-18/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | to new CL number because I switched machines. Implemented the rest of loading/parsing logic for extension i18n: 1. Loading message catalogs for default and application locale. 2. Parsing JSON and replacing placeholders with actual content within a message. 3. Creating unified dictionary (union of default and application dictionaries, where application dict. has priority for common messages). New class ExtensionMessageBundle holds new dictionary, and parses data. It's injected into Extension. ExtensionMessageHandler::ReplaceVariablesInString can replace both $placeholders$ and __MSG_messages__ in given string (HTML, manifest, actual message string...). Implemented actual manifest name/description replacement too, as an example. Extension is now pretty agnostic about localization, and this makes it easier to use message bundles with things that are not extensions... BUG=12131 Review URL: http://codereview.chromium.org/202063 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26609 0039d316-1c4b-4281-b951-d872f2087c98
* Don't allow updating tabs to javascript URLs without hostaa@chromium.org2009-09-111-3/+7
| | | | | | | | | | | | | | | | | | | | | | | | permissions to that tab. Cleaned up a few things along the way: - added a GetExtension() method to ExtensionFunctionDispatcher and ExtensionFunction since it was used in more than one place. - Removed first param from chrome.test.failCallback() since it wasn't used anywhere. - Added a convenience CanAccessHost() method to Extension, since it seems likely to be commonly used. - Refactored setup of mock host resolver in browsertest, since the way it was, you could only customize it at the testsuite level, not the test level. Review URL: http://codereview.chromium.org/199074 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25971 0039d316-1c4b-4281-b951-d872f2087c98