Crash in v70 with Google Keep extensions and disabled Client ID |
||||
Issue description
Chrome Version: v70
OS: Windows, Linux
Note: Tested in Vivaldi browser, with other changes
This have been reported by users of the Vivaldi 2.0 (final, v69 based) after the release of 2.0.1309.40, which disabled ClientID/ClientSecret in order to disable Account Consistency and Google Account registration of Vivaldi as an App with full access to the account.
What steps will reproduce the problem?
(1) Build executable with google_default_client_id="" google_default_client_secret=""
(2) Install Google Keep
(3) Do not login to Google.
(4) Restart browser
What is the expected result?
Run normally
What happens instead?
There is a crash in this callstack:
> vivaldi.dll!content::WebContentsViewChildFrame::GetTopLevelNativeWindow() Line 67 C++
vivaldi.dll!SigninViewControllerDelegateViews::DisplayModal() Line 149 C++
vivaldi.dll!SigninViewControllerDelegateViews::SigninViewControllerDelegateViews(SigninViewController * signin_view_controller=0x0c424150, std::unique_ptr<views::WebView,std::default_delete<views::WebView> > content_view={...}, Browser * browser=0x0c423fd0, ui::ModalType dialog_modal_type=MODAL_TYPE_CHILD, bool wait_for_size=false) Line 69 C++
vivaldi.dll!SigninViewControllerDelegate::CreateModalSigninDelegate(SigninViewController * signin_view_controller=0x0c424150, profiles::BubbleViewMode mode=BUBBLE_VIEW_MODE_GAIA_REAUTH, Browser * browser=0x0c423fd0, signin_metrics::AccessPoint access_point=ACCESS_POINT_EXTENSIONS) Line 255 C++
vivaldi.dll!SigninViewController::ShowModalSigninDialog(profiles::BubbleViewMode mode=BUBBLE_VIEW_MODE_GAIA_REAUTH, Browser * browser=0x0c423fd0, signin_metrics::AccessPoint access_point=ACCESS_POINT_EXTENSIONS) Line 152 C++
vivaldi.dll!chrome::ShowBrowserSignin(Browser * browser=0x008ceeb0, signin_metrics::AccessPoint access_point=ACCESS_POINT_EXTENSIONS) Line 434 C++
vivaldi.dll!LoginUIService::ShowLoginPopup() Line 237 C++
vivaldi.dll!extensions::IdentityGetAuthTokenFunction::StartSigninFlow() Line 297 C++
vivaldi.dll!extensions::IdentityGetAuthTokenFunction::OnReceivedExtensionAccountInfo(bool is_primary_account, const std::set<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > & scopes, const base::Optional<AccountInfo> & account_info={...}, const identity::AccountState & account_state={...}) Line 214 C++
vivaldi.dll!extensions::IdentityGetAuthTokenFunction::OnReceivedPrimaryAccountInfo(const std::set<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > & scopes, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > & extension_gaia_id, const base::Optional<AccountInfo> & account_info={...}, const identity::AccountState & account_state={...}) Line 165 C++
vivaldi.dll!base::internal::Invoker<base::internal::BindState<void (extensions::IdentityGetAuthTokenFunction::*)(const std::set<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > > &, const std::basic_string<char,std::char_traits<char>,std::allocator<char> > &, const base::Optional<AccountInfo> &, const identity::AccountState &) __attribute__((thiscall)),scoped_refptr<extensions::IdentityGetAuthTokenFunction>,std::set<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > > >,std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,void (const base::Optional<AccountInfo> &, const identity::AccountState &)>::RunOnce(base::internal::BindStateBase * base=0x0c082448, const base::Optional<AccountInfo> & unbound_args={...}, const identity::AccountState & unbound_args={...}) Line 653 C++
vivaldi.dll!identity::mojom::IdentityManager_GetPrimaryAccountInfo_ForwardToCallback::Accept(mojo::Message * message=0x008cf220) Line 401 C++
vivaldi.dll!mojo::InterfaceEndpointClient::HandleValidatedMessage(mojo::Message * message=0x008cf220) Line 418 C++
vivaldi.dll!mojo::internal::MultiplexRouter::ProcessIncomingMessage(mojo::internal::MultiplexRouter::MessageWrapper * message_wrapper=0x008cf28c, mojo::internal::MultiplexRouter::ClientCallBehavior client_call_behavior=ALLOW_DIRECT_CLIENT_CALLS, base::SequencedTaskRunner * current_task_runner=0x06803680) Line 870 C++
vivaldi.dll!mojo::internal::MultiplexRouter::Accept(mojo::Message * message=0x008cf324) Line 594 C++
vivaldi.dll!mojo::Connector::ReadSingleMessage(unsigned int * read_result=0x008cf398) Line 456 C++
vivaldi.dll!mojo::Connector::ReadAllAvailableMessages() Line 486 C++
vivaldi.dll!mojo::Connector::OnHandleReadyInternal(unsigned int result=0) Line 389 C++
vivaldi.dll!base::internal::Invoker<base::internal::BindState<void (net::(anonymous namespace)::DnsUDPAttempt::*)(int) __attribute__((thiscall)),base::internal::UnretainedWrapper<net::(anonymous namespace)::DnsUDPAttempt> >,void (int)>::RunOnce(base::internal::BindStateBase * base=0x19d009a8, int unbound_args=0) Line 653 C++
vivaldi.dll!mojo::SimpleWatcher::DiscardReadyState(const base::RepeatingCallback<void (unsigned int)> & callback, unsigned int result=0, const mojo::HandleSignalsState & state) Line 194 C++
vivaldi.dll!base::internal::Invoker<base::internal::BindState<void (*)(const base::RepeatingCallback<void (unsigned int)> &, unsigned int, const mojo::HandleSignalsState &),base::RepeatingCallback<void (unsigned int)> >,void (unsigned int, const mojo::HandleSignalsState &)>::Run(base::internal::BindStateBase * base=0x19d00b28, unsigned int unbound_args=0, const mojo::HandleSignalsState & unbound_args) Line 662 C++
vivaldi.dll!mojo::SimpleWatcher::OnHandleReady(int watch_id=1, unsigned int result=0, const mojo::HandleSignalsState & state) Line 273 C++
vivaldi.dll!base::internal::Invoker<base::internal::BindState<void (mojo::SimpleWatcher::*)(int, unsigned int, const mojo::HandleSignalsState &) __attribute__((thiscall)),base::WeakPtr<mojo::SimpleWatcher>,int,unsigned int,mojo::HandleSignalsState>,void ()>::Run(base::internal::BindStateBase * base=0x19cde440) Line 665 C++
vivaldi.dll!base::debug::TaskAnnotator::RunTask(const char * queue_function=0x11f3c8b4, base::PendingTask * pending_task=0x008cf558) Line 101 C++
vivaldi.dll!base::MessageLoop::RunTask(base::PendingTask * pending_task=0x008cf558) Line 423 C++
vivaldi.dll!base::MessageLoop::DeferOrRunPendingTask(base::PendingTask pending_task={...}) Line 432 C++
vivaldi.dll!base::MessageLoop::DoWork() Line 480 C++
vivaldi.dll!base::MessagePumpForUI::DoRunLoop() Line 172 C++
vivaldi.dll!base::MessagePumpWin::Run(base::MessagePump::Delegate * delegate=0x06805b10) Line 54 C++
vivaldi.dll!base::MessageLoop::Run(bool) Line 373 C++
vivaldi.dll!base::RunLoop::Run() Line 108 C++
vivaldi.dll!ChromeBrowserMainParts::MainMessageLoopRun(int * result_code=0x06805ca8) Line 2106 C++
vivaldi.dll!content::BrowserMainLoop::RunMainMessageLoopParts() Line 1036 C++
vivaldi.dll!content::BrowserMainRunnerImpl::Run() Line 163 C++
vivaldi.dll!content::BrowserMain(const content::MainFunctionParams & parameters={...}) Line 49 C++
vivaldi.dll!content::RunBrowserProcessMain(const content::MainFunctionParams & main_function_params={...}, content::ContentMainDelegate * delegate=0x008cf9f0) Line 596 C++
vivaldi.dll!content::ContentMainRunnerImpl::Run(bool start_service_manager_only=false) Line 947 C++
vivaldi.dll!content::ContentServiceManagerMainDelegate::RunEmbedderProcess() Line 53 C++
vivaldi.dll!service_manager::Main(const service_manager::MainParams & params={...}) Line 476 C++
vivaldi.dll!content::ContentMain(const content::ContentMainParams & params={...}) Line 19 C++
vivaldi.dll!ChromeMain(HINSTANCE__ * instance=0x00d00000, sandbox::SandboxInterfaceInfo * sandbox_info=0x008cfa70, __int64 exe_entry_point_ticks=2428944120) Line 125 C++
vivaldi.exe!MainDllLoader::Launch(HINSTANCE__ * instance=0x00d00000, base::TimeTicks) Line 203 C++
vivaldi.exe!wWinMain(HINSTANCE__ * instance=0x00d00000, HINSTANCE__ * prev=0x00000000, wchar_t *=0x009b2f38, int=1) Line 233 C++
[External Code]
Notes:
* It is possible that Vivaldi's modifications to handling of document windows are involved, we are still investigating
* Our investigations have also discovered that disabling Vivaldi's UI and using the Chromium UI does *not* reproduce the issue, possibly related to the previous point. In that case the dialog is momentarily displayed, then goes away.
* We have confirmed that https://bugs.chromium.org/p/chromium/issues/detail?id=894071 does not fix the issue
,
Oct 16
Our testers have just reported a platform difference: Mac does not crash. On startup the dialog pops up a few second after the UI has been set up. It is possible that there is a timing difference in when the UI is ready on the various platforms. Major difference: Mac is using the Cocoa UI
,
Oct 16
I don't think this bug should affect Chrome. ShowModalSigninDialog() is no longer used in production (it's only used on ChromeOS). It is called here only because the client ID is missing. Ideally, the identity API should fail in that case. One way to do this would be to automatically set prefs::kSigninAllowed to false when we detect a missing client ID. It would fix this and also simplify the code by removing one edge case. That said, that crash may be the symptom of a real problem. In that case my above suggestion is not really a fix, because it would just cause that code to no longer be called. Looking at the call stack, it would seem that the pop up may be displayed before the window is ready? Unfortunately this is no my area of expertise, but if you made changes in how windows and frames are rendered, this is obviously a good place to start investigating.
,
Oct 16
We do suspect that the dialog was attempting to be displayed before the UI was ready. We do not know if this could affect other embedders. At present we have added a patch in ShowBrowserSignin that immediately return when running Vivaldi. That seems to work around the issue for us. However, we do think that it would be useful if you should investigate if there are better ways to handle this situation. As we now have found a workaround I have lowered the priority
,
Oct 17
,
Oct 18
There are 2 issues here: * chrome.identity API might attempt to show the sign-in page very early which leads to the crash. It is hard to say whether this is a real issue in the Chromium code or just specific to Vivaldi which has a different UI stack. * chrome.indentity API attempts to show the sign-in UI if there is no client ID configured. This is not a production issue as both Chromium channels and Chrome have client IDs configured. It may be an issue for embedders like Vivaldi that also take embed the extension APIs. |
||||
►
Sign in to add a comment |
||||
Comment 1 by dtapu...@chromium.org
, Oct 16