Index: chrome/browser/tab_contents/match_preview.cc |
diff --git a/chrome/browser/tab_contents/match_preview.cc b/chrome/browser/tab_contents/match_preview.cc |
index d167ceb315b3b61f3cdbe9f03d4c8a156ed58b36..1d24287b2cb26412597dff9bdc6adedbbb178b83 100644 |
--- a/chrome/browser/tab_contents/match_preview.cc |
+++ b/chrome/browser/tab_contents/match_preview.cc |
@@ -7,6 +7,7 @@ |
#include <algorithm> |
#include "base/command_line.h" |
+#include "base/string_number_conversions.h" |
#include "base/utf_string_conversions.h" |
#include "chrome/browser/autocomplete/autocomplete.h" |
#include "chrome/browser/favicon_service.h" |
@@ -37,18 +38,41 @@ namespace { |
const char kUserInputScript[] = |
"if (window.chrome.userInput) window.chrome.userInput(\"$1\");"; |
+const char kUserDoneScript[] = |
+ "if (window.chrome.userWantsQuery) window.chrome.userWantsQuery(\"$1\");"; |
+const char kSetOmniboxBoundsScript[] = |
+ "if (window.chrome.setOmniboxDimensions) " |
+ "window.chrome.setOmniboxDimensions($1, $2, $3, $4);"; |
// Sends the user input script to |tab_contents|. |text| is the text the user |
// input into the omnibox. |
void SendUserInputScript(TabContents* tab_contents, |
const string16& text, |
bool done) { |
- // TODO: support done. |
string16 escaped_text(text); |
ReplaceSubstringsAfterOffset(&escaped_text, 0L, ASCIIToUTF16("\""), |
ASCIIToUTF16("\\\"")); |
- string16 script = ReplaceStringPlaceholders(ASCIIToUTF16(kUserInputScript), |
- escaped_text, NULL); |
+ string16 script = ReplaceStringPlaceholders( |
+ ASCIIToUTF16(done ? kUserDoneScript : kUserInputScript), |
+ escaped_text, |
+ NULL); |
+ tab_contents->render_view_host()->ExecuteJavascriptInWebFrame( |
+ std::wstring(), |
+ UTF16ToWide(script)); |
+} |
+ |
+// Sends the script for setting the bounds of the omnibox to |tab_contents|. |
+void SendOmniboxBoundsScript(TabContents* tab_contents, |
+ const gfx::Rect& bounds) { |
+ std::vector<string16> bounds_vector; |
+ bounds_vector.push_back(base::IntToString16(bounds.x())); |
+ bounds_vector.push_back(base::IntToString16(bounds.y())); |
+ bounds_vector.push_back(base::IntToString16(bounds.width())); |
+ bounds_vector.push_back(base::IntToString16(bounds.height())); |
+ string16 script = ReplaceStringPlaceholders( |
+ ASCIIToUTF16(kSetOmniboxBoundsScript), |
+ bounds_vector, |
+ NULL); |
tab_contents->render_view_host()->ExecuteJavascriptInWebFrame( |
std::wstring(), |
UTF16ToWide(script)); |
@@ -96,6 +120,12 @@ class MatchPreview::FrameLoadObserver : public NotificationObserver { |
return; |
} |
+ if (match_preview_) { |
+ gfx::Rect bounds = match_preview_->GetOmniboxBoundsInTermsOfPreview(); |
+ if (!bounds.IsEmpty()) |
+ SendOmniboxBoundsScript(tab_contents_, bounds); |
+ } |
+ |
SendUserInputScript(tab_contents_, text_, send_done_); |
if (match_preview_) |
@@ -434,7 +464,7 @@ void MatchPreview::Update(TabContents* tab_contents, |
if (template_url && template_url->supports_instant() && |
TemplateURL::SupportsReplacement(template_url)) { |
if (template_url_id == template_url_id_) { |
- if (frame_load_observer_.get()) { |
+ if (is_waiting_for_load()) { |
// The page hasn't loaded yet. We'll send the script down when it does. |
frame_load_observer_->set_text(user_text_); |
return; |
@@ -454,6 +484,7 @@ void MatchPreview::Update(TabContents* tab_contents, |
frame_load_observer_.reset(new FrameLoadObserver(this, user_text_)); |
} |
} else { |
+ template_url_id_ = 0; |
frame_load_observer_.reset(NULL); |
preview_contents_->controller().LoadURL(url_, GURL(), match.transition); |
} |
@@ -461,6 +492,18 @@ void MatchPreview::Update(TabContents* tab_contents, |
template_url_id_ = template_url_id; |
} |
+void MatchPreview::SetOmniboxBounds(const gfx::Rect& bounds) { |
+ if (omnibox_bounds_ == bounds) |
+ return; |
+ |
+ omnibox_bounds_ = bounds; |
+ if (preview_contents_.get() && is_showing_instant() && |
+ !is_waiting_for_load()) { |
+ SendOmniboxBoundsScript(preview_contents_.get(), |
+ GetOmniboxBoundsInTermsOfPreview()); |
+ } |
+} |
+ |
void MatchPreview::DestroyPreviewContents() { |
delegate_->HideMatchPreview(); |
delete ReleasePreviewContents(false); |
@@ -472,6 +515,7 @@ void MatchPreview::CommitCurrentPreview() { |
} |
TabContents* MatchPreview::ReleasePreviewContents(bool commit_history) { |
+ omnibox_bounds_ = gfx::Rect(); |
template_url_id_ = 0; |
url_ = GURL(); |
user_text_.clear(); |
@@ -526,3 +570,14 @@ void MatchPreview::PageFinishedLoading() { |
// FrameLoadObserver deletes itself after this call. |
FrameLoadObserver* unused ALLOW_UNUSED = frame_load_observer_.release(); |
} |
+ |
+gfx::Rect MatchPreview::GetOmniboxBoundsInTermsOfPreview() { |
+ if (omnibox_bounds_.IsEmpty()) |
+ return omnibox_bounds_; |
+ |
+ gfx::Rect preview_bounds(delegate_->GetMatchPreviewBounds()); |
+ return gfx::Rect(omnibox_bounds_.x() - preview_bounds.x(), |
+ omnibox_bounds_.y() - preview_bounds.y(), |
+ omnibox_bounds_.width(), |
+ omnibox_bounds_.height()); |
+} |