| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/profile_resetter/jtl_interpreter.h" | 5 #include "chrome/browser/profile_resetter/jtl_interpreter.h" |
| 6 | 6 |
| 7 #include <numeric> | 7 #include <numeric> |
| 8 | 8 |
| 9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 188 | 188 |
| 189 private: | 189 private: |
| 190 DISALLOW_COPY_AND_ASSIGN(NavigateBackOperation); | 190 DISALLOW_COPY_AND_ASSIGN(NavigateBackOperation); |
| 191 }; | 191 }; |
| 192 | 192 |
| 193 class StoreValue : public Operation { | 193 class StoreValue : public Operation { |
| 194 public: | 194 public: |
| 195 StoreValue(const std::string& hashed_name, scoped_ptr<base::Value> value) | 195 StoreValue(const std::string& hashed_name, scoped_ptr<base::Value> value) |
| 196 : hashed_name_(hashed_name), | 196 : hashed_name_(hashed_name), |
| 197 value_(value.Pass()) { | 197 value_(value.Pass()) { |
| 198 DCHECK(base::IsStringUTF8(hashed_name)); | 198 DCHECK(IsStringUTF8(hashed_name)); |
| 199 DCHECK(value_); | 199 DCHECK(value_); |
| 200 } | 200 } |
| 201 virtual ~StoreValue() {} | 201 virtual ~StoreValue() {} |
| 202 virtual bool Execute(ExecutionContext* context) OVERRIDE { | 202 virtual bool Execute(ExecutionContext* context) OVERRIDE { |
| 203 context->working_memory()->Set(hashed_name_, value_->DeepCopy()); | 203 context->working_memory()->Set(hashed_name_, value_->DeepCopy()); |
| 204 return context->ContinueExecution(); | 204 return context->ContinueExecution(); |
| 205 } | 205 } |
| 206 | 206 |
| 207 private: | 207 private: |
| 208 std::string hashed_name_; | 208 std::string hashed_name_; |
| 209 scoped_ptr<base::Value> value_; | 209 scoped_ptr<base::Value> value_; |
| 210 DISALLOW_COPY_AND_ASSIGN(StoreValue); | 210 DISALLOW_COPY_AND_ASSIGN(StoreValue); |
| 211 }; | 211 }; |
| 212 | 212 |
| 213 class CompareStoredValue : public Operation { | 213 class CompareStoredValue : public Operation { |
| 214 public: | 214 public: |
| 215 CompareStoredValue(const std::string& hashed_name, | 215 CompareStoredValue(const std::string& hashed_name, |
| 216 scoped_ptr<base::Value> value, | 216 scoped_ptr<base::Value> value, |
| 217 scoped_ptr<base::Value> default_value) | 217 scoped_ptr<base::Value> default_value) |
| 218 : hashed_name_(hashed_name), | 218 : hashed_name_(hashed_name), |
| 219 value_(value.Pass()), | 219 value_(value.Pass()), |
| 220 default_value_(default_value.Pass()) { | 220 default_value_(default_value.Pass()) { |
| 221 DCHECK(base::IsStringUTF8(hashed_name)); | 221 DCHECK(IsStringUTF8(hashed_name)); |
| 222 DCHECK(value_); | 222 DCHECK(value_); |
| 223 DCHECK(default_value_); | 223 DCHECK(default_value_); |
| 224 } | 224 } |
| 225 virtual ~CompareStoredValue() {} | 225 virtual ~CompareStoredValue() {} |
| 226 virtual bool Execute(ExecutionContext* context) OVERRIDE { | 226 virtual bool Execute(ExecutionContext* context) OVERRIDE { |
| 227 const base::Value* actual_value = NULL; | 227 const base::Value* actual_value = NULL; |
| 228 if (!context->working_memory()->Get(hashed_name_, &actual_value)) | 228 if (!context->working_memory()->Get(hashed_name_, &actual_value)) |
| 229 actual_value = default_value_.get(); | 229 actual_value = default_value_.get(); |
| 230 if (!value_->Equals(actual_value)) | 230 if (!value_->Equals(actual_value)) |
| 231 return true; | 231 return true; |
| 232 return context->ContinueExecution(); | 232 return context->ContinueExecution(); |
| 233 } | 233 } |
| 234 | 234 |
| 235 private: | 235 private: |
| 236 std::string hashed_name_; | 236 std::string hashed_name_; |
| 237 scoped_ptr<base::Value> value_; | 237 scoped_ptr<base::Value> value_; |
| 238 scoped_ptr<base::Value> default_value_; | 238 scoped_ptr<base::Value> default_value_; |
| 239 DISALLOW_COPY_AND_ASSIGN(CompareStoredValue); | 239 DISALLOW_COPY_AND_ASSIGN(CompareStoredValue); |
| 240 }; | 240 }; |
| 241 | 241 |
| 242 template<bool ExpectedTypeIsBooleanNotHashable> | 242 template<bool ExpectedTypeIsBooleanNotHashable> |
| 243 class StoreNodeValue : public Operation { | 243 class StoreNodeValue : public Operation { |
| 244 public: | 244 public: |
| 245 explicit StoreNodeValue(const std::string& hashed_name) | 245 explicit StoreNodeValue(const std::string& hashed_name) |
| 246 : hashed_name_(hashed_name) { | 246 : hashed_name_(hashed_name) { |
| 247 DCHECK(base::IsStringUTF8(hashed_name)); | 247 DCHECK(IsStringUTF8(hashed_name)); |
| 248 } | 248 } |
| 249 virtual ~StoreNodeValue() {} | 249 virtual ~StoreNodeValue() {} |
| 250 virtual bool Execute(ExecutionContext* context) OVERRIDE { | 250 virtual bool Execute(ExecutionContext* context) OVERRIDE { |
| 251 scoped_ptr<base::Value> value; | 251 scoped_ptr<base::Value> value; |
| 252 if (ExpectedTypeIsBooleanNotHashable) { | 252 if (ExpectedTypeIsBooleanNotHashable) { |
| 253 if (!context->current_node()->IsType(base::Value::TYPE_BOOLEAN)) | 253 if (!context->current_node()->IsType(base::Value::TYPE_BOOLEAN)) |
| 254 return true; | 254 return true; |
| 255 value.reset(context->current_node()->DeepCopy()); | 255 value.reset(context->current_node()->DeepCopy()); |
| 256 } else { | 256 } else { |
| 257 std::string hash; | 257 std::string hash; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 268 DISALLOW_COPY_AND_ASSIGN(StoreNodeValue); | 268 DISALLOW_COPY_AND_ASSIGN(StoreNodeValue); |
| 269 }; | 269 }; |
| 270 | 270 |
| 271 // Stores the hash of the registerable domain name -- as in, the portion of the | 271 // Stores the hash of the registerable domain name -- as in, the portion of the |
| 272 // domain that is registerable, as opposed to controlled by a registrar; without | 272 // domain that is registerable, as opposed to controlled by a registrar; without |
| 273 // subdomains -- of the URL represented by the current node into working memory. | 273 // subdomains -- of the URL represented by the current node into working memory. |
| 274 class StoreNodeRegisterableDomain : public Operation { | 274 class StoreNodeRegisterableDomain : public Operation { |
| 275 public: | 275 public: |
| 276 explicit StoreNodeRegisterableDomain(const std::string& hashed_name) | 276 explicit StoreNodeRegisterableDomain(const std::string& hashed_name) |
| 277 : hashed_name_(hashed_name) { | 277 : hashed_name_(hashed_name) { |
| 278 DCHECK(base::IsStringUTF8(hashed_name)); | 278 DCHECK(IsStringUTF8(hashed_name)); |
| 279 } | 279 } |
| 280 virtual ~StoreNodeRegisterableDomain() {} | 280 virtual ~StoreNodeRegisterableDomain() {} |
| 281 virtual bool Execute(ExecutionContext* context) OVERRIDE { | 281 virtual bool Execute(ExecutionContext* context) OVERRIDE { |
| 282 std::string possibly_invalid_url; | 282 std::string possibly_invalid_url; |
| 283 std::string domain; | 283 std::string domain; |
| 284 if (!context->current_node()->GetAsString(&possibly_invalid_url) || | 284 if (!context->current_node()->GetAsString(&possibly_invalid_url) || |
| 285 !GetRegisterableDomain(possibly_invalid_url, &domain)) | 285 !GetRegisterableDomain(possibly_invalid_url, &domain)) |
| 286 return true; | 286 return true; |
| 287 context->working_memory()->Set( | 287 context->working_memory()->Set( |
| 288 hashed_name_, new base::StringValue(context->GetHash(domain))); | 288 hashed_name_, new base::StringValue(context->GetHash(domain))); |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 break; | 481 break; |
| 482 } | 482 } |
| 483 case jtl_foundation::NAVIGATE_ANY: | 483 case jtl_foundation::NAVIGATE_ANY: |
| 484 operators.push_back(new NavigateAnyOperation); | 484 operators.push_back(new NavigateAnyOperation); |
| 485 break; | 485 break; |
| 486 case jtl_foundation::NAVIGATE_BACK: | 486 case jtl_foundation::NAVIGATE_BACK: |
| 487 operators.push_back(new NavigateBackOperation); | 487 operators.push_back(new NavigateBackOperation); |
| 488 break; | 488 break; |
| 489 case jtl_foundation::STORE_BOOL: { | 489 case jtl_foundation::STORE_BOOL: { |
| 490 std::string hashed_name; | 490 std::string hashed_name; |
| 491 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 491 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 492 return false; | 492 return false; |
| 493 bool value = false; | 493 bool value = false; |
| 494 if (!ReadBool(&value)) | 494 if (!ReadBool(&value)) |
| 495 return false; | 495 return false; |
| 496 operators.push_back(new StoreValue( | 496 operators.push_back(new StoreValue( |
| 497 hashed_name, | 497 hashed_name, |
| 498 scoped_ptr<base::Value>(new base::FundamentalValue(value)))); | 498 scoped_ptr<base::Value>(new base::FundamentalValue(value)))); |
| 499 break; | 499 break; |
| 500 } | 500 } |
| 501 case jtl_foundation::COMPARE_STORED_BOOL: { | 501 case jtl_foundation::COMPARE_STORED_BOOL: { |
| 502 std::string hashed_name; | 502 std::string hashed_name; |
| 503 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 503 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 504 return false; | 504 return false; |
| 505 bool value = false; | 505 bool value = false; |
| 506 if (!ReadBool(&value)) | 506 if (!ReadBool(&value)) |
| 507 return false; | 507 return false; |
| 508 bool default_value = false; | 508 bool default_value = false; |
| 509 if (!ReadBool(&default_value)) | 509 if (!ReadBool(&default_value)) |
| 510 return false; | 510 return false; |
| 511 operators.push_back(new CompareStoredValue( | 511 operators.push_back(new CompareStoredValue( |
| 512 hashed_name, | 512 hashed_name, |
| 513 scoped_ptr<base::Value>(new base::FundamentalValue(value)), | 513 scoped_ptr<base::Value>(new base::FundamentalValue(value)), |
| 514 scoped_ptr<base::Value>( | 514 scoped_ptr<base::Value>( |
| 515 new base::FundamentalValue(default_value)))); | 515 new base::FundamentalValue(default_value)))); |
| 516 break; | 516 break; |
| 517 } | 517 } |
| 518 case jtl_foundation::STORE_HASH: { | 518 case jtl_foundation::STORE_HASH: { |
| 519 std::string hashed_name; | 519 std::string hashed_name; |
| 520 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 520 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 521 return false; | 521 return false; |
| 522 std::string hashed_value; | 522 std::string hashed_value; |
| 523 if (!ReadHash(&hashed_value)) | 523 if (!ReadHash(&hashed_value)) |
| 524 return false; | 524 return false; |
| 525 operators.push_back(new StoreValue( | 525 operators.push_back(new StoreValue( |
| 526 hashed_name, | 526 hashed_name, |
| 527 scoped_ptr<base::Value>(new base::StringValue(hashed_value)))); | 527 scoped_ptr<base::Value>(new base::StringValue(hashed_value)))); |
| 528 break; | 528 break; |
| 529 } | 529 } |
| 530 case jtl_foundation::COMPARE_STORED_HASH: { | 530 case jtl_foundation::COMPARE_STORED_HASH: { |
| 531 std::string hashed_name; | 531 std::string hashed_name; |
| 532 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 532 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 533 return false; | 533 return false; |
| 534 std::string hashed_value; | 534 std::string hashed_value; |
| 535 if (!ReadHash(&hashed_value)) | 535 if (!ReadHash(&hashed_value)) |
| 536 return false; | 536 return false; |
| 537 std::string hashed_default_value; | 537 std::string hashed_default_value; |
| 538 if (!ReadHash(&hashed_default_value)) | 538 if (!ReadHash(&hashed_default_value)) |
| 539 return false; | 539 return false; |
| 540 operators.push_back(new CompareStoredValue( | 540 operators.push_back(new CompareStoredValue( |
| 541 hashed_name, | 541 hashed_name, |
| 542 scoped_ptr<base::Value>(new base::StringValue(hashed_value)), | 542 scoped_ptr<base::Value>(new base::StringValue(hashed_value)), |
| 543 scoped_ptr<base::Value>( | 543 scoped_ptr<base::Value>( |
| 544 new base::StringValue(hashed_default_value)))); | 544 new base::StringValue(hashed_default_value)))); |
| 545 break; | 545 break; |
| 546 } | 546 } |
| 547 case jtl_foundation::STORE_NODE_BOOL: { | 547 case jtl_foundation::STORE_NODE_BOOL: { |
| 548 std::string hashed_name; | 548 std::string hashed_name; |
| 549 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 549 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 550 return false; | 550 return false; |
| 551 operators.push_back(new StoreNodeValue<true>(hashed_name)); | 551 operators.push_back(new StoreNodeValue<true>(hashed_name)); |
| 552 break; | 552 break; |
| 553 } | 553 } |
| 554 case jtl_foundation::STORE_NODE_HASH: { | 554 case jtl_foundation::STORE_NODE_HASH: { |
| 555 std::string hashed_name; | 555 std::string hashed_name; |
| 556 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 556 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 557 return false; | 557 return false; |
| 558 operators.push_back(new StoreNodeValue<false>(hashed_name)); | 558 operators.push_back(new StoreNodeValue<false>(hashed_name)); |
| 559 break; | 559 break; |
| 560 } | 560 } |
| 561 case jtl_foundation::STORE_NODE_REGISTERABLE_DOMAIN_HASH: { | 561 case jtl_foundation::STORE_NODE_REGISTERABLE_DOMAIN_HASH: { |
| 562 std::string hashed_name; | 562 std::string hashed_name; |
| 563 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 563 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 564 return false; | 564 return false; |
| 565 operators.push_back(new StoreNodeRegisterableDomain(hashed_name)); | 565 operators.push_back(new StoreNodeRegisterableDomain(hashed_name)); |
| 566 break; | 566 break; |
| 567 } | 567 } |
| 568 case jtl_foundation::COMPARE_NODE_BOOL: { | 568 case jtl_foundation::COMPARE_NODE_BOOL: { |
| 569 bool value = false; | 569 bool value = false; |
| 570 if (!ReadBool(&value)) | 570 if (!ReadBool(&value)) |
| 571 return false; | 571 return false; |
| 572 operators.push_back(new CompareNodeBool(value)); | 572 operators.push_back(new CompareNodeBool(value)); |
| 573 break; | 573 break; |
| 574 } | 574 } |
| 575 case jtl_foundation::COMPARE_NODE_HASH: { | 575 case jtl_foundation::COMPARE_NODE_HASH: { |
| 576 std::string hashed_value; | 576 std::string hashed_value; |
| 577 if (!ReadHash(&hashed_value)) | 577 if (!ReadHash(&hashed_value)) |
| 578 return false; | 578 return false; |
| 579 operators.push_back(new CompareNodeHash(hashed_value)); | 579 operators.push_back(new CompareNodeHash(hashed_value)); |
| 580 break; | 580 break; |
| 581 } | 581 } |
| 582 case jtl_foundation::COMPARE_NODE_HASH_NOT: { | 582 case jtl_foundation::COMPARE_NODE_HASH_NOT: { |
| 583 std::string hashed_value; | 583 std::string hashed_value; |
| 584 if (!ReadHash(&hashed_value)) | 584 if (!ReadHash(&hashed_value)) |
| 585 return false; | 585 return false; |
| 586 operators.push_back(new CompareNodeHashNot(hashed_value)); | 586 operators.push_back(new CompareNodeHashNot(hashed_value)); |
| 587 break; | 587 break; |
| 588 } | 588 } |
| 589 case jtl_foundation::COMPARE_NODE_TO_STORED_BOOL: { | 589 case jtl_foundation::COMPARE_NODE_TO_STORED_BOOL: { |
| 590 std::string hashed_name; | 590 std::string hashed_name; |
| 591 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 591 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 592 return false; | 592 return false; |
| 593 operators.push_back(new CompareNodeToStored<true>(hashed_name)); | 593 operators.push_back(new CompareNodeToStored<true>(hashed_name)); |
| 594 break; | 594 break; |
| 595 } | 595 } |
| 596 case jtl_foundation::COMPARE_NODE_TO_STORED_HASH: { | 596 case jtl_foundation::COMPARE_NODE_TO_STORED_HASH: { |
| 597 std::string hashed_name; | 597 std::string hashed_name; |
| 598 if (!ReadHash(&hashed_name) || !base::IsStringUTF8(hashed_name)) | 598 if (!ReadHash(&hashed_name) || !IsStringUTF8(hashed_name)) |
| 599 return false; | 599 return false; |
| 600 operators.push_back(new CompareNodeToStored<false>(hashed_name)); | 600 operators.push_back(new CompareNodeToStored<false>(hashed_name)); |
| 601 break; | 601 break; |
| 602 } | 602 } |
| 603 case jtl_foundation::COMPARE_NODE_SUBSTRING: { | 603 case jtl_foundation::COMPARE_NODE_SUBSTRING: { |
| 604 std::string hashed_pattern; | 604 std::string hashed_pattern; |
| 605 uint32 pattern_length = 0, pattern_sum = 0; | 605 uint32 pattern_length = 0, pattern_sum = 0; |
| 606 if (!ReadHash(&hashed_pattern)) | 606 if (!ReadHash(&hashed_pattern)) |
| 607 return false; | 607 return false; |
| 608 if (!ReadUint32(&pattern_length) || pattern_length == 0) | 608 if (!ReadUint32(&pattern_length) || pattern_length == 0) |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 return working_memory_->GetString(hashed_key, output); | 739 return working_memory_->GetString(hashed_key, output); |
| 740 } | 740 } |
| 741 | 741 |
| 742 int JtlInterpreter::CalculateProgramChecksum() const { | 742 int JtlInterpreter::CalculateProgramChecksum() const { |
| 743 uint8 digest[3] = {}; | 743 uint8 digest[3] = {}; |
| 744 crypto::SHA256HashString(program_, digest, arraysize(digest)); | 744 crypto::SHA256HashString(program_, digest, arraysize(digest)); |
| 745 return static_cast<uint32>(digest[0]) << 16 | | 745 return static_cast<uint32>(digest[0]) << 16 | |
| 746 static_cast<uint32>(digest[1]) << 8 | | 746 static_cast<uint32>(digest[1]) << 8 | |
| 747 static_cast<uint32>(digest[2]); | 747 static_cast<uint32>(digest[2]); |
| 748 } | 748 } |
| OLD | NEW |