| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/commerce/ios/browser/web_state_wrapper.h" |
| |
| #include "base/functional/bind.h" |
| #include "base/strings/string_util.h" |
| #include "base/values.h" |
| #include "components/ukm/ios/ukm_url_recorder.h" |
| #include "ios/web/public/browser_state.h" |
| #include "ios/web/public/js_messaging/web_frame.h" |
| #include "ios/web/public/js_messaging/web_frames_manager.h" |
| #include "ios/web/public/web_state.h" |
| |
| namespace commerce { |
| |
| WebStateWrapper::WebStateWrapper(web::WebState* web_state) |
| : web_state_(web_state) {} |
| |
| WebStateWrapper::~WebStateWrapper() = default; |
| |
| const GURL& WebStateWrapper::GetLastCommittedURL() const { |
| if (!web_state_) |
| return GURL::EmptyGURL(); |
| |
| return web_state_->GetLastCommittedURL(); |
| } |
| |
| const std::u16string& WebStateWrapper::GetTitle() { |
| return web_state_ ? web_state_->GetTitle() : base::EmptyString16(); |
| } |
| |
| bool WebStateWrapper::IsFirstLoadForNavigationFinished() { |
| return is_first_load_for_nav_finished_; |
| } |
| |
| void WebStateWrapper::SetIsFirstLoadForNavigationFinished(bool finished) { |
| is_first_load_for_nav_finished_ = finished; |
| } |
| |
| bool WebStateWrapper::IsOffTheRecord() { |
| if (!web_state_ || !web_state_->GetBrowserState()) |
| return false; |
| |
| return web_state_->GetBrowserState()->IsOffTheRecord(); |
| } |
| |
| void WebStateWrapper::RunJavascript( |
| const std::u16string& script, |
| base::OnceCallback<void(const base::Value)> callback) { |
| // GetPageWorldWebFramesManager() never returns null, but the main frame mght |
| // be. |
| if (!web_state_ || |
| !web_state_->GetPageWorldWebFramesManager()->GetMainWebFrame()) { |
| std::move(callback).Run(base::Value()); |
| return; |
| } |
| |
| web_state_->GetPageWorldWebFramesManager() |
| ->GetMainWebFrame() |
| ->ExecuteJavaScript( |
| script, base::BindOnce( |
| [](base::OnceCallback<void(const base::Value)> callback, |
| const base::Value* response) { |
| std::move(callback).Run(response ? response->Clone() |
| : base::Value()); |
| }, |
| std::move(callback))); |
| } |
| |
| ukm::SourceId WebStateWrapper::GetPageUkmSourceId() { |
| return web_state_ ? ukm::GetSourceIdForWebStateDocument(web_state_) |
| : ukm::kInvalidSourceId; |
| } |
| |
| void WebStateWrapper::ClearWebStatePointer() { |
| web_state_ = nullptr; |
| } |
| |
| } // namespace commerce |